@Override
  public void visit(OWLSubClassAxiom owlSubClassAxiom) {
    // get the complex description out of the axiom
    List<OWLDescription> descriptions =
        new ArrayList<OWLDescription>(owlSubClassAxiom.getDescriptions());

    for (OWLDescription description : descriptions) {
      // visit the description and record replacment
      description.accept(descriptionVisitor);
    }

    // construct new Axiom
    OWLDescription subReplace =
        descriptionVisitor.getReplacements().get(owlSubClassAxiom.getSubClass());
    OWLDescription superReplace =
        descriptionVisitor.getReplacements().get(owlSubClassAxiom.getSuperClass());

    if (subReplace == null) {
      subReplace = owlSubClassAxiom.getSubClass();
    }
    if (superReplace == null) {
      superReplace = owlSubClassAxiom.getSuperClass();
    }

    OWLSubClassAxiom replacementAxiom =
        owlDataFactory.getOWLSubClassAxiom(subReplace, superReplace);

    // create the changeevents that have to be performed on the ontology
    try {
      List<OWLAxiomChange> replaceEvent =
          OWLUtils.createReplaceAxiomEvents(owlOntology, owlSubClassAxiom, replacementAxiom);
      axiomChanges.addAll(replaceEvent);

    } catch (OWLOntologyChangeException e) {
      e
          .printStackTrace(); // To change body of catch statement use File | Settings | File
                              // Templates.
    }

    // clear the description visitor
    descriptionVisitor.clear();

    super.visit(owlSubClassAxiom);
  }
  private void _createNewOntology() throws Exception {

    assert namespace.matches(".*(/|#)");

    String baseUri = namespace.replaceAll("(/|#)+$", ""); // removing any trailing slash/hash

    manager = new SKOSManager();

    if (namespace.endsWith("#")) {
      // Ok, OWLAPI v2 works fine with hash separator:
      dataset = manager.createSKOSDataset(URI.create(baseUri));
    } else {
      /////////////////////////////////////////////////////////////////////////////////////////////
      // TODO NOTE: workaround for bug in OWLAPI v2:
      // Instead of using a baseUri without separator,
      // use the namespace itself (ie, w/ fragment separator):
      dataset = manager.createSKOSDataset(URI.create(namespace));
      // In this way, the resulting ontology looks OK except that the xml:base is
      // written with the separator:
      //
      //		<rdf:RDF xmlns="http://mmisw.org/ont/mmi/cf/parameter/"
      //		     xml:base="http://mmisw.org/ont/mmi/cf/parameter/"    <<<--- WITH trailing slash
      //		     xmlns:owl2xml="http://www.w3.org/2006/12/owl2-xml#"
      //		     xmlns:xsd="http://www.w3.org/2001/XMLSchema#"
      //		     xmlns:owl2="http://www.w3.org/2006/12/owl2#"
      //		     xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#"
      //		     xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
      //		     xmlns:owl="http://www.w3.org/2002/07/owl#"
      //		     xmlns:skos="http://www.w3.org/2004/02/skos/core#">
      //		    <owl:Ontology rdf:about=""/>
      //		...
      //	    <!-- http://mmisw.org/ont/mmi/cf/parameter/CfStdName -->
      //
      //	        <skos:ConceptScheme rdf:about="CfStdName"/>
      //
      //
      //	        <!-- http://mmisw.org/ont/mmi/cf/parameter/age_of_stratospheric_air -->
      //
      //	        <skos:Concept rdf:about="age_of_stratospheric_air">
      //	            <skos:inScheme rdf:resource="CfStdName"/>
      //	        </skos:Concept>
      //
      //
      //	        <!-- http://mmisw.org/ont/mmi/cf/parameter/air_density -->
      //
      //	        <skos:Concept rdf:about="air_density">
      //	            <skos:inScheme rdf:resource="CfStdName"/>
      //	        </skos:Concept>
      //
      //		...
      /////////////////////////////////////////////////////////////////////////////////////////////
    }

    SAXBuilder builder = new SAXBuilder();
    Document document = builder.build(new StringReader(inputContents));

    standard_name_table = document.getRootElement();

    _getProperty(standard_name_table, "version_number");
    _getProperty(standard_name_table, "last_modified");
    _getProperty(standard_name_table, "institution");
    _getProperty(standard_name_table, "contact");

    // TODO assign version_number, last_modified as some properties to the ontology itself.

    dataFactory = manager.getSKOSDataFactory();

    allEntities = new ArrayList<SKOSEntity>();
    conceptScheme = dataFactory.getSKOSConceptScheme(URI.create(namespace + CONCEPT_SCHEME));
    concepts = new HashSet<SKOSConcept>();

    URI topConceptUri = URI.create(namespace + TOP_CONCEPT);
    topConcept = dataFactory.getSKOSConcept(topConceptUri);
    concepts.add(topConcept);

    objectRelationAssertions = new ArrayList<SKOSObjectRelationAssertion>();
    dataRelationAssertions = new ArrayList<SKOSDataRelationAssertion>();

    // skos:hasTopConcept
    objectRelationAssertions.add(
        dataFactory.getSKOSObjectRelationAssertion(
            conceptScheme, dataFactory.getSKOSHasTopConceptProperty(), topConcept));

    /////////////////////////////////////////////////
    // OWL API stuff
    owlManager = manager.getOWLManger();
    owlOntology = owlManager.getOntology(URI.create(namespace));
    owlDataFactory = owlManager.getOWLDataFactory();

    canonicalUnitsProp =
        owlDataFactory.getOWLDataProperty(URI.create(namespace + "canonical_units"));
    gribProp = owlDataFactory.getOWLDataProperty(URI.create(namespace + "grib"));
    amipProp = owlDataFactory.getOWLDataProperty(URI.create(namespace + "amip"));

    rdfsLabel =
        owlDataFactory.getOWLDataProperty(URI.create("http://www.w3.org/2000/01/rdf-schema#label"));
    rdfsComment =
        owlDataFactory.getOWLDataProperty(
            URI.create("http://www.w3.org/2000/01/rdf-schema#comment"));

    owlChanges = new ArrayList<AddAxiom>();

    _addOwlChange(topConceptUri, TOP_CONCEPT.replace('_', ' '), "", null, null, null);
  }
  private void _addOwlChange(
      URI conceptUri,
      String id,
      String description,
      String canonicalUnits,
      String grib,
      String amip) {

    OWLIndividual conceptOwlIndiv = owlDataFactory.getOWLIndividual(conceptUri);

    // rdfs:label
    if (id.trim().length() > 0) {
      OWLTypedConstant owlc = owlDataFactory.getOWLTypedConstant(id.trim());
      OWLDataPropertyAssertionAxiom addProp =
          owlDataFactory.getOWLDataPropertyAssertionAxiom(conceptOwlIndiv, rdfsLabel, owlc);
      owlChanges.add(new AddAxiom(owlOntology, addProp));
    }

    // rdfs:comment
    if (description.trim().length() > 0) {
      OWLTypedConstant owlc = owlDataFactory.getOWLTypedConstant(description.trim());
      OWLDataPropertyAssertionAxiom addProp =
          owlDataFactory.getOWLDataPropertyAssertionAxiom(conceptOwlIndiv, rdfsComment, owlc);
      owlChanges.add(new AddAxiom(owlOntology, addProp));
    }

    // canonicalUnits
    if (canonicalUnits != null && canonicalUnits.trim().length() > 0) {
      OWLTypedConstant owlc = owlDataFactory.getOWLTypedConstant(canonicalUnits.trim());
      OWLDataPropertyAssertionAxiom addProp =
          owlDataFactory.getOWLDataPropertyAssertionAxiom(
              conceptOwlIndiv, canonicalUnitsProp, owlc);
      owlChanges.add(new AddAxiom(owlOntology, addProp));
    }

    // grib
    if (grib != null && grib.trim().length() > 0) {
      OWLTypedConstant owlc = owlDataFactory.getOWLTypedConstant(grib.trim());
      OWLDataPropertyAssertionAxiom addProp =
          owlDataFactory.getOWLDataPropertyAssertionAxiom(conceptOwlIndiv, gribProp, owlc);
      owlChanges.add(new AddAxiom(owlOntology, addProp));
    }
    // amip
    if (amip != null && amip.trim().length() > 0) {
      OWLTypedConstant owlc = owlDataFactory.getOWLTypedConstant(amip.trim());
      OWLDataPropertyAssertionAxiom addProp =
          owlDataFactory.getOWLDataPropertyAssertionAxiom(conceptOwlIndiv, amipProp, owlc);
      owlChanges.add(new AddAxiom(owlOntology, addProp));
    }
  }