package com.limegroup.gnutella.metadata; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import com.limegroup.gnutella.xml.LimeXMLDocument; import com.limegroup.gnutella.xml.LimeXMLUtils; /** * Factory for various editors of MetaData for media files. * * @author Sumeet Thadani */ public abstract class MetaDataEditor { private Log LOG = LogFactory.getLog(MetaDataEditor.class); protected LimeXMLDocument correctDocument= null; protected MetaDataEditor() {} protected boolean matches(final String a, final String b) { if( a == null ) return b == null; return a.equals(b); } /** * @return true if I have better data than other, false otherwise. Better is * defined as having better values for every field. If there is even one * field where other has better values than me, I am not better. We do this * so we have a chance to pick the better fields later */ public abstract boolean betterThan(MetaDataEditor other); /** * @return true if first field is better than the second field. Better is * defined as being equal to the second, or having a value */ protected boolean firstBetter(String first, String second) { if(first == null && second == null) return true; if((first != null) && first.equals(second)) return true; if(first != null && !"".equals(first)) return true; //first has no value, and second does return false; } /** * Sets the fields of this if the corresponding fields of other are better * than their values. In this case other's values get presidence. */ public abstract void pickBetterFields(MetaDataEditor other); /** * performs the actual write of the metadata to disk * @param filename the file that should be annotated * @return status code as defined in LimeWireXMLReplyCollection */ public abstract int commitMetaData(String filename); public abstract void populate(LimeXMLDocument document); public void setCorrectDocument(LimeXMLDocument document) { this.correctDocument = document; } public LimeXMLDocument getCorrectDocument() { return correctDocument; } /** * factory method which returns an instance of MetaDataEditor which * should be used with the specific file * @param name the name of the file to be annotated * @return the MetaDataEditor that will do the annotation. null if the * lime xml repository should be used. */ public static MetaDataEditor getEditorForFile(String name) { if (LimeXMLUtils.isSupportedAudioFormat(name)) return AudioMetaDataEditor.getEditorForFile(name); //add video types here return null; } }