private void loadGlobalConceptDomains() throws Exception {
    logger.log("Load Concept Domains", LogMessageType.Process);

    BindingsParser parser =
        new BindingsParser(
            new CSFileInputStream(new CSFile(termDir + "bindings.xml")),
            termDir + "bindings.xml",
            srcDir,
            registry);
    List<BindingSpecification> cds = parser.parse();

    for (BindingSpecification cd : cds) {
      definitions.getBindings().put(cd.getName(), cd);
      definitions.getCommonBindings().add(cd);
    }

    for (BindingSpecification cd : definitions.getBindings().values()) {
      if (cd.getBinding() == BindingSpecification.Binding.CodeList) {
        if (!parser.loadCodes(cd)) {
          File file = new CSFile(termDir + cd.getReference().substring(1) + ".csv");
          if (!file.exists())
            throw new Exception(
                "code source file not found for " + cd.getName() + ": " + file.getAbsolutePath());
          CodeListParser cparser = new CodeListParser(new CSFileInputStream(file));
          cparser.parse(cd.getCodes());
          cparser.close();
        }
      }
      if (cd.getBinding() == Binding.ValueSet && !Utilities.noString(cd.getReference())) {
        if (cd.getReference().startsWith("http://hl7.org/fhir")) {
          // ok, it's a reference to a value set defined within this build. Since it's an absolute
          // reference, it's into the base infrastructure. That's not loaded yet, so we will try
          // to resolve it later
        } else if (new File(Utilities.appendSlash(termDir) + cd.getReference() + ".xml").exists()) {
          XmlParser p = new XmlParser();
          FileInputStream input =
              new FileInputStream(Utilities.appendSlash(termDir) + cd.getReference() + ".xml");
          cd.setReferredValueSet((ValueSet) p.parse(input));
        } else if (new File(Utilities.appendSlash(termDir) + cd.getReference() + ".json")
            .exists()) {
          JsonParser p = new JsonParser();
          FileInputStream input =
              new FileInputStream(Utilities.appendSlash(termDir) + cd.getReference() + ".json");
          cd.setReferredValueSet((ValueSet) p.parse(input));
        } else
          throw new Exception(
              "Unable to find source for "
                  + cd.getReference()
                  + " ("
                  + Utilities.appendSlash(termDir)
                  + cd.getReference()
                  + ".xml/json)");
      }
    }
  }
  public void parse(Calendar genDate, String version) throws Exception {
    logger.log("Loading", LogMessageType.Process);

    eCoreParseResults = DefinitionsImpl.build(genDate.getTime(), version);

    loadGlobalConceptDomains();
    eCoreParseResults
        .getBinding()
        .addAll(
            sortBindings(
                BindingConverter.buildBindingsFromFhirModel(
                    definitions.getBindings().values(), null)));

    loadPrimitives();

    eCoreParseResults
        .getPrimitive()
        .addAll(
            PrimitiveConverter.buildPrimitiveTypesFromFhirModel(
                definitions.getPrimitives().values()));

    for (String n : ini.getPropertyNames("removed-resources"))
      definitions.getDeletedResources().add(n);

    for (String n : ini.getPropertyNames("types")) loadCompositeType(n, definitions.getTypes());
    for (String n : ini.getPropertyNames("structures"))
      loadCompositeType(n, definitions.getStructures());

    String[] shared = ini.getPropertyNames("shared");
    if (shared != null)
      for (String n : shared)
        definitions.getShared().add(loadCompositeType(n, definitions.getStructures()));

    for (String n : ini.getPropertyNames("infrastructure"))
      loadCompositeType(n, definitions.getInfrastructure());

    List<TypeDefn> allFhirComposites = new ArrayList<TypeDefn>();

    allFhirComposites.add(CompositeTypeConverter.buildElementBaseType());

    allFhirComposites.addAll(
        PrimitiveConverter.buildCompositeTypesForPrimitives(eCoreParseResults.getPrimitive()));

    allFhirComposites.addAll(
        CompositeTypeConverter.buildCompositeTypesFromFhirModel(
            definitions.getTypes().values(), null));

    allFhirComposites.addAll(
        CompositeTypeConverter.buildCompositeTypesFromFhirModel(
            definitions.getStructures().values(), null));

    List<CompositeTypeDefn> infra =
        CompositeTypeConverter.buildCompositeTypesFromFhirModel(
            definitions.getInfrastructure().values(), null);
    for (CompositeTypeDefn composite : infra) composite.setInfrastructure(true);
    allFhirComposites.addAll(infra);

    allFhirComposites.addAll(
        ConstrainedTypeConverter.buildConstrainedTypesFromFhirModel(
            definitions.getConstraints().values(), definitions.getConstraintInvariants()));

    eCoreParseResults.getType().addAll(sortTypes(allFhirComposites));

    for (String n : ini.getPropertyNames("resources"))
      loadResource(n, definitions.getResources(), false);

    ResourceDefn baseResource = loadResource("resource", null, false);
    baseResource.setAbstract(true);
    definitions.setBaseResource(baseResource);

    loadCompartments();
    loadStatusCodes();

    org.hl7.fhir.definitions.ecore.fhir.ResourceDefn eCoreBaseResource =
        CompositeTypeConverter.buildResourceFromFhirModel(baseResource, null);
    eCoreBaseResource.getElement().add(CompositeTypeConverter.buildInternalIdElement());
    eCoreParseResults.getType().add(eCoreBaseResource);

    eCoreParseResults
        .getType()
        .addAll(
            sortTypes(
                CompositeTypeConverter.buildResourcesFromFhirModel(
                    definitions.getResources().values())));

    eCoreParseResults.getType().add(CompositeTypeConverter.buildBinaryResourceDefn());

    for (String n : ini.getPropertyNames("svg"))
      definitions.getDiagrams().put(n, ini.getStringProperty("svg", n));

    if (ini.getPropertyNames("future-resources") != null)
      for (String n : ini.getPropertyNames("future-resources")) {
        DefinedCode cd =
            new DefinedCode(ini.getStringProperty("future-resources", n), "Yet to be defined", n);
        definitions.getKnownResources().put(n, cd);

        ResourceDefn futureResource = new ResourceDefn();
        futureResource.setName(cd.getCode());
        futureResource.setDefinition("Future resource " + cd.getCode() + ". As yet undefined.");
        futureResource.setForFutureUse(true);
        definitions.getFutureResources().put(cd.getCode(), futureResource);
      }

    eCoreParseResults
        .getType()
        .addAll(
            CompositeTypeConverter.buildResourcesFromFhirModel(
                definitions.getFutureResources().values()));

    eCoreParseResults
        .getEvent()
        .addAll(EventConverter.buildEventsFromFhirModel(definitions.getEvents().values()));

    // As a second pass, resolve typerefs to the types
    fixTypeRefs(eCoreParseResults);

    eCoreParseResults
        .getBinding()
        .add(BindingConverter.buildResourceTypeBinding(eCoreParseResults));

    for (String n : ini.getPropertyNames("special-resources"))
      definitions.getAggregationEndpoints().add(n);

    String[] pn = ini.getPropertyNames("valuesets");
    if (pn != null)
      for (String n : pn) {
        loadValueSet(n);
      }
    for (String n : ini.getPropertyNames("profiles")) {
      loadProfile(n, definitions.getProfiles());
    }

    for (ResourceDefn r : definitions.getResources().values()) {
      for (RegisteredProfile p : r.getProfiles()) {
        SpreadsheetParser sparser =
            new SpreadsheetParser(
                new CSFileInputStream(p.getFilepath()),
                p.getName(),
                definitions,
                srcDir,
                logger,
                registry);
        sparser.setFolder(Utilities.getDirectoryForFile(p.getFilepath()));
        p.setProfile(sparser.parseProfile(definitions));
      }
    }
  }