InstanceKind type
com.vainolo.phd.opp.interpreter/src/com/vainolo/phd/opp/interpreter/OPPObjectInstance.java
this.kind = type;
    this.id = UUID.randomUUID();
  public String getId() {
    return id.toString();
  // Creation
  public static OPPObjectInstance createCompositeInstance() {
    return new OPPObjectInstance(InstanceKind.COMPOSITE);
    OPPObjectInstance instance = new OPPObjectInstance(InstanceKind.NUMERICAL);
    OPPObjectInstance instance = new OPPObjectInstance(InstanceKind.STRING);
  public static OPPObjectInstance createFromValue(Object object) {
    Preconditions.checkNotNull(object);
    OPPObjectInstance instance = new OPPObjectInstance(InstanceKind.JAVA_OBJECT);
    instance.setValue(object);
    return instance;
private OPPObjectInstance(InstanceKind type)
OPPObjectInstance value
com.vainolo.phd.opp.interpreter/src/com/vainolo/phd/opp/interpreter/OPPObjectInstance.java
checkNotNull(value, "Cannot append a null element to a collection.");
    Integer firstKey = 0;
    if (compositeValues.size() > 0) {
      firstKey = compositeValues.firstKey();
void addFirstPart(OPPObjectInstance value)
OPPObjectInstance value
com.vainolo.phd.opp.interpreter/src/com/vainolo/phd/opp/interpreter/OPPObjectInstance.java
if (compositeValues.size() > 0) {
      lastKey = compositeValues.lastKey();
    compositeValues.put(newKey, value);
    compositeKeyToIndexMapping.put(UUID.randomUUID().toString(), newKey);
  public void setPart(String name, OPPObjectInstance value) {
    checkTypeForCompositeOnlyOperations();
    if (compositeKeyToIndexMapping.containsKey(name)) {
      compositeValues.remove(compositeKeyToIndexMapping.get(name));
      compositeKeyToIndexMapping.remove(name);
    int lastKey = 0;
    if (compositeValues.size() > 0) {
      lastKey = compositeValues.lastKey();
void addLastPart(OPPObjectInstance value)
String key
com.vainolo.phd.opp.interpreter/src/com/vainolo/phd/opp/interpreter/OPPObjectInstance.java
checkTypeForCompositeOnlyOperations();
    checkState((key != null) && (!"".equals(key)), "Key cannot be null or empty.");
    return compositeValues.get(compositeKeyToIndexMapping.get(key));
OPPObjectInstance getPart(String key)
com.vainolo.phd.opp.interpreter/src/com/vainolo/phd/opp/interpreter/OPPObjectInstance.java
checkTypeForCompositeOnlyOperations();
    return compositeValues.get(compositeValues.firstKey());
  public OPPObjectInstance getLastPart() {
    checkTypeForCompositeOnlyOperations();
    return compositeValues.get(compositeValues.lastKey());
  public Collection<OPPObjectInstance> getAllParts() {
    checkTypeForCompositeOnlyOperations();
    return Collections.unmodifiableCollection(compositeValues.values());
  public Set<String> getAllPartIndexes() {
    checkTypeForCompositeOnlyOperations();
    return Collections.unmodifiableSet(compositeKeyToIndexMapping.keySet());
  public void removePart(OPPObjectInstance key) {
    checkTypeForCompositeOnlyOperations();
    checkState(key != null, "Key cannot be null.");
    switch (key.kind) {
    case STRING:
    case NUMERICAL:
      removePart(key.getStringValue());
      break;
    case COMPOSITE:
      removePart(key.getId());
      break;
    case JAVA_OBJECT:
      throw new OPPRuntimeException("Java object keys are not supported.");
OPPObjectInstance getFirstPart()
String key
com.vainolo.phd.opp.interpreter/src/com/vainolo/phd/opp/interpreter/OPPObjectInstance.java
checkTypeForCompositeOnlyOperations();
    checkState((key != null) && ("".equals(key)), "Key cannot be null or empty.");
    Integer index = compositeKeyToIndexMapping.get(key);
    compositeValues.remove(index);
    compositeKeyToIndexMapping.remove(key);
void removePart(String key)
com.vainolo.phd.opp.interpreter/src/com/vainolo/phd/opp/interpreter/OPPObjectInstance.java
checkTypeForCompositeOnlyOperations();
    Integer firstIndex = compositeValues.firstKey();
    OPPObjectInstance firstInstance = compositeValues.remove(firstIndex);
    compositeKeyToIndexMapping.inverse().remove(firstIndex);
    return firstInstance;
  public OPPObjectInstance removeLastPart() {
    checkTypeForCompositeOnlyOperations();
    Integer lastIndex = compositeValues.lastKey();
    OPPObjectInstance lastInstance = compositeValues.remove(lastIndex);
    compositeKeyToIndexMapping.inverse().remove(lastIndex);
    return lastInstance;
    if (InstanceKind.STRING.equals(kind) || InstanceKind.NUMERICAL.equals(kind)) {
OPPObjectInstance removeFirstPart()
com.vainolo.phd.opp.interpreter/src/com/vainolo/phd/opp/interpreter/OPPRuntimeException.java
super();
public OPPRuntimeException()
String message
com.vainolo.phd.opp.interpreter/src/com/vainolo/phd/opp/interpreter/OPPRuntimeException.java
super(message);
public OPPRuntimeException(String message)
com.vainolo.phd.opp.interpreter/src/com/vainolo/phd/opp/interpreter/builtin/OPPBinaryMathOpProcessInstance.java
switch (this) {
      case ADD:
        return "Add";
      case SUBS:
        return "Subtract";
      case MULT:
        return "Multiply";
      case DIV:
        return "Divide";
      case POW:
        return "Power";
String getName()
opmObject.kind == InstanceKind.NUMERICAL
com.vainolo.phd.opp.interpreter/src/com/vainolo/phd/opp/interpreter/builtin/OPPWriteOPMObjectInstanceToJSON.java
else if (opmObject.kind == InstanceKind.NUMERICAL)
OPPProcessInstance instance  Map<String  OPPArgument> namedArguments
com.vainolo.phd.opp.interpreter/src/com/vainolo/phd/opp/interpreter/inzoomedprocessinstance/OPPInZoomedProcessArgumentHandler.java
private void loadAnonymousArguments(OPPProcessInstance instance, List<OPPArgument> arguments,
      for(OPPArgument argument : arguments) {
    Map<String, OPPArgument> namedResults = Maps.newHashMap();
    List<OPPArgument> anonymousResult = Lists.newArrayList();
      OPPArgument argument = new OPPArgument(analyzer.getObject(resultLink));
        throw new OPPRuntimeException("Argument modifiers are not supported.");
    List<String> outgoingParametersNames = instance.getOutgoingParameters().stream().map(p -> p.getName())
        .collect(Collectors.toList());
      setValue(namedResults.get(namedResult), instance.getArgument(namedResult));
    // Then extract results where the variable in the instance matches the
    // result object
    Iterator<OPPArgument> anonymousResultsIterator = anonymousResult.iterator();
      OPPArgument argument = anonymousResultsIterator.next();
      if(instance.getOutgoingParameters().contains(argument.object.getName())) {
          setValue(argument, instance.getArgument(argument.object.getName()));
    // Finally, extract all remaining outgoing parameters to the remaining
    // anonymous result objects.
    for(int i = 0; i < anonymousResult.size(); i++) {
      setValue(anonymousResult.get(i), instance.getArgument(outgoingParametersNames.get(i)));
  private void setValue(OPPArgument argument, OPPObjectInstance objectInstance) {
    if(argument.hasModifier) {
      throw new OPPRuntimeException("Argument modifiers are not supported.");
      heap.setVariable(argument.object, objectInstance);
  private OPPObjectInstance getValue(OPPArgument argument) {
    if(!argument.hasModifier) {
      throw new OPPRuntimeException("Argument modifiers are not supported.");
  /**
   * Representation of an argument that is passed to a
   * {@link OPPProcessInstance
void loadNamedArguments(OPPProcessInstance instance, Map<String, OPPArgument> namedArguments)
OPPProcessInstance input
com.vainolo.phd.opp.interpreter/src/com/vainolo/phd/opp/interpreter/inzoomedprocessinstance/OPPInZoomedProcessExecutableInstance.java
return instance2ProcessMap.get(input);
OPPProcess apply(OPPProcessInstance input)
com.vainolo.phd.opp.interpreter/src/com/vainolo/phd/opp/interpreter/inzoomedprocessinstance/OPPInZoomedProcessExecutableInstance.java
// Collection<OPPObject> parameters =
  // analyzer.findIncomingParameters(getOpd());
  // for (OPPObject object : parameters) {
  // if (getArgument(object.getName()) == null) {
  // return false;
  //
boolean isReady()
String text
com.vainolo.phd.opp.editor/src/com/vainolo/phd/opp/editor/figure/OPPProcessFigure.java
smartLabel.setText(text);
void setText(String text)
com.vainolo.phd.opp.interpreter.tests/src/com/vainolo/phd/opp/interpreter/inzoomedprocessinstance/OPPInZoomedProcessInstanceHeapTest.java
createAggregationRelation(obj1, part1);

    heap.setVariable(obj1, inst1);
void assignSimpleInstanceToCompositeObject()
com.vainolo.phd.opp.interpreter/src/com/vainolo/phd/opp/interpreter/OPPJavaProcessExecutableInstance.java
return true;
boolean isReady()
InstanceType type
com.vainolo.phd.opp.interpreter/src/com/vainolo/phd/opp/interpreter/OPPObjectInstance.java
this.type = type;
  // Creation
  public static OPPObjectInstance createCompositeInstance() {
    return new OPPObjectInstance(InstanceType.COMPOSITE);
  public static OPPObjectInstance createCollectionInstace() {
    return new OPPObjectInstance(InstanceType.COLLECTION);
    OPPObjectInstance instance = new OPPObjectInstance(InstanceType.NUMERICAL);
    OPPObjectInstance instance = new OPPObjectInstance(InstanceType.STRING);
    switch(existingInstance.type) {
      for(Entry<String, OPPObjectInstance> part : existingInstance.getCompositeParts()) {
        newInstance.addCompositePart(part.getKey(), createFromExistingInstance(part.getValue()));
    case COLLECTION:
      newInstance = createCollectionInstace();
      for(Integer index : existingInstance.collectionValues.keySet()) {
        newInstance.collectionValues.put(index, existingInstance.collectionValues.get(index));
        newInstance.collectionNameToIndexMapping.inverse().put(index,
            existingInstance.collectionNameToIndexMapping.inverse().get(index));
private OPPObjectInstance(InstanceType type)
String name  OPPObjectInstance part
com.vainolo.phd.opp.interpreter/src/com/vainolo/phd/opp/interpreter/OPPObjectInstance.java
checkTypeForCompositeOnlyOperations();
    checkNotNull(name);
    checkNotNull(part);
    parts.put(name, part);
void addCompositePart(String name, OPPObjectInstance part)
String name
com.vainolo.phd.opp.interpreter/src/com/vainolo/phd/opp/interpreter/OPPObjectInstance.java
checkNotNull(name, "Part name cannot be null");
    checkArgument(!"".equals(name), "Part name cannot be empty");
    return parts.get(name);
  public Set<Entry<String, OPPObjectInstance>> getCompositeParts() {
    return Collections.unmodifiableSet(parts.entrySet());
OPPObjectInstance getCompositePart(String name)
OPPObjectInstance value
com.vainolo.phd.opp.interpreter/src/com/vainolo/phd/opp/interpreter/OPPObjectInstance.java
checkTypeForCollectionOnlyOperations();
    if(collectionValues.size() > 0) {
      lastKey = collectionValues.lastKey();
    collectionValues.put(newKey, value);
    collectionNameToIndexMapping.put(UUID.randomUUID().toString(), newKey);
    return newKey;
  public void putCollectionElement(String name, OPPObjectInstance value) {
    checkTypeForCollectionOnlyOperations();
    if(collectionNameToIndexMapping.containsKey(name)) {
      collectionValues.remove(collectionNameToIndexMapping.get(name));
      collectionNameToIndexMapping.remove(name);
    int index = appendCollectionElement(value);
    collectionNameToIndexMapping.inverse().remove(index);
    collectionNameToIndexMapping.put(name, index);
  public void putCollectionElementAtIndex(int index, OPPObjectInstance value) {
    checkTypeForCollectionOnlyOperations();
    checkNotNull(value, "Cannot insert a null element to a collection.");
    if(collectionValues.containsKey(index)) {
      collectionValues.remove(index);
      collectionNameToIndexMapping.inverse().remove(index);
int appendCollectionElement(OPPObjectInstance value)
String name
com.vainolo.phd.opp.interpreter/src/com/vainolo/phd/opp/interpreter/OPPObjectInstance.java
checkTypeForCollectionOnlyOperations();
    checkState((name != null) && !("".equals(name)), "Named location of element must not be null or empty.");
    checkState(collectionNameToIndexMapping.containsKey(name), "Collection does contain a value at index %s.", name);
    return collectionValues.get(collectionNameToIndexMapping.get(name));
  public OPPObjectInstance getCollectionElementAtIndex(int index) {
    checkTypeForCollectionOnlyOperations();
    return collectionValues.get(index);
  public OPPObjectInstance getCollectionFirstElement() {
    checkTypeForCollectionOnlyOperations();
    return collectionValues.get(collectionValues.firstKey());
  public OPPObjectInstance getLastCollectionElement() {
    checkTypeForCollectionOnlyOperations();
    return collectionValues.get(collectionValues.lastKey());
  public Collection<OPPObjectInstance> getCollectionAllElements() {
    checkTypeForCollectionOnlyOperations();
    return Collections.unmodifiableCollection(collectionValues.values());
  public Set<String> getCollectionAllIndexes() {
    checkTypeForCollectionOnlyOperations();
    return Collections.unmodifiableSet(collectionNameToIndexMapping.keySet());
    if(InstanceType.STRING.equals(type) || InstanceType.NUMERICAL.equals(type))
    else if(InstanceType.COMPOSITE.equals(type)) {
      for(String partName : parts.keySet()) {
        ret.append(partName + ":" + parts.get(partName) + ",");
OPPObjectInstance getCollectionElement(String name)
String name  boolean isCollection
com.vainolo.phd.opp.interpreter/src/com/vainolo/phd/opp/interpreter/OPPParameter.java
this.isCollection = isCollection;

  public boolean isCollection() {
    return isCollection;
public OPPParameter(String name, boolean isCollection)
com.vainolo.phd.opp.interpreter/src/com/vainolo/phd/opp/interpreter/builtin/OPPCompareProcessInstance.java
return (getArgument("a") != null) && (getArgument("b") != null);
  public List<OPPParameter> getIncomingParameterNames() {
    return Lists.newArrayList(new OPPParameter("a", false), new OPPParameter("b", false));
boolean isReady()
com.vainolo.phd.opp.interpreter/src/com/vainolo/phd/opp/interpreter/builtin/OPPConceptualProcess.java
return true;
boolean isReady()
com.vainolo.phd.opp.interpreter/src/com/vainolo/phd/opp/interpreter/builtin/OPPCreateObjectProcessInstance.java
return true;
boolean isReady()
com.vainolo.phd.opp.interpreter/src/com/vainolo/phd/opp/interpreter/builtin/OPPInputProcessInstance.java
return true;
boolean isReady()
com.vainolo.phd.opp.interpreter/src/com/vainolo/phd/opp/interpreter/builtin/OPPOutputProcessInstance.java
return getArgument("text") != null;
boolean isReady()
com.vainolo.phd.opp.interpreter/src/com/vainolo/phd/opp/interpreter/builtin/OPPPrintHelloWorldProcessInstance.java
return true;
boolean isReady()
com.vainolo.phd.opp.interpreter/src/com/vainolo/phd/opp/interpreter/builtin/OPPReadJSONObjectProcessInstance.java
return getArgument("json") != null;
  public List<OPPParameter> getIncomingParameterNames() {
    return Lists.newArrayList(new OPPParameter("json", false));
boolean isReady()
com.vainolo.phd.opp.interpreter/src/com/vainolo/phd/opp/interpreter/builtin/OPPSleepProcessInstance.java
return getArgument("time") != null;
boolean isReady()
com.vainolo.phd.opp.interpreter/src/com/vainolo/phd/opp/interpreter/builtin/OPPSubstractProcessInstance.java
return (getArgument("a") != null) && (getArgument("b") != null);
  public List<OPPParameter> getIncomingParameterNames() {
    return Lists.newArrayList(new OPPParameter("a", false), new OPPParameter("b", false));
boolean isReady()
opmObject.type == InstanceType.NUMERICAL
com.vainolo.phd.opp.interpreter/src/com/vainolo/phd/opp/interpreter/builtin/OPPWriteOPMObjectInstanceToJSON.java
else if(opmObject.type == InstanceType.NUMERICAL)
opmObject.type == InstanceType.COMPOSITE
com.vainolo.phd.opp.interpreter/src/com/vainolo/phd/opp/interpreter/builtin/OPPWriteOPMObjectInstanceToJSON.java
public boolean isReady() {
    return getArgument("object") != null;
  public List<OPPParameter> getIncomingParameterNames() {
    return Lists.newArrayList(new OPPParameter("object", false));
else if(opmObject.type == InstanceType.COMPOSITE)
OPPParameter input
com.vainolo.phd.opp.interpreter/src/com/vainolo/phd/opp/interpreter/inzoomedprocessinstance/OPPInZoomedProcessArgumentHandler.java
return input.getName();
String apply(OPPParameter input)
OPPProcessInstance instance  Map<String  OPMArgument> namedArguments
com.vainolo.phd.opp.interpreter/src/com/vainolo/phd/opp/interpreter/inzoomedprocessinstance/OPPInZoomedProcessArgumentHandler.java
private void loadAnonymousArguments(OPPProcessInstance instance, List<OPMArgument> arguments,
      for(OPMArgument argument : arguments) {
    Map<String, OPMArgument> namedResults = Maps.newHashMap();
    List<OPMArgument> anonymousResult = Lists.newArrayList();
      OPMArgument argument = new OPMArgument(analyzer.getObject(resultLink));
        argument.isCollectionElement = true;
        String argName = resultLink.getCenterDecoration().split(",")[0];
        String collectionReference = resultLink.getCenterDecoration().split(",")[1];
        if(valueAnalyzer.isNumericalLiteral(collectionReference)) {
          argument.collectionElementIndex = valueAnalyzer.parseNumericalLiteral(collectionReference);
void loadNamedArguments(OPPProcessInstance instance, Map<String, OPMArgument> namedArguments)
OPPParameter input
com.vainolo.phd.opp.interpreter/src/com/vainolo/phd/opp/interpreter/inzoomedprocessinstance/OPPInZoomedProcessArgumentHandler.java
return input.getName();
String apply(OPPParameter input)
OPMArgument argument  OPPObjectInstance value
com.vainolo.phd.opp.interpreter/src/com/vainolo/phd/opp/interpreter/inzoomedprocessinstance/OPPInZoomedProcessArgumentHandler.java
OPPObjectInstance currentValue = heap.getVariable(argument.object);
    if(currentValue == null) {
      currentValue = OPPObjectInstance.createCollectionInstace();
void setCollectionElementValue(OPMArgument argument, OPPObjectInstance value)
argument.collectionElementIndex != null
com.vainolo.phd.opp.interpreter/src/com/vainolo/phd/opp/interpreter/inzoomedprocessinstance/OPPInZoomedProcessArgumentHandler.java
currentValue.putCollectionElementAtIndex(argument.collectionElementIndex.intValue(), value);
else if(argument.collectionElementIndex != null)
OPMArgument argument
com.vainolo.phd.opp.interpreter/src/com/vainolo/phd/opp/interpreter/inzoomedprocessinstance/OPPInZoomedProcessArgumentHandler.java
if(!argument.isCollectionElement) {
      OPPObjectInstance instance = heap.getVariable(argument.object);
      if(argument.collectionElementName != null) {
        return instance.getCollectionElement(argument.collectionElementName);
OPPObjectInstance getValue(OPMArgument argument)
argument.collectionElementIndex != null
com.vainolo.phd.opp.interpreter/src/com/vainolo/phd/opp/interpreter/inzoomedprocessinstance/OPPInZoomedProcessArgumentHandler.java
return instance.getCollectionElementAtIndex(argument.collectionElementIndex.intValue());
else if(argument.collectionElementIndex != null)
OPPProcessInstance input
com.vainolo.phd.opp.interpreter/src/com/vainolo/phd/opp/interpreter/inzoomedprocessinstance/OPPInZoomedProcessExecutableInstance.java
return mapping.get(input);
OPPProcess apply(OPPProcessInstance input)
com.vainolo.phd.opp.interpreter/src/com/vainolo/phd/opp/interpreter/inzoomedprocessinstance/OPPInZoomedProcessExecutableInstance.java
Collection<OPPObject> parameters = analyzer.findIncomingParameters(getOpd());
    for(OPPObject object : parameters) {
      if(getArgument(object.getName()) == null) {
        return false;
boolean isReady()
OPPObject source  OPPObject target
com.vainolo.phd.opp.interpreter/src/com/vainolo/phd/opp/interpreter/inzoomedprocessinstance/OPPInZoomedProcessInstanceHeap.java
if((source.isCollection() && target.isCollection()) || (!source.isCollection() && !target.isCollection())) {
      setVariable(target, getVariable(source));
void transferDataWithNoReferences(OPPObject source, OPPObject target)
OPPObject source  String reference
com.vainolo.phd.opp.interpreter/src/com/vainolo/phd/opp/interpreter/inzoomedprocessinstance/OPPInZoomedProcessInstanceHeap.java
OPPObjectInstance sourceValue = null;
    if(valueAnalyzer.isNumericalLiteral(reference)) {
      int sourceIndex = valueAnalyzer.parseNumericalLiteral(reference).intValue();
      sourceValue = getVariable(source).getCollectionElementAtIndex(sourceIndex);
OPPObjectInstance getCollectionValueUsingReference(OPPObject source, String reference)
OPPObjectInstance value  String reference 
      OPPObject targetCollection
com.vainolo.phd.opp.interpreter/src/com/vainolo/phd/opp/interpreter/inzoomedprocessinstance/OPPInZoomedProcessInstanceHeap.java
OPPObjectInstance targetValue = getVariable(targetCollection);
    if(targetValue == null) {
      targetValue = OPPObjectInstance.createCollectionInstace();
OPPObjectInstance putValueInCollectionUsingReference(OPPObjectInstance value, String reference,
      OPPObject targetCollection)
String uri
com.vainolo.phd.opp.utilities/src/com/vainolo/phd/opp/utilities/OPPFileUtils.java
// OPMObjectProcessDiagram opd;
  // final ResourceSet resourceSet = new ResourceSetImpl();
  // resourceSet.getResourceFactoryRegistry().getExtensionToFactoryMap()
  // .put(Resource.Factory.Registry.DEFAULT_EXTENSION, new
  // XMIResourceFactoryImpl());
  // final Resource opdResource =
  // resourceSet.createResource(URI.createURI(uri));
  // try {
  // opdResource.load(null);
  // opd = (OPMObjectProcessDiagram) opdResource.getContents().get(0);
  //
OPMObjectProcessDiagram loadOPDFile(String uri)
OPMObjectProcessDiagram opd
com.vainolo.phd.opp.utilities/src/com/vainolo/phd/opp/utilities/OPPFileUtils.java
// OPMProcess process = OPMFactory.eINSTANCE.createOPMProcess();
  // process.setId(1);
  // process.setName("");
  // process.setConstraints(new Rectangle(200, 100, 100, 100));
  // opd.getNodes().add(process);
  // opd.setLastKnownUsedId(1);
  //
void createInitialProcessNode(OPMObjectProcessDiagram opd)
OPMObjectProcessDiagram opd 
  // String name
com.vainolo.phd.opp.utilities/src/com/vainolo/phd/opp/utilities/OPPFileUtils.java
// OPMObject object = OPMFactory.eINSTANCE.createOPMObject();
  // object.setId(1);
  // object.setName(name);
  // object.setConstraints(new Rectangle(200, 100, 100, 100));
  // opd.getNodes().add(object);
  // opd.setLastKnownUsedId(1);
  //
void createInitialObjectNode(OPMObjectProcessDiagram opd,
  // String name)
OPPObject object
com.vainolo.phd.opp.utilities/src/com/vainolo/phd/opp/utilities/analysis/OPPOPDAnalyzer.java
Collection<OPPLink> outgoingStructuralLinks = findOutgoingStructuralLinks(object);
    for(OPPLink link : outgoingStructuralLinks) {
      OPPStructuralLinkAggregator target = OPPStructuralLinkAggregator.class.cast(link.getTarget());
      if(target.getKind().equals(OPPStructuralLinkAggregatorKind.AGGREGATION)) {
        return true;
boolean isObjectComposite(OPPObject object)
OPPObject object
com.vainolo.phd.opp.utilities/src/com/vainolo/phd/opp/utilities/analysis/OPPOPDAnalyzer.java
return object.isCollection();
boolean isObjectCollection(OPPObject object)