package com.limegroup.gnutella.metadata; import java.io.File; import java.io.IOException; import java.util.List; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import com.limegroup.gnutella.xml.LimeXMLUtils; /** * subclass for all data objects that contain the metadata * of a given media file. */ public abstract class MetaData { private static final Log LOG = LogFactory.getLog(MetaData.class); protected MetaData(){} // use the factory instead of instantiating /** Creates MetaData for the file, if possible. */ public static MetaData parse(File f) throws IOException { try { if (LimeXMLUtils.isSupportedAudioFormat(f)) return AudioMetaData.parseAudioFile(f); else if (LimeXMLUtils.isSupportedVideoFormat(f)) return VideoMetaData.parseVideoMetaData(f); //TODO: add other media formats here else if (LimeXMLUtils.isSupportedMultipleFormat(f)) return parseMultipleFormat(f); } catch (OutOfMemoryError e) { LOG.warn("Ran out of memory while parsing.",e); } return null; } /** Figures out what kind of MetaData should exist for this file. */ private static MetaData parseMultipleFormat(File f) throws IOException { if(LimeXMLUtils.isASFFile(f)) { ASFParser p = new ASFParser(f); if(p.hasVideo()) return new WMVMetaData(p); else if(p.hasAudio()) return new WMAMetaData(p); } return null; } /** * Determines if all fields are valid. */ public abstract boolean isComplete(); /** * Writes the data to a NameValue list. */ public abstract List toNameValueList(); /** * Retrieves the XML schema URI that this MetaData can be read with. */ public abstract String getSchemaURI(); /** * populates this's data fields with data read from the media file * all subclasses need to implement it * @throws IOException parsing failed */ protected abstract void parseFile(File f) throws IOException; }