OSDN Git Service

fixed : compile warrnings.
[importpicture/importpicture.git] / src / main / java / osm / jp / gpx / ImportPicture.java
1 package osm.jp.gpx;\r
2 \r
3 import java.io.ByteArrayInputStream;\r
4 import java.io.File;\r
5 import java.io.FileNotFoundException;\r
6 import java.io.IOException;\r
7 import java.io.InputStream;\r
8 import java.io.UnsupportedEncodingException;\r
9 import java.nio.file.Files;\r
10 import java.nio.file.Path;\r
11 import java.nio.file.Paths;\r
12 import java.text.DateFormat;\r
13 import java.text.ParseException;\r
14 import java.text.SimpleDateFormat;\r
15 import java.util.Date;\r
16 import java.util.ResourceBundle;\r
17 import java.util.TimeZone;\r
18 import java.util.logging.LogManager;\r
19 import java.util.logging.Logger;\r
20 \r
21 import javax.xml.parsers.*;\r
22 import javax.xml.transform.TransformerException;\r
23 \r
24 import org.apache.commons.imaging.ImageReadException;\r
25 import org.apache.commons.imaging.ImageWriteException;\r
26 import org.xml.sax.SAXException;\r
27 \r
28 public class ImportPicture extends Thread {\r
29     \r
30     /**\r
31      * 実行中に発生したExceptionを保持する場所\r
32      */\r
33     public Exception ex = null;\r
34         \r
35     /**\r
36      * ログ設定プロパティファイルのファイル内容\r
37      */\r
38     protected static final String LOGGING_PROPERTIES_DATA\r
39         = "handlers=java.util.logging.ConsoleHandler\n"\r
40         + ".level=FINEST\n"\r
41         + "java.util.logging.ConsoleHandler.level=INFO\n"\r
42         + "java.util.logging.ConsoleHandler.formatter=osm.jp.gpx.YuuLogFormatter";\r
43 \r
44     /**\r
45      * static initializer によるログ設定の初期化\r
46      */\r
47     public static final Logger LOGGER = Logger.getLogger("CommandLogging");\r
48     static {\r
49         try (InputStream inStream = new ByteArrayInputStream(LOGGING_PROPERTIES_DATA.getBytes("UTF-8"))) {\r
50             try {\r
51                 LogManager.getLogManager().readConfiguration(inStream);\r
52                 // "ログ設定: LogManagerを設定しました。"\r
53                 LOGGER.config("LoggerSettings: LogManager setuped.");\r
54             }\r
55             catch (IOException e) {\r
56                 // LogManager設定の際に例外が発生しました.\r
57                 String str = "LoggerSettings: Exception occered:" + e.toString();\r
58                 LOGGER.warning(str);\r
59             }\r
60         }\r
61         catch (UnsupportedEncodingException e) {\r
62             String str = "LoggerSettings: Not supported 'UTF-8' encoding: " + e.toString();\r
63             LOGGER.severe(str);\r
64         } catch (IOException e1) {\r
65             LOGGER.severe(e1.toString());\r
66                 }\r
67     }\r
68     \r
69     /** メイン\r
70      * 画像ファイルをGPXファイルに取り込みます。\r
71      * \r
72      * ・画像ファイルの更新日付をその画像の撮影日時とします。(Exi情報は無視します)\r
73      *    ※ 対象とするファイルは'*.jpg'のみ\r
74      * ・精確な時刻との時差を入力することで、撮影日時を補正します。\r
75      * ・画像ファイルの更新日付リストをCSV形式のファイルとして出力する。\r
76      * ・・結果は、取り込み元のGPXファイルとは別に、元ファイル名にアンダーバー「_」を付加した.ファイルに出力します。\r
77      * \r
78      *  exp) $ java -cp .:AdjustTime.jar:commons-imaging-1.0-SNAPSHOT.jar [AdjustTime.ini]\r
79      *\r
80      * @param argv\r
81      * argv[0] = INIファイルのパス名\r
82      * \r
83      * @throws IOException\r
84      * @throws ImageReadException \r
85      */\r
86     public static void main(String[] argv) throws Exception\r
87     {\r
88         ImportPicture obj = new ImportPicture();\r
89         obj.setUp(((argv.length < 1) ? AppParameters.FILE_PATH : argv[0]));\r
90     }\r
91     \r
92     //public File gpxDir;\r
93     public ImgFolder imgFolder;\r
94     public GpxFolder gpxFolder;\r
95     public AppParameters params;\r
96     \r
97     private static final String EXIF_DATE_TIME_FORMAT_STRING = "yyyy:MM:dd HH:mm:ss";\r
98     public static final ResourceBundle i18n = ResourceBundle.getBundle("i18n");\r
99     \r
100     public void setUp(String paramFilePath) throws Exception {\r
101         System.out.println("Param File = '"+ paramFilePath +"'");\r
102         this.params = new AppParameters(paramFilePath);\r
103         params.printout();\r
104 \r
105         this.ex = null;\r
106         \r
107         // AppParameters.IMG_SOURCE_FOLDER に置き換え\r
108         imgFolder = new ImgFolder(params);\r
109         gpxFolder = new GpxFolder(params);\r
110         \r
111         // 出力ファイル\r
112         // AppParameters.IMG_OUTPUT に置き換え\r
113         if (params.isImgOutput()) {\r
114             Path outDir = Paths.get(params.getProperty(AppParameters.IMG_OUTPUT_FOLDER));\r
115             if (!Files.exists(outDir)) {\r
116                 // 出力ディレクトリが存在しないときは作成する\r
117                 Files.createDirectories(outDir);\r
118             }\r
119             else if (!Files.isDirectory(outDir)) {\r
120                 // 出力ディレクトリがFILEのときはERROR\r
121                 throw new FileNotFoundException(String.format("OUTPUT directory '%s' is a File!", outDir.toAbsolutePath().toString()));\r
122             }\r
123             outDir = Paths.get(outDir.toAbsolutePath().toString(), imgFolder.getImgDir().getFileName().toString());\r
124             //File f = new File(outDir.toFile(), imgFolder.getImgDir().toFile().getName());\r
125             //outDir = f.toPath();\r
126             imgFolder.setOutDir(outDir);\r
127         }\r
128 \r
129         this.start();\r
130         try {\r
131             this.join();\r
132         } catch(InterruptedException end) {}\r
133         if (this.ex != null) {\r
134             throw this.ex;\r
135         }\r
136     }\r
137     \r
138     /**\r
139      * @code{\r
140         <wpt lat="35.25714922" lon="139.15490497">\r
141             <ele>62.099998474121094</ele>\r
142             <time>2012-06-11T00:44:38Z</time>\r
143             <hdop>0.75</hdop>\r
144             <name><![CDATA[写真]]></name>\r
145             <cmt><![CDATA[精度: 3.0m]]></cmt>\r
146             <link href="2012-06-11_09-44-38.jpg">\r
147                 <text>2012-06-11_09-44-38.jpg</text>\r
148             </link>\r
149             <sat>9</sat>\r
150         </wpt>\r
151      * }\r
152      */\r
153     @Override\r
154     public void run() {\r
155         try {\r
156             long delta = 0;\r
157             String timeStr = params.getProperty(AppParameters.IMG_TIME);\r
158             try {\r
159                 Date t = ImportPicture.toUTCDate(timeStr);\r
160 \r
161                 // 基準時刻ファイルの「更新日時」を使って時刻合わせを行う。\r
162                 // argv[1] --> AppParameters.IMG_BASE_FILE に置き換え\r
163                 Date imgtime = ImgFile.getDate(params, getImgBaseFile());\r
164                 delta = t.getTime() - imgtime.getTime();\r
165             }\r
166             catch (ParseException e) {\r
167                 // "'%s'の書式が違います(%s)"0\r
168                 System.out.println(\r
169                     String.format(\r
170                         ImportPicture.i18n.getString("msg.130"),\r
171                         timeStr,\r
172                         ImportPicture.TIME_FORMAT_STRING\r
173                     )\r
174                 );\r
175                 return;\r
176             }\r
177 \r
178             for (GpxFile gpxFile : gpxFolder) {\r
179                 gpxFile.parse();\r
180                 \r
181                 System.out.println("time difference: "+ (delta / 1000) +"(sec)");\r
182                 System.out.println("     Target GPX: ["+ gpxFile.getAbsolutePath() +"]");\r
183                 System.out.println("           EXIF: "+ (params.isImgOutputExif() ? ("convert to '" + imgFolder.getOutDir().toAbsolutePath() +"'") : "off"));\r
184                 System.out.println();\r
185 \r
186                 gpxFile.printinfo();\r
187                 imgFolder.procGPXfile(gpxFile, delta);\r
188             }\r
189             \r
190             // imgDir内の画像ファイルを処理する\r
191             ImgFile.printheader();\r
192             for (ImgFile image : imgFolder) {\r
193                 image.printinfo();\r
194             }\r
195             ImgFile.printfooter();\r
196         }\r
197         catch(ParserConfigurationException | SAXException | IOException | ParseException | ImageReadException | ImageWriteException | IllegalArgumentException | TransformerException e) {\r
198             e.printStackTrace();\r
199             this.ex = new Exception(e);\r
200         }\r
201     }\r
202     \r
203     \r
204         \r
205     \r
206     \r
207     \r
208     public static final String TIME_FORMAT_STRING = "yyyy-MM-dd'T'HH:mm:ss'Z'";\r
209 \r
210     public static Date toUTCDate(String timeStr) throws ParseException {\r
211         DateFormat dfUTC = new SimpleDateFormat(TIME_FORMAT_STRING);\r
212         dfUTC.setTimeZone(TimeZone.getTimeZone("UTC"));\r
213         return dfUTC.parse(timeStr);\r
214     }\r
215 \r
216     public static String toUTCString(Date localdate) {\r
217         DateFormat dfUTC = new SimpleDateFormat(TIME_FORMAT_STRING);\r
218         dfUTC.setTimeZone(TimeZone.getTimeZone("UTC"));\r
219         return dfUTC.format(localdate);\r
220     }\r
221         \r
222     /**\r
223      * DateをEXIFの文字列に変換する。\r
224      * 注意:EXiFの撮影時刻はUTC時間ではない\r
225      * @param localdate\r
226      * @return\r
227      */\r
228     public static String toEXIFString(Date localdate) {\r
229         DateFormat dfUTC = new SimpleDateFormat(EXIF_DATE_TIME_FORMAT_STRING);\r
230         return dfUTC.format(localdate);\r
231     }\r
232     \r
233     /**\r
234      * EXIFの文字列をDateに変換する。\r
235      * 注意:EXiFの撮影時刻はUTC時間ではない\r
236      * @param timeStr\r
237      * @return\r
238      * @throws ParseException\r
239      */\r
240     public static Date toEXIFDate(String timeStr) throws ParseException {\r
241         DateFormat dfUTC = new SimpleDateFormat(EXIF_DATE_TIME_FORMAT_STRING);\r
242         //dfUTC.setTimeZone(TimeZone.getTimeZone("UTC"));\r
243         return dfUTC.parse(timeStr);\r
244     }\r
245     \r
246         public File getImgBaseFile() {\r
247                 return new File(imgFolder.getImgDir().toFile(), params.getProperty(AppParameters.IMG_BASE_FILE));\r
248         }\r
249         \r
250     static String getShortPathName(File dir, File iFile) {\r
251         String dirPath = dir.getAbsolutePath();\r
252         String filePath = iFile.getAbsolutePath();\r
253         if (filePath.startsWith(dirPath)) {\r
254             return filePath.substring(dirPath.length()+1);\r
255         }\r
256         else {\r
257             return filePath;\r
258         }\r
259     }\r
260 }