package org.jboss.metadata;
import java.util.Iterator;
import org.w3c.dom.Element;
import org.jboss.deployment.DeploymentException;
public class RelationMetaData extends MetaData {
private String relationName;
private RelationshipRoleMetaData left;
private RelationshipRoleMetaData right;
public String getRelationName() {
return relationName;
}
public RelationshipRoleMetaData getLeftRelationshipRole() {
return left;
}
public RelationshipRoleMetaData getRightRelationshipRole() {
return right;
}
public RelationshipRoleMetaData getOtherRelationshipRole(
RelationshipRoleMetaData role) {
if(left == role) {
return right;
} else if(right == role) {
return left;
} else {
throw new IllegalArgumentException("Specified role is not the left " +
"or right role. role=" + role);
}
}
public void importEjbJarXml (Element element) throws DeploymentException {
relationName = getOptionalChildContent(element, "ejb-relation-name");
if ("".equals(relationName))
{
relationName = null;
}
Iterator iter = getChildrenByTagName(element, "ejb-relationship-role");
if(iter.hasNext()) {
left = new RelationshipRoleMetaData(this);
left.importEjbJarXml((Element) iter.next());
} else {
throw new DeploymentException("Expected 2 ejb-relationship-role " +
"roles but found none");
}
if(iter.hasNext()) {
right = new RelationshipRoleMetaData(this);
right.importEjbJarXml((Element) iter.next());
} else {
throw new DeploymentException("Expected 2 ejb-relationship-role " +
"but only found one");
}
if(iter.hasNext()) {
throw new DeploymentException("Expected only 2 ejb-relationship-" +
"role but found more then 2");
}
if(relationName == null)
{
relationName =
left.getEntityName() +
(left.getCMRFieldName() == null ? "" : "_" + left.getCMRFieldName()) +
"-" +
right.getEntityName() +
(right.getCMRFieldName() == null ? "" : "_" + right.getCMRFieldName());
}
String leftName = left.getRelationshipRoleName();
String rightName = right.getRelationshipRoleName();
if(leftName != null && leftName.equals(rightName)) {
throw new DeploymentException("ejb-relationship-role-name must be " +
"unique in ejb-relation: ejb-relationship-role-name is " +
leftName);
}
if(left.isCascadeDelete() && right.isMultiplicityMany()) {
throw new DeploymentException("cascade-delete is only allowed in " +
"ejb-relationship-role where the other role has a " +
"multiplicity One");
}
if(right.isCascadeDelete() && left.isMultiplicityMany()) {
throw new DeploymentException("cascade-delete is only allowed in " +
"ejb-relationship-role where the other role has a " +
"multiplicity One");
}
}
}