public static Hashtable<String, Object> getChoiceOfValues(
     EObject object, EStructuralFeature feature) {
   ExtendedPropertiesAdapter adapter =
       (ExtendedPropertiesAdapter) AdapterUtil.adapt(object, ExtendedPropertiesAdapter.class);
   if (adapter != null) return adapter.getFeatureDescriptor(feature).getChoiceOfValues(object);
   return null;
 }
  public static String getText(EObject object, EStructuralFeature feature) {
    if (feature == null) return getText(object);

    ExtendedPropertiesAdapter adapter =
        (ExtendedPropertiesAdapter) AdapterUtil.adapt(object, ExtendedPropertiesAdapter.class);
    if (adapter != null) return adapter.getFeatureDescriptor(feature).getText(object);
    return getDisplayName(object, feature);
  }
 public static String getLabel(EObject object, EStructuralFeature feature) {
   String label = "";
   ExtendedPropertiesAdapter adapter =
       (ExtendedPropertiesAdapter) AdapterUtil.adapt(object, ExtendedPropertiesAdapter.class);
   if (adapter != null) label = adapter.getFeatureDescriptor(feature).getLabel(object);
   else label = ModelUtil.toDisplayName(feature.getName());
   label = label.replaceAll(" Ref$", "");
   return label;
 }
 public static String getText(Object object) {
   if (object instanceof EObject) {
     EObject eObject = (EObject) object;
     ExtendedPropertiesAdapter adapter =
         (ExtendedPropertiesAdapter) AdapterUtil.adapt(eObject, ExtendedPropertiesAdapter.class);
     if (adapter != null) return adapter.getObjectDescriptor().getText(eObject);
     return getDisplayName(eObject);
   }
   return object.toString();
 }
 public static boolean isMultiChoice(EObject object, EStructuralFeature feature) {
   if (feature.getEType() instanceof EClass) {
     ExtendedPropertiesAdapter adapter =
         (ExtendedPropertiesAdapter) AdapterUtil.adapt(object, ExtendedPropertiesAdapter.class);
     if (adapter != null) {
       Object result = adapter.getProperty(feature, ExtendedPropertiesAdapter.UI_IS_MULTI_CHOICE);
       if (result instanceof Boolean) return ((Boolean) result);
     }
   }
   return getChoiceOfValues(object, feature) != null;
 }
 public static boolean canEditInline(EObject object, EStructuralFeature feature) {
   if (feature.getEType() instanceof EClass) {
     ExtendedPropertiesAdapter adapter =
         (ExtendedPropertiesAdapter) AdapterUtil.adapt(object, ExtendedPropertiesAdapter.class);
     if (adapter != null) {
       Object result = adapter.getProperty(feature, ExtendedPropertiesAdapter.UI_CAN_EDIT_INLINE);
       if (result instanceof Boolean) return ((Boolean) result);
     }
   }
   return false;
 }
 public static boolean canCreateNew(EObject object, EStructuralFeature feature) {
   if (feature.getEType() instanceof EClass) {
     ExtendedPropertiesAdapter adapter =
         (ExtendedPropertiesAdapter) AdapterUtil.adapt(object, ExtendedPropertiesAdapter.class);
     if (adapter != null) {
       Object result = adapter.getProperty(feature, ExtendedPropertiesAdapter.UI_CAN_CREATE_NEW);
       if (result instanceof Boolean) return ((Boolean) result);
     }
     return true;
   }
   return false;
 }
 /*
  * Various model object and feature UI property methods
  */
 public static String getLabel(Object object) {
   String label = "";
   if (object instanceof EObject) {
     EObject eObject = (EObject) object;
     ExtendedPropertiesAdapter adapter =
         (ExtendedPropertiesAdapter) AdapterUtil.adapt(eObject, ExtendedPropertiesAdapter.class);
     if (adapter != null) label = adapter.getObjectDescriptor().getLabel(eObject);
     else label = ModelUtil.toDisplayName(eObject.eClass().getName());
   } else label = object.toString();
   label = label.replaceAll(" Ref$", "");
   return label;
 }
    /* (non-Javadoc)
     * @see org.eclipse.bpmn2.util.Bpmn2Switch#defaultCase(org.eclipse.emf.ecore.EObject)
     *
     * The default case for this switch is to search the current target runtime plugin for
     * ExtendedPropertiesAdapters that can handle the given EObject.
     *
     * If the given EObject is actually an EClass, then a dummy EObject is constructed and cached
     * for use by the adapter. This could cause problems if the adapter is used for anything other
     * than providing simple static information (labels, etc.)
     *
     * For an example usage of this, see the org.eclipse.bpmn2.modeler.ui.util.PropertyUtil#getLabel(Object)
     * call in the List Composite, to fetch section titles and table column headers from the adapter:
     * @see org.eclipse.bpmn2.modeler.ui.property.AbstractListComposite#bindList(EObject,EStructuralFeature)
     *
     * If no adapter is found for the given EObject, a generic one is constructed and returned.
     */
    @Override
    public ExtendedPropertiesAdapter defaultCase(EObject object) {
      ExtendedPropertiesAdapter adapter = null;
      if (object instanceof EClass) {
        // this is an EClass: search the current target runtime for an adapter that
        // can handle this thing.
        adapter = getTargetRuntimeAdapter((EClass) object);
        if (adapter == null) {
          // if none is found, create a dummy EObject and cache it
          object = ModelUtil.getDummyObject((EClass) object);
          adapter = doSwitch(object);
        }
      } else adapter = getTargetRuntimeAdapter(object);

      if (adapter == null) {
        adapter = new ExtendedPropertiesAdapter(adapterFactory, object);
        adapter.setObjectDescriptor(
            new ObjectDescriptor(adapterFactory, object) {
              @Override
              public String getLabel(Object context) {
                EObject object = this.object;
                if (context instanceof EObject) object = (EObject) context;
                if (ModelUtil.isStringWrapper(object)) {
                  return "Item Type";
                }
                return super.getLabel(context);
              }

              @Override
              public String getDisplayName(Object context) {
                EObject object = this.object;
                if (context instanceof EObject) object = (EObject) context;
                if (ModelUtil.isStringWrapper(object)) {
                  return ModelUtil.getStringWrapperValue(object);
                }
                return super.getDisplayName(context);
              }
            });
      }
      return adapter;
    }
 /**
  * Returns the Java class that implements a Work Item Editor dialog for the given BaseElement if
  * the WID file defines one.
  *
  * @param baseElement
  * @return a Work Item Editor dialog class or null if the BaseElement is not a custom task
  *     (defined by a WID file) or if the WID file does declare a "eclipse:customEditor" class.
  *     <p>TODO: make this return an object instance and make sure it implements the {@code
  *     WorkEditor} interface.
  */
 public static WorkEditor getWorkItemEditor(BaseElement baseElement) {
   String customTaskId = CustomElementFeatureContainer.findId(baseElement);
   TargetRuntime rt = TargetRuntime.getRuntime(baseElement);
   JBPM5RuntimeExtension rte = (JBPM5RuntimeExtension) rt.getRuntimeExtension();
   WorkItemDefinition wid = ((JBPM5RuntimeExtension) rte).getWorkItemDefinition(customTaskId);
   if (wid != null) {
     String customEditor = wid.getEclipseCustomEditor();
     if (customEditor != null && !customEditor.isEmpty()) {
       try {
         Resource res = ExtendedPropertiesAdapter.getResource(baseElement);
         URI uri = res.getURI();
         IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject(uri.segment(1));
         JavaProjectClassLoader cl = new JavaProjectClassLoader(project);
         if (cl != null) {
           return new SampleCustomEditor(Display.getDefault().getActiveShell());
         }
       } catch (Exception ignore) {
       }
     }
   }
   return null;
 }
 public static EObject createObject(EObject object, EStructuralFeature feature, EClass eclass) {
   ExtendedPropertiesAdapter adapter =
       (ExtendedPropertiesAdapter) AdapterUtil.adapt(object, ExtendedPropertiesAdapter.class);
   if (adapter != null) return adapter.getFeatureDescriptor(feature).createObject(object, eclass);
   return null;
 }
 public static boolean getIsMultiLine(EObject object, EStructuralFeature feature) {
   ExtendedPropertiesAdapter adapter =
       (ExtendedPropertiesAdapter) AdapterUtil.adapt(object, ExtendedPropertiesAdapter.class);
   if (adapter != null) return adapter.getFeatureDescriptor(feature).isMultiLine(object);
   return false;
 }
    @SuppressWarnings("unchecked")
    @Override
    protected void internalSet(
        DataAssociation association, EStructuralFeature feature, Object value, int index) {
      EObject container = null;
      EStructuralFeature containerFeature = null;
      if (value instanceof Property) {
        if (((Property) value).eContainer() == null) {
          // this Property isn't owned by anything yet - figure out who the owner is
          container = ModelUtil.findNearestAncestor(association, new Class[] {Activity.class});
          if (container == null)
            container = ModelUtil.findNearestAncestor(association, new Class[] {Event.class});
          if (container == null)
            container = ModelUtil.findNearestAncestor(association, new Class[] {Process.class});
          containerFeature = container.eClass().getEStructuralFeature("properties"); // $NON-NLS-1$
        }
      } else if (value instanceof DataStore) {
        if (((DataStore) value).eContainer() == null) {
          // this DataStore isn't owned by anything yet - figure out who the owner is
          container = ModelUtil.findNearestAncestor(association, new Class[] {DocumentRoot.class});
          containerFeature = container.eClass().getEStructuralFeature("dataStore"); // $NON-NLS-1$
        }
      } else if (value instanceof String) {
        // first check if a property with this name already exists
        Hashtable<String, Object> choices = getChoiceOfValues();
        Property property = (Property) choices.get(value);
        if (property == null) {
          // need to create a new one!
          DiagramEditor editor = ModelUtil.getEditor(object);
          ModelEnablements modelEnablement =
              (ModelEnablements) editor.getAdapter(ModelEnablements.class);
          // find nearest element that can contain a Property and create one
          container = association;
          for (; ; ) {
            container =
                ModelUtil.findNearestAncestor(
                    container, new Class[] {Activity.class, Event.class, Process.class});
            if (container == null) return;
            containerFeature =
                container.eClass().getEStructuralFeature("properties"); // $NON-NLS-1$
            if (modelEnablement.isEnabled(container.eClass(), containerFeature)) break;
          }

          containerFeature = container.eClass().getEStructuralFeature("properties"); // $NON-NLS-1$
          property = Bpmn2ModelerFactory.create(Property.class);
          ExtendedPropertiesAdapter adapter = ExtendedPropertiesAdapter.adapt(property);
          adapter.getObjectDescriptor().setTextValue((String) value);
        }
        value = property;
      }

      final EObject c = container;
      final EStructuralFeature cf = containerFeature;
      final ItemAwareElement v = (ItemAwareElement) value;

      if (feature == Bpmn2Package.eINSTANCE.getDataAssociation_SourceRef()) {
        setSourceRef(association, v, c, cf);
      } else {
        setTargetRef(association, v, c, cf);
      }
    }