/*
* Copyright (c) 2013, University of Toronto.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may
* not use this file except in compliance with the License. You may obtain
* a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations
* under the License.
*/
package edu.toronto.cs.xcurator.discoverer;
import edu.toronto.cs.xcurator.common.DataDocument;
import edu.toronto.cs.xcurator.mapping.Mapping;
import edu.toronto.cs.xcurator.mapping.XmlBasedMapping;
import edu.toronto.cs.xcurator.mapping.Attribute;
import edu.toronto.cs.xcurator.mapping.Schema;
import edu.toronto.cs.xcurator.mapping.Reference;
import edu.toronto.cs.xcurator.mapping.Relation;
import edu.toronto.cs.xcurator.common.NsContext;
import edu.toronto.cs.xcurator.common.RdfUriConfig;
import edu.toronto.cs.xcurator.common.XmlDocumentBuilder;
import java.io.OutputStream;
import java.util.Iterator;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
/**
*
* @author zhuerkan
*/
public class SerializeMapping implements MappingDiscoveryStep {
private final OutputStream output;
private final XmlDocumentBuilder builder;
private final Transformer transformer;
private final NsContext rdfNsContext;
public SerializeMapping(XmlDocumentBuilder builder, OutputStream output,
Transformer transformer, RdfUriConfig rdfUriConfig) {
this.output = output;
this.builder = builder;
this.transformer = transformer;
rdfNsContext = new NsContext();
rdfNsContext.addNamespace(rdfUriConfig.getPropertyResourcePrefix(),
rdfUriConfig.getPropertyResourceUriBase());
rdfNsContext.addNamespace(rdfUriConfig.getTypeResourcePrefix(),
rdfUriConfig.getTypeResourceUriBase());
}
@Override
public void process(List<DataDocument> dataDocuments, Mapping mapping) {
try {
if (!(mapping instanceof XmlBasedMapping)
|| !mapping.isInitialized()) {
return;
}
XmlBasedMapping xmlMap = (XmlBasedMapping) mapping;
Document mapDoc = builder.createDocument();
Element root = builder.addRootElement(mapDoc, xmlMap.getMappingNamespaceUri(),
xmlMap.getMappingNodeName());
builder.addNsContextToEntityElement(root, xmlMap.getBaseNamespaceContext());
builder.addNsContextToEntityElement(root, rdfNsContext);
Iterator<Schema> entityIterator = xmlMap.getEntityIterator();
while (entityIterator.hasNext()) {
Schema entity = entityIterator.next();
serializeEntity(entity, mapDoc, root, xmlMap);
}
// Write to output stream
transformer.transform(new DOMSource(mapDoc), new StreamResult(output));
} catch (ParserConfigurationException ex) {
Logger.getLogger(SerializeMapping.class.getName()).log(Level.SEVERE, null, ex);
} catch (TransformerConfigurationException ex) {
Logger.getLogger(SerializeMapping.class.getName()).log(Level.SEVERE, null, ex);
} catch (TransformerException ex) {
Logger.getLogger(SerializeMapping.class.getName()).log(Level.SEVERE, null, ex);
}
}
private void serializeEntity(Schema entity, Document doc, Element root,
XmlBasedMapping mapping) {
String mappingNsUri = mapping.getMappingNamespaceUri();
NsContext nsContext = entity.getNamespaceContext();
// Create a new entity element in the mapping document
Element entityElement = doc.createElementNS(mappingNsUri,
mapping.getEntityNodeName());
entityElement.setAttribute(XmlBasedMapping.pathAttrName, entity.getPath());
builder.addUriBasedAttrToElement(XmlBasedMapping.typeAttrName,
entity.getRdfTypeUri(), rdfNsContext, entityElement);
builder.addUriBasedAttrToElement(XmlBasedMapping.xmlTypeAttrName,
entity.getXmlTypeUri(), nsContext, entityElement);
builder.addNsContextToEntityElement(entityElement, nsContext);
builder.addNsContextToEntityElement(entityElement, rdfNsContext);
root.appendChild(entityElement);
// Create attribute children
Iterator<Attribute> attrIterator = entity.getAttributeIterator();
while (attrIterator.hasNext()) {
Attribute attribute = attrIterator.next();
Element attrElement = doc.createElementNS(mappingNsUri,
mapping.getAttributeNodeName());
attrElement.setAttribute(XmlBasedMapping.pathAttrName, attribute.getPath());
builder.addUriBasedAttrToElement(XmlBasedMapping.nameAttrName,
attribute.getRdfUri(), rdfNsContext, attrElement);
entityElement.appendChild(attrElement);
}
// Create relation children
Iterator<Relation> relIterator = entity.getRelationIterator();
while (relIterator.hasNext()) {
Relation relation = relIterator.next();
Element relElement = doc.createElementNS(mappingNsUri, mapping.getRelationNodeName());
relElement.setAttribute(XmlBasedMapping.pathAttrName, relation.getPath());
builder.addUriBasedAttrToElement(XmlBasedMapping.nameAttrName, relation.getRdfUri(), rdfNsContext, relElement);
builder.addUriBasedAttrToElement(XmlBasedMapping.targetEntityXmlTypeAttrName,
relation.getObjectXmlTypeUri(), nsContext, relElement);
// Create references of this releation
Iterator<Reference> refIterator = relation.getReferenceIterator();
while (refIterator.hasNext()) {
Reference reference = refIterator.next();
Element refElement = doc.createElementNS(mappingNsUri, mapping.getReferenceNodeName());
refElement.setAttribute(XmlBasedMapping.referencePathAttrName, reference.getPath());
refElement.setAttribute(XmlBasedMapping.referenceTargetPathAttrName, reference.getTargetPath());
relElement.appendChild(refElement);
}
entityElement.appendChild(relElement);
}
}
}