package jp.sfjp.jindolf.config;
+import java.io.BufferedInputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
-import java.nio.charset.Charset;
-import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
private static final String RES_DIR = "resources";
private static final String RES_README = RES_DIR + "/README.txt";
- private static final Charset CHARSET_README = StandardCharsets.UTF_8;
-
private static final String MSG_POST =
"<ul>"
+ "<li><code>" + CmdOption.OPT_CONFDIR + "</code>"
*
* <p>閉じるまで待つ。
*
- * @param seq メッセージtxt*/
+ * @param seq メッセージtxt
+ */
private static void showWarnMessage(String txt){
JOptionPane pane;
pane = new JOptionPane(txt, JOptionPane.WARNING_MESSAGE);
*
* <p>閉じるまで待つ。
*
- * @param seq メッセージtxt*/
+ * @param seq メッセージtxt
+ */
private static void showInfoMessage(String txt){
JOptionPane pane;
pane = new JOptionPane(txt, JOptionPane.INFORMATION_MESSAGE);
}
/**
+ * アプリケーション設定ディレクトリを返す。
+ *
+ * <p>存在の有無、アクセスの可否は関知しない。
+ *
+ * <p>WindowsやLinuxではホームディレクトリ。
+ * Mac OS X ではさらにホームディレクトリの下の
+ * "Library/Application Support/"
+ *
+ * @return アプリケーション設定ディレクトリ
+ */
+ public static Path getAppSetDir(){
+ Path home = FileUtils.getHomeDirectory();
+ if(home == null) return null;
+
+ Path result = home;
+
+ if(FileUtils.isMacOSXFs()){
+ result = result.resolve("Library");
+ result = result.resolve("Application Support");
+ }
+
+ return result;
+ }
+
+ /**
* 暗黙的な設定格納ディレクトリを返す。
*
* <ul>
* @return 設定格納ディレクトリ
*/
public static Path getImplicitConfigDirectory(){
- Path result;
-
Path jarParent = FileUtils.getJarDirectory();
if(jarParent != null && FileUtils.isAccessibleDirectory(jarParent)){
Path confPath = jarParent.resolve(JINCONF);
}
}
- Path appset = FileUtils.getAppSetDir();
+ Path appset = getAppSetDir();
if(appset == null) return null;
+ Path result;
if(FileUtils.isMacOSXFs() || FileUtils.isWindowsOSFs()){
result = appset.resolve(JINCONF);
}else{
public static void buildImageCacheDir(Path imgCacheDir){
if(Files.exists(imgCacheDir)) return;
- String jsonRes = "resources/image/avatarCache.json";
- InputStream is = ResourceManager.getResourceAsStream(jsonRes);
- if(is == null) return;
-
try{
Files.createDirectories(imgCacheDir);
}catch(IOException e){
}
ConfigDirUtils.checkDirPerm(imgCacheDir);
+ String jsonRes = "resources/image/avatarCache.json";
+ InputStream is = ResourceManager.getResourceAsStream(jsonRes);
+ if(is == null) return;
+
Path cachePath = imgCacheDir;
Path jsonLeaf = Paths.get("avatarCache.json");
Path path = cachePath.resolve(jsonLeaf);
- try{
- Files.copy(is, path);
+
+ try(InputStream bis = new BufferedInputStream(is)){
+ Files.copy(bis, path);
}catch(IOException e){
abortCantAccessConfigDir(path);
}
showDialog(pane);
- Object result = pane.getValue();
- if(result == null) return false;
- else if( ! (result instanceof Integer) ) return false;
+ Object val = pane.getValue();
+ if( ! (val instanceof Integer) ) return false;
+ int ival = (Integer) val;
+ boolean result = ival == JOptionPane.YES_OPTION;
- int ival = (Integer) result;
- if(ival == JOptionPane.YES_OPTION) return true;
-
- return false;
+ return result;
}
/**
private static void touchReadme(Path path){
Path readme = path.resolve(FILE_README);
- InputStream resReadme;
- resReadme = ResourceManager.getResourceAsStream(RES_README);
+ InputStream resReadme =
+ ResourceManager.getResourceAsStream(RES_README);
- try{
- Files.copy(resReadme, readme);
+ try(InputStream bis = new BufferedInputStream(resReadme)){
+ Files.copy(bis, readme);
}catch(IOException e){
abortCantWrite(readme);
}
}
/**
- * クラスがローカルファイルからロードされたのであれば
- * そのファイルを返す。
+ * クラスのロード元のURLを返す。
*
- * @param klass 任意のクラス
- * @return ロード元ファイル。見つからなければnull。
+ * @param klass クラス
+ * @return ロード元URL。不明ならnull
*/
- public static Path getClassSourceFile(Class<?> klass){
+ public static URL getClassSourceUrl(Class<?> klass){
ProtectionDomain domain = klass.getProtectionDomain();
if(domain == null) return null;
if(src == null) return null;
URL location = src.getLocation();
+
+ return location;
+ }
+
+ /**
+ * クラスがローカルファイルからロードされたのであれば
+ * そのファイルを返す。
+ *
+ * @param klass 任意のクラス
+ * @return ロード元ファイル。見つからなければnull。
+ */
+ public static Path getClassSourcePath(Class<?> klass){
+ URL location = getClassSourceUrl(klass);
if(location == null) return null;
String scheme = location.getProtocol();
/**
* すでに存在するJARファイルか判定する。
*
+ * <p>ファイルがすでに通常ファイルとしてローカルに存在し、
+ * ファイル名の拡張子が「.jar」であれば真と判定される。
+ *
* @param path 任意のファイル
* @return すでに存在するJARファイルであればtrue
*/
if( ! Files.exists(path) ) return false;
if( ! Files.isRegularFile(path) ) return false;
- String leafName = path.getFileName().toString();
+ Path leaf = path.getFileName();
+ assert leaf != null;
+ String leafName = leaf.toString();
boolean result = leafName.matches("^.+\\.[jJ][aA][rR]$");
return result;
* JARが見つからない、もしくはロード元がJARファイルでなければnull。
*/
public static Path getJarDirectory(Class<?> klass){
- Path jarFile = getClassSourceFile(klass);
+ Path jarFile = getClassSourcePath(klass);
if(jarFile == null) return null;
if( ! isExistsJarFile(jarFile) ){
osName = osName.toLowerCase(Locale.ROOT);
- if(osName.startsWith("mac os x")){
- return true;
- }
-
- return false;
+ boolean result = osName.startsWith("mac os x");
+ return result;
}
/**
osName = osName.toLowerCase(Locale.ROOT);
- if(osName.startsWith("windows")){
- return true;
- }
-
- return false;
- }
-
- /**
- * アプリケーション設定ディレクトリを返す。
- *
- * <p>存在の有無、アクセスの可否は関知しない。
- *
- * <p>WindowsやLinuxではホームディレクトリ。
- * Mac OS X ではさらにホームディレクトリの下の
- * "Library/Application Support/"
- *
- * @return アプリケーション設定ディレクトリ
- */
- public static Path getAppSetDir(){
- Path home = getHomeDirectory();
- if(home == null) return null;
-
- Path result = home;
-
- if(isMacOSXFs()){
- result = result.resolve("Library");
- result = result.resolve("Application Support");
- }
-
+ boolean result = osName.startsWith("windows");
return result;
}