result.java
来自「sunxacml源码」· Java 代码 · 共 454 行 · 第 1/2 页
JAVA
454 行
* @param obligations the obligations the PEP must handle
*
* @throws IllegalArgumentException if decision is not valid
*/
public Result(int decision, Status status, String resource,
Set obligations)
throws IllegalArgumentException
{
// check that decision is valid
if ((decision != DECISION_PERMIT) && (decision != DECISION_DENY) &&
(decision != DECISION_INDETERMINATE) &&
(decision != DECISION_NOT_APPLICABLE))
throw new IllegalArgumentException("invalid decision value");
this.decision = decision;
this.resource = resource;
if (status == null)
this.status = Status.getOkInstance();
else
this.status = status;
if (obligations == null)
this.obligations = new HashSet();
else
this.obligations = obligations;
}
/**
* Creates a new instance of a <code>Result</code> based on the given
* DOM root node. A <code>ParsingException</code> is thrown if the DOM
* root doesn't represent a valid ResultType.
*
* @param root the DOM root of a ResultType
*
* @return a new <code>Result</code>
*
* @throws ParsingException if the node is invalid
*/
public static Result getInstance(Node root) throws ParsingException {
int decision = -1;
Status status = null;
String resource = null;
Set obligations = null;
NamedNodeMap attrs = root.getAttributes();
Node resourceAttr = attrs.getNamedItem("ResourceId");
if (resourceAttr != null)
resource = resourceAttr.getNodeValue();
NodeList nodes = root.getChildNodes();
for (int i = 0; i < nodes.getLength(); i++) {
Node node = nodes.item(i);
String name = node.getNodeName();
if (name.equals("Decision")) {
String type = node.getFirstChild().getNodeValue();
for (int j = 0; j < DECISIONS.length; j++) {
if (DECISIONS[j].equals(type)) {
decision = j;
break;
}
}
if (decision == -1)
throw new ParsingException("Unknown Decision: " + type);
} else if (name.equals("Status")) {
status = Status.getInstance(node);
} else if (name.equals("Obligations")) {
obligations = parseObligations(node);
}
}
return new Result(decision, status, resource, obligations);
}
/**
* Helper method that handles the obligations
*/
private static Set parseObligations(Node root) throws ParsingException {
Set set = new HashSet();
NodeList nodes = root.getChildNodes();
for (int i = 0; i < nodes.getLength(); i++) {
Node node = nodes.item(i);
if (node.getNodeName().equals("Obligation"))
set.add(Obligation.getInstance(node));
}
if (set.size() == 0)
throw new ParsingException("ObligationsType must not be empty");
return set;
}
/**
* Returns the decision associated with this <code>Result</code>. This
* will be one of the four <code>DECISION_*</code> fields in this class.
*
* @return the decision effect
*/
public int getDecision() {
return decision;
}
/**
* Returns the status data included in this <code>Result</code>.
* Typically this will be <code>STATUS_OK</code> except when the decision
* is <code>INDETERMINATE</code>.
*
* @return status associated with this Result
*/
public Status getStatus() {
return status;
}
/**
* Returns the resource to which this Result applies, or null if none
* is specified.
*
* @return a resource identifier or null
*/
public String getResource() {
return resource;
}
/**
* Sets the resource identifier if it has not already been set before.
* The core code does not set the resource identifier, so this is useful
* if you want to write wrapper code that needs this information.
*
* @param resource the resource identifier
*
* @return true if the resource identifier was set, false if it already
* had a value
*/
public boolean setResource(String resource) {
if (this.resource != null)
return false;
this.resource = resource;
return true;
}
/**
* Returns the set of obligations that the PEP must fulfill, which may
* be empty.
*
* @return the set of obligations
*/
public Set getObligations() {
return obligations;
}
/**
* Adds an obligation to the set of obligations that the PEP must fulfill
*
* @param obligation the <code>Obligation</code> to add
*/
public void addObligation(Obligation obligation) {
if (obligation != null)
obligations.add(obligation);
}
/**
* Encodes this <code>Result</code> into its XML form and writes this
* out to the provided <code>OutputStream<code> with no indentation.
*
* @param output a stream into which the XML-encoded data is written
*/
public void encode(OutputStream output) {
encode(output, new Indenter(0));
}
/**
* Encodes this <code>Result</code> into its XML form and writes this
* out to the provided <code>OutputStream<code> with indentation.
*
* @param output a stream into which the XML-encoded data is written
* @param indenter an object that creates indentation strings
*/
public void encode(OutputStream output, Indenter indenter) {
PrintStream out = new PrintStream(output);
String indent = indenter.makeString();
indenter.in();
String indentNext = indenter.makeString();
// encode the starting tag
if (resource == null)
out.println(indent + "<Result>");
else
out.println(indent + "<Result ResourceId=\"" + resource + "\">");
// encode the decision
out.println(indentNext + "<Decision>" + DECISIONS[decision] +
"</Decision>");
// encode the status
if (status != null)
status.encode(output, indenter);
// encode the obligations
if (obligations.size() != 0) {
out.println(indentNext + "<Obligations>");
Iterator it = obligations.iterator();
indenter.in();
while (it.hasNext()) {
Obligation obligation = (Obligation)(it.next());
obligation.encode(output, indenter);
}
indenter.out();
out.println(indentNext + "</Obligations>");
}
indenter.out();
// finish it off
out.println(indent + "</Result>");
}
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?