package org.jboss.windup.rules.apps.xml.model; import java.io.InputStream; import java.util.logging.Logger; import org.jboss.windup.graph.Indexed; import org.jboss.windup.graph.model.resource.FileModel; import org.jboss.windup.graph.model.resource.SourceFileModel; import org.jboss.windup.util.exception.WindupException; import org.jboss.windup.util.xml.LocationAwareXmlReader; import org.w3c.dom.Document; import com.tinkerpop.blueprints.Direction; import com.tinkerpop.blueprints.Vertex; import com.tinkerpop.frames.Adjacency; import com.tinkerpop.frames.Property; import com.tinkerpop.frames.modules.javahandler.JavaHandler; import com.tinkerpop.frames.modules.javahandler.JavaHandlerContext; import com.tinkerpop.frames.modules.typedgraph.TypeValue; @TypeValue(XmlFileModel.TYPE) public interface XmlFileModel extends FileModel, SourceFileModel { Logger LOG = Logger.getLogger(XmlFileModel.class.getName()); String NOT_VALID_XML = "XML File is not valid"; String XSD_URL_NOT_VALID = "XML File references not valid xsd url."; String ROOT_TAG_NAME = "rootTagName"; String NAMESPACE = "namespace"; String DOCTYPE = "doctype"; String TYPE = "XmlFileModel"; @Adjacency(label = DOCTYPE, direction = Direction.OUT) void setDoctype(DoctypeMetaModel doctype); @Adjacency(label = DOCTYPE, direction = Direction.OUT) DoctypeMetaModel getDoctype(); @Adjacency(label = NAMESPACE, direction = Direction.OUT) void addNamespace(NamespaceMetaModel namespace); @Adjacency(label = NAMESPACE, direction = Direction.OUT) Iterable<NamespaceMetaModel> getNamespaces(); @Indexed @Property(ROOT_TAG_NAME) String getRootTagName(); @Property(ROOT_TAG_NAME) void setRootTagName(String rootTagName); @JavaHandler Document asDocument(); abstract class Impl implements XmlFileModel, JavaHandlerContext<Vertex> { @Override public Document asDocument() { XMLDocumentCache.Result cacheResult = XMLDocumentCache.get(this); Document document; if (cacheResult.isParseFailure()) { throw new WindupException("Could not load " + asFile() + " due to previous parse failure"); } else if (cacheResult.getDocument() == null) { FileModel fileModel = frame(asVertex(), FileModel.class); try (InputStream is = fileModel.asInputStream()) { document = LocationAwareXmlReader.readXML(is); XMLDocumentCache.cache(this, document); } catch (Exception e) { XMLDocumentCache.cacheParseFailure(this); throw new WindupException("Exception reading document due to: " + e.getMessage(), e); } } else { document = cacheResult.getDocument(); } return document; } } }