package org.eclipse.epf.library.edit.uma; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; import org.eclipse.epf.library.edit.meta.TypeDefUtil; import org.eclipse.epf.library.edit.util.Comparators; import org.eclipse.epf.library.edit.util.PropUtil; import org.eclipse.epf.uma.Constraint; import org.eclipse.epf.uma.MethodConfiguration; import org.eclipse.epf.uma.MethodElement; import org.eclipse.epf.uma.WorkProduct; import org.eclipse.epf.uma.WorkProductDescriptor; import org.eclipse.epf.uma.ecore.IUserDefinedTypeMeta; import org.eclipse.epf.uma.ecore.impl.MultiResourceEObject.ExtendObject; import org.eclipse.epf.uma.ecore.util.OppositeFeature; import org.eclipse.epf.uma.util.ExtendedOpposite; import org.eclipse.epf.uma.util.UmaUtil; public class MethodElementExt extends ExtendObject { private MethodElement element; private boolean transientElement = false; private Object cachedObject; private ExtendReferenceMap extendReferenceMap; private IUserDefinedTypeMeta userDefinedTypeMeta; private Map<Object, Object> extendedPropertyMap; private IUserDefinedTypeMeta modifiedTypeMeta; private boolean excludedFromPublish = false; public MethodElementExt(MethodElement element) { this.element = element; excludedFromPublish = excludedFromPublishDefault(element); } public static boolean excludedFromPublishDefault(MethodElement element) { if (element instanceof WorkProductDescriptor) { return true; } return false; } public ExtendReferenceMap getExtendReferenceMap(boolean create) { if (create && extendReferenceMap == null) { extendReferenceMap = new ExtendReferenceMap(element); } return extendReferenceMap; } public Object getCachedObject() { return cachedObject; } public void setCachedObject(Object cachedObject) { this.cachedObject = cachedObject; } public MethodElement getElement() { return element; } public boolean isTransientElement() { return transientElement; } public void setTransientElement(boolean transientElement) { this.transientElement = transientElement; } public static class WorkProductStateExt extends MethodElementExt { private Set<WorkProduct> assignedToWps; public WorkProductStateExt(Constraint element) { super(element); } public void addToAssignedToWps(WorkProduct wp) { if (assignedToWps == null) { assignedToWps = new HashSet<WorkProduct>(); } assignedToWps.add(wp); } public void removeFromAssignedToWps(WorkProduct wp) { if (assignedToWps == null) { return; } assignedToWps.remove(wp); } public List<WorkProduct> getAssignedToWorkProducts() { List<WorkProduct> list = new ArrayList<WorkProduct>(); List<WorkProduct> list1 = new ArrayList<WorkProduct>(); if (assignedToWps == null) { return list; } for (WorkProduct wp : assignedToWps) { if (UmaUtil.isInLibrary(wp)) { list.add(wp); } else { list1.add(wp); } } if (! list1.isEmpty()) { assignedToWps.removeAll(list1); } if (list.size() > 1) { Collections.sort(list, Comparators.PRESENTATION_NAME_COMPARATOR); } return list; } } public static class MethodConfigurationExt extends MethodElementExt { boolean loadCheckPackagesCalled = false; public MethodConfigurationExt(MethodConfiguration element) { super(element); } public boolean isLoadCheckPackagesCalled() { return loadCheckPackagesCalled; } public void setLoadCheckPackagesCalled(boolean loadCheckPackagesCalled) { this.loadCheckPackagesCalled = loadCheckPackagesCalled; } } public IUserDefinedTypeMeta getUserDefinedTypeMeta() { return userDefinedTypeMeta; } public void setUserDefinedTypeMeta(IUserDefinedTypeMeta userDefinedTypeMeta) { this.userDefinedTypeMeta = userDefinedTypeMeta; } public IUserDefinedTypeMeta getModifiedTypeMeta() { return modifiedTypeMeta; } public void setModifiedTypeMeta(IUserDefinedTypeMeta modifiedTypeMeta) { this.modifiedTypeMeta = modifiedTypeMeta; } public Map<Object, Object> getExtendedPropertyMap(boolean create) { if (extendedPropertyMap == null && create) { extendedPropertyMap = new HashMap<Object, Object>(); } return extendedPropertyMap; } @Override public boolean handleOppostie(OppositeFeature oFeature) { return oFeature == UmaUtil.UdtListOpposite || TypeDefUtil.getInstance().getAssociatedExtendedOpposite(oFeature) != null; } @Override public Object getOppositeFeatureValue(OppositeFeature feature) { if (feature == UmaUtil.UdtListOpposite) { return PropUtil.getPropUtil().getReferencingList( element, TypeDefUtil.getInstance().getAssociatedExtendedReference( UmaUtil.MethodElement_UdtList)); } ExtendedOpposite extendedOpposite = TypeDefUtil.getInstance().getAssociatedExtendedOpposite(feature); if (extendedOpposite != null) { return PropUtil.getPropUtil().getReferencingList(element, extendedOpposite.getTargetReference()); } return super.getOppositeFeatureValue(feature); } public boolean isExcludedFromPublish() { return excludedFromPublish; } public void setExcludedFromPublish(boolean excludedFromPublish) { this.excludedFromPublish = excludedFromPublish; } }