private String loadCompositeType(String n, Map<String, ElementDefn> map) throws Exception {
    TypeParser tp = new TypeParser();
    List<TypeRef> ts = tp.parse(n);
    definitions.getKnownTypes().addAll(ts);

    try {
      TypeRef t = ts.get(0);
      File csv = new CSFile(dtDir + t.getName().toLowerCase() + ".xml");
      if (csv.exists()) {
        SpreadsheetParser p =
            new SpreadsheetParser(
                new CSFileInputStream(csv), csv.getName(), definitions, srcDir, logger, registry);
        ElementDefn el = p.parseCompositeType();
        map.put(t.getName(), el);
        el.getAcceptableGenericTypes().addAll(ts.get(0).getParams());
        return el.getName();
      } else {
        String p = ini.getStringProperty("types", n);
        csv = new CSFile(dtDir + p.toLowerCase() + ".xml");
        if (!csv.exists()) throw new Exception("unable to find a definition for " + n + " in " + p);
        XLSXmlParser xls = new XLSXmlParser(new CSFileInputStream(csv), csv.getAbsolutePath());
        Sheet sheet = xls.getSheets().get("Restrictions");
        boolean found = false;
        for (int i = 0; i < sheet.rows.size(); i++) {
          if (sheet.getColumn(i, "Name").equals(n)) {
            found = true;
            Invariant inv = new Invariant();
            inv.setId(n);
            inv.setEnglish(sheet.getColumn(i, "Rules"));
            inv.setOcl(sheet.getColumn(i, "OCL"));
            inv.setXpath(sheet.getColumn(i, "XPath"));
            definitions.getConstraints().put(n, new DefinedCode(n, sheet.getColumn(i, "Rules"), p));
            definitions.getConstraintInvariants().put(n, inv);
          }
        }
        if (!found) throw new Exception("Unable to find definition for " + n);
        return n;
      }
    } catch (Exception e) {
      throw new Exception("Unable to load " + n + ": " + e.getMessage(), e);
    }
  }
  public void checkConditions(List<String> errors, Map<String, Long> dates) throws Exception {
    Utilities.checkFolder(srcDir, errors);
    Utilities.checkFolder(termDir, errors);
    Utilities.checkFolder(imgDir, errors);
    this.dates = dates;
    checkFile("required", termDir, "bindings.xml", errors, "all");
    checkFile("required", dtDir, "primitives.xml", errors, "all");

    for (String n : ini.getPropertyNames("types"))
      if (ini.getStringProperty("types", n).equals("")) {
        TypeRef t = new TypeParser().parse(n).get(0);
        checkFile("type definition", dtDir, t.getName().toLowerCase() + ".xml", errors, "all");
      }
    for (String n : ini.getPropertyNames("structures"))
      checkFile("structure definition", dtDir, n.toLowerCase() + ".xml", errors, "all");

    String[] shared = ini.getPropertyNames("shared");

    if (shared != null)
      for (String n : shared)
        checkFile("shared structure definition", dtDir, n.toLowerCase() + ".xml", errors, "all");

    for (String n : ini.getPropertyNames("infrastructure"))
      checkFile("infrastructure definition", dtDir, n.toLowerCase() + ".xml", errors, "all");

    for (String n : ini.getPropertyNames("resources")) {
      if (!new File(srcDir + n).exists()) errors.add("unable to find folder for resource " + n);
      else {
        if (new CSFile(srcDir + n + File.separatorChar + n + "-spreadsheet.xml").exists()) {
          checkFile(
              "definition", srcDir + n + File.separatorChar, n + "-spreadsheet.xml", errors, n);
        } else checkFile("definition", srcDir + n + File.separatorChar, n + "-def.xml", errors, n);
        checkFile("example xml", srcDir + n + File.separatorChar, n + "-example.xml", errors, n);
        // now iterate all the files in the directory checking data

        for (String fn : new File(srcDir + n + File.separatorChar).list())
          checkFile("source", srcDir + n + File.separatorChar, fn, errors, n);
      }
    }
    for (String n : ini.getPropertyNames("special-resources")) {
      if (new CSFile(srcDir + n + File.separatorChar + n + "-spreadsheet.xml").exists())
        checkFile("definition", srcDir + n + File.separatorChar, n + "-spreadsheet.xml", errors, n);
      else checkFile("definition", srcDir + n + File.separatorChar, n + "-def.xml", errors, n);
      // now iterate all the files in the directory checking data
      for (String fn : new File(srcDir + n + File.separatorChar).list())
        checkFile("source", srcDir + n + File.separatorChar, fn, errors, n);
    }
  }
 protected void generateElement(GenBlock block, ElementDefn elementDefinition) {
   List<TypeRef> types = elementDefinition.getTypes();
   boolean multipleCardinality =
       elementDefinition.getMaxCardinality() == null || elementDefinition.getMaxCardinality() > 1;
   if (types.size() > 0) {
     for (TypeRef typeRef : types) {
       String elementType = typeRef.getName();
       if (elementType.startsWith("@")) {
         handleField(block, FieldType.EMBEDDED, multipleCardinality, elementDefinition, typeRef);
       } else {
         handleField(
             block,
             FieldType.getFieldType(elementType),
             multipleCardinality,
             elementDefinition,
             typeRef);
         dataTypes.add(elementType);
       }
     }
   } else if (types.size() == 0) {
     handleField(block, FieldType.EMBEDDED, multipleCardinality, elementDefinition, null);
   }
 }
  protected String generateTypeName(ElementDefn elementDefinition, TypeRef type, boolean fixTypes) {
    String elementName = elementDefinition.getName().replace("[x]", "");
    if (elementDefinition.getTypes().size() > 1) {
      String typeName = type.getName();
      typeName = Character.toUpperCase(typeName.charAt(0)) + typeName.substring(1);
      if (FieldType.QUANTITY == FieldType.getFieldType(typeName)) {
        elementName += "Quantity";
      } else {
        elementName += typeName;
      }
    }

    if (!fixTypes) {
      return elementName;
    } else if (elementName.equals("type")) {
      elementName = "fhirType";
    } else if (elementName.equals("collection")) {
      elementName = "fhirCollection";
    } else if (elementName.equals("deleted")) {
      elementName = "fhirDeleted";
    } else if (elementName.equals("version")) {
      elementName = "versionNum";
    } else if (elementName.equals("class")) {
      elementName = "fhirClass";
    } else if (elementName.equals("hash")) {
      elementName = "fhirHash";
    } else if (elementName.equals("identity")) {
      elementName = "fhirIdentity";
    } else if (elementName.equals("modifier")) {
      elementName = "fhirModifier";
    } else if (elementName.equals("validated")) {
      elementName = "fhirValidated";
    }

    return elementName;
  }
 protected boolean isResource(ElementDefn elementDefinition) {
   for (TypeRef type : elementDefinition.getTypes()) {
     if (type.getName().endsWith(RESOURCE_TYPE)) return true;
   }
   return false;
 }