blob: dddaf1835c5d7817502f0a6ceb752ed6bcb9d488 [file] [log] [blame]
package org.eclipse.epf.library.edit.meta.internal;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import org.eclipse.emf.ecore.EReference;
import org.eclipse.epf.common.utils.XMLUtil;
import org.eclipse.epf.library.edit.meta.IMetaDef;
import org.eclipse.epf.library.edit.meta.TypeDefException;
import org.eclipse.epf.library.edit.meta.TypeDefUtil;
import org.eclipse.epf.uma.UmaPackage;
import org.eclipse.epf.uma.util.ExtendedOpposite;
import org.eclipse.epf.uma.util.ExtendedReference;
import org.eclipse.epf.uma.util.MetaElement;
import org.eclipse.epf.uma.util.QualifiedReference;
import org.eclipse.epf.uma.util.UmaUtil;
import org.w3c.dom.Element;
public class ExtendedReferenceImpl extends MetaElementImpl implements ExtendedReference {
private EReference ref;
private List<QualifiedReference> qualifiedReferences;
private List<String> valueTypes;
private String contributeTo;
private ExtendedOppositeImpl opposite;
public ExtendedReferenceImpl(MetaElement parent) {
super(parent);
}
public EReference getReference() {
return ref;
}
protected void setReference(EReference ref) {
this.ref = ref;
}
public List<QualifiedReference> getQualifiedReferences() {
return qualifiedReferences;
}
public void parseElement(Element element) throws TypeDefException {
super.parseElement(element);
if (element == null) {
return;
}
ref = UmaUtil.createReference(getId());
TypeDefUtil.getInstance().associate(this, ref);
valueTypes = XMLUtil.getChildTextsByTagName(element, IMetaDef.valueType);
contributeTo = element.getAttribute(IMetaDef.contributeTo);
if (contributeTo != null) {
contributeTo = contributeTo.toLowerCase();
}
if (Roles.equals(contributeTo)) {
valueTypes = Collections.singletonList(UmaPackage.eINSTANCE.getRole().getInstanceClass().getName());
} else if (WorkProducts.equals(contributeTo)) {
valueTypes = Collections.singletonList(UmaPackage.eINSTANCE.getWorkProduct().getInstanceClass().getName());
} else {
contributeTo = null;
}
Element childElement = XMLUtil.getFirstChild(element, IMetaDef.oppositeReference);
if (childElement != null) {
opposite = new ExtendedOppositeImpl(this);
opposite.parseElement(childElement);
}
qualifiedReferences = new ArrayList<QualifiedReference>();
List<Element> rqElements = XMLUtil.getChildElementsByTagName(element, IMetaDef.REFERENCE_QUALIFIERS);
if (rqElements == null || rqElements.isEmpty()) {
return;
}
for (Element rqElement : rqElements) {
List<Element> qElements = XMLUtil.getChildElementsByTagName(rqElement, IMetaDef.QUALIFIER);
for (Element qElement : qElements) {
QualifiedReferenceImpl q = new QualifiedReferenceImpl(this);
q.parseElement(qElement);
qualifiedReferences.add(q);
}
}
}
public List<String> getValueTypes() {
return valueTypes;
}
public String getContributeTo() {
return contributeTo;
}
@Override
public boolean processInheritance() {
if (! super.processInheritance()) {
return false;
}
if (getSuperMeta() == null) {
qualifiedReferences = (List<QualifiedReference>) processSuppress(this.getQualifiedReferences());
return true;
}
if (getSuperMeta() instanceof ExtendedReferenceImpl) {
ExtendedReferenceImpl sMeta = (ExtendedReferenceImpl) getSuperMeta();
sMeta.processInheritance();
qualifiedReferences = (List<QualifiedReference>) processInherentList(this.getQualifiedReferences(), sMeta.getQualifiedReferences());
for (QualifiedReference qref : getQualifiedReferences()) {
qref.processInheritance();
}
return true;
}
return true;
}
public ExtendedOpposite getOpposite() {
return opposite;
}
}