package org.exist.client.xacml;
import java.net.URI;
import org.exist.security.xacml.XACMLUtil;
import com.sun.xacml.PolicyTreeElement;
public abstract class PolicyElementNode extends AbstractNodeContainer implements NodeContainer
{
private URI originalId;
private URI id;
private String originalDescription;
private String description;
private TargetNode target;
protected PolicyElementNode(NodeContainer parent, PolicyTreeElement policyElement)
{
super(parent);
if(policyElement == null)
throw new NullPointerException("Policy element cannot be null");
id = policyElement.getId();
if(id == null)
throw new NullPointerException("Policy element ID cannot be null");
description = policyElement.getDescription();
target = new TargetNode(this, policyElement.getTarget());
originalId = id;
originalDescription = description;
}
/**
* Creates a <code>PolicyTreeElement</code>
* from this object's current state.
*
* @return a <code>PolicyTreeElement</code>
*/
abstract PolicyTreeElement create();
/**
* Creates a <code>PolicyTreeElement</code>
* from this object's current state except
* that it uses the specified id.
*
* @return a <code>PolicyTreeElement</code>
*/
abstract PolicyTreeElement create(URI id);
/**
* Retrieves the id of this element.
*
* @return the id
*/
public URI getId()
{
return id;
}
/**
* Provides a string representation appropriate for display
* to the user.
*
* @return The string representation
*/
public String toString()
{
return id.toString();
}
/**
* Sets the id of this element.
*
* @param id The new id, which cannot be null.
*/
void setId(URI id)
{
if(id == null)
throw new NullPointerException("Policy element ID cannot be null");
this.id = id;
fireChanged();
}
/**
* Gets the description of the element.
*
* @return the description
*/
public String getDescription()
{
return description;
}
/**
* Sets the description of the element. May be null.
*
* @param description The new description.
*/
public void setDescription(String description)
{
this.description = description;
fireChanged();
}
public boolean isIdModified()
{
return !id.equals(originalId);
}
public boolean isDescriptionModified()
{
if(description == null)
return originalDescription != null;
return !description.equals(originalDescription);
}
public boolean isModified(boolean deep)
{
if(super.isModified(deep) || isIdModified() || isDescriptionModified())
return true;
if(deep)
{
if(target.isModified(deep))
return true;
}
return false;
}
public void revert(boolean deep)
{
description = originalDescription;
id = originalId;
if(deep)
target.revert(deep);
super.revert(deep);
}
public void commit(boolean deep)
{
originalDescription = description;
originalId = id;
if(deep)
target.commit(deep);
super.commit(deep);
}
/**
* Gets the wrapper around the target for this element.
* The returned value will never be null, even if this
* element has an empty target.
*
* @return a wrapper around this element's target
*/
public TargetNode getTarget()
{
return target;
}
public String serialize(boolean indent)
{
return XACMLUtil.serialize(create(), indent);
}
}