/************************************************************
* Copyright (c) 2010 paperlocator.org - all rights reserved.
*
* $Id$
* $Revision$
* $Author$
***********************************************************/
package org.js.model.rbac;
import java.util.Comparator;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.util.EcoreUtil;
import org.js.model.feature.Attribute;
import org.js.model.feature.Feature;
/**
* @author <a href="mailto:julia.schroeter@tu-dresden.de">Julia Schroeter</a>
*
*/
public class PermissionComparator implements Comparator<Permission> {
final static int isEqual = 0;
final static int isNotEqual = -1;
@Override
public int compare(Permission o1, Permission o2) {
if (o1 != null && o2 != null) {
if ((o1 instanceof FeatureOperation && o2 instanceof FeatureOperation)) {
// if permission is a FeatureOperation than compare referenced features
FeatureOperation o1FeatureOp = (FeatureOperation) o1;
FeatureOperation o2FeatureOp = (FeatureOperation) o2;
return compareFeatureOperations(o1FeatureOp, o2FeatureOp);
} else if (o1 instanceof AttributeValueOperation && o2 instanceof AttributeValueOperation) {
// if permission is a DomainValueOperation than compare domain values and referenced attributes
AttributeValueOperation o1DomainOp = (AttributeValueOperation) o1;
AttributeValueOperation o2DomainOp = (AttributeValueOperation) o2;
return compareDomainValueOperations(o1DomainOp, o2DomainOp);
} else if (o1 instanceof AttributeOperation && o2 instanceof AttributeOperation) {
// if both are set attribute permissions than check attribute and contained domain value permissions
AttributeOperation o1SetOp = (AttributeOperation) o1;
AttributeOperation o2SetOp = (AttributeOperation) o2;
Attribute o1Attribute = o1SetOp.getAttribute();
Attribute o2Attribute = o2SetOp.getAttribute();
if (EcoreUtil.equals(o1Attribute, o2Attribute)) {
// TODO: check each domainValuePermission
return isEqual;
}
}
} else if (o1 == null && o2 == null) {
return isEqual;
}
return isNotEqual;
}
private int compareFeatureOperations(FeatureOperation o1FeatureOp, FeatureOperation o2FeatureOp) {
boolean isEqualType = RbacHelper.isSelectFeatureOperation(o1FeatureOp) && RbacHelper.isSelectFeatureOperation(o2FeatureOp);
Feature o1Feature = o1FeatureOp.getFeature();
Feature o2Feature = o2FeatureOp.getFeature();
return (isEqualType) ? compareEObjects(o1Feature, o2Feature) : isNotEqual;
}
private int compareEObjects(EObject o1, EObject o2) {
boolean equals = EcoreUtil.equals(o1, o2);
if (equals) {
return isEqual;
}
return isNotEqual;
}
private int compareDomainValueOperations(AttributeValueOperation o1DomainOp, AttributeValueOperation o2DomainOp) {
int equals = isNotEqual;
int o1Value = o1DomainOp.getValue();
int o2Value = o2DomainOp.getValue();
if (o1Value == o2Value) {
Attribute o1attribute = getAttributeFromDomainValueOp(o1DomainOp);
Attribute o2attribute = getAttributeFromDomainValueOp(o2DomainOp);
if (EcoreUtil.equals(o1attribute, o2attribute)) {
equals = isEqual;
}
}
return equals;
}
private AttributeOperation getContainerAttribute(AttributeValueOperation op) {
AttributeOperation attrOp = null;
EObject container = op.eContainer();
if (container instanceof AttributeOperation) {
attrOp = (AttributeOperation) container;
}
return attrOp;
}
private Attribute getAttributeFromDomainValueOp(AttributeValueOperation op) {
Attribute attribute = null;
AttributeOperation containerAttribute = getContainerAttribute(op);
if (containerAttribute != null) {
attribute = containerAttribute.getAttribute();
}
return attribute;
}
}