| /* |
| * 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 |
| /////////////// |
| package jena.examples.ontology.classHierarchy; |
| |
| |
| import java.io.PrintStream; |
| import java.util.*; |
| |
| // Imports |
| /////////////// |
| import org.apache.jena.ontology.OntClass; |
| import org.apache.jena.ontology.OntModel; |
| import org.apache.jena.ontology.Restriction; |
| import org.apache.jena.rdf.model.AnonId; |
| import org.apache.jena.rdf.model.Resource; |
| import org.apache.jena.shared.PrefixMapping; |
| |
| |
| /** |
| * <p> |
| * Simple demonstration program to show how to list a hierarchy of classes. This |
| * is not a complete solution to the problem (sub-classes of restrictions, for example, |
| * are not shown). It is intended only to be illustrative of the general approach. |
| * </p> |
| */ |
| public class ClassHierarchy { |
| // Constants |
| ////////////////////////////////// |
| |
| // Static variables |
| ////////////////////////////////// |
| |
| // Instance variables |
| ////////////////////////////////// |
| |
| protected OntModel m_model; |
| private Map<AnonId,String> m_anonIDs = new HashMap<AnonId, String>(); |
| private int m_anonCount = 0; |
| |
| |
| |
| // Constructors |
| ////////////////////////////////// |
| |
| // External signature methods |
| ////////////////////////////////// |
| |
| /** Show the sub-class hierarchy encoded by the given model */ |
| public void showHierarchy( PrintStream out, OntModel m ) { |
| // create an iterator over the root classes that are not anonymous class expressions |
| Iterator<OntClass> i = m.listHierarchyRootClasses() |
| .filterDrop( OntClass::isAnon ); |
| |
| while (i.hasNext()) { |
| showClass( out, i.next(), new ArrayList<OntClass>(), 0 ); |
| } |
| } |
| |
| |
| // Internal implementation methods |
| ////////////////////////////////// |
| |
| /** Present a class, then recurse down to the sub-classes. |
| * Use occurs check to prevent getting stuck in a loop |
| */ |
| protected void showClass( PrintStream out, OntClass cls, List<OntClass> occurs, int depth ) { |
| renderClassDescription( out, cls, depth ); |
| out.println(); |
| |
| // recurse to the next level down |
| if (cls.canAs( OntClass.class ) && !occurs.contains( cls )) { |
| for (Iterator<OntClass> i = cls.listSubClasses( true ); i.hasNext(); ) { |
| OntClass sub = i.next(); |
| |
| // we push this expression on the occurs list before we recurse |
| occurs.add( cls ); |
| showClass( out, sub, occurs, depth + 1 ); |
| occurs.remove( cls ); |
| } |
| } |
| } |
| |
| |
| /** |
| * <p>Render a description of the given class to the given output stream.</p> |
| * @param out A print stream to write to |
| * @param c The class to render |
| */ |
| public void renderClassDescription( PrintStream out, OntClass c, int depth ) { |
| indent( out, depth ); |
| |
| if (c.isRestriction()) { |
| renderRestriction( out, c.as( Restriction.class ) ); |
| } |
| else { |
| if (!c.isAnon()) { |
| out.print( "Class " ); |
| renderURI( out, c.getModel(), c.getURI() ); |
| out.print( ' ' ); |
| } |
| else { |
| renderAnonymous( out, c, "class" ); |
| } |
| } |
| } |
| |
| /** |
| * <p>Handle the case of rendering a restriction.</p> |
| * @param out The print stream to write to |
| * @param r The restriction to render |
| */ |
| protected void renderRestriction( PrintStream out, Restriction r ) { |
| if (!r.isAnon()) { |
| out.print( "Restriction " ); |
| renderURI( out, r.getModel(), r.getURI() ); |
| } |
| else { |
| renderAnonymous( out, r, "restriction" ); |
| } |
| |
| out.print( " on property " ); |
| renderURI( out, r.getModel(), r.getOnProperty().getURI() ); |
| } |
| |
| /** Render a URI */ |
| protected void renderURI( PrintStream out, PrefixMapping prefixes, String uri ) { |
| out.print( prefixes.shortForm( uri ) ); |
| } |
| |
| /** Render an anonymous class or restriction */ |
| protected void renderAnonymous( PrintStream out, Resource anon, String name ) { |
| String anonID = m_anonIDs.get( anon.getId() ); |
| if (anonID == null) { |
| anonID = "a-" + m_anonCount++; |
| m_anonIDs.put( anon.getId(), anonID ); |
| } |
| |
| out.print( "Anonymous "); |
| out.print( name ); |
| out.print( " with ID " ); |
| out.print( anonID ); |
| } |
| |
| /** Generate the indentation */ |
| protected void indent( PrintStream out, int depth ) { |
| for (int i = 0; i < depth; i++) { |
| out.print( " " ); |
| } |
| } |
| |
| |
| //============================================================================== |
| // Inner class definitions |
| //============================================================================== |
| |
| } |