private ArrayList<Integer> getCoreChildren(int concept_id, I_IntSet allowed_status, I_Path path)
     throws Exception {
   // TODO replace with passed in config...
   I_ConfigAceFrame config = Terms.get().getActiveAceFrameConfig();
   ArrayList<Integer> ret = new ArrayList<Integer>();
   final I_TermFactory tf = Terms.get();
   I_GetConceptData c = tf.getConcept(concept_id);
   I_IntSet isa_rels = tf.newIntSet();
   isa_rels.add(SNOMED.Concept.IS_A.localize().getNid());
   isa_rels.add(ArchitectonicAuxiliary.Concept.IS_A_REL.localize().getNid());
   for (I_GetConceptData d :
       c.getDestRelOrigins(
           allowed_status,
           isa_rels,
           null,
           config.getPrecedence(),
           config.getConflictResolutionStrategy())) {
     ret.add(d.getConceptId());
   }
   Collections.sort(
       ret,
       new Comparator<Integer>() {
         public int compare(Integer obj1, Integer obj2) {
           try {
             String s1 = tf.getConcept(obj1).getInitialText();
             String s2 = tf.getConcept(obj2).getInitialText();
             return s1.compareTo(s2);
           } catch (Exception e) {
           }
           return obj1.compareTo(obj2);
         }
       });
   return ret;
 }
    public void processConcept(I_GetConceptData concept) throws Exception {
      // get origins
      I_Path architectonicPath =
          termFactory.getPath(ArchitectonicAuxiliary.Concept.ARCHITECTONIC_BRANCH.getUids());

      I_Position latestOnArchitectonicPath =
          termFactory.newPosition(architectonicPath, Integer.MAX_VALUE);

      origins.add(latestOnArchitectonicPath);

      Set<I_Position> branchPositions = new HashSet<I_Position>();

      // TODO replace with passed in config...
      I_ConfigAceFrame config = Terms.get().getActiveAceFrameConfig();

      // get all the concepts/paths/positions for the specified branches
      if (branches == null) {
        branchPositions = null;
      } else {
        for (ConceptDescriptor branch : branches) {
          I_GetConceptData currentConcept = branch.getVerifiedConcept();
          I_Path currentPath = termFactory.getPath(currentConcept.getUids());
          I_Position currentPosition = termFactory.newPosition(currentPath, Integer.MAX_VALUE);
          branchPositions.add(currentPosition);
        }
      }

      // get latest IS-A relationships
      I_IntSet isARel = termFactory.newIntSet();
      isARel.add(
          termFactory.getConcept(ArchitectonicAuxiliary.Concept.IS_A_REL.getUids()).getConceptId());

      List<? extends I_RelTuple> results =
          concept.getDestRelTuples(
              null,
              isARel,
              new PositionSetReadOnly(branchPositions),
              config.getPrecedence(),
              config.getConflictResolutionStrategy());
      if (results.size() > count) {
        String message = "Concept: " + concept + " has > 20 children.";
        getLog().info(message);
        htmlWriter.append(message);
        htmlWriter.append("<br>");
        textWriter.append(concept.getUids().toString());
        textWriter.newLine();
      }

      termFactory.addUncommitted(concept);
    }
  private void listRefset() throws Exception {
    // TODO replace with passed in config...
    I_ConfigAceFrame config = Terms.get().getActiveAceFrameConfig();

    getLog().info("refset list");
    list_file.getParentFile().mkdirs();
    PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter(this.list_file)));
    final I_TermFactory tf = Terms.get();
    if (this.path_uuid != null) {
      this.path = tf.getPath(Arrays.asList(UUID.fromString(this.path_uuid)));
    }
    // I_IntSet allowed_status = tf.newIntSet();
    // allowed_status.add(ArchitectonicAuxiliary.Concept.CURRENT.localize().getNid());
    refset_con = tf.getConcept(Arrays.asList(UUID.fromString(this.refset_con_uuid)));
    out.println("<html>");
    out.println("<head>");
    out.println("<style type=\"text/css\">");
    out.println("BODY {font:10pt sans-serif}");
    out.println("TABLE {font:10pt sans-serif; border-collapse:collapse}");
    out.println("TD {border: 1px solid; padding:5px}");
    out.println("</style>");
    out.println("</head>");
    out.println("<body>");
    out.println("<h2>");
    out.println("Refset Report");
    out.println("</h2>");
    out.println("<p>");
    out.println(
        escapeString(
            DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG).format(new Date())));
    ArrayList<Integer> refsets =
        getCoreDescendants(refset_con.getConceptId(), getActiveStatus(), this.path);
    if (this.sort_by_name) {
      Collections.sort(
          refsets,
          new Comparator<Integer>() {
            public int compare(Integer obj1, Integer obj2) {
              try {
                String s1 = tf.getConcept(obj1).getInitialText();
                String s2 = tf.getConcept(obj2).getInitialText();
                return s1.compareTo(s2);
              } catch (Exception e) {
              }
              return obj1.compareTo(obj2);
            }
          });
    }
    for (Integer con_id : refsets) {
      I_GetConceptData con = tf.getConcept(con_id);
      out.println("<h3>");
      out.println(escapeString(con.getInitialText()));
      out.println("</h3>");
      out.println("<table border=\"1\">");
      for (UUID id : con.getUids()) {
        out.println("<tr>");
        out.println("<td>");
        out.println("ID");
        out.println("<td>");
        out.println(escapeString(String.valueOf(id)));
      }
      for (String r :
          Arrays.asList(
              "dd413e49-c124-3b05-8c25-0da5922379d3",
              "7a981930-621f-3935-b26c-47f54413a59d",
              "41fbef7f-7210-3288-97cb-c860dfc90601",
              "f60922c9-cb3d-3099-8960-1097d2c5afdc")) {
        I_GetConceptData r_con = tf.getConcept(Arrays.asList(UUID.fromString(r)));
        if (r_con != null) {
          boolean found = false;
          String head = r_con.getInitialText().replace(" rel", "");
          I_IntSet r_set = tf.newIntSet();
          r_set.add(r_con.getConceptId());
          for (I_GetConceptData val_con :
              con.getSourceRelTargets(
                  getActiveStatus(),
                  r_set,
                  null,
                  config.getPrecedence(),
                  config.getConflictResolutionStrategy())) {
            // for (int val_id : getRelationship(con.getConceptId(),
            // r_con.getConceptId(), null, Integer.MAX_VALUE)) {
            // I_GetConceptData val_con = tf.getConcept(val_id);
            if (val_con != null) {
              found = true;
              out.println("<tr>");
              out.println("<td>");
              out.println(escapeString(head));
              out.println("<td>");
              out.println(escapeString(val_con.getInitialText()));
            }
          }
          if (!found) {
            out.println("<tr>");
            out.println("<td>");
            out.println(escapeString(head));
            out.println("<td>");
          }
        }
      }
      // comments rel "ff1b55d3-2b7b-382c-ae42-eceffcc47c71"
      // promotion rel "9a801240-b3b0-3475-8a7b-07111d3ff564"
      for (String r :
          Arrays.asList(
              "ff1b55d3-2b7b-382c-ae42-eceffcc47c71", "9a801240-b3b0-3475-8a7b-07111d3ff564")) {
        I_GetConceptData r_con = tf.getConcept(Arrays.asList(UUID.fromString(r)));
        if (r_con != null) {
          boolean found = false;
          String head = r_con.getInitialText().replace(" rel", "");
          I_IntSet r_set = tf.newIntSet();
          r_set.add(r_con.getConceptId());
          for (I_GetConceptData val_con :
              con.getSourceRelTargets(
                  getActiveStatus(),
                  r_set,
                  null,
                  config.getPrecedence(),
                  config.getConflictResolutionStrategy())) {
            if (val_con != null) {
              found = true;
              out.println("<tr>");
              out.println("<td>");
              out.println(escapeString(head));
              out.println("<td>");
              // out.println(val_con.getInitialText());
              //
              for (I_ExtendByRef mem : tf.getRefsetExtensionMembers(val_con.getConceptId())) {
                I_GetConceptData mem_con = tf.getConcept(mem.getComponentId());
                I_ExtendByRefPart p = mem.getMutableParts().get(0);
                if (p instanceof I_ExtendByRefPartStr) {
                  I_ExtendByRefPartStr pccs = (I_ExtendByRefPartStr) p;
                  out.println("<tr>");
                  out.println("<td>");
                  out.println("<td>");
                  out.println(escapeString(pccs.getStringValue()));
                } else {
                  getLog().info("Wrong type: " + p.getClass() + " " + mem_con.getInitialText());
                }
              }
              //
            }
          }
          if (!found) {
            out.println("<tr>");
            out.println("<td>");
            out.println(escapeString(head));
            out.println("<td>");
          }
        }
      }
      out.println("</table>");
    }
    out.println("</body>");
    out.println("</html>");
    out.close();

    // make a copy of the report file, in Maven's site folder
    site_output_file.getParentFile().mkdirs();
    copy(list_file, site_output_file);
  }
  public Condition evaluate(I_EncodeBusinessProcess process, I_Work worker)
      throws TaskFailedException {
    try {
      I_ConfigAceFrame config =
          (I_ConfigAceFrame) worker.readAttachement(WorkerAttachmentKeys.ACE_FRAME_CONFIG.name());

      I_TermFactory tf = Terms.get();

      I_ConfigAceFrame workingProfile = (I_ConfigAceFrame) process.getProperty(profilePropName);
      if (workingProfile == null) {
        workingProfile =
            (I_ConfigAceFrame) worker.readAttachement(WorkerAttachmentKeys.ACE_FRAME_CONFIG.name());
      }

      Object conceptObj = process.getProperty(activeConceptPropName);
      I_GetConceptData concept = AceTaskUtil.getConceptFromObject(conceptObj);

      List<? extends I_ConceptAttributeTuple> attrTupels =
          concept.getConceptAttributeTuples(
              workingProfile.getAllowedStatus(), workingProfile.getViewPositionSetReadOnly(),
              workingProfile.getPrecedence(), workingProfile.getConflictResolutionStrategy());

      I_IntSet pathSet = Terms.get().newIntSet();

      ArrayList<UniversalAcePosition> positionList = new ArrayList<UniversalAcePosition>();
      for (I_ConceptAttributeTuple t : attrTupels) {
        positionList.add(
            new UniversalAcePosition(
                tf.getUids(t.getPathId()), tf.convertToThickVersion(t.getVersion())));
        pathSet.add(t.getPathId());
      }
      ArrayList<String> addressList = new ArrayList<String>();

      I_IntList inboxDescTypeList = Terms.get().newIntList();
      inboxDescTypeList.add(ArchitectonicAuxiliary.Concept.USER_INBOX.localize().getNid());
      for (int pathId : pathSet.getSetValues()) {
        I_GetConceptData pathConcept = Terms.get().getConcept(pathId);
        I_DescriptionTuple inboxDesc = pathConcept.getDescTuple(inboxDescTypeList, config);
        if (inboxDesc == null) {
          worker.getLogger().info("Cannot find inbox for: " + pathConcept.getInitialText());
          worker.getLogger().info(" inboxDescTypeList: " + inboxDescTypeList.getListArray());
          for (I_DescriptionVersioned desc : pathConcept.getDescriptions()) {
            for (I_DescriptionTuple tuple : desc.getTuples()) {
              worker.getLogger().info(" desc tuple: " + tuple);
            }
          }
        } else {
          addressList.add(inboxDesc.getText());
        }
      }
      process.setProperty(addressListPropName, addressList);
      process.setProperty(positionListPropName, positionList);
      worker.getLogger().info("Selected status values have these positions: " + positionList);
      worker.getLogger().info("Got addresses from status values: " + addressList);

      return Condition.CONTINUE;
    } catch (IllegalArgumentException e) {
      throw new TaskFailedException(e);
    } catch (IllegalAccessException e) {
      throw new TaskFailedException(e);
    } catch (InvocationTargetException e) {
      throw new TaskFailedException(e);
    } catch (IntrospectionException e) {
      throw new TaskFailedException(e);
    } catch (IOException e) {
      throw new TaskFailedException(e);
    } catch (TerminologyException e) {
      throw new TaskFailedException(e);
    }
  }