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 org.limewire.util.NameValue; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.Singleton; import com.limegroup.gnutella.xml.LimeXMLDocument; import com.limegroup.gnutella.xml.LimeXMLDocumentFactory; import com.limegroup.gnutella.xml.LimeXMLSchema; import com.limegroup.gnutella.xml.LimeXMLSchemaRepository; /** * Utility class that creates a <tt>LimeXMLDocument</tt> from a file. */ @Singleton public class MetaDataReader { private static final Log LOG = LogFactory.getLog(MetaDataReader.class); private final LimeXMLDocumentFactory limeXMLDocumentFactory; private final LimeXMLSchemaRepository limeXMLSchemaRepository; private final Provider<MetaDataFactory> metaDataFactory; @Inject MetaDataReader(LimeXMLDocumentFactory limeXMLDocumentFactory, LimeXMLSchemaRepository limeXMLSchemaRepository, Provider<MetaDataFactory> metaDataFactory) { this.limeXMLDocumentFactory = limeXMLDocumentFactory; this.limeXMLSchemaRepository = limeXMLSchemaRepository; this.metaDataFactory = metaDataFactory; } /** * Generates a LimeXMLDocument from this file, only parsing it if it's the * given schemaURI. */ public LimeXMLDocument readDocument(File file) throws IOException { MetaData data = metaDataFactory.get().parse(file); if (data == null) throw new IOException("unable to parse file"); List<NameValue<String>> nameValList = data.toNameValueList(); if (nameValList.isEmpty()) throw new IOException("invalid/no data."); String uri = data.getSchemaURI(); LimeXMLSchema schema = limeXMLSchemaRepository.getSchema(uri); if (schema == null || schema.getCanonicalizedFields().isEmpty()) throw new IOException("schema: " + uri + " doesn't exist"); try { return limeXMLDocumentFactory.createLimeXMLDocument(nameValList, uri); } catch(IllegalArgumentException iae) { LOG.warn("Error creating document", iae); // See: LWC-1150. It's sometimes the case that people had // old schemas that don't contain all the newer fields, and // some docs are setup with only newer fields, leading the // attributeString to be empty, causing the doc to not validate. // Is worked-around as much as possible. throw (IOException)new IOException().initCause(iae); } } }