/* Copyright 2012-2015 SAP SE * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package eu.aniketos.securebpmn.xacml.pdp.runtimeEvaluation; import java.util.List; import org.apache.log4j.Logger; import com.sun.xacml.EvaluationCtx; import com.sun.xacml.MatchElement; import com.sun.xacml.MatchResult; import com.sun.xacml.PolicyTreeElement; import com.sun.xacml.combine.CombinerElement; import com.sun.xacml.combine.CombinerParameter; import com.sun.xacml.combine.CombiningAlgorithm; import com.sun.xacml.cond.Evaluatable; import com.sun.xacml.cond.EvaluationResult; import com.sun.xacml.cond.Expression; import com.sun.xacml.cond.Function; import com.sun.xacml.ctx.Result; import com.sun.xacml.debug.Locatable; import com.sun.xacml.debug.RuntimeInfo; /** * This class is automatically loaded and registered when the * EvaluationEventHub is loaded (as it is required for several * other classes and analysis techniques, e.g, the Analysis * Combining Algorithms) * */ public class EvalInfoProvider implements EvaluationEvents { /** * saves the tree of policyTreeElements */ private InfoTree<PolicyTreeElement, EvalInfo> treeElemTree; private InfoTree<Locatable, EvalInfo> xacmlTree; private static final Logger logger = Logger.getLogger(EvalInfoProvider.class); private boolean evalAllIfUnresolved; public EvalInfoProvider() { //RootPDPElement root = new RootPDPElement(); treeElemTree = new InfoTree<PolicyTreeElement, EvalInfo>(); //treeElemTree.addChild(root, new EvalInfo()); xacmlTree = new InfoTree<Locatable, EvalInfo>(); //xacmlTree.addChild(root, new EvalInfo()); } public void clear() { treeElemTree.clear(); xacmlTree.clear(); } public boolean isEvalAllIfUnresolved() { return evalAllIfUnresolved; } public void setEvalAllIfUnresolved(boolean evalAllIfUnresolved) { this.evalAllIfUnresolved = evalAllIfUnresolved; } public InfoTree<Locatable, EvalInfo> getCurrent() { return this.xacmlTree.getCurrent(); } public Locatable getCurrentXACMLObject() { Locatable loc = getCurrent().getElement(); if ( loc == null ) { logger.fatal("No runtime information available - " + "probably you are using the wrong XACML jar " + "(i.e., not patched with aspectJ)"); } return loc; } public RuntimeInfo getCurrentRuntimeInfo() { return getCurrentXACMLObject().getRuntimeInfo(); } public InfoTree<PolicyTreeElement, EvalInfo> getCurrentTreeElem() { return treeElemTree.getCurrent(); } public InfoTree<PolicyTreeElement, EvalInfo> getTreeElemTree() { return treeElemTree; } public boolean isMissingAttribute() { return getCurrentTreeElem().getInfo().isMissingAttribute(); } public boolean isCurrentlyAbstract() { //TODO: check is abstract values got "reduced", e.g., $unkown or #true => result is true, not abstract return isMissingAttribute(); } private void hitTreeElement(PolicyTreeElement target) { treeElemTree.addChild(target, new EvalInfo()); } private void closeTreeElement(PolicyTreeElement target) { treeElemTree.close(target); } public void beforePolicyTreeElement(PolicyTreeElement target, EvaluationCtx context) { hitTreeElement(target); xacmlTree.addChild(target, new EvalInfo()); } public void beforeCombiningAlg(CombiningAlgorithm target, EvaluationCtx context, List<CombinerParameter> parameters, List<CombinerElement> inputs) { xacmlTree.addChild(target, new EvalInfo()); } public void beforeEvaluatable(Evaluatable target, EvaluationCtx context) { xacmlTree.addChild(target, new EvalInfo()); } public void beforeFunction(Function target, List<Expression> inputs, EvaluationCtx context) { xacmlTree.addChild(target, new EvalInfo()); } public void beforeMatch(MatchElement target, EvaluationCtx context) { xacmlTree.addChild(target, new EvalInfo()); } public void afterPolicyTreeElement(PolicyTreeElement target, EvaluationCtx context, Result result) { closeTreeElement(target); xacmlTree.close(target); } public void afterCombiningAlg(CombiningAlgorithm target, EvaluationCtx context, List<CombinerParameter> parameters, List<CombinerElement> inputs, Result result) { xacmlTree.close(target); } public void afterEvaluatable(Evaluatable target, EvaluationCtx context, EvaluationResult result) { xacmlTree.close(target); } public void afterFunction(Function target, List<Expression> inputs, EvaluationCtx context, EvaluationResult result) { xacmlTree.close(target); } public void afterMatch(MatchElement target, EvaluationCtx context, MatchResult result) { xacmlTree.close(target); } }