no message
parent
4d1f4e4619
commit
82320c60b2
@ -1,4 +1,4 @@
|
|||||||
package cokr.xit.base.boot;
|
package cokr.xit.custom.boot;
|
||||||
|
|
||||||
import javax.sql.DataSource;
|
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.List;
|
||||||
import java.util.Map;
|
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.ImportAutoConfiguration;
|
||||||
import org.springframework.boot.autoconfigure.SpringBootApplication;
|
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