no message
parent
4d1f4e4619
commit
82320c60b2
@ -1,4 +1,4 @@
|
||||
package cokr.xit.base.boot;
|
||||
package cokr.xit.custom.boot;
|
||||
|
||||
import javax.sql.DataSource;
|
||||
|
@ -0,0 +1,37 @@
|
||||
package cokr.xit.custom.boot;
|
||||
|
||||
import org.springframework.boot.CommandLineRunner;
|
||||
import org.springframework.boot.SpringApplication;
|
||||
import org.springframework.boot.WebApplicationType;
|
||||
import org.springframework.boot.autoconfigure.ImportAutoConfiguration;
|
||||
import org.springframework.boot.autoconfigure.SpringBootApplication;
|
||||
import org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration;
|
||||
import org.springframework.test.context.ContextConfiguration;
|
||||
|
||||
/**Spring Boot에서 xit-foundation.jar를 사용하는 stand-alone 애플리케이션의 베이스 클래스
|
||||
* <p>설정 파일을 추가하여 사용하는 경우 설정 파일은
|
||||
* <ul><li>클래스패스의 spring 폴더 아래에 있어야 하고</li>
|
||||
* <li>이름은 'context-'로 시작하는 xml이어야 한다</li>
|
||||
* <li>즉 classpath*:spring/context-*.xml 경로에 해당해야 한다.</li>
|
||||
* </ul>
|
||||
* @author mjkhan
|
||||
*/
|
||||
@SpringBootApplication(exclude = {
|
||||
WebMvcAutoConfiguration.class
|
||||
})
|
||||
@ImportAutoConfiguration({
|
||||
CommonConfig2.class,
|
||||
DatasourceConfig2.class,
|
||||
TransactionConfig2.class,
|
||||
})
|
||||
@ContextConfiguration("classpath:spring/context-*.xml")
|
||||
public class StandAloneApplication2 implements CommandLineRunner {
|
||||
@Override
|
||||
public void run(String... args) throws Exception {}
|
||||
|
||||
protected static void start(Class<?> klass, String... args) {
|
||||
SpringApplication app = new SpringApplication(klass);
|
||||
app.setWebApplicationType(WebApplicationType.NONE);
|
||||
app.run(args);
|
||||
}
|
||||
}
|
@ -0,0 +1,55 @@
|
||||
package cokr.xit.custom.boot;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.function.Predicate;
|
||||
|
||||
import org.springframework.beans.factory.annotation.Value;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
|
||||
import cokr.xit.foundation.Assert;
|
||||
import cokr.xit.foundation.data.StringMap;
|
||||
|
||||
@Configuration("staticResource")
|
||||
public class StaticResourceConfig2 {
|
||||
@Value("${spring.mvc.static-path-pattern}")
|
||||
private String staticURLs;
|
||||
@Value("${spring.web.resources.static-locations}")
|
||||
private String staticLocations;
|
||||
|
||||
public Map<String, String> getMappings() {
|
||||
if (Assert.isEmpty(staticURLs) && Assert.isEmpty(staticLocations))
|
||||
return Collections.emptyMap();
|
||||
|
||||
List<String>
|
||||
urls = Arrays.asList(staticURLs.split(",")),
|
||||
locations = Arrays.asList(staticLocations.split(","));
|
||||
if (urls.size() != locations.size())
|
||||
throw new RuntimeException("URLs and locations do not match in size for static resources");
|
||||
|
||||
StringMap<String> resMap = new StringMap<>();
|
||||
for (int i = 0; i < urls.size(); ++i) {
|
||||
String url = urls.get(i),
|
||||
location = locations.get(i);
|
||||
resMap.put(url.trim(), location.trim());
|
||||
}
|
||||
|
||||
return resMap;
|
||||
}
|
||||
|
||||
public String[] getURLs(Predicate<Map.Entry<String, String>> filter) {
|
||||
Predicate<Map.Entry<String, String>> test = filter != null ? filter : entry -> true;
|
||||
List<String> urls = getMappings().entrySet().stream()
|
||||
.filter(test)
|
||||
.map(entry -> entry.getKey())
|
||||
.toList();
|
||||
return urls.toArray(new String[urls.size()]);
|
||||
}
|
||||
|
||||
public String[] getLocations() {
|
||||
List<String> locations = getMappings().values().stream().toList();
|
||||
return locations.toArray(new String[locations.size()]);
|
||||
}
|
||||
}
|
@ -1,4 +1,4 @@
|
||||
package cokr.xit.base.boot;
|
||||
package cokr.xit.custom.boot;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
@ -1,4 +1,4 @@
|
||||
package cokr.xit.base.boot;
|
||||
package cokr.xit.custom.boot;
|
||||
|
||||
import org.springframework.boot.autoconfigure.ImportAutoConfiguration;
|
||||
import org.springframework.boot.autoconfigure.SpringBootApplication;
|
@ -0,0 +1,130 @@
|
||||
package cokr.xit.custom.boot;
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import org.springframework.boot.env.YamlPropertySourceLoader;
|
||||
import org.springframework.core.env.PropertySource;
|
||||
import org.springframework.core.io.ClassPathResource;
|
||||
|
||||
import cokr.xit.foundation.Assert;
|
||||
|
||||
/**yml 파일 내용을 프로퍼티 형식으로 읽기를 지원하는 유틸리티.
|
||||
* <p>
|
||||
* @author mjkhan
|
||||
*/
|
||||
public class Yml2 {
|
||||
private Map<String, ?> source;
|
||||
|
||||
/**새 Yml을 생성한다.
|
||||
* @param rootName 프로퍼티 소스의 루트 이름
|
||||
* @param path 클래스패스에서 yml 파일의 경로
|
||||
*/
|
||||
public Yml2(String rootName, String path) {
|
||||
load(rootName, path);
|
||||
}
|
||||
|
||||
/**지정하는 yml 파일의 프로퍼티들을 읽어들인다.
|
||||
* @param rootName 프로퍼티 소스의 루트 이름
|
||||
* @param path 클래스패스에서 yml 파일의 경로
|
||||
* @return 현재 Yml
|
||||
*/
|
||||
public Yml2 load(String rootName, String path) {
|
||||
source = null;
|
||||
try {
|
||||
List<PropertySource<?>> sources = new YamlPropertySourceLoader()
|
||||
.load(rootName, new ClassPathResource(path));
|
||||
if (!sources.isEmpty())
|
||||
source = (Map<String, ?>)sources.get(0).getSource();
|
||||
return this;
|
||||
} catch (Exception e) {
|
||||
throw Assert.runtimeException(e);
|
||||
}
|
||||
}
|
||||
|
||||
/**지정하는 프로퍼티(아래 참고)의 값을 반환한다.
|
||||
* @param key 키. 프로퍼티 이름
|
||||
* <pre><code> spring:
|
||||
* application:
|
||||
* name: my-application
|
||||
* </code></pre>
|
||||
* @return 지정하는 키의 프로퍼티 값
|
||||
*/
|
||||
public String getValue(String key) {
|
||||
if (source == null) return "";
|
||||
|
||||
Object obj = source.get(key);
|
||||
return obj != null ? obj.toString() : "";
|
||||
}
|
||||
|
||||
/**지정하는 문자열로 시작하는 프로퍼티(아래 참고) 값들을 반환한다.
|
||||
* <pre><code> list:
|
||||
* - item-0
|
||||
* - item-2
|
||||
* - item-3</code></pre>
|
||||
* @param prefix 프로퍼티 접두어
|
||||
* @return 지정하는 문자열로 시작하는 프로퍼티 값
|
||||
*/
|
||||
public List<String> getValues(String prefix) {
|
||||
if (source == null) return Collections.emptyList();
|
||||
|
||||
return getPrefixed(prefix).stream()
|
||||
.map(entry -> entry.getValue().toString())
|
||||
.collect(Collectors.toList());
|
||||
}
|
||||
|
||||
private List<Map.Entry<String, ?>> getPrefixed(String prefix) {
|
||||
return source.entrySet().stream()
|
||||
.filter(entry -> entry.getKey().startsWith(prefix))
|
||||
.collect(Collectors.toList());
|
||||
}
|
||||
|
||||
/**지정하는 문자열로 시작하는 프로퍼티(아래 참고) 값들을 Map으로 반환한다.
|
||||
* <pre><code> parent:
|
||||
* - property-0: value-0
|
||||
* - property-1: value-1
|
||||
* - property-2: value-2</code></pre>
|
||||
* @param prefix 프로퍼티 접두어
|
||||
* @return 지정하는 문자열로 시작하는 프로퍼티로 된 Map
|
||||
*/
|
||||
public Map<String, String> getMap(String prefix) {
|
||||
if (source == null) return Collections.emptyMap();
|
||||
|
||||
LinkedHashMap<String, String> map = new LinkedHashMap<>();
|
||||
getPrefixed(prefix).stream().forEach(entry -> putTo(map, entry));
|
||||
|
||||
return map;
|
||||
}
|
||||
|
||||
private void putTo(LinkedHashMap<String, String> map, Map.Entry<String, ?> entry) {
|
||||
String key = entry.getKey();
|
||||
key = key.substring(key.lastIndexOf(".") + 1);
|
||||
String val = entry.getValue().toString();
|
||||
map.put(key, val);
|
||||
}
|
||||
|
||||
/**지정하는 문자열로 시작하는 프로퍼티들(아래 참고)을 Map 목록으로 반환한다.
|
||||
* <pre><code> parent:
|
||||
* - property-0: value-0.0
|
||||
* property-1: value-0.1
|
||||
* - property-0: value-1.0
|
||||
* property-1: value-1.1</code></pre>
|
||||
* @param prefix 프로퍼티 접두어
|
||||
* @return 지정하는 문자열로 시작하는 프로퍼티들의 Map 목록
|
||||
*/
|
||||
public List<Map<String, String>> getMaps(String prefix) {
|
||||
if (source == null) return Collections.emptyList();
|
||||
|
||||
return getPrefixed(prefix).stream()
|
||||
.map(entry -> {
|
||||
String str = entry.getKey();
|
||||
return str.substring(0, str.lastIndexOf("."));
|
||||
})
|
||||
.collect(Collectors.toSet()).stream()
|
||||
.map(this::getMap)
|
||||
.collect(Collectors.toList());
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue