diff --git a/src/main/java/osm/surveyor/matchtime/Restamp.java b/src/main/java/osm/surveyor/matchtime/Restamp.java index b770042..6dd2b91 100644 --- a/src/main/java/osm/surveyor/matchtime/Restamp.java +++ b/src/main/java/osm/surveyor/matchtime/Restamp.java @@ -63,6 +63,7 @@ * ``` * * exp) $ java -jar Restamp.jar argv[0] argv[1] argv[2] argv[3] argv[4] + * exp) $ java -jar Restamp.jar argv[0] argv[1] argv[2] argv[3] argv[4] argv[5] * * @param argv * argv[0] = 画像ファイルが格納されているディレクトリ --> imgDir @@ -70,103 +71,137 @@ * argv[2] = 基準画像ファイルの精確な撮影日時 "yyyy-MM-dd HH:mm:ss z" --> baseTime1 * argv[3] = 時刻補正の基準とする画像ファイル --> baseFile2 * argv[4] = 基準画像ファイルの精確な撮影日時 "yyyy-MM-dd HH:mm:ss z" --> baseTime2 + * argv[5] = (option)変換済み画像ファイルの出力フォルダ.省略した場合は元画像を直接上書きする --> outputDir * @throws ImageReadException */ public static void main(String[] argv) throws Exception { if (argv.length < 5) { - System.out.println("java Restamp "); + System.out.println("java osm.surveyor.matchtime.Restamp "); + System.out.println("java osm.surveyor.matchtime.Restamp "); return; } Path imgDir = Paths.get(argv[0]); - if (!Files.exists(imgDir)) { - // "[error] が存在しません。" - System.out.println(i18n.getString("msg.200")); - return; - } - if (!Files.isDirectory(imgDir)) { - // "[error] がフォルダじゃない" - System.out.println(i18n.getString("msg.210")); - return; + + Path outDir = imgDir; + if (argv.length >= 6) { + outDir = Paths.get(argv[5]); } Path baseFile1 = Paths.get(imgDir.toString(), argv[1]); - if (!Files.exists(baseFile1)) { - // "[error] が存在しません。" - System.out.println(i18n.getString("msg.220")); - return; - } - if (!Files.isRegularFile(baseFile1)) { - // "[error] がファイルじゃない" - System.out.println(i18n.getString("msg.230")); - return; - } DateFormat df1 = new SimpleDateFormat(TIME_PATTERN); Date baseTime1 = df1.parse(argv[2]); + Date baseTime2 = df1.parse(argv[4]); Path baseFile2 = Paths.get(imgDir.toString(), argv[3]); - if (!Files.exists(baseFile2)) { - // "[error] が存在しません。" - System.out.println(i18n.getString("msg.240")); - return; - } - if (!Files.isRegularFile(baseFile2)) { - // "[error] がファイルじゃない" - System.out.println(i18n.getString("msg.250")); - return; - } - - Date baseTime2 = df1.parse(argv[4]); Restamp obj = new Restamp(); - obj.setUp(imgDir, baseFile1, baseTime1, baseFile2, baseTime2); + if (obj.setUp(imgDir, baseFile1, baseTime1, baseFile2, baseTime2, outDir)) { + obj.start(); + try { + obj.join(); + } catch(InterruptedException end) {} + if (obj.ex != null) { + throw obj.ex; + } + } } Path imgDir; - //Path outDir; + Path outDir; Date baseTime1; Date baseTime2; Path baseFile1; Path baseFile2; public static ResourceBundle i18n = ResourceBundle.getBundle("i18n"); + /** + * パラメータの設定とチェック + * @param imgDir + * @param baseFile1 + * @param baseTime1 + * @param baseFile2 + * @param baseTime2 + * @param outDir + * @return パラメータチェックに合格すればtrue + * @throws Exception + */ @SuppressWarnings("Convert2Lambda") - public void setUp( + public boolean setUp( Path imgDir, Path baseFile1, Date baseTime1, - Path baseFile2, Date baseTime2) throws Exception { + Path baseFile2, Date baseTime2, + Path outDir) throws Exception { this.imgDir = imgDir; + this.outDir = outDir; this.baseTime1 = baseTime1; this.baseTime2 = baseTime2; this.baseFile1 = baseFile1; this.baseFile2 = baseFile2; - /* - File outDir = new File(imgDir, "restamp.out"); - if (outDir.exists()) { - // "[error] が存在する。" - if (!outDir.isDirectory()) { - // "[error] がフォルダじゃない" + // のチェック + if (!Files.exists(imgDir)) { + // "[error] が存在しません。" + System.out.println(i18n.getString("msg.200")); + return false; + } + if (!Files.isDirectory(imgDir)) { + // "[error] がフォルダじゃない" + System.out.println(i18n.getString("msg.210")); + return false; + } + + // のチェック + if (Files.exists(outDir)) { + if (!Files.isDirectory(outDir)) { + // "[error] <出力先フォルダ>はフォルダじゃない" System.out.println(i18n.getString("msg.270")); - return; + return false; } } else { - // "が存在しない。" - outDir.mkdir(); + // "[error] は存在しません。" + try { + Files.createDirectories(outDir); + } + catch (IOException e) { + System.out.println(i18n.getString("msg.275")); + return false; + } } - this.outDir = outDir; - */ + if (!Files.isWritable(outDir)) { + // "[error] <出力先フォルダ>には書き込みできません" + System.out.println(i18n.getString("msg.275")); + return false; + } - this.start(); - try { - this.join(); - } catch(InterruptedException end) {} - if (this.ex != null) { - throw this.ex; + // のチェック + if (!Files.exists(baseFile1)) { + // "[error] が存在しません。" + System.out.println(i18n.getString("msg.220")); + return false; } + if (!Files.isRegularFile(baseFile1)) { + // "[error] がファイルじゃない" + System.out.println(i18n.getString("msg.230")); + return false; + } + + // のチェック + if (!Files.exists(baseFile2)) { + // "[error] が存在しません。" + System.out.println(i18n.getString("msg.240")); + return false; + } + if (!Files.isRegularFile(baseFile2)) { + // "[error] がファイルじゃない" + System.out.println(i18n.getString("msg.250")); + return false; + } + + return true; } @Override diff --git a/src/main/resources/i18n.properties b/src/main/resources/i18n.properties index f581273..df9b53f 100644 --- a/src/main/resources/i18n.properties +++ b/src/main/resources/i18n.properties @@ -69,5 +69,7 @@ msg.240=[error] Not exists . msg.250=[error] is not a file. msg.260=[error] Not exists . +msg.265=[error] Did not create folder. msg.270=[error] is not folder. +msg.275=[error] is not writable. IMAGES/FIT16.GIF=images/Fit16.gif diff --git a/src/main/resources/i18n_ja_JP.properties b/src/main/resources/i18n_ja_JP.properties index 2535af0..a77c64a 100644 --- a/src/main/resources/i18n_ja_JP.properties +++ b/src/main/resources/i18n_ja_JP.properties @@ -70,5 +70,7 @@ msg.240=[error] \u304c\u5b58\u5728\u3057\u307e\u305b\u3093 msg.250=[error] \u304c\u30d5\u30a1\u30a4\u30eb\u3058\u3083\u306a\u3044 msg.260=[error] <\u51fa\u529b\u5148\u30d5\u30a9\u30eb\u30c0>\u304c\u5b58\u5728\u3057\u307e\u305b\u3093 -msg.270=[error] <\u51fa\u529b\u5148\u30d5\u30a9\u30eb\u30c0>\u304c\u30d5\u30a9\u30eb\u30c0\u3058\u3083\u306a\u3044 +msg.265=[error] <\u51fa\u529b\u5148\u30d5\u30a9\u30eb\u30c0>\u3092\u4f5c\u6210\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f +msg.270=[error] <\u51fa\u529b\u5148\u30d5\u30a9\u30eb\u30c0>\u306f\u30d5\u30a9\u30eb\u30c0\u3058\u3083\u306a\u3044 +msg.275=[error] <\u51fa\u529b\u5148\u30d5\u30a9\u30eb\u30c0>\u306b\u306f\u66f8\u304d\u8fbc\u307f\u3067\u304d\u307e\u305b\u3093 IMAGES/FIT16.GIF=images/Fit16.gif diff --git a/src/test/java/osm/surveyor/matchtime/RestampTest.java b/src/test/java/osm/surveyor/matchtime/RestampTest.java index f1dec34..ebe24c7 100644 --- a/src/test/java/osm/surveyor/matchtime/RestampTest.java +++ b/src/test/java/osm/surveyor/matchtime/RestampTest.java @@ -32,13 +32,16 @@ @Before public void setUp() { dirPath = "./src/test/data/images"; + outPath = "./out"; } @After public void tearDown() { + } String dirPath; + String outPath; @Test public void testMain() { @@ -160,10 +163,43 @@ } } + @Test + public void testMain_5() { + String[] ans = { + "2019-09-04 16:26:53 JST", // 0.0 + "2019-09-04 16:26:55 JST", // 2.0 + "2019-09-04 16:26:58 JST", // 3.0 + "2019-09-04 16:27:00 JST", // 2.0 + "2019-09-04 16:27:03 JST", // 3.0 + "2019-09-04 16:27:05 JST", // 2.0 + "2019-09-04 16:27:08 JST", // 3.0 + "2019-09-04 16:27:10 JST", // 2.0 + "2019-09-04 16:27:13 JST", // 3.0 + }; + + try { + String[] argv = new String[]{ + dirPath, + "00003.jpg", + "2019-09-04 16:26:58 JST", + "00005.jpg", + "2019-09-04 16:27:03 JST", + outPath + }; + Restamp.main(argv); + check(new File(outPath), ans); + } + catch (Exception e) { + fail(); + } + } + void check(File imgDir, String[] ans) { DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss z"); File[] files = imgDir.listFiles(); + assertThat(files.length, is(ans.length)); + java.util.Arrays.sort(files, (File file1, File file2) -> file1.getName().compareTo(file2.getName())); int i = 0;