/*
* 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 org.eclipse.core.runtime.IStatus;
import org.eclipse.emf.ecore.EObject;
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.UmlRelationship;
import org.teiid.designer.diagram.ui.DiagramUiConstants;
import org.teiid.designer.diagram.ui.DiagramUiPlugin;
/**
* AbstractBinaryAssociation
*
* @since 8.0
*/
public class AbstractBinaryAssociation
implements BinaryAssociation,
DiagramUiConstants {
private UmlRelationship umlAspect;
private EObject eObj;
private EObject sourceEObject;
private EObject targetEObject;
private int relationshipType = TYPE_UNKNOWN_RELATIONSHIP;
public AbstractBinaryAssociation( EObject eObj, boolean initialize ) {
setEObject( eObj );
MetamodelAspect theAspect = DiagramUiPlugin.getDiagramAspectManager().getUmlAspect( eObj );
if( theAspect instanceof UmlRelationship )
setUmlAspect( (UmlRelationship)theAspect );
if( initialize )
init(null, null);
}
public AbstractBinaryAssociation( EObject eObj, EObject sourceObject, EObject targetObject) {
setEObject( eObj );
if( eObj != null ) {
MetamodelAspect theAspect = DiagramUiPlugin.getDiagramAspectManager().getUmlAspect( eObj );
if( theAspect != null && theAspect instanceof UmlRelationship )
setUmlAspect( (UmlRelationship)theAspect );
}
init(sourceObject, targetObject);
}
private void init(EObject sourceEObject, EObject targetEObject) {
// Let's populate the ends...
if( sourceEObject != null ) {
setSourceEObject(sourceEObject);
}
if( targetEObject != null ) {
setTargetEObject(targetEObject);
}
if( sourceEObject == null && targetEObject == null ) {
setSourceEObject(getEObject()); // UmlAssociation case
setTargetEObject(getEObject()); // UmlAssociation case
}
}
/**
* Set the association that the other methods will use
* @param assoc
*/
public void setEObject( EObject eObj ) {
this.eObj = eObj;
}
/**
* Set the association that the other methods will use
* @param assoc
*/
public EObject getEObject() {
return eObj;
}
/**
* Set the association that the other methods will use
* @param assoc
*/
@Override
public void setUmlAspect( UmlRelationship umlAspect ) {
this.umlAspect = umlAspect;
}
/**
* Get the association that the other methods will use
* @return the assoc
*/
public UmlRelationship getUmlAspect() {
return umlAspect;
}
/* (non-Javadoc)
* @See org.teiid.designer.diagram.ui.connection.BinaryAssocation#getEndCount(java.lang.Object)
*/
@Override
public int getEndCount() {
return UmlRelationshipHelper.getEndCount( getUmlAspect(), getEObject() );
}
/* (non-Javadoc)
* @See org.teiid.designer.diagram.ui.connection.BinaryAssocation#getRoleName(java.lang.Object, int)
*/
@Override
public String getRoleName( int end ) {
return UmlRelationshipHelper.getRoleName( getUmlAspect(), getEObject() , end );
}
/* (non-Javadoc)
* @See org.teiid.designer.diagram.ui.connection.BinaryAssocation#getMultiplicity(java.lang.Object, int)
*/
@Override
public String getMultiplicity( int end ) {
return UmlRelationshipHelper.getMultiplicity( getUmlAspect(), getEObject() , end );
}
/* (non-Javadoc)
* @See org.teiid.designer.diagram.ui.connection.BinaryAssocation#getAggregation(java.lang.Object, int)
*/
@Override
public int getAggregation( int end ) {
return UmlRelationshipHelper.getAggregation( getUmlAspect(), getEObject() , end );
}
/* (non-Javadoc)
* @See org.teiid.designer.diagram.ui.connection.BinaryAssocation#getProperties(java.lang.Object, int)
*/
@Override
public String[] getProperties( int end ) {
return UmlRelationshipHelper.getProperties( getUmlAspect(), getEObject() , end );
}
/* (non-Javadoc)
* @See org.teiid.designer.diagram.ui.connection.BinaryAssocation#getNavigability(java.lang.Object, int)
*/
@Override
public int getNavigability( int end ) {
return UmlRelationshipHelper.getNavigability( getUmlAspect(), getEObject() , end );
}
/* (non-Javadoc)
* @See org.teiid.designer.diagram.ui.connection.BinaryAssocation#getEnd(java.lang.Object, int)
*/
@Override
public EObject getEnd( int end ) {
if( !(getUmlAspect() instanceof UmlAssociation) ) {
if( end == BinaryAssociation.SOURCE_END && sourceEObject != null )
return sourceEObject;
if( end == BinaryAssociation.TARGET_END && targetEObject != null )
return targetEObject;
}
return UmlRelationshipHelper.getEnd( getUmlAspect(), getEObject() , end );
}
/* (non-Javadoc)
* @See org.teiid.designer.diagram.ui.connection.BinaryAssocation#getEndTarget(java.lang.Object, int)
*/
@Override
public EObject getEndTarget( int end ) {
return UmlRelationshipHelper.getEndTarget( getUmlAspect(), getEObject() , end );
}
/* (non-Javadoc)
* @See org.teiid.designer.diagram.ui.connection.BinaryAssocation#setRoleName(java.lang.Object, int, java.lang.String)
*/
@Override
public IStatus setRoleName( int end, String name ) {
return UmlRelationshipHelper.setRoleName( getUmlAspect(), getEObject() , end, name );
}
/* (non-Javadoc)
* @See org.teiid.designer.diagram.ui.connection.BinaryAssocation#setMultiplicity(java.lang.Object, int, java.lang.String)
*/
@Override
public IStatus setMultiplicity( int end, String mult ) {
return UmlRelationshipHelper.setMultiplicity( getUmlAspect(), getEObject() , end, mult );
}
/* (non-Javadoc)
* @See org.teiid.designer.diagram.ui.connection.BinaryAssocation#setProperties(java.lang.Object, int, java.lang.String)
*/
@Override
public IStatus setProperties( int end, String[] props ) {
return UmlRelationshipHelper.setProperties( getUmlAspect(), getEObject() , end, props );
}
/* (non-Javadoc)
* @See org.teiid.designer.diagram.ui.connection.BinaryAssocation#setNavigability(java.lang.Object, int, int)
*/
@Override
public IStatus setNavigability( int end, int navigability ) {
return UmlRelationshipHelper.setNavigability( getUmlAspect(), getEObject() , end, navigability );
}
/* (non-Javadoc)
* @See org.teiid.designer.diagram.ui.connection.BinaryAssocation#getVisibility(java.lang.Object)
*/
@Override
public int getVisibility() {
return UmlRelationshipHelper.getVisibility( getUmlAspect(), getEObject() );
}
/* (non-Javadoc)
* @See org.teiid.designer.diagram.ui.connection.BinaryAssocation#getStereotype(java.lang.Object)
*/
@Override
public String getStereotype() {
return UmlRelationshipHelper.getStereotype( getUmlAspect(), getEObject() );
}
/* (non-Javadoc)
* @See org.teiid.designer.diagram.ui.connection.BinaryAssocation#getSignature(java.lang.Object, int)
*/
@Override
public String getSignature( int showMask ) {
return UmlRelationshipHelper.getSignature( getUmlAspect(), getEObject(), showMask );
}
/* (non-Javadoc)
* @See org.teiid.designer.diagram.ui.connection.BinaryAssocation#getEditableSignature(java.lang.Object)
*/
@Override
public String getEditableSignature() {
return UmlRelationshipHelper.getEditableSignature( getUmlAspect(), getEObject() );
}
/* (non-Javadoc)
* @See org.teiid.designer.diagram.ui.connection.BinaryAssocation#setSignature(java.lang.Object, java.lang.String)
*/
@Override
public IStatus setSignature( String newSignature ) {
return UmlRelationshipHelper.setSignature( getUmlAspect(), getEObject(), newSignature );
}
/**
* @return
*/
public EObject getSourceEObject() {
return sourceEObject;
}
/**
* @return
*/
public EObject getTargetEObject() {
return targetEObject;
}
/**
* @param object
*/
public void setSourceEObject(EObject object) {
sourceEObject = object;
// give the helper a chance to change it here?? i.e. UmlAssociations (column to column)
EObject endSourceEObject = object;
if( getUmlAspect()!= null && getUmlAspect() instanceof UmlAssociation )
endSourceEObject = UmlRelationshipHelper.getEndTarget(getUmlAspect(), object, BinaryAssociation.SOURCE_END);
if( endSourceEObject != null ) {
sourceEObject = endSourceEObject;
}
}
/**
* @param object
*/
public void setTargetEObject(EObject object) {
targetEObject = object;
// give the helper a chance to change it here?? i.e. UmlAssociations (column to column)
EObject endTargetEObject = object;
if( getUmlAspect()!= null && getUmlAspect() instanceof UmlAssociation )
endTargetEObject = UmlRelationshipHelper.getEndTarget(getUmlAspect(), object, BinaryAssociation.TARGET_END);
if( endTargetEObject != null ) {
targetEObject = endTargetEObject;
}
}
/* (non-Javadoc)
* @See org.teiid.designer.diagram.ui.connection.BinaryAssociation#getRelationshipType()
*/
@Override
public int getRelationshipType() {
return relationshipType;
}
/**
* @param i
*/
public void setRelationshipType(int i) {
relationshipType = i;
}
/* (non-Javadoc)
* @See org.teiid.designer.diagram.ui.connection.BinaryAssociation#getRelationshipAspect()
*/
@Override
public UmlRelationship getRelationshipAspect() {
// XXX Auto-generated method stub
return umlAspect;
}
/* (non-Javadoc)
* @See org.teiid.designer.diagram.ui.connection.BinaryAssociation#getReference()
*/
@Override
public EObject getReference() {
// XXX Auto-generated method stub
return eObj;
}
/* (non-Javadoc)
* @see java.lang.Object#equals(java.lang.Object)
*/
@Override
public boolean equals(Object someOtherBass) {
if( someOtherBass == this)
return true;
boolean isEqual = false;
if( someOtherBass instanceof BinaryAssociation) {
isEqual = true;
BinaryAssociation otherBass = (BinaryAssociation)someOtherBass;
if( otherBass.getReference() == null && getReference() != null )
isEqual = false;
if( isEqual && otherBass.getReference() != null && getReference() == null )
isEqual = false;
if( isEqual && !(otherBass.getReference().equals(getReference())) )
isEqual = false;
if( isEqual && otherBass.getReference() != null && getReference() != null ) {
if( otherBass.getRelationshipAspect() instanceof UmlAssociation &&
getRelationshipAspect() instanceof UmlAssociation ) {
EObject otherSource = otherBass.getEndTarget(BinaryAssociation.SOURCE_END);
EObject thisSource = getEndTarget(BinaryAssociation.SOURCE_END);
EObject otherTarget = otherBass.getEndTarget(BinaryAssociation.TARGET_END);
EObject thisTarget = getEndTarget(BinaryAssociation.TARGET_END);
if( otherSource == null || thisSource == null )
isEqual = false;
if( isEqual && !thisSource.equals(otherSource))
isEqual = false;
if( otherTarget == null || thisTarget == null )
isEqual = false;
if( isEqual && !otherTarget.equals(thisTarget))
isEqual = false;
}
}
}
return isEqual;
}
}