* @throws SAXException
   *           if an exception is thrown by the ContentHandler
   */
  public static void typeSystem2Xml(TypeSystem aTypeSystem, ContentHandler aContentHandler)
          throws SAXException {
    ResourceSpecifierFactory factory = UIMAFramework.getResourceSpecifierFactory();
    TypeSystemDescription tsDesc = factory.createTypeSystemDescription();
    List typeDescs = new ArrayList();
    Iterator typeIterator = aTypeSystem.getTypeIterator();
    while (typeIterator.hasNext()) {
      Type type = (Type) typeIterator.next();
      Type superType = aTypeSystem.getParent(type);
      if (type.getName().startsWith("uima.cas") && type.isFeatureFinal()) {
        continue; // this indicates a primitive type
      }
      TypeDescription typeDesc = factory.createTypeDescription();
      typeDesc.setName(type.getName());
      typeDesc.setSupertypeName(superType.getName());
      List featDescs = new ArrayList();
      Iterator featIterator = type.getFeatures().iterator();
      while (featIterator.hasNext()) {
        Feature feat = (Feature) featIterator.next();
        FeatureDescription featDesc = factory.createFeatureDescription();
        featDesc.setName(feat.getShortName());
        featDesc.setRangeTypeName(feat.getRange().getName());
        featDescs.add(featDesc);
      }
      FeatureDescription[] featDescArr = new FeatureDescription[featDescs.size()];
      featDescs.toArray(featDescArr);
      typeDesc.setFeatures(featDescArr);
      // check for string subtypes
      if (type instanceof StringTypeImpl) {
  LowLevelTypeSystem lts = aTypeSystem.getLowLevelTypeSystem();
  final int typeCode = lts.ll_getCodeForType(type);
        String[] strings = lts.ll_getStringSet(typeCode);
        AllowedValue[] allowedVals = new AllowedValue[strings.length];
        for (int i = 0; i < strings.length; i++) {
          allowedVals[i] = factory.createAllowedValue();
          allowedVals[i].setString(strings[i]);
        }
        typeDesc.setAllowedValues(allowedVals);
      }