@Test
  public void testParsingCite100DataFeatures()
      throws ClassCastException, ClassNotFoundException, InstantiationException,
          IllegalAccessException {

    String schemaURL = this.getClass().getResource("../testdata/schema/cite/all.xsd").toString();
    ApplicationSchemaXSDDecoder adapter =
        new ApplicationSchemaXSDDecoder(GMLVersion.GML_2, null, schemaURL);
    FeatureType[] fts = adapter.extractFeatureTypeSchema().getFeatureTypes();
    Assert.assertEquals(19, fts.length);
  }
  @Test
  public void testParsingPhilosopher()
      throws ClassCastException, ClassNotFoundException, InstantiationException,
          IllegalAccessException {

    String schemaURL = this.getClass().getResource("../testdata/schema/Philosopher.xsd").toString();
    ApplicationSchemaXSDDecoder adapter =
        new ApplicationSchemaXSDDecoder(GMLVersion.GML_31, null, schemaURL);
    FeatureType[] fts = adapter.extractFeatureTypeSchema().getFeatureTypes();
    Assert.assertEquals(4, fts.length);
    // TODO do more thorough testing
  }
  // @Test
  public void testParsingXPlanGML20()
      throws ClassCastException, ClassNotFoundException, InstantiationException,
          IllegalAccessException {

    String schemaURL =
        "file:/home/schneider/workspace/lkee_xplanung2/resources/schema/XPlanGML_2_0/XPlanGml.xsd";
    ApplicationSchemaXSDDecoder adapter =
        new ApplicationSchemaXSDDecoder(GMLVersion.GML_31, null, schemaURL);
    FeatureType ft =
        adapter
            .extractFeatureTypeSchema()
            .getFeatureType(new QName("http://www.xplanung.de/xplangml", "BP_Plan"));
    System.out.println(ft);
    // TODO do more thorough testing
  }
  @Test
  public void testParsingCite110SF2()
      throws ClassCastException, ClassNotFoundException, InstantiationException,
          IllegalAccessException {

    String schemaURL =
        this.getClass().getResource("../testdata/schema/cite/cite-gmlsf2.xsd").toString();
    ApplicationSchemaXSDDecoder adapter =
        new ApplicationSchemaXSDDecoder(GMLVersion.GML_31, null, schemaURL);
    FeatureType[] fts = adapter.extractFeatureTypeSchema().getFeatureTypes();
    for (int i = 0; i < fts.length; i++) {
      System.out.println(fts[i]);
    }

    // TODO do more thorough testing
  }
  @Test
  public void testParsingCite110SF1()
      throws ClassCastException, ClassNotFoundException, InstantiationException,
          IllegalAccessException {

    String schemaURL =
        this.getClass().getResource("../testdata/schema/cite/cite-gmlsf1.xsd").toString();
    ApplicationSchemaXSDDecoder adapter =
        new ApplicationSchemaXSDDecoder(GMLVersion.GML_31, null, schemaURL);
    FeatureType[] fts = adapter.extractFeatureTypeSchema().getFeatureTypes();
    Assert.assertEquals(4, fts.length);
    for (FeatureType ft : fts) {
      System.out.println("\nFt: " + ft.getName());
      for (PropertyType pt : ft.getPropertyDeclarations()) {
        System.out.println(pt);
      }
    }
  }
  @Test
  public void testParsingCityGML()
      throws ClassCastException, ClassNotFoundException, InstantiationException,
          IllegalAccessException {

    String schemaURL = "http://schemas.opengis.net/citygml/profiles/base/1.0/CityGML.xsd";
    ApplicationSchemaXSDDecoder adapter =
        new ApplicationSchemaXSDDecoder(GMLVersion.GML_31, null, schemaURL);
    ApplicationSchema schema = adapter.extractFeatureTypeSchema();
    FeatureType[] fts = schema.getFeatureTypes();
    Assert.assertEquals(54, fts.length);

    FeatureType buildingFt =
        schema.getFeatureType(
            QName.valueOf("{http://www.opengis.net/citygml/building/1.0}Building"));
    PropertyType<?> pt =
        buildingFt.getPropertyDeclaration(
            QName.valueOf(
                "{http://www.opengis.net/citygml/1.0}_GenericApplicationPropertyOfCityObject"));
    Assert.assertEquals(8, pt.getSubstitutions().length);
  }
  private ApplicationSchema buildApplicationSchema(XMLStreamReaderWrapper xmlStream)
      throws XMLParsingException {
    String schemaLocation = xmlStream.getAttributeValue(XSINS, "schemaLocation");
    if (schemaLocation == null) {
      throw new XMLParsingException(
          xmlStream, Messages.getMessage("ERROR_NO_SCHEMA_LOCATION", xmlStream.getSystemId()));
    }

    String[] tokens = schemaLocation.trim().split("\\s+");
    if (tokens.length % 2 != 0) {
      throw new XMLParsingException(
          xmlStream,
          Messages.getMessage("ERROR_SCHEMA_LOCATION_TOKENS_COUNT", xmlStream.getSystemId()));
    }
    String[] schemaUrls = new String[tokens.length / 2];
    for (int i = 0; i < schemaUrls.length; i++) {
      String schemaUrl = tokens[i * 2 + 1];
      try {
        schemaUrls[i] = new URL(new URL(xmlStream.getSystemId()), schemaUrl).toString();
      } catch (MalformedURLException e) {
        throw new XMLParsingException(
            xmlStream, "Error parsing application schema: " + e.getMessage());
      }
    }

    // TODO handle multi-namespace schemas
    ApplicationSchema schema = null;
    try {
      ApplicationSchemaXSDDecoder decoder =
          new ApplicationSchemaXSDDecoder(version, null, schemaUrls);
      schema = decoder.extractFeatureTypeSchema();
    } catch (Exception e) {
      e.printStackTrace();
      throw new XMLParsingException(
          xmlStream, "Error parsing application schema: " + e.getMessage());
    }
    return schema;
  }