TemplateLoader.java
package com.github.mygreen.splate;
import java.io.IOException;
import java.util.Optional;
import org.springframework.core.io.Resource;
import org.springframework.core.io.ResourceLoader;
import org.springframework.util.StringUtils;
/**
* SQLテンプレートのファイルを読み込む処理です。
* <p>{@literal suffixName} が指定されている場合、接尾語がついているリソースを優先して読み込みます。</p>
*
*
* @author T.TSUCHIE
*
*/
public class TemplateLoader {
/**
* リソースを指定して読み込む。
* @param resource リソース
* @param encoding 文字コード
* @return SQLファイルの内容
* @throws TwoWaySqlException テンプレートの読み込みに失敗した場合にスローされます。
*/
public String loadByResource(final Resource resource, final String encoding) {
try {
return SqlUtils.readStream(resource.getInputStream(), encoding);
} catch(IOException e) {
throw new TwoWaySqlException("Fail load resource", e);
}
}
/**
* リソースパスを指定して読み込む。
* {@literal suffixName} が指定されている場合、接尾語付きのリソースを優先して読み込みます。
*
* @param location リロースパス
* @param resourceLoader リロースローダー。
* @param encoding 文字コード
* @param suffixName リロースの接尾語
* @return SQLファイルの内容
* @throws TwoWaySqlException テンプレートの読み込みに失敗した場合にスローされます。
*/
public String loadByLocation(final String location,
final ResourceLoader resourceLoader, final String encoding, final Optional<String> suffixName) {
if(suffixName.isPresent()) {
// 接尾語付きパスの読み込み
String suffixedPath = convertPathWithSuffixed(location, suffixName.get());
try {
Resource resource = resourceLoader.getResource(suffixedPath);
if(resource.isReadable()) {
return SqlUtils.readStream(resource.getInputStream(), encoding);
}
} catch(IOException e) {
// 読み込めない場合
throw new TwoWaySqlException(String.format("Fail load file : %s", suffixedPath), e);
}
}
// 元々のパスでの読み込み
try {
Resource resource = resourceLoader.getResource(location);
if(resource.isReadable()) {
return SqlUtils.readStream(resource.getInputStream(), encoding);
}
} catch(IOException e) {
// 読み込めない場合
throw new TwoWaySqlException(String.format("Fail load file : %s", location), e);
}
// 読み込み対象のファイルが見つからない場合
throw new TwoWaySqlException(String.format("Not found or non-readable file : %s", location));
}
/**
* SQLのパスを接尾語付きのパスに変換する。
* @param location 変換対象のパス
* @param suffixName リロースの接尾語
* @return 変換したパス
*/
protected String convertPathWithSuffixed(final String location, final String suffixName) {
final StringBuilder sb = new StringBuilder(location.length());
final String extension = StringUtils.getFilenameExtension(location);
// 拡張子を除いたファイル名に方言名を付ける
sb.append(StringUtils.stripFilenameExtension(location))
.append("-").append(suffixName);
// 拡張子がある場合は戻す。
if(!StringUtils.isEmpty(extension)) {
sb.append(".").append(extension);
}
return sb.toString();
}
}