/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you 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 org.apache.jena.util; import java.io.PrintWriter ; import java.util.Iterator ; import java.util.Map ; import org.apache.jena.datatypes.xsd.XSDDatatype ; import org.apache.jena.graph.* ; import org.apache.jena.rdf.model.RDFNode ; import org.apache.jena.rdf.model.Statement ; import org.apache.jena.rdf.model.impl.Util ; import org.apache.jena.reasoner.TriplePattern ; import org.apache.jena.shared.PrefixMapping ; import org.apache.jena.vocabulary.OWL ; import org.apache.jena.vocabulary.RDF ; import org.apache.jena.vocabulary.RDFS ; import org.apache.jena.vocabulary.ReasonerVocabulary ; /** * A collection of small utilites for pretty printing nodes, triples * and associated things. The core functionality here is a static * prefix map which is preloaded with known prefixes. */ public class PrintUtil { protected static PrefixMapping prefixMapping = PrefixMapping.Factory.create(); /** Default built in eg namespace used in testing */ public static final String egNS = "urn:x-hp:eg/"; static { init(); } /** * Load built in prefixes. */ public static void init() { registerPrefix("rdf", RDF.getURI()); registerPrefix("rdfs", RDFS.getURI()); registerPrefix("drdfs", "urn:x-hp-direct-predicate:http_//www.w3.org/2000/01/rdf-schema#"); registerPrefix("owl", OWL.getURI()); registerPrefix("jr", ReasonerVocabulary.getJenaReasonerNS()); registerPrefix("rb", ReasonerVocabulary.getRBNamespace()); registerPrefix("eg", egNS); registerPrefix("xsd", XSDDatatype.XSD + "#"); } /** * Register a new prefix/namespace mapping which will be used to shorten * the print strings for resources in known namespaces. */ public static void registerPrefix(String prefix, String namespace) { prefixMapping.setNsPrefix( prefix, namespace ); } /** * Register a set of new prefix/namespace mapping which will be used to shorten * the print strings for resources in known namespaces. */ public static void registerPrefixMap(Map<String, String> map) { prefixMapping.setNsPrefixes( map ); } /** * Remove a registered prefix from the table of known short forms */ public static void removePrefix(String prefix) { prefixMapping.removeNsPrefix(prefix); } /** * Remove a set of prefix mappings from the table of known short forms */ public static void removePrefixMap(Map<String, String> map) { for ( String s : map.keySet() ) { prefixMapping.removeNsPrefix( s ); } } /** * Return a simplified print string for a Node. */ public static String print(Node node) { if (node instanceof Node_URI) { String uri = ((Node_URI)node).getURI(); String suri = prefixMapping == null ? uri : prefixMapping.shortForm(uri); if (uri.equals(suri)) { return "<" + uri + ">"; } else { return suri; } } else if (node instanceof Node_Literal) { String lf = node.getLiteralLexicalForm(); // RDF 1.1 : Print xsd:string without ^^xsd:string return "'" + lf + "'" + (Util.isSimpleString(node) ? "" : "^^" + node.getLiteralDatatypeURI()); } else if (node instanceof Node_ANY) { return "*"; } if (node == null) { return "null"; } return node.toString(); } /** * Return a simplified print string for an RDFNode. */ public static String print(RDFNode node) { if (node == null) return "null"; return print(node.asNode()); } /** * Return a simplified print string for a Triple */ public static String print(Triple triple) { if (triple == null) return "(null)"; return "(" + print(triple.getSubject()) + " " + print(triple.getPredicate()) + " " + print(triple.getObject()) + ")"; } /** * Return a simplified print string for a TriplePattern */ public static String print(TriplePattern triple) { if (triple == null) return "(null)"; return "(" + print(triple.getSubject()) + " " + print(triple.getPredicate()) + " " + print(triple.getObject()) + ")"; } /** * Return a simplified print string for a statment */ public static String print(Statement stmt) { if (stmt == null) return "(null)"; return print(stmt.asTriple()); } /** * Default print which just uses tostring */ public static String print(Object obj) { if (obj == null) return "null"; if (obj instanceof Triple) { return print((Triple)obj); } else if (obj instanceof TriplePattern) { return print((TriplePattern)obj); } else if (obj instanceof Node) { return print((Node)obj); } else if (obj instanceof RDFNode) { return print((RDFNode)obj); } else if (obj instanceof Statement) { return print((Statement)obj); } else { return obj.toString(); } } /** * Expand qnames to URIs. If the given URI appears * to start with one of the registered prefixes then * expand the prefix, otherwise return the original URI */ public static String expandQname(String uri) { return prefixMapping.expandPrefix( uri ); } /** * Print an n-space indent to the given output stream */ public static void printIndent(PrintWriter out, int indent) { StringBuilder spaces = new StringBuilder(); for (int i = 0; i < indent; i++) spaces.append(" "); out.print(spaces.toString()); } /** * Print all the Triple values from a find iterator. */ public static void printOut( Iterator<?> it ) { while (it.hasNext()) { System.out.println(" " + print(it.next())); } } }