package au.com.langdale.jena;
import com.hp.hpl.jena.vocabulary.OWL2;
import com.hp.hpl.jena.vocabulary.RDFS;
import au.com.langdale.kena.OntResource;
import au.com.langdale.kena.ResIterator;
import au.com.langdale.xmi.UML;
public class MappingTree extends JenaTreeModelBase {
private static final String DEFAULT_NS = "http://example.com/MappingSchema/NoName#";
@Override
protected Node classify(OntResource root) {
return new MappingRoot();
}
protected String getNamespace() {
OntResource validOntology = getOntModel().getValidOntology();
if( validOntology != null )
return validOntology.getURI() + "#";
else
return DEFAULT_NS;
}
public class MappingRoot extends Node {
@Override
protected void populate() {
populateFunctional();
populateDatatype();
populateSuperClass();
}
protected void populateSuperClass() {
ResIterator it = getOntModel().listSubjectsWithProperty(RDFS.subClassOf);
while( it.hasNext()) {
OntResource rela = it.nextResource();
ResIterator jt = rela.listSuperClasses(false);
while( jt.hasNext()) {
OntResource subj = jt.nextResource();
if( subj.hasSuperClass(rela))
add( new EquivNode(subj, rela));
else
add( new SuperClassNode(subj, rela));
}
}
}
protected void populateFunctional() {
ResIterator it = getOntModel().listObjectProperties();
while( it.hasNext()) {
OntResource prop = it.nextResource();
OntResource subj = prop.getRange();
OntResource rela = prop.getDomain();
if( rela != null && subj != null)
add(new FunctionalNode(prop.getLocalName(), subj, rela));
}
}
protected void populateDatatype() {
ResIterator it = getOntModel().listDatatypeProperties();
while( it.hasNext()) {
OntResource prop = it.nextResource();
OntResource subj = prop.getRange();
OntResource rela = prop.getDomain();
if( rela != null && subj != null)
add(new DatatypeNode(prop.getLocalName(), subj, rela));
}
}
@Override
public OntResource getSubject() {
return getOntModel().createResource(UML.global_package.asNode());
}
@Override
public boolean getErrorIndicator() {
return false;
}
}
public abstract class MappingNode extends ModelNode {
protected OntResource subject, related;
protected String name;
public MappingNode( String name, OntResource subject, OntResource related ) {
this.subject = subject;
this.related = related;
this.name = name;
}
public abstract void create();
public abstract void remove();
public abstract boolean extant();
public abstract boolean isProperty();
@Override
public String getName() {
return name;
}
@Override
protected void populate() {
// no children
}
@Override
public OntResource getSubject() {
return subject;
}
public OntResource getRelated() {
return related;
}
@Override
public boolean getErrorIndicator() {
return false;
}
}
public class SuperClassNode extends MappingNode {
public SuperClassNode(OntResource subject, OntResource related) {
super(label(subject), subject, related);
}
public void create() {
related.addSuperClass(subject);
}
public void remove() {
related.removeSuperClass(subject);
}
public boolean extant() {
return related.hasSuperClass(subject);
}
public boolean isProperty() {
return false;
}
@Override
public String toString() {
return label(related) + " -> " + label(subject);
}
}
public class EquivNode extends MappingNode {
public EquivNode(OntResource subject, OntResource related) {
super(label(subject), subject, related);
}
public void create() {
related.addSuperClass(subject);
related.addSubClass(subject);
}
public void remove() {
related.removeSuperClass(subject);
related.removeSubClass(subject);
}
public boolean extant() {
return related.hasSuperClass(subject) && related.hasSubClass(subject);
}
public boolean isProperty() {
return false;
}
@Override
public String toString() {
return label(related) + " = " + label(subject);
}
}
public class FunctionalNode extends MappingNode {
public FunctionalNode(String name, OntResource subject, OntResource related) {
super(name, subject, related);
}
public void create() {
remove();
OntResource prop = getOntModel().createObjectProperty(getNamespace() + name);
prop.addDomain(related);
prop.addRange(subject);
prop.addRDFType(OWL2.FunctionalProperty);
}
public void remove() {
getOntModel().createResource(getNamespace() + name).remove();
}
public boolean extant() {
OntResource prop = getOntModel().createResource(getNamespace() + name);
return prop.isObjectProperty() && prop.hasProperty(RDFS.domain, related) && prop.hasProperty(RDFS.range, subject);
}
public boolean isProperty() {
return true;
}
@Override
public String toString() {
return name + ": " + label(related) + " -> " + label(subject);
}
}
public class DatatypeNode extends MappingNode {
public DatatypeNode(String name, OntResource subject, OntResource related) {
super(name, subject, related);
}
public void create() {
remove();
OntResource prop = getOntModel().createDatatypeProperty(getNamespace() + name);
prop.addDomain(related);
prop.addRange(subject);
}
public void remove() {
getOntModel().createResource(getNamespace() + name).remove();
}
public boolean extant() {
OntResource prop = getOntModel().createResource(getNamespace() + name);
return prop.isDatatypeProperty() && prop.hasProperty(RDFS.domain, related) && prop.hasProperty(RDFS.range, subject);
}
public boolean isProperty() {
return true;
}
@Override
public String toString() {
return name + ": " + label(related) + " -> " + label(subject);
}
}
public MappingNode makeNode(String name, OntResource subject, OntResource related, boolean functional, boolean equiv) {
if( subject != null && related != null && related.isClass()) {
if( subject.isDatatype()) {
return new DatatypeNode(name, subject, related);
}
else if( subject.isClass()) {
if(functional)
return new FunctionalNode(name, subject.inModel(getOntModel()), related.inModel(getOntModel()));
else if(equiv)
return new EquivNode(subject.inModel(getOntModel()), related.inModel(getOntModel()));
else
return new SuperClassNode(subject.inModel(getOntModel()), related.inModel(getOntModel()));
}
}
return null;
}
}