package org.jboss.ejb.plugins.cmp.jdbc;
import java.util.HashSet;
import java.util.Set;
import javax.ejb.EJBException;
import org.jboss.ejb.plugins.cmp.jdbc.bridge.JDBCCMRFieldBridge;
public final class RelationData
{
private final JDBCCMRFieldBridge leftCMRField;
private final JDBCCMRFieldBridge rightCMRField;
public final Set addedRelations = new HashSet();
public final Set removedRelations = new HashSet();
public final Set notRelatedPairs = new HashSet();
public RelationData(JDBCCMRFieldBridge leftCMRField, JDBCCMRFieldBridge rightCMRField)
{
this.leftCMRField = leftCMRField;
this.rightCMRField = rightCMRField;
}
public JDBCCMRFieldBridge getLeftCMRField()
{
return leftCMRField;
}
public JDBCCMRFieldBridge getRightCMRField()
{
return rightCMRField;
}
public void addRelation(JDBCCMRFieldBridge leftCMRField,
Object leftId,
JDBCCMRFieldBridge rightCMRField,
Object rightId)
{
if(!leftCMRField.hasForeignKey() && !rightCMRField.hasForeignKey())
{
RelationPair pair = createRelationPair(leftCMRField, leftId, rightCMRField, rightId);
if(removedRelations.contains(pair))
{
removedRelations.remove(pair);
}
else
{
addedRelations.add(pair);
if(notRelatedPairs.contains(pair))
{
notRelatedPairs.remove(pair);
}
}
}
}
public void removeRelation(JDBCCMRFieldBridge leftCMRField,
Object leftId,
JDBCCMRFieldBridge rightCMRField,
Object rightId)
{
if(!leftCMRField.hasForeignKey() && !rightCMRField.hasForeignKey())
{
RelationPair pair = createRelationPair(leftCMRField, leftId, rightCMRField, rightId);
if(addedRelations.contains(pair))
{
addedRelations.remove(pair);
notRelatedPairs.add(pair);
}
else
{
if(!notRelatedPairs.contains(pair))
{
removedRelations.add(pair);
}
}
}
}
public boolean isDirty()
{
return addedRelations.size() > 0 || removedRelations.size() > 0;
}
private RelationPair createRelationPair(JDBCCMRFieldBridge leftCMRField,
Object leftId,
JDBCCMRFieldBridge rightCMRField,
Object rightId)
{
if(this.leftCMRField == leftCMRField && this.rightCMRField == rightCMRField)
{
return new RelationPair(leftCMRField, leftId, rightCMRField, rightId);
}
if(this.leftCMRField == rightCMRField && this.rightCMRField == leftCMRField)
{
return new RelationPair(rightCMRField, rightId, leftCMRField, leftId);
}
throw new EJBException("Error: cmrFields are of wrong type");
}
}