/* * 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; import edu.uci.ics.jung.graph.DirectedSparseMultigraph; import edu.uci.ics.jung.graph.Graph; import edu.uci.ics.jung.graph.util.EdgeType; import edu.uci.ics.jung.graph.util.Pair; public class GraphParrotModel implements Graph<NodeWrapper, NodeWrapper>, ParrotModel { private DirectedSparseMultigraph<NodeWrapper, NodeWrapper> delegateGraph; private ParrotModelHelper delegateModel; private OntModel ontModel; public GraphParrotModel(OntModel model) { ontModel = model; delegateGraph = new DirectedSparseMultigraph<NodeWrapper, NodeWrapper>(); } public Graph<NodeWrapper, NodeWrapper> asGraph() { return this; } /* ParrotModel methods */ @Override public OntModel getOntModel() { return delegateModel.getOntModel(); } @Override public void loadData(String datafile) { if (delegateModel == null) { delegateModel = new ParrotModelHelper(ontModel, this); delegateModel.loadData(datafile); } populateGraphModel(delegateModel.getOntModel()); } private void populateGraphModel(OntModel model) { ModelExtractor extractor = new ModelExtractor(model); 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 = model.getResource(subject.getURI()); } if (!(subject.canAs(Individual.class)) || !ParrotModelHelper.isPotentialNode(delegateModel, subject.as(Individual.class))) { continue; } Property predicate = stat.getPredicate(); if (predicate.isURIResource()) { predicate = model.getProperty(predicate.getURI()); } if (!ParrotModelHelper.isPotentialEdge(delegateModel, predicate)) { continue; } NodeWrapper subjectWrapper = delegateModel.addSubject(subject .as(Individual.class)); delegateGraph.addVertex(subjectWrapper); OntResource predicateResource = model.getOntResource(predicate); NodeWrapper predicateWrapper = delegateModel .addPredicate(predicateResource); RDFNode object = stat.getObject(); if (object.isURIResource()) { object = model.getResource(object.as(Resource.class).getURI()); } NodeWrapper objectWrapper = delegateModel.addObject(object); if (objectWrapper != null) { delegateGraph.addVertex(objectWrapper); delegateGraph.addEdge(predicateWrapper, subjectWrapper, objectWrapper); } } } public void addTriplet(NodeWrapper subjectWrapper, NodeWrapper predicateWrapper, NodeWrapper objectWrapper) { if (subjectWrapper != null) { delegateGraph.addVertex(subjectWrapper); } if (objectWrapper != null) { delegateGraph.addVertex(objectWrapper); } if (subjectWrapper != null && predicateWrapper != null && objectWrapper != null) { delegateGraph.addEdge(predicateWrapper, subjectWrapper, objectWrapper); } } @Override public void saveData() { delegateModel.saveData(); } @Override public String getDataIdentifier() { return delegateModel.getDataIdentifier(); } @Override public Set<NodeWrapper> getSubjectTypes() { return delegateModel.getSubjectTypes(); } @Override public Set<NodeWrapper> getAllSubjects() { return delegateModel.getAllSubjects(); } @Override public Set<NodeWrapper> getAllPredicates() { return delegateModel.getAllPredicates(); } @Override public Set<NodeWrapper> getPredicatesForSubject(NodeWrapper subjectType) { return delegateModel.getPredicatesForSubject(subjectType); } @Override public Set<NodeWrapper> getTypesForIndividual(NodeWrapper node) { return delegateModel.getTypesForIndividual(node); } @Override public Set<NodeWrapper> getIndividualsForType(NodeWrapper type) { return delegateModel.getIndividualsForType(type); } @Override public Set<NodeWrapper> getSuperPredicates(NodeWrapper node) { return delegateModel.getSuperPredicates(node); } @Override public void addFilter(Filter filter) { delegateModel.addFilter(filter); } @Override public void removeFilter(Filter filter) { delegateModel.removeFilter(filter); } @Override public void replaceFilter(Filter oldFilter, Filter newFilter) { delegateModel.replaceFilter(oldFilter, newFilter); } @Override public NodeWrapper getNodeWrapper(Individual instance) { return delegateModel.getNodeWrapper(instance); } @Override public Set<NodeWrapper> getNodeWrappers(OntClass ontClass) { return delegateModel.getNodeWrappers(ontClass); } @Override public Set<NodeWrapper> searchNodeWrappers(String query) throws SearchFailedException { return delegateModel.searchNodeWrappers(query); } @Override public IntervalChain<NodeWrapper> getTimedThings() { return delegateModel.getTimedThings(); } @Override public QuadTree<CenteredThing<NodeWrapper>> getLocatedThings() { return delegateModel.getLocatedThings(); } @Override public void addParrotModelListener(ParrotModelListener pml) { delegateModel.addParrotModelListener(pml); } @Override public void removeParrotModelListener(ParrotModelListener pml) { delegateModel.removeParrotModelListener(pml); } @Override public void deleteEdge(NodeWrapper edge) { // TODO #13 actually implement this when sorting out the editing } @Override public void deleteNode(NodeWrapper vertex) { // TODO #13 actually implement this when sorting out the editing } @Override public boolean isBusy() { return delegateModel.isBusy(); } @Override public Set<NodeWrapper> getAllNodeWrappers() { return delegateModel.getAllNodeWrappers(); } @Override public Set<NodeWrapper> getAllNodes() { return delegateModel.getAllNodes(); } @Override public Set<NodeWrapper> getNodeWrappersOnChain(List<ChainLink> chain) { return delegateModel.getNodeWrappersOnChain(chain); } @Override public List<List<NodeWrapper>> getChains(List<ChainLink> chain) { return delegateModel.getChains(chain); } @Override public boolean hasSuccessor(NodeWrapper node, NodeWrapper maybeSuccessor) { return delegateGraph.isSuccessor(maybeSuccessor, node); } @Override public Collection<NodeWrapper> getSuccessorNodes(NodeWrapper node) { return delegateGraph.getSuccessors(node); } @Override public Collection<NodeWrapper> getEdges(NodeWrapper from, NodeWrapper to) { return delegateGraph.findEdgeSet(from, to); } @Override public NodeWrapper getNodeWrapperForString(String url) throws NoSuchNodeWrapperException { return delegateModel.getNodeWrapperForString(url); } @Override public GraphParrotModel asGraphModel() { return this; } @Override public TableParrotModel asListModel() { throw new UnsupportedOperationException("can't make a graph model out of this"); } public void setDelegate(ParrotModelHelper delegateModel) { this.delegateModel = delegateModel; } /* delegate methods for delegateGraph */ public boolean addEdge(NodeWrapper edge, NodeWrapper v1, NodeWrapper v2, EdgeType edgeType) { // TODO #13 actually implement this when sorting out the editing return false; } public boolean addEdge(NodeWrapper e, NodeWrapper v1, NodeWrapper v2) { // TODO #13 actually implement this when sorting out the editing return false; } public boolean addEdge(NodeWrapper edge, Pair<NodeWrapper> endpoints, EdgeType edgeType) { // TODO #13 actually implement this when sorting out the editing return false; } public boolean addEdge(NodeWrapper edge, Pair<NodeWrapper> endpoints) { // TODO #13 actually implement this when sorting out the editing return false; } public boolean addVertex(NodeWrapper vertex) { // TODO #13 actually implement this when sorting out the editing return false; } public boolean containsEdge(NodeWrapper edge) { return delegateGraph.containsEdge(edge); } public boolean containsVertex(NodeWrapper vertex) { return delegateGraph.containsVertex(vertex); } public int degree(NodeWrapper vertex) { return delegateGraph.degree(vertex); } public boolean equals(Object obj) { return delegateGraph.equals(obj); } public NodeWrapper findEdge(NodeWrapper arg0, NodeWrapper arg1) { return delegateGraph.findEdge(arg0, arg1); } public Collection<NodeWrapper> findEdgeSet(NodeWrapper arg0, NodeWrapper arg1) { return delegateGraph.findEdgeSet(arg0, arg1); } public EdgeType getDefaultEdgeType() { return delegateGraph.getDefaultEdgeType(); } public NodeWrapper getDest(NodeWrapper edge) { return delegateGraph.getDest(edge); } public int getEdgeCount() { return delegateGraph.getEdgeCount(); } public int getEdgeCount(EdgeType edge_type) { return delegateGraph.getEdgeCount(edge_type); } public Collection<NodeWrapper> getEdges() { return delegateGraph.getEdges(); } public Collection<NodeWrapper> getEdges(EdgeType arg0) { return delegateGraph.getEdges(arg0); } public EdgeType getEdgeType(NodeWrapper edge) { return delegateGraph.getEdgeType(edge); } public Pair<NodeWrapper> getEndpoints(NodeWrapper edge) { return delegateGraph.getEndpoints(edge); } public int getIncidentCount(NodeWrapper edge) { return delegateGraph.getIncidentCount(edge); } public Collection<NodeWrapper> getIncidentEdges(NodeWrapper vertex) { return delegateGraph.getIncidentEdges(vertex); } public Collection<NodeWrapper> getIncidentVertices(NodeWrapper edge) { return delegateGraph.getIncidentVertices(edge); } public Collection<NodeWrapper> getInEdges(NodeWrapper vertex) { return delegateGraph.getInEdges(vertex); } public int getNeighborCount(NodeWrapper vertex) { return delegateGraph.getNeighborCount(vertex); } public Collection<NodeWrapper> getNeighbors(NodeWrapper vertex) { return delegateGraph.getNeighbors(vertex); } public NodeWrapper getOpposite(NodeWrapper vertex, NodeWrapper edge) { return delegateGraph.getOpposite(vertex, edge); } public Collection<NodeWrapper> getOutEdges(NodeWrapper vertex) { return delegateGraph.getOutEdges(vertex); } public int getPredecessorCount(NodeWrapper vertex) { return delegateGraph.getPredecessorCount(vertex); } public Collection<NodeWrapper> getPredecessors(NodeWrapper arg0) { return delegateGraph.getPredecessors(arg0); } public NodeWrapper getSource(NodeWrapper edge) { return delegateGraph.getSource(edge); } public int getSuccessorCount(NodeWrapper vertex) { return delegateGraph.getSuccessorCount(vertex); } public Collection<NodeWrapper> getSuccessors(NodeWrapper vertex) { return delegateGraph.getSuccessors(vertex); } public int getVertexCount() { return delegateGraph.getVertexCount(); } public Collection<NodeWrapper> getVertices() { return delegateGraph.getVertices(); } public int hashCode() { return delegateGraph.hashCode(); } public int inDegree(NodeWrapper vertex) { return delegateGraph.inDegree(vertex); } public boolean isDest(NodeWrapper vertex, NodeWrapper edge) { return delegateGraph.isDest(vertex, edge); } public boolean isIncident(NodeWrapper vertex, NodeWrapper edge) { return delegateGraph.isIncident(vertex, edge); } public boolean isNeighbor(NodeWrapper v1, NodeWrapper v2) { return delegateGraph.isNeighbor(v1, v2); } public boolean isPredecessor(NodeWrapper v1, NodeWrapper v2) { return delegateGraph.isPredecessor(v1, v2); } public boolean isSource(NodeWrapper vertex, NodeWrapper edge) { return delegateGraph.isSource(vertex, edge); } public boolean isSuccessor(NodeWrapper v1, NodeWrapper v2) { return delegateGraph.isSuccessor(v1, v2); } public int outDegree(NodeWrapper vertex) { return delegateGraph.outDegree(vertex); } public boolean removeEdge(NodeWrapper edge) { // TODO #13 actually implement this when sorting out the editing return false; } public boolean removeVertex(NodeWrapper vertex) { // TODO #13 actually implement this when sorting out the editing return false; } public String toString() { return delegateGraph.toString(); } @Override public boolean addEdge(NodeWrapper arg0, Collection<? extends NodeWrapper> arg1) { // TODO #13 actually implement this when sorting out the editing return false; } @Override public boolean addEdge(NodeWrapper arg0, Collection<? extends NodeWrapper> arg1, EdgeType arg2) { // TODO #13 actually implement this when sorting out the editing return false; } }