From 2b9a3a5a01c98c7f59849730960554920bf6febe Mon Sep 17 00:00:00 2001 From: Jim Blake Date: Fri, 29 Aug 2014 17:43:30 -0400 Subject: [PATCH] Enhanced toString() methods for Models, OntModels, Datasets, Graphs, RDFService --- .../dao/jena/BlankNodeFilteringGraph.java | 8 ++ .../webapp/dao/jena/DifferenceGraph.java | 9 ++ .../webapp/dao/jena/RDFServiceDataset.java | 6 + .../webapp/dao/jena/RDFServiceGraph.java | 7 ++ .../webapp/dao/jena/RegeneratingGraph.java | 7 ++ .../vitro/webapp/dao/jena/SparqlGraph.java | 9 ++ .../dao/jena/SparqlGraphMultilingual.java | 8 ++ .../adapters/AbstractOntModelDecorator.java | 8 ++ .../adapters/BulkUpdatingOntModel.java | 5 - .../adapters/VitroModelFactory.java | 10 ++ .../rdfservice/impl/jena/ListeningGraph.java | 8 ++ .../impl/jena/sdb/RDFServiceSDB.java | 6 + .../servlet/setup/SimpleReasonerSetup.java | 3 + .../mannlib/vitro/webapp/utils/ToString.java | 119 ++++++++++++++++++ 14 files changed, 208 insertions(+), 5 deletions(-) create mode 100644 webapp/src/edu/cornell/mannlib/vitro/webapp/utils/ToString.java diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/BlankNodeFilteringGraph.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/BlankNodeFilteringGraph.java index e46fe3c01..5e28f248e 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/BlankNodeFilteringGraph.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/BlankNodeFilteringGraph.java @@ -20,6 +20,8 @@ import com.hp.hpl.jena.shared.PrefixMapping; import com.hp.hpl.jena.util.iterator.ExtendedIterator; import com.hp.hpl.jena.util.iterator.WrappedIterator; +import edu.cornell.mannlib.vitro.webapp.utils.ToString; + public class BlankNodeFilteringGraph implements Graph { private Graph graph; @@ -141,4 +143,10 @@ public class BlankNodeFilteringGraph implements Graph { public void remove(Node arg0, Node arg1, Node arg2) { graph.remove(arg0, arg1, arg2); } + + @Override + public String toString() { + return "BlankNodeFilteringGraph[" + ToString.hashHex(this) + ", inner=" + + ToString.graphToString(graph) + "]"; + } } diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/DifferenceGraph.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/DifferenceGraph.java index e247ebeac..b393c60a0 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/DifferenceGraph.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/DifferenceGraph.java @@ -19,6 +19,8 @@ import com.hp.hpl.jena.shared.PrefixMapping; import com.hp.hpl.jena.util.iterator.ExtendedIterator; import com.hp.hpl.jena.util.iterator.WrappedIterator; +import edu.cornell.mannlib.vitro.webapp.utils.ToString; + public class DifferenceGraph implements Graph { private Graph g; @@ -134,4 +136,11 @@ public class DifferenceGraph implements Graph { g.clear(); } + @Override + public String toString() { + return "DifferenceGraph[" + ToString.hashHex(this) + ", g=" + + ToString.graphToString(g) + ", subtract=" + + ToString.graphToString(subtract) + "]"; + } + } diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/RDFServiceDataset.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/RDFServiceDataset.java index 6460359f9..9e2d85e53 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/RDFServiceDataset.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/RDFServiceDataset.java @@ -16,6 +16,7 @@ import com.hp.hpl.jena.sparql.core.DatasetGraph; import com.hp.hpl.jena.sparql.util.Context; import edu.cornell.mannlib.vitro.webapp.rdfservice.RDFService; +import edu.cornell.mannlib.vitro.webapp.utils.ToString; public class RDFServiceDataset implements Dataset { @@ -139,4 +140,9 @@ public class RDFServiceDataset implements Dataset { + " does not support transactions."); } + @Override + public String toString() { + return "RDFServiceDataset[" + ToString.hashHex(this) + ", " + g + "]"; + } + } diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/RDFServiceGraph.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/RDFServiceGraph.java index 6b117bfce..bba1d4b97 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/RDFServiceGraph.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/RDFServiceGraph.java @@ -39,6 +39,7 @@ import edu.cornell.mannlib.vitro.webapp.rdfservice.RDFService; import edu.cornell.mannlib.vitro.webapp.rdfservice.RDFServiceException; import edu.cornell.mannlib.vitro.webapp.rdfservice.adapters.VitroModelFactory; import edu.cornell.mannlib.vitro.webapp.rdfservice.impl.RDFServiceUtils; +import edu.cornell.mannlib.vitro.webapp.utils.ToString; public class RDFServiceGraph implements GraphWithPerform { @@ -460,5 +461,11 @@ public class RDFServiceGraph implements GraphWithPerform { }); return m; } + + @Override + public String toString() { + return "RDFServiceGraph[" + ToString.hashHex(this) + ", " + rdfService + + ", graphURI=" + ToString.modelName(graphURI) + "]"; + } } diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/RegeneratingGraph.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/RegeneratingGraph.java index fe7b0184c..392839081 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/RegeneratingGraph.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/RegeneratingGraph.java @@ -21,6 +21,8 @@ import com.hp.hpl.jena.util.iterator.ExtendedIterator; import com.hp.hpl.jena.vocabulary.DCTerms; import com.hp.hpl.jena.vocabulary.RDF; +import edu.cornell.mannlib.vitro.webapp.utils.ToString; + public class RegeneratingGraph implements Graph, Regenerable { private final static Log log = LogFactory.getLog(RegeneratingGraph.class); @@ -296,4 +298,9 @@ public class RegeneratingGraph implements Graph, Regenerable { } } + @Override + public String toString() { + return "RegeneratingGraph[" + ToString.hashHex(this) + ", " + + ToString.graphToString(g) + "]"; + } } diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/SparqlGraph.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/SparqlGraph.java index a2a3f9394..5ff4a009f 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/SparqlGraph.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/SparqlGraph.java @@ -43,6 +43,8 @@ import com.hp.hpl.jena.util.iterator.ExtendedIterator; import com.hp.hpl.jena.util.iterator.SingletonIterator; import com.hp.hpl.jena.util.iterator.WrappedIterator; +import edu.cornell.mannlib.vitro.webapp.utils.ToString; + public class SparqlGraph implements GraphWithPerform { private String endpointURI; @@ -497,4 +499,11 @@ public class SparqlGraph implements GraphWithPerform { // sbuff.append(hexstr); } } + + @Override + public String toString() { + return "SparqlGraph[" + ToString.hashHex(this) + ", endpoint=" + + endpointURI + ", name=" + ToString.modelName(graphURI) + "]"; + } + } diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/SparqlGraphMultilingual.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/SparqlGraphMultilingual.java index 825f0a5f8..a743c5bef 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/SparqlGraphMultilingual.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/SparqlGraphMultilingual.java @@ -21,6 +21,8 @@ import com.hp.hpl.jena.shared.AddDeniedException; import com.hp.hpl.jena.util.iterator.ExtendedIterator; import com.hp.hpl.jena.util.iterator.WrappedIterator; +import edu.cornell.mannlib.vitro.webapp.utils.ToString; + public class SparqlGraphMultilingual extends SparqlGraph implements GraphWithPerform { private static final Log log = LogFactory.getLog(SparqlGraphMultilingual.class); @@ -145,5 +147,11 @@ public class SparqlGraphMultilingual extends SparqlGraph implements GraphWithPer } + @Override + public String toString() { + return "SparqlGraphMultilingual[" + ToString.hashHex(this) + + ", endpoint=" + getEndpointURI() + ", name=" + + ToString.modelName(getGraphURI()) + "]"; + } } diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/rdfservice/adapters/AbstractOntModelDecorator.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/rdfservice/adapters/AbstractOntModelDecorator.java index 4f5992dc6..2f9f6d8d4 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/rdfservice/adapters/AbstractOntModelDecorator.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/rdfservice/adapters/AbstractOntModelDecorator.java @@ -79,6 +79,8 @@ import com.hp.hpl.jena.shared.Lock; import com.hp.hpl.jena.shared.PrefixMapping; import com.hp.hpl.jena.util.iterator.ExtendedIterator; +import edu.cornell.mannlib.vitro.webapp.utils.ToString; + /** * The base class for a delegating ontology model decorator. * @@ -94,6 +96,12 @@ public abstract class AbstractOntModelDecorator implements OntModel { } this.inner = m; } + + @Override + public String toString() { + return ToString.simpleName(this) + "[" + ToString.hashHex(this) + ", " + + ToString.ontModelToString(inner) + "]"; + } @Override @Deprecated diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/rdfservice/adapters/BulkUpdatingOntModel.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/rdfservice/adapters/BulkUpdatingOntModel.java index 388df3c8f..083085235 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/rdfservice/adapters/BulkUpdatingOntModel.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/rdfservice/adapters/BulkUpdatingOntModel.java @@ -207,11 +207,6 @@ public class BulkUpdatingOntModel extends AbstractOntModelDecorator { return this; } - @Override - public String toString() { - return "<" + this.getClass().getSimpleName() + " " + getGraph() + ">"; - } - private Iterator asTriples(StmtIterator it) { return it.mapWith(mapAsTriple); } diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/rdfservice/adapters/VitroModelFactory.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/rdfservice/adapters/VitroModelFactory.java index 81e1acb46..739bc9975 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/rdfservice/adapters/VitroModelFactory.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/rdfservice/adapters/VitroModelFactory.java @@ -17,6 +17,8 @@ import com.hp.hpl.jena.rdf.model.Model; import com.hp.hpl.jena.rdf.model.ModelFactory; import com.hp.hpl.jena.rdf.model.impl.ModelCom; +import edu.cornell.mannlib.vitro.webapp.utils.ToString; + /** * Make models that will do proper bulk updates. */ @@ -74,6 +76,14 @@ public class VitroModelFactory { L.getBulkUpdateHandler()); } + @Override + public String toString() { + return "BulkUpdatingUnion[" + ToString.hashHex(this) + ", L=" + + ToString.graphToString(L) + ", R=" + + ToString.graphToString(R) + "]"; + } + + } @SuppressWarnings("deprecation") diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/rdfservice/impl/jena/ListeningGraph.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/rdfservice/impl/jena/ListeningGraph.java index 12614b047..6d8702ce0 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/rdfservice/impl/jena/ListeningGraph.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/rdfservice/impl/jena/ListeningGraph.java @@ -29,6 +29,7 @@ import com.hp.hpl.jena.util.iterator.WrappedIterator; import edu.cornell.mannlib.vitro.webapp.rdfservice.ModelChange; import edu.cornell.mannlib.vitro.webapp.rdfservice.impl.RDFServiceImpl; +import edu.cornell.mannlib.vitro.webapp.utils.ToString; public class ListeningGraph implements GraphWithPerform { @@ -225,4 +226,11 @@ public class ListeningGraph implements GraphWithPerform { } }; + @Override + public String toString() { + return "ListeningGraph["+ToString.hashHex(this) + + ", " + rdfServiceImpl + + ", " + ToString.modelName(graphURI) + "]"; + } + } diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/rdfservice/impl/jena/sdb/RDFServiceSDB.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/rdfservice/impl/jena/sdb/RDFServiceSDB.java index 4cc1f1542..cf7ced6e6 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/rdfservice/impl/jena/sdb/RDFServiceSDB.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/rdfservice/impl/jena/sdb/RDFServiceSDB.java @@ -27,6 +27,7 @@ import edu.cornell.mannlib.vitro.webapp.rdfservice.ChangeSet; import edu.cornell.mannlib.vitro.webapp.rdfservice.RDFService; import edu.cornell.mannlib.vitro.webapp.rdfservice.RDFServiceException; import edu.cornell.mannlib.vitro.webapp.rdfservice.impl.jena.RDFServiceJena; +import edu.cornell.mannlib.vitro.webapp.utils.ToString; public class RDFServiceSDB extends RDFServiceJena implements RDFService { @@ -170,5 +171,10 @@ public class RDFServiceSDB extends RDFServiceJena implements RDFService { } } } + + @Override + public String toString() { + return "RDFServiceSDB[" + ToString.hashHex(this) + "]"; + } } diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/SimpleReasonerSetup.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/SimpleReasonerSetup.java index 100bf695f..a306f5bf4 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/SimpleReasonerSetup.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/SimpleReasonerSetup.java @@ -55,6 +55,9 @@ public class SimpleReasonerSetup implements ServletContextListener { OntModel tboxAssertionsModel = ModelAccess.on(ctx).getOntModel(ModelNames.TBOX_ASSERTIONS); OntModel tboxInferencesModel = ModelAccess.on(ctx).getOntModel(ModelNames.TBOX_INFERENCES); OntModel tboxUnionModel = ModelAccess.on(ctx).getOntModel(ModelNames.TBOX_UNION); + log.debug("tboxAssertionsModel=" + tboxAssertionsModel); + log.debug("tboxInferencesModel=" + tboxInferencesModel); + log.debug("tboxUnionModel=" + tboxUnionModel); WebappDaoFactory wadf = ModelAccess.on(ctx).getWebappDaoFactory(); diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/utils/ToString.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/utils/ToString.java new file mode 100644 index 000000000..af18b6a38 --- /dev/null +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/utils/ToString.java @@ -0,0 +1,119 @@ +/* $This file is distributed under the terms of the license in /doc/license.txt$ */ + +package edu.cornell.mannlib.vitro.webapp.utils; + +import java.util.Collection; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +import org.apache.commons.lang.StringUtils; + +import com.hp.hpl.jena.graph.Graph; +import com.hp.hpl.jena.graph.compose.Polyadic; +import com.hp.hpl.jena.ontology.OntModel; +import com.hp.hpl.jena.rdf.model.Model; + +/** + * Some useful methods for printing out the contents of data structures: + * OntModels, Models, Datasets, etc. + */ +public class ToString { + /** + * Local implementations of OntModel can display themselves. Built-in Jena + * OntModels will show their hashcodes, base models, and sub-models. + */ + public static String ontModelToString(OntModel ontModel) { + if (ontModel == null || isVitroClass(ontModel)) { + return String.valueOf(ontModel); + } else { + Model base = ontModel.getBaseModel(); + Graph baseGraph = base.getGraph(); + List subGraphs = ontModel.getSubGraphs(); + return simpleName(ontModel) + "[" + hashHex(ontModel) + ", base=" + + modelToString(base) + ", subgraphs=" + + subGraphsToString(subGraphs, baseGraph) + "]"; + } + } + + /** Show the sub-graphs, except for the base graph. */ + private static String subGraphsToString(Collection subGraphs, + Graph baseGraph) { + Set set = new HashSet<>(subGraphs); + set.remove(baseGraph); + return setOfGraphsToString(set); + } + + private static String setOfGraphsToString(Set set) { + Set strings = new HashSet<>(); + for (Graph g : set) { + strings.add(graphToString(g)); + } + return "[" + StringUtils.join(strings, ", ") + "]"; + } + + /** + * Local implementations of Model can display themselves. Built-in Jena + * Graphs will show their hashcodes and graphs. + */ + public static String modelToString(Model model) { + if (model == null || isVitroClass(model)) { + return String.valueOf(model); + } else { + return simpleName(model) + "[" + hashHex(model) + ", base=" + + graphToString(model.getGraph()) + "]"; + } + } + + /** + * Local implementations of Graph can display themselves. Built-in Jena + * Graphs will show their hashcodes. + */ + public static String graphToString(Graph graph) { + if (graph == null || isVitroClass(graph)) { + return String.valueOf(graph); + } else if (graph instanceof Polyadic) { + return polyadicGraphToString((Polyadic) graph); + } else { + return simpleName(graph) + "[" + hashHex(graph) + "]"; + } + } + + private static String polyadicGraphToString(Polyadic poly) { + Graph baseGraph = poly.getBaseGraph(); + List subGraphs = poly.getSubGraphs(); + return simpleName(poly) + "[" + hashHex(poly) + ", base=" + + graphToString(baseGraph) + ", subgraphs=" + + subGraphsToString(subGraphs, baseGraph) + "]"; + } + + /** + * If the string is found in ModelNames, return the name of the constant. If + * not, use the string itself. + * + * TODO: Make it work. + */ + public static String modelName(String name) { + return name; + } + + public static boolean isVitroClass(Object o) { + return (o == null) ? false : o.getClass().getName() + .startsWith("edu.cornell"); + } + + public static String simpleName(Object o) { + return (o == null) ? "null" : o.getClass().getSimpleName(); + } + + public static String hashHex(Object o) { + return (o == null) ? "00000000" : Integer.toString(o.hashCode(), 16); + } + + /** + * This class contains only static methods. No need for an instance. + */ + private ToString() { + // Nothing to initialize. + } +}