package org.archstudio.xadl;
import java.io.Serializable;
import java.util.List;
import org.archstudio.sysutils.SystemUtils;
import org.archstudio.xadl3.implementation_3_0.Implementation_3_0Package;
import org.archstudio.xadl3.structure_3_0.Structure_3_0Package;
import org.archstudio.xadl3.xadlcore_3_0.Extension;
import org.archstudio.xarchadt.IXArchADT;
import org.archstudio.xarchadt.IXArchADTFeature;
import org.archstudio.xarchadt.IXArchADTQuery;
import org.archstudio.xarchadt.IXArchADTTypeMetadata;
import org.archstudio.xarchadt.ObjRef;
import org.archstudio.xarchadt.XArchADTProxy;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EClassifier;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EPackage;
import org.eclipse.emf.ecore.EReference;
import org.eclipse.jdt.annotation.Nullable;
import com.google.common.collect.Iterables;
import com.google.common.collect.Lists;
public class XadlUtils {
@Nullable
public static String getID(IXArchADTQuery xarch, ObjRef ref) {
try {
return (String) xarch.get(ref, "id");
} catch (Exception e) {
}
return null;
}
@Nullable
public static String getName(IXArchADTQuery xarch, ObjRef ref) {
try {
String name = (String) xarch.get(ref, "name");
return name == null ? "[No Name]" : name;
} catch (Exception e) {
}
return null;
}
public static void setName(IXArchADT xarch, ObjRef ref, String newName) {
xarch.set(ref, "name", newName);
}
@Nullable
public static ObjRef getExt(IXArchADTQuery xarch, ObjRef ref, String extensionNsURI,
String extensionTypeName) {
if (xarch.getTypeMetadata(ref).getFeatures().containsKey("ext")) {
for (ObjRef extRef : Iterables.filter(xarch.getAll(ref, "ext"), ObjRef.class)) {
if (xarch.isInstanceOf(extRef, extensionNsURI, extensionTypeName)) {
return extRef;
}
}
}
return null;
}
@SuppressWarnings("unchecked")
public static @Nullable <T extends Extension> T getExt(IXArchADT xarch, EObject eObject,
EClass extClass) {
return (T) XArchADTProxy.proxy(xarch, getExt(xarch, XArchADTProxy.unproxy(eObject),
extClass.getEPackage().getNsURI(), extClass.getName()));
}
public static ObjRef createExt(IXArchADT xarch, ObjRef ref, String extensionNsURI,
String extensionTypeName) {
ObjRef extRef = getExt(xarch, ref, extensionNsURI, extensionTypeName);
if (extRef == null) {
extRef = xarch.create(extensionNsURI, extensionTypeName);
xarch.add(ref, "ext", extRef);
}
return extRef;
}
@SuppressWarnings("unchecked")
public static <T extends Extension> T createExt(IXArchADT xarch, EObject eObject,
EClass extClass) {
return (T) XArchADTProxy.proxy(xarch, createExt(xarch, XArchADTProxy.unproxy(eObject),
extClass.getEPackage().getNsURI(), extClass.getName()));
}
public static boolean isBrick(IXArchADTQuery xarch, ObjRef ref) {
return isInstanceOf(xarch, ref, Structure_3_0Package.Literals.BRICK);
}
public static boolean isComponent(IXArchADTQuery xarch, ObjRef ref) {
return isInstanceOf(xarch, ref, Structure_3_0Package.Literals.COMPONENT);
}
public static boolean isConnector(IXArchADTQuery xarch, ObjRef ref) {
return isInstanceOf(xarch, ref, Structure_3_0Package.Literals.CONNECTOR);
}
public static @Nullable ObjRef getImplementation(IXArchADTQuery xarch, ObjRef ref, EClass type) {
EClass extClass = Implementation_3_0Package.Literals.IMPLEMENTATION_EXTENSION;
ObjRef implementationExtRef =
XadlUtils.getExt(xarch, ref, extClass.getEPackage().getNsURI(), extClass.getName());
if (implementationExtRef != null) {
for (ObjRef implementationRef : Iterables
.filter(xarch.getAll(implementationExtRef, "implementation"), ObjRef.class)) {
if (XadlUtils.isInstanceOf(xarch, implementationRef, type)) {
return implementationRef;
}
}
}
return null;
}
public static List<ObjRef> getAllSubstitutionGroupElementsByType(IXArchADTQuery xarch, ObjRef ref,
String substitutionGroupName, String targetNsURI, String targetTypeName) {
List<ObjRef> matchingRefs = Lists.newArrayList();
for (ObjRef objRef : Iterables.filter(xarch.getAll(ref, substitutionGroupName), ObjRef.class)) {
if (xarch.isInstanceOf(objRef, targetNsURI, targetTypeName)) {
matchingRefs.add(objRef);
}
}
return matchingRefs;
}
public static List<ObjRef> getAllSubstitutionGroupElementsByTag(IXArchADTQuery xarch, ObjRef ref,
String substitutionGroupName, String tagName) {
List<ObjRef> matchingRefs = Lists.newArrayList();
for (ObjRef objRef : Iterables.filter(xarch.getAll(ref, substitutionGroupName), ObjRef.class)) {
String refTagName = xarch.getTagName(objRef);
if (tagName.equals(refTagName)) {
matchingRefs.add(objRef);
}
}
return matchingRefs;
}
public static String getDisplayName(IXArchADTQuery xarch, ObjRef ref) {
StringBuffer sb = new StringBuffer();
String tagName = xarch.getTagName(ref);
String containingFeatureName = xarch.getContainingFeatureName(ref);
if (tagName == null) {
sb.append(SystemUtils.capFirst(containingFeatureName));
} else if (tagName.equals(containingFeatureName)) {
sb.append(SystemUtils.capFirst(tagName));
} else {
sb.append(SystemUtils.capFirst(containingFeatureName));
sb.append(" (");
sb.append(SystemUtils.capFirst(tagName));
sb.append(")");
}
return sb.toString();
}
public static @Nullable IXArchADTFeature getFeatureByName(IXArchADTQuery xarch, ObjRef ref,
String name) {
IXArchADTTypeMetadata typeMetadata = xarch.getTypeMetadata(ref);
for (IXArchADTFeature feature : typeMetadata.getFeatures().values()) {
if (feature.getName().equals(name)) {
return feature;
}
}
return null;
}
public static boolean isRootElement(IXArchADTQuery xarch, ObjRef ref) {
// FIXME: This won't work for non-xADL documents
return xarch.getTagsOnlyPathString(ref).equals("xADL");
}
public static ObjRef create(IXArchADT xarch, EClass eClass) {
return xarch.create(eClass.getEPackage().getNsURI(), eClass.getName());
}
public static <DOCUMENT_ROOT extends EObject> DOCUMENT_ROOT createDocument(IXArchADT xarch,
URI uri, EReference documentRootReference) {
EClass eClass = documentRootReference.getEContainingClass();
String eClassURI = eClass.getEPackage().getNsURI();
ObjRef documentRootRef = xarch.createDocument(uri, eClassURI);
return XArchADTProxy.proxy(xarch, documentRootRef);
}
public static boolean isInstanceOf(IXArchADTQuery xarch, Object object, EClass eClass) {
if (object instanceof Serializable) {
return xarch.isInstanceOf((Serializable) object, eClass.getEPackage().getNsURI(),
eClass.getName());
}
return false;
}
public static boolean isInstanceOf(IXArchADTQuery xarch, IXArchADTFeature feature,
EClass eClass) {
return xarch.isAssignable(feature.getNsURI(), feature.getTypeName(),
eClass.getEPackage().getNsURI(), eClass.getName());
}
public static boolean isInstanceOf(IXArchADTQuery xarch, EClass objectEClass, EClass eClass) {
return xarch.isAssignable(objectEClass.getEPackage().getNsURI(), objectEClass.getName(),
eClass.getEPackage().getNsURI(), eClass.getName());
}
/**
* Returns <code>true</code> if an instance of the thing referred to by typeMetadata could be
* assigned to the feature, <code>false</code> otherwise.
*
* @param xarch xArchADT instance
* @param feature The feature that is going to be assigned.
* @param typeMetadata The thing you want to assign to the feature.
* @return <code>true</code> if an instance of the thing referred to by typeMetadata could be
* assigned to the feature, <code>false</code> otherwise.
*/
public static boolean isAssignableTo(IXArchADTQuery xarch, IXArchADTFeature feature,
IXArchADTTypeMetadata typeMetadata) {
return xarch.isAssignable(feature.getNsURI(), feature.getTypeName(), typeMetadata.getNsURI(),
typeMetadata.getTypeName());
}
public static void remove(IXArchADT xarch, ObjRef objRef) {
ObjRef parentRef = xarch.getParent(objRef);
if (parentRef != null) {
IXArchADTTypeMetadata type = xarch.getTypeMetadata(parentRef);
String elementName = xarch.getContainingFeatureName(objRef);
if (elementName != null) {
switch (type.getFeatures().get(elementName).getType()) {
case ATTRIBUTE:
case ELEMENT_SINGLE:
xarch.clear(parentRef, elementName);
break;
case ELEMENT_MULTIPLE:
xarch.remove(parentRef, elementName, objRef);
break;
}
}
}
}
public static Class<?> getType(IXArchADT xarch, ObjRef objRef) {
IXArchADTTypeMetadata typeMetadata = xarch.getTypeMetadata(objRef);
String nsURI = typeMetadata.getNsURI();
EPackage ePackage = EPackage.Registry.INSTANCE.getEPackage(nsURI);
if (ePackage != null) {
String typeName = typeMetadata.getTypeName();
EClassifier eClassifier = ePackage.getEClassifier(typeName);
if (eClassifier instanceof EClass) {
EClass eClass = (EClass) eClassifier;
return eClass.getInstanceClass();
}
}
return Object.class;
}
}