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()}));
     }
   }
 }
  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()}));
    }
  }