Author: mattmann
Date: Sat Oct  4 02:21:31 2014
New Revision: 1629347

URL: http://svn.apache.org/r1629347
Log:
Fix for TIKA-1369: Resolve thread safety issue in ImageMetadataExtractor. 
Contributed by Vilmos Papp <[email protected]>. This closes #15.

Modified:
    tika/trunk/CHANGES.txt
    
tika/trunk/tika-parsers/src/main/java/org/apache/tika/parser/image/ImageMetadataExtractor.java

Modified: tika/trunk/CHANGES.txt
URL: 
http://svn.apache.org/viewvc/tika/trunk/CHANGES.txt?rev=1629347&r1=1629346&r2=1629347&view=diff
==============================================================================
--- tika/trunk/CHANGES.txt (original)
+++ tika/trunk/CHANGES.txt Sat Oct  4 02:21:31 2014
@@ -1,4 +1,7 @@
 Release 1.7 - Current Development
+
+  * Thread safety issue in ImageMetadataExtractor were resolved
+    (TIKA-1369).
  
   * The ForkParser service is now registered in Activator
     (TIKA-1354).

Modified: 
tika/trunk/tika-parsers/src/main/java/org/apache/tika/parser/image/ImageMetadataExtractor.java
URL: 
http://svn.apache.org/viewvc/tika/trunk/tika-parsers/src/main/java/org/apache/tika/parser/image/ImageMetadataExtractor.java?rev=1629347&r1=1629346&r2=1629347&view=diff
==============================================================================
--- 
tika/trunk/tika-parsers/src/main/java/org/apache/tika/parser/image/ImageMetadataExtractor.java
 (original)
+++ 
tika/trunk/tika-parsers/src/main/java/org/apache/tika/parser/image/ImageMetadataExtractor.java
 Sat Oct  4 02:21:31 2014
@@ -246,7 +246,13 @@ public class ImageMetadataExtractor {
     
     static class ExifHandler implements DirectoryHandler {
         // There's a new ExifHandler for each file processed, so this is 
thread safe
-        private final SimpleDateFormat DATE_UNSPECIFIED_TZ = new 
SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss", Locale.ROOT);
+       private static final ThreadLocal<SimpleDateFormat> DATE_UNSPECIFIED_TZ 
= new ThreadLocal<SimpleDateFormat>(){
+            @Override
+            protected SimpleDateFormat initialValue()
+            {
+               return new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
+            }
+        };
 
         public boolean supports(Class<? extends Directory> directoryType) {
             return directoryType == ExifIFD0Directory.class || 
@@ -379,7 +385,7 @@ public class ImageMetadataExtractor {
                 // Unless we have GPS time we don't know the time zone so date 
must be set
                 // as ISO 8601 datetime without timezone suffix (no Z or +/-)
                 if (original != null) {
-                    String datetimeNoTimeZone = 
DATE_UNSPECIFIED_TZ.format(original); // Same time zone as Metadata Extractor 
uses
+                   String datetimeNoTimeZone = 
DATE_UNSPECIFIED_TZ.get().format(original); // Same time zone as Metadata 
Extractor uses
                     metadata.set(TikaCoreProperties.CREATED, 
datetimeNoTimeZone);
                     metadata.set(Metadata.ORIGINAL_DATE, datetimeNoTimeZone);
                 }
@@ -387,7 +393,7 @@ public class ImageMetadataExtractor {
             if (directory.containsTag(ExifIFD0Directory.TAG_DATETIME)) {
                 Date datetime = 
directory.getDate(ExifIFD0Directory.TAG_DATETIME);
                 if (datetime != null) {
-                    String datetimeNoTimeZone = 
DATE_UNSPECIFIED_TZ.format(datetime);
+                   String datetimeNoTimeZone = 
DATE_UNSPECIFIED_TZ.get().format(datetime);
                     metadata.set(TikaCoreProperties.MODIFIED, 
datetimeNoTimeZone);
                     // If Date/Time Original does not exist this might be 
creation date
                     if (metadata.get(TikaCoreProperties.CREATED) == null) {


Reply via email to