
nablarch.fw.web.i18n.ResourcePathRule Maven / Gradle / Ivy
package nablarch.fw.web.i18n;
import java.net.MalformedURLException;
import java.util.Locale;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import nablarch.core.ThreadContext;
import nablarch.core.util.annotation.Published;
import nablarch.fw.web.servlet.UriUtil;
/**
* 言語対応リソースパスのルールを表すクラス。
*
* 自身が表すルールに基づき言語対応のリソースパスを提供する。
* @author Kiyohito Itoh
*/
@Published(tag = "architect")
public abstract class ResourcePathRule {
/** {@link ServletContextCreator}のインスタンス */
private ServletContextCreator servletContextCreator = new BasicServletContextCreator();
/**
* {@link ServletContextCreator}を設定する。
*
* @param servletContextCreator サーブレットコンテキスト生成クラス
*/
public void setServletContextCreator(ServletContextCreator servletContextCreator) {
this.servletContextCreator = servletContextCreator;
}
/**
* 言語対応のリソースパスを取得する。
*
* 言語は{@link ThreadContext#getLanguage()}から取得する。
* {@link ThreadContext#getLanguage()}から言語を取得できない場合は指定されたリソースパスをそのまま返す。
*
* 言語対応のリソースパスが指すファイルが存在する場合は言語対応のリソースパスを返し、
* 存在しない場合は指定されたリソースパスをそのまま返す。
* 指定されたリソースパスに拡張子を含まない場合は指定されたリソースパスをそのまま返す。
*
* 言語対応のリソースパスは{@link #createPathForLanguage(String, String)}メソッドを呼び出し作成する。
* {@link #createPathForLanguage(String, String)}メソッドはサブクラスにより実装される。
*
* @param path オリジナルのリソースパス
* @param request リクエスト
* @return 言語対応のリソースパス
*/
public String getPathForLanguage(String path, HttpServletRequest request) {
Locale locale = ThreadContext.getLanguage();
if (locale == null) { // 言語がnullの場合。
return path;
}
int extensionIndex = path.lastIndexOf('.');
if (extensionIndex == -1) { // 拡張子を含まない場合。
return path;
}
// コンテキストルートからのパスに変換。
String pathFromContextRoot = convertToPathFromContextRoot(path, request);
// 言語対応のリソースパスの作成。
String pathForLanguage = createPathForLanguage(pathFromContextRoot, locale.getLanguage());
// 言語対応のリソースパスが指すファイルが存在しない場合。
if (!existsResource(pathForLanguage, request)) {
return path;
}
// コンテキストルートからのパス変換時に追加されたパスがある場合は取り除く。
String addedPath = pathFromContextRoot.replace(path, "");
if (!addedPath.isEmpty()) {
pathForLanguage = pathForLanguage.substring(addedPath.length());
}
return pathForLanguage;
}
/**
* 指定されたパスが指すファイルが存在するか否かを判定する。
* @param request リクエスト
* @param resourcePath リソースパス
* @return ファイルが存在する場合はtrue
*/
protected boolean existsResource(String resourcePath, HttpServletRequest request) {
try {
return getServletContext(request).getResource(resourcePath)
!= null;
} catch (MalformedURLException e) {
throw new IllegalArgumentException(e);
}
}
/**
* サーブレットコンテキストを取得する。
*
* @param request リクエスト
* @return サーブレットコンテキスト
*/
private ServletContext getServletContext(HttpServletRequest request) {
return servletContextCreator.create(request);
}
/**
* コンテキストルートからのパスに変換する。
* @param path パス
* @param request リクエスト
* @return コンテキストルートからのパス
*/
protected String convertToPathFromContextRoot(String path, HttpServletRequest request) {
return UriUtil.convertToPathFromContextRoot(path, request);
}
/**
* 言語対応のリソースパスを作成する。
* @param pathFromContextRoot コンテキストルートからのパス
* @param language 言語
* @return 言語対応のリソースパス
*/
protected abstract String createPathForLanguage(String pathFromContextRoot, String language);
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy