/*
* ====================================================================
*
* The ObjectStyle Group Software License, Version 1.0
*
* Copyright (c) 2006 The ObjectStyle Group and individual authors of the
* software. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* 3. The end-user documentation included with the redistribution, if any, must
* include the following acknowlegement: "This product includes software
* developed by the ObjectStyle Group (http://objectstyle.org/)." Alternately,
* this acknowlegement may appear in the software itself, if and wherever such
* third-party acknowlegements normally appear.
*
* 4. The names "ObjectStyle Group" and "Cayenne" must not be used to endorse or
* promote products derived from this software without prior written permission.
* For written permission, please contact andrus@objectstyle.org.
*
* 5. Products derived from this software may not be called "ObjectStyle" nor
* may "ObjectStyle" appear in their names without prior written permission of
* the ObjectStyle Group.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
* FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
* OBJECTSTYLE GROUP OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* ====================================================================
*
* This software consists of voluntary contributions made by many individuals on
* behalf of the ObjectStyle Group. For more information on the ObjectStyle
* Group, please see <http://objectstyle.org/>.
*
*/
package org.objectstyle.wolips.eomodeler.core.model;
import java.util.HashSet;
import java.util.Set;
import org.objectstyle.wolips.baseforplugins.util.ComparisonUtils;
public class EOJoin extends EOModelObject<EORelationship> implements ISortableEOModelObject {
public static final String DESTINATION_ATTRIBUTE = "destinationAttribute";
public static final String SOURCE_ATTRIBUTE = "sourceAttribute";
public static final String DESTINATION_ATTRIBUTE_NAME = "destinationAttributeName";
public static final String SOURCE_ATTRIBUTE_NAME = "sourceAttributeName";
private EORelationship myRelationship;
private EOAttribute mySourceAttribute;
private EOAttribute myDestinationAttribute;
private EOModelMap myJoinMap;
public EOJoin() {
myJoinMap = new EOModelMap();
}
public EOJoin addInverseJoinInto(EORelationship _relationship, boolean _fireEvents) {
EOJoin inverseJoin = new EOJoin();
inverseJoin.setSourceAttribute(myDestinationAttribute);
inverseJoin.setDestinationAttribute(mySourceAttribute);
_relationship.addJoin(inverseJoin, _fireEvents);
return inverseJoin;
}
public Set<EOModelReferenceFailure> getReferenceFailures() {
return new HashSet<EOModelReferenceFailure>();
}
protected void _propertyChanged(String _propertyName, Object _oldValue, Object _newValue) {
if (myRelationship != null) {
myRelationship._joinChanged(this, _propertyName, _oldValue, _newValue);
}
}
public void setName(String name) throws DuplicateNameException {
throw new RuntimeException("uh .... what?");
}
public String getName() {
return ((mySourceAttribute != null) ? mySourceAttribute.getName() : "") + ((myDestinationAttribute != null) ? myDestinationAttribute.getName() : "");
}
public void _setRelationship(EORelationship _relationship) {
myRelationship = _relationship;
}
public EORelationship getRelationship() {
return myRelationship;
}
public boolean isInverseJoin(EOJoin _join) {
return _join != null && ComparisonUtils.equals(mySourceAttribute, _join.myDestinationAttribute) && ComparisonUtils.equals(myDestinationAttribute, _join.mySourceAttribute);
}
public void pasted() throws DuplicateNameException {
if (mySourceAttribute != null) {
EOAttribute sourceAttribute = myRelationship.getEntity().getAttributeNamed(mySourceAttribute.getName());
if (mySourceAttribute == null) {
mySourceAttribute = mySourceAttribute._cloneModelObject();
myRelationship.getEntity().addAttribute(sourceAttribute);
} else {
mySourceAttribute = sourceAttribute;
}
}
if (myDestinationAttribute != null) {
EOEntity destination = myRelationship.getDestination();
if (destination != null) {
EOAttribute destinationAttribute = destination.getAttributeNamed(myDestinationAttribute.getName());
if (destinationAttribute == null && myDestinationAttribute.getEntity() == myRelationship.getEntity()) {
myDestinationAttribute = myDestinationAttribute._cloneModelObject();
myRelationship.getEntity().addAttribute(destinationAttribute);
} else {
myDestinationAttribute = destinationAttribute;
}
}
else {
myDestinationAttribute = null;
}
}
}
// public int hashCode() {
// int hashCode = (myRelationship == null) ? 1 : myRelationship.hashCode();
// if (mySourceAttribute != null) {
// hashCode *= mySourceAttribute.hashCode();
// }
// if (myDestinationAttribute != null) {
// hashCode *= myDestinationAttribute.hashCode();
// }
// return hashCode;
// }
//
// public boolean equals(Object _obj) {
// boolean equals = false;
// if (_obj instanceof EOJoin) {
// if (_obj == this) {
// equals = true;
// } else {
// EOJoin otherJoin = (EOJoin) _obj;
// if (ComparisonUtils.equals(otherJoin.myRelationship, myRelationship)) {
// if (mySourceAttribute != null && myDestinationAttribute != null && otherJoin.mySourceAttribute != null && otherJoin.myDestinationAttribute != null) {
// equals = mySourceAttribute.equals(otherJoin.mySourceAttribute) && myDestinationAttribute.equals(otherJoin.myDestinationAttribute);
// }
// }
// }
// }
// return equals;
// }
public boolean isRelatedTo(EOAttribute _attribute) {
boolean isRelatedTo = false;
EOAttribute sourceAttribute = getSourceAttribute();
if (sourceAttribute != null && sourceAttribute.equals(_attribute)) {
isRelatedTo = true;
}
else {
EOAttribute destinationAttribute = getDestinationAttribute();
if (destinationAttribute != null && destinationAttribute.equals(_attribute)) {
isRelatedTo = true;
}
}
return isRelatedTo;
}
public String getSourceAttributeName() {
String sourceAttributeName = null;
EOAttribute sourceAttribute = getSourceAttribute();
if (sourceAttribute != null) {
sourceAttributeName = sourceAttribute.getName();
}
return sourceAttributeName;
}
public void setSourceAttributeName(String _sourceAttributeName) {
EOAttribute sourceAttribute = myRelationship.getEntity().getAttributeNamed(_sourceAttributeName);
setSourceAttribute(sourceAttribute);
}
public EOAttribute getSourceAttribute() {
return mySourceAttribute;
}
public void setSourceAttribute(EOAttribute _sourceAttribute) {
setSourceAttribute(_sourceAttribute, true);
}
public void setSourceAttribute(EOAttribute _sourceAttribute, boolean _fireEvents) {
EOAttribute oldSourceAttribute = mySourceAttribute;
mySourceAttribute = _sourceAttribute;
if (_fireEvents) {
firePropertyChange(EOJoin.SOURCE_ATTRIBUTE, oldSourceAttribute, mySourceAttribute);
}
}
public String getDestinationAttributeName() {
String destinationAttributeName = null;
EOAttribute destinationAttribute = getDestinationAttribute();
if (destinationAttribute != null) {
destinationAttributeName = destinationAttribute.getName();
}
return destinationAttributeName;
}
public void setDestinationAttributeName(String _destinationAttributeName) {
EOAttribute destinationAttribute = myRelationship.getDestination().getAttributeNamed(_destinationAttributeName);
setDestinationAttribute(destinationAttribute);
}
public EOAttribute getDestinationAttribute() {
return myDestinationAttribute;
}
public void setDestinationAttribute(EOAttribute _destinationAttribute) {
setDestinationAttribute(_destinationAttribute, true);
}
public void setDestinationAttribute(EOAttribute _destinationAttribute, boolean _fireEvents) {
EOAttribute oldDestinationAttribute = myDestinationAttribute;
myDestinationAttribute = _destinationAttribute;
if (_fireEvents) {
firePropertyChange(EOJoin.DESTINATION_ATTRIBUTE, oldDestinationAttribute, myDestinationAttribute);
}
}
@SuppressWarnings("unused")
public void loadFromMap(EOModelMap _joinMap, Set _failures) {
myJoinMap = _joinMap;
}
public EOModelMap toMap() {
EOModelMap joinMap = myJoinMap.cloneModelMap();
if (myDestinationAttribute != null) {
joinMap.setString("destinationAttribute", myDestinationAttribute.getName(), true);
} else {
joinMap.remove("destinationAttribute");
}
if (mySourceAttribute != null) {
joinMap.setString("sourceAttribute", mySourceAttribute.getName(), true);
} else {
joinMap.remove("sourceAttribute");
}
return joinMap;
}
public void resolve(Set<EOModelVerificationFailure> _failures) {
String sourceAttributeName = myJoinMap.getString("sourceAttribute", true);
mySourceAttribute = myRelationship.getEntity().getAttributeNamed(sourceAttributeName);
if (mySourceAttribute == null) {
_failures.add(new MissingAttributeFailure(myRelationship.getEntity(), sourceAttributeName));
}
String destinationAttributeName = myJoinMap.getString("destinationAttribute", true);
EOEntity destination = myRelationship.getDestination();
if (destination != null) {
myDestinationAttribute = myRelationship.getDestination().getAttributeNamed(destinationAttributeName);
if (myDestinationAttribute == null) {
_failures.add(new MissingAttributeFailure(myRelationship.getDestination(), destinationAttributeName));
}
}
}
public void verify(Set<EOModelVerificationFailure> _failures) {
if (mySourceAttribute == null) {
_failures.add(new EOModelVerificationFailure(getRelationship().getEntity().getModel(), getRelationship(), getRelationship().getName() + " has a join with a missing source attribute.", false));
}
if (myDestinationAttribute == null) {
_failures.add(new EOModelVerificationFailure(getRelationship().getEntity().getModel(), getRelationship(), getRelationship().getName() + " has a join with a missing destination attribute.", false));
}
}
public String getFullyQualifiedName() {
return ((myRelationship == null) ? "?" : myRelationship.getFullyQualifiedName()) + "/join: " + getSourceAttributeName() + "=>" + getDestinationAttributeName();
}
@Override
public EOJoin _cloneModelObject() {
EOJoin join = new EOJoin();
join.mySourceAttribute = mySourceAttribute;
join.myDestinationAttribute = myDestinationAttribute;
return join;
}
@Override
public Class<EORelationship> _getModelParentType() {
return EORelationship.class;
}
public EORelationship _getModelParent() {
return getRelationship();
}
public void _removeFromModelParent(Set<EOModelVerificationFailure> failures) {
getRelationship().removeJoin(this);
}
public void _addToModelParent(EORelationship modelParent, boolean findUniqueName, Set<EOModelVerificationFailure> failures) {
modelParent.addJoin(this);
}
public String toString() {
return "[EOJoin: sourceAttribute = " + ((mySourceAttribute == null) ? "null" : mySourceAttribute.getName()) + "; destinationAttribute = " + ((myDestinationAttribute == null) ? "null" : myDestinationAttribute.getName()) + "]"; //$NON-NLS-4$ //$NON-NLS-5$
}
}