/*
* Copyright (C) 2011 Andrea Schweer
*
* This file is part of the Digital Parrot.
*
* The Digital Parrot is free software; you can redistribute it and/or modify
* it under the terms of the Eclipse Public License as published by the Eclipse
* Foundation or its Agreement Steward, either version 1.0 of the License, or
* (at your option) any later version.
*
* The Digital Parrot is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the Eclipse Public License for
* more details.
*
* You should have received a copy of the Eclipse Public License along with the
* Digital Parrot. If not, see http://www.eclipse.org/legal/epl-v10.html.
*
*/
package net.schweerelos.parrot.model;
import java.util.Collection;
import java.util.EnumSet;
import java.util.List;
import java.util.Set;
import net.schweerelos.parrot.model.filters.ChainLink;
import net.schweerelos.parrot.util.QuadTree;
import net.schweerelos.timeline.model.IntervalChain;
import org.mindswap.pellet.jena.ModelExtractor;
import org.mindswap.pellet.jena.ModelExtractor.StatementType;
import com.hp.hpl.jena.ontology.Individual;
import com.hp.hpl.jena.ontology.OntClass;
import com.hp.hpl.jena.ontology.OntModel;
import com.hp.hpl.jena.ontology.OntResource;
import com.hp.hpl.jena.rdf.model.Model;
import com.hp.hpl.jena.rdf.model.Property;
import com.hp.hpl.jena.rdf.model.RDFNode;
import com.hp.hpl.jena.rdf.model.Resource;
import com.hp.hpl.jena.rdf.model.Statement;
import com.hp.hpl.jena.rdf.model.StmtIterator;
public class CombinedParrotModel implements ParrotModel {
private GraphParrotModel graphModel;
private TableParrotModel listModel;
private ParrotModelHelper delegateModel;
private OntModel ontModel;
public CombinedParrotModel(OntModel model) {
this.ontModel = model;
graphModel = new GraphParrotModel(model);
listModel = new TableParrotModel(model);
}
public void addFilter(Filter filter) {
delegateModel.addFilter(filter);
}
public String toString() {
return "combined list and graph model";
}
@Override
public void addParrotModelListener(ParrotModelListener pml) {
delegateModel.addParrotModelListener(pml);
}
@Override
public void deleteEdge(NodeWrapper edge) {
delegateModel.deleteEdge(edge);
}
@Override
public void deleteNode(NodeWrapper vertex) {
delegateModel.deleteNode(vertex);
}
@Override
public Set<NodeWrapper> getAllNodeWrappers() {
return delegateModel.getAllNodeWrappers();
}
@Override
public Set<NodeWrapper> getAllNodes() {
return delegateModel.getAllNodes();
}
@Override
public Set<NodeWrapper> getAllPredicates() {
return delegateModel.getAllPredicates();
}
@Override
public Set<NodeWrapper> getAllSubjects() {
return delegateModel.getAllSubjects();
}
@Override
public List<List<NodeWrapper>> getChains(List<ChainLink> links) {
return delegateModel.getChains(links);
}
@Override
public String getDataIdentifier() {
return delegateModel.getDataIdentifier();
}
@Override
public Collection<NodeWrapper> getEdges(NodeWrapper from, NodeWrapper to) {
// arbitrarily using graph edges
Collection<NodeWrapper> graphEdges = graphModel.getEdges(from, to);
return graphEdges;
}
@Override
public Set<NodeWrapper> getIndividualsForType(NodeWrapper type) {
return delegateModel.getIndividualsForType(type);
}
@Override
public QuadTree<CenteredThing<NodeWrapper>> getLocatedThings() {
return delegateModel.getLocatedThings();
}
@Override
public NodeWrapper getNodeWrapper(Individual instance) {
return delegateModel.getNodeWrapper(instance);
}
@Override
public NodeWrapper getNodeWrapperForString(String url)
throws NoSuchNodeWrapperException {
return delegateModel.getNodeWrapperForString(url);
}
@Override
public Set<NodeWrapper> getNodeWrappers(OntClass ontClass) {
return delegateModel.getNodeWrappers(ontClass);
}
@Override
public Set<NodeWrapper> getNodeWrappersOnChain(List<ChainLink> chain) {
return delegateModel.getNodeWrappersOnChain(chain);
}
@Override
public OntModel getOntModel() {
return delegateModel.getOntModel();
}
@Override
public Set<NodeWrapper> getPredicatesForSubject(NodeWrapper subject) {
return delegateModel.getPredicatesForSubject(subject);
}
@Override
public Set<NodeWrapper> getSubjectTypes() {
return delegateModel.getSubjectTypes();
}
@Override
public Collection<NodeWrapper> getSuccessorNodes(NodeWrapper node) {
// arbitrarily using graph successors
Collection<NodeWrapper> graphSuccessors = graphModel.getSuccessorNodes(node);
return graphSuccessors;
}
@Override
public Set<NodeWrapper> getSuperPredicates(NodeWrapper node) {
return delegateModel.getSuperPredicates(node);
}
@Override
public IntervalChain<NodeWrapper> getTimedThings() {
return delegateModel.getTimedThings();
}
@Override
public Set<NodeWrapper> getTypesForIndividual(NodeWrapper node) {
return delegateModel.getTypesForIndividual(node);
}
@Override
public boolean hasSuccessor(NodeWrapper node, NodeWrapper maybeSuccessor) {
// arbitrarily using graph answer
boolean graphAnswer = graphModel.hasSuccessor(node, maybeSuccessor);
return graphAnswer;
}
@Override
public boolean isBusy() {
return delegateModel.isBusy();
}
@Override
public void loadData(String datafile) {
delegateModel = new ParrotModelHelper(ontModel, this);
delegateModel.loadData(datafile);
graphModel.setDelegate(delegateModel);
listModel.setDelegate(delegateModel);
ModelExtractor extractor = new ModelExtractor(ontModel);
EnumSet<StatementType> selectors = StatementType.PROPERTY_VALUE;
extractor.setSelector(selectors);
Model eModel = extractor.extractModel();
StmtIterator statements = eModel.listStatements();
while (statements.hasNext()) {
Statement stat = statements.nextStatement();
Resource subject = stat.getSubject();
if (subject.isURIResource()) {
subject = ontModel.getResource(subject.getURI());
}
if (!(subject.canAs(Individual.class))
|| !ParrotModelHelper.isPotentialNode(delegateModel, subject.as(Individual.class))) {
continue;
}
Property predicate = stat.getPredicate();
if (predicate.isURIResource()) {
predicate = ontModel.getProperty(predicate.getURI());
}
if (!ParrotModelHelper.isPotentialEdge(delegateModel, predicate)) {
continue;
}
NodeWrapper subjectWrapper = delegateModel.addSubject(subject.as(Individual.class));
OntResource predicateResource = ontModel.getOntResource(predicate);
NodeWrapper predicateWrapper = delegateModel.addPredicate(predicateResource);
RDFNode object = stat.getObject();
if (object.isURIResource()) {
object = ontModel.getResource(object.as(Resource.class).getURI());
}
NodeWrapper objectWrapper = delegateModel.addObject(object);
graphModel.addTriplet(subjectWrapper, predicateWrapper, objectWrapper);
listModel.addTriplet(subjectWrapper, predicateWrapper, objectWrapper);
}
}
@Override
public void removeFilter(Filter filter) {
delegateModel.removeFilter(filter);
}
@Override
public void removeParrotModelListener(ParrotModelListener pml) {
delegateModel.removeParrotModelListener(pml);
}
@Override
public void replaceFilter(Filter oldFilter, Filter newFilter) {
delegateModel.replaceFilter(oldFilter, newFilter);
}
@Override
public void saveData() {
delegateModel.saveData();
}
@Override
public Set<NodeWrapper> searchNodeWrappers(String query)
throws SearchFailedException {
return delegateModel.searchNodeWrappers(query);
}
@Override
public GraphParrotModel asGraphModel() {
return graphModel;
}
@Override
public TableParrotModel asListModel() {
return listModel;
}
}