package se.cth.hedgehogphoto.metadata;
import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.StringReader;
import java.util.logging.Level;
import org.apache.sanselan.ImageReadException;
import org.apache.sanselan.Sanselan;
import org.apache.sanselan.common.IImageMetadata;
import se.cth.hedgehogphoto.log.Log;
import se.cth.hedgehogphoto.objects.ImageObject;
/**
* A wrapper-class for the metadata extractor
* @author Florian
*/
public class Metadata {
private static final String[] metadataTypes =
{"Modify Date", "Artist", "XPComment", "XPAuthor",
"XPKeywords", "Date Time Original", "Interop Index",
"Interop Version", "Unknown Tag (0x3)", "Unknown Tag (0x4)"};
public static ImageObject getImageObject(File file) {
IImageMetadata metadata = extractMetadata(file);
return getImageObject(metadata);
}
public static IImageMetadata extractMetadata(File file) {
IImageMetadata metadata = null;
try {
metadata = Sanselan.getMetadata(file);
} catch (ImageReadException e) {
Log.getLogger().log(Level.WARNING, "Failed to read metadata from file " + file, e);
}
catch (IOException e) {
Log.getLogger().log(Level.WARNING, "Failed to read metadata from file " + file, e);
}
return metadata;
}
public static ImageObject getImageObject(IImageMetadata imageMetadata) {
ImageObject imageObject = new ImageObject();
if (imageMetadata == null) {
return imageObject;
}
String metadata = imageMetadata.toString();
/* New Feature in java 1.7 - closes stream automatically */
try (BufferedReader br = new BufferedReader( new StringReader(metadata) )) {
String line;
while((line = br.readLine()) != null) {
if (containsTargetMetadata(line)) {
setPropertyFromString(imageObject, line);
}
}
} catch (IOException e) {
Log.getLogger().log(Level.SEVERE, "IOException", e);
}
return imageObject;
}
private static boolean containsTargetMetadata(String line) {
int nbrOfTypes = metadataTypes.length;
for(int i = 0; i < nbrOfTypes; i++) {
if(line.contains(metadataTypes[i])) {
return true;
}
}
return false;
}
private static void setPropertyFromString(ImageObject imageObject, String line) {
line = line.trim();
String property = getProperty(line);
String value = getPropertyValue(line);
imageObject.setProperty(property, value);
}
private static String getProperty(String line) {
int indexOfPropertyEnds = line.indexOf(":");
return line.substring(0,indexOfPropertyEnds);
}
private static String getPropertyValue(String line) {
int indexOfValueStarts = line.indexOf(":") + 1;
return line.substring(indexOfValueStarts);
}
}