/**
   * Artifact is either retrieved or prepared for later addition to registry
   *
   * @param ga
   * @return
   */
  private GovernanceArtifact addArtifact(RBGGovernanceArtifact ga) {
    boolean checkChanged = false;
    boolean isNewer = false;
    GenericArtifactManager gam = registryFactory.getManagerForArtifactType(ga.getRegistryType());
    GenericArtifact fa = (GenericArtifact) findMatchingArtifact(ga);
    log.info("working on: " + ga.getName());
    try {
      if (fa != null) {
        isNewer = isVersionNewer(ga.getVersion(), fa.getAttribute("details_version"));
        checkChanged = updateAttributes(ga, fa);
      } else {
        fa = gam.newGovernanceArtifact(new QName(ga.getName())); // artifactname
        fa.setAttribute("details_version", ga.getVersion());
        updateAttributes(ga, fa);
        gam.addGenericArtifact(fa);
        handleLifeCycle(ga, fa);
      }
      if (isNewer) {
        if (checkChanged) {
          gam.updateGenericArtifact(fa);
          log.info("updated: " + ga.getName());
        }
        handleLifeCycle(ga, fa);
      }
    } catch (GovernanceException e) {
      log.error(e.getMessage());
    } catch (RegistryException e) {
      log.error(e.getMessage());
    }

    return fa;
  }
  private void processModelContainer(ModelContainer mc) {
    Map<RBGGovernanceArtifact, GovernanceArtifact> rbgToGen =
        new HashMap<RBGGovernanceArtifact, GovernanceArtifact>();
    Set<RBGGovernanceArtifact> toBeUpated = new HashSet<RBGGovernanceArtifact>();

    // create Artifacts: apps, modules, appservices
    for (Application app : mc.getApplications()) {
      GovernanceArtifact ga = addArtifact(app);
      rbgToGen.put(app, ga);
    }
    for (Module module : mc.getModules()) {
      GovernanceArtifact ga = addArtifact(module);
      rbgToGen.put(module, ga);
    }
    for (ApplicationService as : mc.getApplicationServices()) {
      if (as instanceof HostProgram) {
        HostProgram hp = (HostProgram) as;
        GovernanceArtifact ga = addArtifact(hp);
        rbgToGen.put(as, ga);
      }
    }
    for (Table table : mc.getTables()) {
      GovernanceArtifact ga = addArtifact(table);
      rbgToGen.put(table, ga);
    }

    for (Infrastructure infra : mc.getInfrastructure()) {
      GovernanceArtifact ga = addArtifact(infra);
      rbgToGen.put(infra, ga);
    }

    // create Links
    for (UseRelation ur : mc.getUseRelations()) {
      GovernanceArtifact ga = rbgToGen.get(ur.getSource());
      boolean needsUpdate = createLink(ur, ga);
      if (needsUpdate) {
        toBeUpated.add(ur.getSource());
      } // CHECK FOR CHANGED VRSION!!
    }
    for (CallRelation cr : mc.getCallRelations()) {
      GovernanceArtifact ga = rbgToGen.get(cr.getSource());
      boolean needsUpdate = createLink(cr, ga);
      if (needsUpdate) {
        toBeUpated.add(cr.getSource());
      }
    }

    // update those, which really need it...
    List<RBGGovernanceArtifact> upds = new ArrayList<RBGGovernanceArtifact>(toBeUpated);
    for (RBGGovernanceArtifact ra : upds) {
      GenericArtifact ga = (GenericArtifact) rbgToGen.get(ra);
      GenericArtifactManager gam = registryFactory.getManagerForArtifactType(ra.getRegistryType());
      try {
        gam.updateGenericArtifact(ga);
      } catch (GovernanceException e) {
        log.error("link creation problem addGenericArtifact " + e.getMessage());
      }
    }
  }