/*
* 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.mapping;
import edu.toronto.cs.xcurator.common.NsContext;
import edu.toronto.cs.xcurator.utils.IOUtils;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
/**
*
* @author zhuerkan
*/
public class XmlBasedMapping implements Mapping {
private boolean initialized;
private String namespaceUri;
private NsContext baseNamespaceContext;
private Map<String, Schema> entities;
public final String tagNamePrefix;
public XmlBasedMapping() {
this("http://www.cs.toronto.edu/xcurator", "xcurator");
}
public XmlBasedMapping(String namespaceUri, String tageNamePrefix) {
this.namespaceUri = namespaceUri;
this.tagNamePrefix = tageNamePrefix;
entities = new HashMap<>();
baseNamespaceContext = new NsContext();
}
@Override
public Map<String, Schema> getEntities() {
return entities;
}
@Override
public boolean isInitialized() {
return initialized;
}
@Override
public boolean setInitialized() {
if (baseNamespaceContext == null) {
return false;
}
if (namespaceUri == null) {
return false;
}
return initialized = true;
}
public void setMappingNamespaceUri(String uri) {
namespaceUri = uri;
}
public String getMappingNamespaceUri() {
return namespaceUri;
}
@Override
public void setBaseNamespaceContext(NsContext nsContext) {
this.baseNamespaceContext = nsContext;
}
@Override
public NsContext getBaseNamespaceContext() {
return baseNamespaceContext;
}
@Override
public void addEntity(Schema entity) {
entities.put(entity.getXmlTypeUri(), entity);
}
@Override
public Schema getEntity(String xmlTypeUri) {
return entities.get(xmlTypeUri);
}
@Override
public void removeEntity(String xmlTypeUri) {
entities.remove(xmlTypeUri);
}
@Override
public void removeInvalidRelations() {
Iterator<Schema> it = getEntityIterator();
while (it.hasNext()) {
Schema entity = it.next();
Iterator<Relation> relationIterator = entity.getRelationIterator();
while (relationIterator.hasNext()) {
Relation rel = relationIterator.next();
if (!isValidRelation(rel, entities)) {
relationIterator.remove();
}
}
}
}
@Override
public Iterator<Schema> getEntityIterator() {
return entities.values().iterator();
}
public static final String mappingTagName = "mapping";
public static final String entityTagName = "entity";
public static final String attributeTagName = "attribute";
public static final String relationTagName = "relation";
public static final String referenceTagName = "reference";
public static final String idTagName = "id";
public static final String keyAttrName = "key";
public static final String nameAttrName = "name";
public static final String xmlTypeAttrName = "xmlType";
public static final String typeAttrName = "type";
public static final String pathAttrName = "path";
public static final String targetEntityXmlTypeAttrName = "targetEntityXmlType";
public static final String referencePathAttrName = "path";
public static final String referenceTargetPathAttrName = "targetPath";
public String getMappingNodeName() {
return tagNamePrefix + ":" + mappingTagName;
}
public String getEntityNodeName() {
return tagNamePrefix + ":" + entityTagName;
}
public String getAttributeNodeName() {
return tagNamePrefix + ":" + attributeTagName;
}
public String getRelationNodeName() {
return tagNamePrefix + ":" + relationTagName;
}
public String getReferenceNodeName() {
return tagNamePrefix + ":" + referenceTagName;
}
public String getIdNodeName() {
return tagNamePrefix + ":" + idTagName;
}
@Override
public String toString() {
return "{ \"XmlBasedMapping\": "
+ "{"
+ "\"initialized\":" + "\"" + initialized + "\""
+ ", \"namespaceUri\":" + "\"" + namespaceUri + "\""
+ ", \"baseNamespaceContext\":" + "\"" + baseNamespaceContext + "\""
+ ", \"entities\":" + IOUtils.printMapAsJson(entities)
+ ", \"tagNamePrefix\":" + "\"" + tagNamePrefix + "\""
+ '}'
+ '}';
}
private boolean isValidRelation(Relation rel, Map<String, Schema> entities) {
boolean validObject = false;
boolean validSubject = false;
for (Schema ent : entities.values()) {
if (rel.object.equals(ent)) {
validObject = true;
}
if (rel.subject.equals(ent)) {
validSubject = true;
}
}
return validObject && validSubject;
}
}