blob: 691a6d01d531fa49e006e8d9054040f5bbf9d74e [file] [log] [blame]
package org.eclipse.epf.library.edit.meta;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.emf.common.notify.Adapter;
import org.eclipse.emf.ecore.EAttribute;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EReference;
import org.eclipse.emf.ecore.EStructuralFeature;
import org.eclipse.epf.library.edit.meta.internal.ModifiedTypeMetaImpl;
import org.eclipse.epf.library.edit.meta.internal.TypeDefParserImpl;
import org.eclipse.epf.library.edit.util.PropUtil;
import org.eclipse.epf.uma.ContentDescription;
import org.eclipse.epf.uma.MethodElement;
import org.eclipse.epf.uma.util.ExtendedAttribute;
import org.eclipse.epf.uma.util.ExtendedReference;
import org.eclipse.epf.uma.util.MetaElement;
import org.eclipse.epf.uma.util.ModifiedTypeMeta;
import org.eclipse.epf.uma.util.QualifiedReference;
public class TypeDefUtil {
private static TypeDefUtil instance = new TypeDefUtil();
public static TypeDefUtil getInstance() {
return instance;
}
private TypeDefUtil() {
}
public TypeDefParser getTypeDefParser() {
return new TypeDefParserImpl();
}
public IMetaDef createMetaDef(Class cls) {
if (cls == ModifiedTypeMeta.class) {
return new ModifiedTypeMetaImpl();
}
return null;
}
public void associate(ExtendedReference eRef, EReference ref) {
associate_(eRef, ref);
}
public void associate(ExtendedAttribute eAtt, EAttribute att) {
associate_(eAtt, att);
}
private void associate_(MetaElement metaElement, EStructuralFeature feature) {
if (! (metaElement instanceof Adapter)) {
return;
}
int sz = feature.eAdapters().size();
for (int i = sz - 1; i >=0; i--) {
Object adapter = feature.eAdapters().get(i);
if (adapter instanceof MetaElement) {
feature.eAdapters().remove(i);
}
}
feature.eAdapters().add((Adapter) metaElement);
}
public ExtendedReference getAssociatedExtendedReference(EStructuralFeature feature) {
MetaElement element = getAssociatedMetaElement(feature);
if (element instanceof ExtendedReference) {
return (ExtendedReference) element;
}
return null;
}
public ExtendedAttribute getAssociatedExtendedAttribute(EStructuralFeature feature) {
MetaElement element = getAssociatedMetaElement(feature);
if (element instanceof ExtendedAttribute) {
return (ExtendedAttribute) element;
}
return null;
}
private MetaElement getAssociatedMetaElement(EStructuralFeature feature) {
if (feature == null) {
return null;
}
for (Object adapter : feature.eAdapters()) {
if (adapter instanceof MetaElement) {
return (MetaElement) adapter;
}
}
return null;
}
public Object eGet(EObject obj, EStructuralFeature feature) {
if (obj instanceof MethodElement) {
MethodElement element = (MethodElement) obj;
if (feature instanceof EReference) {
EReference ref = (EReference) feature;
ExtendedReference eRef = getAssociatedExtendedReference(ref);
if (eRef != null) {
PropUtil propUtil = PropUtil.getPropUtil();
return propUtil.getExtendedReferenceList(element, eRef, false);
}
} else if (feature instanceof EAttribute && element instanceof ContentDescription) {
EAttribute att = (EAttribute) feature;
ExtendedAttribute eAtt = getAssociatedExtendedAttribute(att);
if (eAtt != null) {
PropUtil propUtil = PropUtil.getPropUtil();
return propUtil.getExtendedAttribute((ContentDescription) element, eAtt);
}
}
}
return obj.eGet(feature);
}
public List<EReference> getEAllReferences(MethodElement element) {
List<EReference> list = element.eClass().getEAllReferences();
PropUtil propUtil = PropUtil.getPropUtil();
ModifiedTypeMeta meta = propUtil.getGlobalMdtMeta(element);
if (meta != null) {
list = new ArrayList<EReference>(list);
for (ExtendedReference eRef : meta.getReferences()) {
list.add(eRef.getReference());
for (QualifiedReference qRef : eRef.getQualifiedReferences()) {
list.add(qRef.getReference());
}
}
}
return list;
}
}