/**
  * @param ai
  * @return
  */
 public static BenchmarkDTO getBenchmarkForActivity(ActivityInstance ai) {
   BenchmarkDTO dto = new BenchmarkDTO();
   if (null != ai.getBenchmarkResult()) {
     dto.color =
         org.eclipse.stardust.ui.web.viewscommon.utils.ActivityInstanceUtils.getBenchmarkColor(ai);
     dto.label =
         org.eclipse.stardust.ui.web.viewscommon.utils.ActivityInstanceUtils.getBenchmarkLabel(ai);
     dto.value = ai.getBenchmarkResult().getCategory();
   }
   return dto;
 }
  /**
   * @param activityOid
   * @param targetActivityOid
   */
  public ActivityInstanceDTO relocateActivity(long activityOid, String activityId) {
    // TODO - not performant - check if this step can be avoided.
    List<TransitionTarget> targets =
        serviceFactoryUtils
            .getWorkflowService()
            .getAdHocTransitionTargets(
                activityOid, TransitionOptions.DEFAULT, ScanDirection.BACKWARD);
    List<ActivityInstanceDTO> list = new ArrayList<ActivityInstanceDTO>();
    if (null != targets) {
      for (TransitionTarget target : targets) {
        if (target.getActivityId().equals(activityId)) {
          ActivityInstance activityInstance =
              activityInstanceUtils.getActivityInstance(target.getActivityInstanceOid());
          if (org.eclipse.stardust.ui.web.viewscommon.utils.ActivityInstanceUtils
              .isRelocationEligible(activityInstance)) {
            if (activityInstance.getActivity().isInteractive()
                && activityInstance.getState().equals(ActivityInstanceState.Suspended)) {
              serviceFactoryUtils.getWorkflowService().activate(target.getActivityInstanceOid());
            }
          }
          TransitionReport report =
              serviceFactoryUtils.getWorkflowService().performAdHocTransition(target, false);
          return DTOBuilder.build(report.getTargetActivityInstance(), ActivityInstanceDTO.class);
        }
      }
    }

    return null;
  }
 private void select() {
   if (model == null
       && departmentList != null
       && !departmentList.isEmpty()
       && departmentList.size() == 1) {
     for (Department d : departmentList) {
       addDepartmentData(d);
     }
   } else if (model != null) {
     DepartmentDialogBean deptBean = DepartmentDialogBean.getCurrent();
     deptBean.setModel(model);
     deptBean.openPopup();
   } else if (model == null) {
     // TODO support asynchronous/synchronous start selection?
     ActivityInstance nextActivityInstance = null;
     ProcessInstance processInstance = PPUtils.startProcess(processDefinition, true);
     if (!(ProcessInstanceUtils.isTransientProcess(processInstance)
         || ProcessInstanceUtils.isCompletedProcess(processInstance))) {
       nextActivityInstance = PPUtils.activateNextActivityInstance(processInstance);
       if (nextActivityInstance != null) {
         Map<String, Object> params = CollectionUtils.newTreeMap();
         if (WorklistsBean.getInstance()
             .isAssemblyLineActivity(nextActivityInstance.getActivity())) {
           params.put("assemblyLineActivity", true);
           params.put("worklistsBean", WorklistsBean.getInstance());
         }
         ActivityInstanceUtils.openActivity(nextActivityInstance, params);
       }
     }
     if (nextActivityInstance == null) {
       MessageDialog.addInfoMessage(
           MessagePropertiesBean.getInstance()
               .getParamString("common.processStarted.message", new String[] {getName()}));
     }
   }
 }
  /**
   * @param queryResult
   * @return
   */
  public static QueryResultDTO buildTableResult(
      QueryResult<?> queryResult,
      MODE mode,
      Map<String, TrivialManualActivityDTO> trivialManualActivityDetails,
      List<String> extraColumns) {
    List<ActivityInstanceDTO> list = new ArrayList<ActivityInstanceDTO>();
    List<CriticalityCategory> criticalityConfigurations =
        CriticalityUtils.getCriticalityConfiguration();

    ModelCache modelCache = ModelCache.findModelCache();
    QueryResultDTO resultDTO = new QueryResultDTO();
    if (null != queryResult) {
      for (Object object : queryResult) {
        if (object instanceof ActivityInstance) {
          ActivityInstance ai = (ActivityInstance) object;
          ActivityInstanceDTO dto;

          if (ActivityInstanceUtils.isTrivialManualActivity(ai)) {
            TrivialActivityInstanceDTO trivialDto =
                DTOBuilder.build(ai, TrivialActivityInstanceDTO.class);
            trivialDto.trivial = true;

            if (null != trivialManualActivityDetails
                && trivialManualActivityDetails.keySet().contains(String.valueOf(ai.getOID()))) {
              TrivialManualActivityDTO tivialManualActivity =
                  trivialManualActivityDetails.get(String.valueOf(ai.getOID()));
              trivialDto.dataMappings = tivialManualActivity.dataMappings;
              trivialDto.inOutData = tivialManualActivity.inOutData;
            }

            dto = trivialDto;
          } else {
            dto = DTOBuilder.build(ai, ActivityInstanceDTO.class);
          }

          dto.auxillary = isAuxiliaryActivity(ai.getActivity());
          dto.duration = ActivityInstanceUtils.getDuration(ai);
          dto.assignedTo = getAssignedToLabel(ai);
          dto.criticality = populateCriticalityDTO(criticalityConfigurations, ai);
          dto.priority = DTOBuilder.build(ai, PriorityDTO.class);
          dto.status = DTOBuilder.build(ai, StatusDTO.class);
          dto.status.label = ActivityInstanceUtils.getActivityStateLabel(ai);
          dto.descriptorValues = getProcessDescriptors(modelCache, ai);
          dto.activatable = findIfActivatable(ai);
          dto.relocationEligible =
              org.eclipse.stardust.ui.web.viewscommon.utils.ActivityInstanceUtils
                  .isRelocationEligible(ai);
          dto.benchmark = getBenchmarkForActivity(ai);

          List<Note> notes =
              org.eclipse.stardust.ui.web.viewscommon.utils.ProcessInstanceUtils.getNotes(
                  ai.getProcessInstance());
          if (null != notes) {
            dto.notesCount = notes.size();
          }

          if (CollectionUtils.isNotEmpty(extraColumns)
              && extraColumns.contains(Constants.RESUBMISSION_TIME)) {
            Date resubmissionDate =
                org.eclipse.stardust.ui.web.viewscommon.utils.ActivityInstanceUtils
                    .getResubmissionDate(ai);
            if (null != resubmissionDate) {
              dto.resubmissionTime = resubmissionDate.getTime();
            }
          }
          ProcessDefinition processDefinition =
              ProcessDefinitionUtils.getProcessDefinition(
                  ai.getModelOID(), ai.getProcessDefinitionId());
          dto.processInstance.supportsProcessAttachments =
              ProcessDefinitionUtils.supportsProcessAttachments(processDefinition);

          if (mode.equals(MODE.ACTIVITY_TABLE)) {
            dto.completedBy = ActivityInstanceUtils.getPerformedByName(ai);
            dto.participantPerformer = getParticipantPerformer(ai);
            dto.abortActivity = !dto.isCaseInstance && isAbortable(ai);
            dto.delegable = isDelegable(ai);
            dto.abortProcess = ProcessInstanceUtils.isAbortable(ai.getProcessInstance());

          } else {
            dto.lastPerformer = getLastPerformer(ai, UserUtils.getDefaultUserNameDisplayFormat());
            if (!dto.defaultCaseActivity) {
              dto.abortActivity = isAbortable(ai);
              dto.delegable = isDelegable(ai);
            }
          }
          dto.defaultCaseActivity = ActivityInstanceUtils.isDefaultCaseActivity(ai);
          dto.isCaseInstance = ai.getProcessInstance().isCaseProcessInstance();
          if (dto.defaultCaseActivity) {
            dto.activity.name = getCaseName(ai);
          }
          list.add(dto);
        }
      }
      resultDTO.totalCount = queryResult.getTotalCount();
    }
    resultDTO.list = list;
    return resultDTO;
  }
  private void addDepartmentData(Department department) {
    Map<String, Object> map = null;
    if (department != null) {
      map = CollectionUtils.newMap();
      Department department1 = department;
      do {
        if (department1 == null) {
          break;
        }
        Organization organization = department1.getOrganization();
        if (organization != null) {
          String s = (String) organization.getAttribute("carnot:engine:dataId");
          if (s != null) {
            ModelCache modelCache = ModelCache.findModelCache();
            Model model = modelCache.getModel(organization.getModelOID());

            Data data = model.getData(s);
            String s1 = data.getTypeId();
            if ("primitive".equals(s1)) {
              map.put(s, department1.getId());
            } else if ("struct".equals(s1)) {
              Object obj = map.get(s);
              if (!(obj instanceof Map)) {
                obj = CollectionUtils.newMap();
                map.put(s, obj);
              }
              Map map1 = (Map) obj;
              String s2 = (String) organization.getAttribute("carnot:engine:dataPath");
              if (StringUtils.isEmpty(s2)) {
                map.put(s, department1.getId());
              } else {
                do {
                  int i;
                  if (0 >= (i = s2.indexOf('/'))) {
                    break;
                  }
                  String s3 = s2.substring(0, i).trim();
                  s2 = s2.substring(i + 1);
                  if (s3.length() > 0) {
                    Map map2 = (Map) map1.get(s3);
                    if (map2 == null) {
                      map2 = CollectionUtils.newMap();
                      map1.put(s3, map2);
                    }
                    map1 = map2;
                  }
                } while (true);
                s2 = s2.trim();
                if (s2.length() > 0) {
                  map1.put(s2, department1.getId());
                }
              }
            } else {
              throw new PublicException(
                  (new StringBuilder())
                      .append("Unsupported data type in manual triggers: ")
                      .append(s1)
                      .toString());
            }
            department1 = department1.getParentDepartment();
          }
        }
      } while (true);
    }

    ActivityInstance nextActivityInstance =
        PPUtils.activateNextActivityInstance(
            PPUtils.startProcess(getProcessDefinition(), map, true));

    if (nextActivityInstance != null) {
      ActivityInstanceUtils.openActivity(nextActivityInstance);
    } else {
      MessageDialog.addInfoMessage(
          MessagePropertiesBean.getInstance()
              .getParamString("common.processStarted.message", new String[] {getName()}));
    }
  }