/*
* JBoss, Home of Professional Open Source.
*
* See the LEGAL.txt file distributed with this work for information regarding copyright ownership and licensing.
*
* See the AUTHORS.txt file distributed with this work for a full listing of individual contributors.
*/
package org.teiid.designer.diagram.ui.connection;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.emf.ecore.EObject;
import org.teiid.designer.core.metamodel.MetamodelDescriptor;
import org.teiid.designer.core.metamodel.aspect.MetamodelAspect;
import org.teiid.designer.core.metamodel.aspect.uml.UmlAssociation;
import org.teiid.designer.core.metamodel.aspect.uml.UmlClassifier;
import org.teiid.designer.core.metamodel.aspect.uml.UmlDependency;
import org.teiid.designer.core.metamodel.aspect.uml.UmlDiagramAspect;
import org.teiid.designer.core.metamodel.aspect.uml.UmlGeneralization;
import org.teiid.designer.core.metamodel.aspect.uml.UmlRelationship;
import org.teiid.designer.core.workspace.ModelResource;
import org.teiid.designer.core.workspace.ModelWorkspaceException;
import org.teiid.designer.diagram.ui.DiagramUiPlugin;
import org.teiid.designer.diagram.ui.util.DiagramUiUtilities;
import org.teiid.designer.ui.viewsupport.ModelUtilities;
/**
* @author BLaFond To change the template for this generated type comment go to Window>Preferences>Java>Code
* Generation>Code and Comments
*
* @since 8.0
*/
public class UmlRelationshipHelper {
private static final String DUMMY_VALUE = "x"; //$NON-NLS-1$
/* (non-Javadoc)
* @See org.teiid.designer.diagram.ui.connection.BinaryAssocation#getEndCount(java.lang.Object)
*/
public static int getEndCount( final UmlRelationship relationshipAspect,
final EObject eObject ) {
int endCount = 1;
if (relationshipAspect instanceof UmlAssociation) {
endCount = ((UmlAssociation)relationshipAspect).getEndCount(eObject);
} else if (relationshipAspect instanceof UmlDependency) {
} else if (relationshipAspect instanceof UmlGeneralization) {
}
return endCount;
}
/* (non-Javadoc)
* @See org.teiid.designer.diagram.ui.connection.BinaryAssocation#getRoleName(java.lang.Object, int)
*/
public static String getRoleName( final UmlRelationship relationshipAspect,
final EObject eObject,
final int end ) {
String roleName = null;
if (relationshipAspect instanceof UmlAssociation) {
roleName = ((UmlAssociation)relationshipAspect).getRoleName(eObject, end);
} else if (relationshipAspect instanceof UmlDependency) {
// Do nothing
} else if (relationshipAspect instanceof UmlGeneralization) {
// Do Nothing
}
return roleName;
}
/* (non-Javadoc)
* @See org.teiid.designer.diagram.ui.connection.BinaryAssocation#getMultiplicity(java.lang.Object, int)
*/
public static String getMultiplicity( final UmlRelationship relationshipAspect,
final EObject eObject,
final int end ) {
String multiplicity = null;
if (relationshipAspect instanceof UmlAssociation) {
multiplicity = ((UmlAssociation)relationshipAspect).getMultiplicity(eObject, end);
} else if (relationshipAspect instanceof UmlDependency) {
// Do nothing
} else if (relationshipAspect instanceof UmlGeneralization) {
// Do Nothing
}
return multiplicity;
}
/* (non-Javadoc)
* @See org.teiid.designer.diagram.ui.connection.BinaryAssocation#getAggregation(java.lang.Object, int)
*/
public static int getAggregation( final UmlRelationship relationshipAspect,
final EObject eObject,
final int end ) {
int aggregation = 0;
if (relationshipAspect instanceof UmlAssociation) {
aggregation = ((UmlAssociation)relationshipAspect).getAggregation(eObject, end);
} else if (relationshipAspect instanceof UmlDependency) {
} else if (relationshipAspect instanceof UmlGeneralization) {
}
return aggregation;
}
/* (non-Javadoc)
* @See org.teiid.designer.diagram.ui.connection.BinaryAssocation#getProperties(java.lang.Object, int)
*/
public static String[] getProperties( final UmlRelationship relationshipAspect,
final EObject eObject,
final int end ) {
String[] properties = null;
if (relationshipAspect instanceof UmlAssociation) {
properties = ((UmlAssociation)relationshipAspect).getProperties(eObject, end);
} else if (relationshipAspect instanceof UmlDependency) {
// Do nothing
} else if (relationshipAspect instanceof UmlGeneralization) {
// Do Nothing
}
return properties;
}
/* (non-Javadoc)
* @See org.teiid.designer.diagram.ui.connection.BinaryAssocation#getNavigability(java.lang.Object, int)
*/
public static int getNavigability( final UmlRelationship relationshipAspect,
final EObject eObject,
final int end ) {
int navigability = UmlAssociation.NAVIGABILITY_NONE;
if (relationshipAspect instanceof UmlAssociation) {
navigability = ((UmlAssociation)relationshipAspect).getNavigability(eObject, end);
} else if (relationshipAspect instanceof UmlDependency) {
} else if (relationshipAspect instanceof UmlGeneralization) {
}
return navigability;
}
/* (non-Javadoc)
* @See org.teiid.designer.diagram.ui.connection.BinaryAssocation#getEnd(java.lang.Object, int)
*/
public static EObject getEnd( final UmlRelationship relationshipAspect,
final EObject eObject,
final int end ) {
EObject endEObject = null;
if (relationshipAspect instanceof UmlAssociation) {
endEObject = ((UmlAssociation)relationshipAspect).getEnd(eObject, end);
} else if (relationshipAspect instanceof UmlDependency) {
} else if (relationshipAspect instanceof UmlGeneralization) {
}
return endEObject;
}
/* (non-Javadoc)
* @See org.teiid.designer.diagram.ui.connection.BinaryAssocation#getEndTarget(java.lang.Object, int)
*/
public static EObject getEndTarget( final UmlRelationship relationshipAspect,
final EObject eObject,
final int end ) {
EObject endETargetObject = null;
if (relationshipAspect instanceof UmlAssociation) {
endETargetObject = ((UmlAssociation)relationshipAspect).getEndTarget(eObject, end);
} else if (relationshipAspect instanceof UmlDependency) {
endETargetObject = eObject;
} else if (relationshipAspect instanceof UmlGeneralization) {
if (end == BinaryAssociation.SOURCE_END) endETargetObject = ((UmlGeneralization)relationshipAspect).getSpecific(eObject);
else endETargetObject = ((UmlGeneralization)relationshipAspect).getGeneral(eObject);
}
return endETargetObject;
}
/* (non-Javadoc)
* @See org.teiid.designer.diagram.ui.connection.BinaryAssocation#setRoleName(java.lang.Object, int, java.lang.String)
*/
public static IStatus setRoleName( final UmlRelationship relationshipAspect,
final EObject eObject,
final int end,
final String name ) {
IStatus iStatus = null;
if (relationshipAspect instanceof UmlAssociation) {
iStatus = ((UmlAssociation)relationshipAspect).setRoleName(eObject, end, name);
} else if (relationshipAspect instanceof UmlDependency) {
// Do nothing
} else if (relationshipAspect instanceof UmlGeneralization) {
// Do Nothing
}
return iStatus;
}
/* (non-Javadoc)
* @See org.teiid.designer.diagram.ui.connection.BinaryAssocation#setMultiplicity(java.lang.Object, int, java.lang.String)
*/
public static IStatus setMultiplicity( final UmlRelationship relationshipAspect,
final EObject eObject,
final int end,
final String mult ) {
IStatus iStatus = null;
if (relationshipAspect instanceof UmlAssociation) {
iStatus = ((UmlAssociation)relationshipAspect).setMultiplicity(eObject, end, mult);
} else if (relationshipAspect instanceof UmlDependency) {
// Do nothing
} else if (relationshipAspect instanceof UmlGeneralization) {
// Do Nothing
}
return iStatus;
}
/* (non-Javadoc)
* @See org.teiid.designer.diagram.ui.connection.BinaryAssocation#setProperties(java.lang.Object, int, java.lang.String)
*/
public static IStatus setProperties( final UmlRelationship relationshipAspect,
final EObject eObject,
final int end,
final String[] props ) {
IStatus iStatus = null;
if (relationshipAspect instanceof UmlAssociation) {
iStatus = ((UmlAssociation)relationshipAspect).setProperties(eObject, end, props);
} else if (relationshipAspect instanceof UmlDependency) {
// Do nothing
} else if (relationshipAspect instanceof UmlGeneralization) {
// Do Nothing
}
return iStatus;
}
/* (non-Javadoc)
* @See org.teiid.designer.diagram.ui.connection.BinaryAssocation#setNavigability(java.lang.Object, int, int)
*/
public static IStatus setNavigability( final UmlRelationship relationshipAspect,
final EObject eObject,
final int end,
final int navigability ) {
IStatus iStatus = null;
if (relationshipAspect instanceof UmlAssociation) {
iStatus = ((UmlAssociation)relationshipAspect).setNavigability(eObject, end, navigability);
} else if (relationshipAspect instanceof UmlDependency) {
// Do nothing
} else if (relationshipAspect instanceof UmlGeneralization) {
// Do Nothing
}
return iStatus;
}
/* (non-Javadoc)
* @See org.teiid.designer.diagram.ui.connection.BinaryAssocation#getVisibility(java.lang.Object)
*/
public static int getVisibility( final UmlRelationship relationshipAspect,
final EObject eObject ) {
int visibility = UmlDiagramAspect.VISIBILITY_DEFAULT;
if (relationshipAspect instanceof UmlAssociation) {
visibility = ((UmlAssociation)relationshipAspect).getVisibility(eObject);
} else if (relationshipAspect instanceof UmlDependency) {
} else if (relationshipAspect instanceof UmlGeneralization) {
}
return visibility;
}
/* (non-Javadoc)
* @See org.teiid.designer.diagram.ui.connection.BinaryAssocation#getStereotype(java.lang.Object)
*/
public static String getStereotype( final UmlRelationship relationshipAspect,
final EObject eObject ) {
String stereotype = null;
if (relationshipAspect instanceof UmlAssociation) {
stereotype = ((UmlAssociation)relationshipAspect).getStereotype(eObject);
} else if (relationshipAspect instanceof UmlDependency) {
// Do nothing
} else if (relationshipAspect instanceof UmlGeneralization) {
// Do Nothing
}
return stereotype;
}
/* (non-Javadoc)
* @See org.teiid.designer.diagram.ui.connection.BinaryAssocation#getSignature(java.lang.Object, int)
*/
public static String getSignature( final UmlRelationship relationshipAspect,
final EObject eObject,
final int showMask ) {
String signature = null;
if (relationshipAspect instanceof UmlAssociation) {
signature = ((UmlAssociation)relationshipAspect).getSignature(eObject, showMask);
} else if (relationshipAspect instanceof UmlDependency) {
// Do nothing
} else if (relationshipAspect instanceof UmlGeneralization) {
// Do Nothing
}
return signature;
}
/* (non-Javadoc)
* @See org.teiid.designer.diagram.ui.connection.BinaryAssocation#getEditableSignature(java.lang.Object)
*/
public static String getEditableSignature( final UmlRelationship relationshipAspect,
final EObject eObject ) {
String signature = null;
if (relationshipAspect instanceof UmlAssociation) {
signature = ((UmlAssociation)relationshipAspect).getEditableSignature(eObject);
} else if (relationshipAspect instanceof UmlDependency) {
// Do nothing
} else if (relationshipAspect instanceof UmlGeneralization) {
// Do Nothing
}
return signature;
}
/* (non-Javadoc)
* @See org.teiid.designer.diagram.ui.connection.BinaryAssocation#setSignature(java.lang.Object, java.lang.String)
*/
public static IStatus setSignature( final UmlRelationship relationshipAspect,
final EObject eObject,
final String newSignature ) {
IStatus iStatus = null;
if (relationshipAspect instanceof UmlAssociation) {
iStatus = ((UmlAssociation)relationshipAspect).setSignature(eObject, newSignature);
} else if (relationshipAspect instanceof UmlDependency) {
// Do nothing
} else if (relationshipAspect instanceof UmlGeneralization) {
// Do Nothing
}
return iStatus;
}
public static int getType( final UmlRelationship relationshipAspect ) {
if (relationshipAspect != null) {
if (relationshipAspect instanceof UmlAssociation) {
return BinaryAssociation.TYPE_UML_ASSOCIATION;
} else if (relationshipAspect instanceof UmlDependency) {
return BinaryAssociation.TYPE_UML_DEPENDENCY;
} else if (relationshipAspect instanceof UmlGeneralization) {
return BinaryAssociation.TYPE_UML_GENERALIZATION;
}
}
return BinaryAssociation.TYPE_UNKNOWN_RELATIONSHIP;
}
public static int getType( final EObject eObject ) {
UmlRelationship relationshipAspect = getRelationshipAspect(eObject);
return getType(relationshipAspect);
}
public static UmlRelationship getRelationshipAspect( final EObject eObj ) {
MetamodelAspect theAspect = DiagramUiPlugin.getDiagramAspectManager().getUmlAspect(eObj);
if (theAspect instanceof UmlRelationship) {
return (UmlRelationship)theAspect;
}
return null;
}
public static boolean isUmlModel( final EObject eObject ) {
ModelResource modelResource = ModelUtilities.getModelResourceForModelObject(eObject);
if (modelResource != null && isUmlModelResource(modelResource)) return true;
return false;
}
public static boolean isUmlModelResource( final ModelResource modelResource ) {
boolean result = false;
MetamodelDescriptor descriptor = null;
try {
descriptor = modelResource.getPrimaryMetamodelDescriptor();
} catch (ModelWorkspaceException e) {
e.printStackTrace();
}
if (descriptor != null) { // && descriptor.getURI().equals(RelationshipPackage.eNS_URI)) {
result = true;
}
return result;
}
public static List getRelatedObjects( List eObjects ) {
HashMap relatedObjects = new HashMap();
Iterator iter = eObjects.iterator();
EObject nextEObj = null;
EObject nextEObj_2 = null;
while (iter.hasNext()) {
nextEObj = (EObject)iter.next();
if (nextEObj != null) {
List relObjs = getRelatedObjects(nextEObj);
if (!relObjs.isEmpty()) {
Iterator iter_2 = relObjs.iterator();
while (iter_2.hasNext()) {
nextEObj_2 = (EObject)iter_2.next();
if (nextEObj_2 != null) relatedObjects.put(nextEObj_2, DUMMY_VALUE);
}
}
}
}
if (relatedObjects.isEmpty()) return Collections.EMPTY_LIST;
return new ArrayList(relatedObjects.keySet());
}
public static List getRelatedObjects( EObject eObject ) {
List binaryAss = getRelationships(eObject);
if (!binaryAss.isEmpty()) {
HashMap relatedObjects = new HashMap();
Iterator iter = binaryAss.iterator();
BinaryAssociation nextBass = null;
EObject sourceEObject = null;
EObject targetEObject = null;
while (iter.hasNext()) {
nextBass = (BinaryAssociation)iter.next();
sourceEObject = getSourceEnd(nextBass);
if (sourceEObject != null && !(sourceEObject == eObject)) relatedObjects.put(sourceEObject, DUMMY_VALUE);
targetEObject = getTargetEnd(nextBass);
if (targetEObject != null && !(targetEObject == eObject)) relatedObjects.put(targetEObject, DUMMY_VALUE);
}
if (relatedObjects.isEmpty()) return Collections.EMPTY_LIST;
return new ArrayList(relatedObjects.keySet());
}
return Collections.EMPTY_LIST;
}
public static List getRelationships( EObject targetEObject ) {
MetamodelAspect classifierAspect = getAspect(targetEObject);
List allBasses = new ArrayList();
if (classifierAspect instanceof UmlClassifier) {
Collection relationships = ((UmlClassifier)classifierAspect).getRelationships(targetEObject);
Collection superTypes = ((UmlClassifier)classifierAspect).getSupertypes(targetEObject);
List allAssociations = new ArrayList();
if (relationships != null && !relationships.isEmpty()) {
Iterator iter = relationships.iterator();
Object nextObject = null;
while (iter.hasNext()) {
nextObject = iter.next();
if (!allAssociations.contains(nextObject)) allAssociations.add(nextObject);
}
}
if (superTypes != null && !superTypes.isEmpty()) {
Iterator iter = superTypes.iterator();
Object nextObject = null;
while (iter.hasNext()) {
nextObject = iter.next();
if (!allAssociations.contains(nextObject)) allAssociations.add(nextObject);
}
}
// Object obj = null;
allBasses = UmlRelationshipFactory.getBinaryAssociations(allAssociations, targetEObject);
}
return allBasses;
}
public static EObject getSourceEnd( BinaryAssociation bAss ) {
EObject sourceEObject = bAss.getEndTarget(BinaryAssociation.SOURCE_END);
if (sourceEObject != null) {
EObject sourceParent = getTopClassifier(sourceEObject);
if (sourceParent != null && sourceParent != sourceEObject) {
return sourceParent;
}
return sourceEObject;
}
return null;
}
public static EObject getTargetEnd( BinaryAssociation bAss ) {
EObject targetEObject = bAss.getEndTarget(BinaryAssociation.TARGET_END);
if (targetEObject != null) {
EObject targetParent = getTopClassifier(targetEObject);
if (targetParent != null && targetParent != targetEObject) {
return targetParent;
}
return targetEObject;
}
return null;
}
public static List getRelationshipEnds( BinaryAssociation bAss ) {
HashMap assMap = new HashMap(); // Holds a list of all association ends.
EObject sourceEObject = bAss.getEndTarget(BinaryAssociation.SOURCE_END);
EObject targetEObject = bAss.getEndTarget(BinaryAssociation.TARGET_END);
if (sourceEObject != null && targetEObject != null && !sourceEObject.equals(targetEObject)) {
// Make sure these aren't nested in any way. i.e. get the top level classifier node.
EObject sourceParent = getTopClassifier(sourceEObject);
if (sourceParent != null) {
if (sourceParent == sourceEObject) {
assMap.put(sourceEObject, DUMMY_VALUE);
} else {
assMap.put(sourceParent, DUMMY_VALUE);
}
} else {
assMap.put(sourceEObject, DUMMY_VALUE);
}
EObject targetParent = getTopClassifier(targetEObject);
if (targetParent != null) {
if (targetParent == targetEObject) {
assMap.put(targetEObject, DUMMY_VALUE);
} else {
assMap.put(targetParent, DUMMY_VALUE);
}
} else {
assMap.put(targetEObject, DUMMY_VALUE);
}
}
if (assMap.isEmpty()) return Collections.EMPTY_LIST;
return new ArrayList(assMap.keySet());
}
public static EObject getTopClassifier( EObject targetEObject ) {
return DiagramUiUtilities.getParentClassifier(targetEObject);
}
public static MetamodelAspect getAspect( EObject eObj ) {
return DiagramUiPlugin.getDiagramAspectManager().getUmlAspect(eObj);
}
}