/**
*
*/
package ecologylab.bigsemantics.sensing;
import java.util.Date;
import com.drew.metadata.MetadataException;
import ecologylab.bigsemantics.metadata.Metadata;
import ecologylab.bigsemantics.metadata.MetadataFieldDescriptor;
import ecologylab.bigsemantics.metadata.scalar.MetadataDate;
import ecologylab.bigsemantics.metadata.scalar.MetadataScalarBase;
/**
* Maps an exif (metadata) tag with a S.IM.PL Metadata field in a S.IM.PL Metadata object.
*
* @author andruid
*/
public class MetadataExifFeature
{
String simplMetadataTag;
int exifTag;
MetadataFieldDescriptor mfd;
public MetadataExifFeature(String simplMetadataTag, int exifTag)
{
this.simplMetadataTag = simplMetadataTag;
this.exifTag = exifTag;
}
/**
* @return the metadataName
*/
public String getMetadataName()
{
return simplMetadataTag;
}
/**
* @return the exifTag
*/
public int getExifTag()
{
return exifTag;
}
/**
* This verision of extract does it the right way, using the ScalarType derived from the
* correct MetadataFieldDescriptor.
* <p/>
* Extract a value from the exif header. Set the matching S.IM.PL Metadata field.
*
* @param metadata
* @param dir
* @return
*/
public Object extract(Metadata metadata, com.drew.metadata.Directory dir)
{
String value = getStringValue(dir);
Object result = null;
if (value != null)
{
MetadataFieldDescriptor mfd = metadata.getFieldDescriptorByTagName(simplMetadataTag);
mfd.set(metadata, value);
}
return result;
}
/**
* Get a String type value out of the exif dir.
*
* @param dir
* @return
*/
public String getStringValue(com.drew.metadata.Directory dir)
{
String result = null;
if (dir.containsTag(exifTag))
result = dir.getString(exifTag);
return result;
}
/**
* Probably never needed, as the extract method is more general.
*
* @param metadata
* @param dir
* @return
*/
public Date extractDate(Metadata metadata, com.drew.metadata.Directory dir)
{
Date value = getDateValue(dir);
if (value != null)
{
MetadataDate metaDate = new MetadataDate(value);
setMetadataField(metadata, metaDate);
}
return value;
}
/**
* @param metadata
* @param metaDate
*/
public void setMetadataField(Metadata metadata, MetadataScalarBase metaDate)
{
MetadataFieldDescriptor mfd = metadata.getFieldDescriptorByTagName(simplMetadataTag);
if (mfd != null)
mfd.setField(metadata, metaDate);
}
/**
* Get a Date type value out of the exif dir.
*
* @param dir
* @return
*/
public Date getDateValue(com.drew.metadata.Directory dir)
{
Date result = null;
if (dir.containsTag(exifTag))
try
{
result = dir.getDate(exifTag);
}
catch (MetadataException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
return result;
}
}