package org.exist.client.xacml;
import java.net.URI;
import com.sun.xacml.PolicyTreeElement;
import com.sun.xacml.Rule;
import com.sun.xacml.ctx.Result;
public class RuleNode extends PolicyElementNode
{
private int effect;
private int originalEffect;
private ConditionNode condition;
public RuleNode(NodeContainer parent, Rule rule)
{
super(parent, rule);
if(rule == null)
{
effect = Result.DECISION_DENY;
condition = new ConditionNode(this);
}
else
{
effect = rule.getEffect();
condition = new ConditionNode(this, rule.getCondition());
}
originalEffect = effect;
}
public int getEffect()
{
return effect;
}
public void setEffect(int effect)
{
if(effect == Result.DECISION_DENY || effect == Result.DECISION_PERMIT)
this.effect = effect;
else
throw new IllegalArgumentException("Invalid effect value: " + effect);
fireChanged();
}
public ConditionNode getCondition()
{
return condition;
}
public boolean isModified(boolean deep)
{
if(super.isModified(deep) || isEffectModified())
return true;
if(deep)
{
if(condition.isModified(true))
return true;
}
return false;
}
public boolean isEffectModified()
{
return effect != originalEffect;
}
public void revert(boolean deep)
{
effect = originalEffect;
if(deep)
condition.revert(deep);
super.revert(deep);
}
public void commit(boolean deep)
{
originalEffect = effect;
if(deep)
condition.commit(deep);
super.commit(deep);
}
public PolicyTreeElement create()
{
return createRule();
}
public PolicyTreeElement create(URI id)
{
return createRule(id);
}
public Rule createRule()
{
return createRule(null);
}
public Rule createRule(URI id)
{
URI useId = (id == null) ? getId() : id;
return new Rule(useId, effect, getDescription(), getTarget().getTarget(), condition.getCondition());
}
public int getChildCount()
{
return 2;
}
public XACMLTreeNode getChild(int index)
{
if(index == 0)
return getTarget();
if(index == 1)
return getCondition();
return null;
}
public int indexOfChild(Object child)
{
if(getTarget() == child)
return 0;
if(getCondition() == child)
return 1;
return -1;
}
}