/* 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 java.util.Vector; 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; /** * * This class is responsible for retrieving events from within * the evaluation engine and distribute it to registered classes. * * */ public class EvaluationEventHub implements EvaluationEvents { private List<EvaluationEvents> registered = new Vector<EvaluationEvents>(); private EvalInfoProvider evalInfo; private static Logger logger = Logger.getLogger(EvaluationEventHub.class); public EvaluationEventHub() { evalInfo = new EvalInfoProvider(); this.register(evalInfo); } /** * Registers a new listener which will receive notifications about * the evaluation of events. This notifications are synchron, i.e., * first, the systems halts as long as the functions are called and, * second, the order the elements are registered defines how they * are called: the first registered object is notified as first before * and as last after the evaluation * * */ public int register(EvaluationEvents e) { registered.add(e); int pos = -1; for ( int i = 0; i < registered.size(); ++i ) { if ( registered.get(i) == e ) { pos = i; break; } } logger.debug("Added EvaluationEvents to EvaluationEventHub at position " + pos + " (" + e.getClass() + ")"); return pos; } public boolean remove(EvaluationEvents e) { if ( e == evalInfo ) { return false; } else { return registered.remove(e); } } public void clear() { for ( int i = 1; i < registered.size(); ++i) { registered.remove(i); } } public EvalInfoProvider getEvalInfo() { return this.evalInfo; } public void clearEvalInfo() { this.evalInfo.clear(); } /* * BEFORE events * */ public void beforeEvaluatable(Evaluatable target, EvaluationCtx context) { for ( int i = 0 ; i < registered.size(); ++i ) { try { registered.get(i).beforeEvaluatable(target, context); } catch (Exception e) { logger.warn("Evaluation Client (index " + i + ", class " + registered.get(i).getClass() + " throw an excpetion " + " when executing beforeEvaluatable (" + e.getClass() + "): " + e.getMessage()); e.printStackTrace(); } } // for ( EvaluationEvents e : registered) { // e.beforeEvaluatable(target, context); // } } public void beforeFunction(Function target, List<Expression> inputs, EvaluationCtx context) { for ( int i = 0 ; i < registered.size(); ++i ) { try { registered.get(i).beforeFunction(target, inputs, context); } catch (Exception e) { logger.warn("Evaluation Client (index " + i + ", class " + registered.get(i).getClass() + " throw an excpetion " + " when executing beforeFunction (" + e.getClass() + "): " + e.getMessage()); e.printStackTrace(); } } // for ( EvaluationEvents e : registered) { // e.beforeFunction(target, inputs, context); // } } public void beforePolicyTreeElement(PolicyTreeElement target, EvaluationCtx context) { for ( int i = 0 ; i < registered.size(); ++i ) { try { registered.get(i).beforePolicyTreeElement(target, context); } catch (Exception e) { logger.warn("Evaluation Client (index " + i + ", class " + registered.get(i).getClass() + " throw an excpetion " + " when executing beforePolicyTreeElement (" + e.getClass() + "): " + e.getMessage()); e.printStackTrace(); } } // for ( EvaluationEvents e : registered) { // e.beforePolicyTreeElement(target, context); // } } public void beforeMatch(MatchElement target, EvaluationCtx context) { for ( int i = 0 ; i < registered.size(); ++i ) { try { registered.get(i).beforeMatch(target, context); } catch (Exception e) { logger.warn("Evaluation Client (index " + i + ", class " + registered.get(i).getClass() + " throw an excpetion " + " when executing beforeMatch (" + e.getClass() + "): " + e.getMessage()); e.printStackTrace(); } } // for ( EvaluationEvents e : registered) { // e.beforeMatch(target, context); // } } public void beforeCombiningAlg(CombiningAlgorithm target, EvaluationCtx context, List<CombinerParameter> parameters, List<CombinerElement> inputs) { for ( int i = 0 ; i < registered.size(); ++i ) { try { registered.get(i).beforeCombiningAlg(target, context, parameters, inputs); } catch (Exception e) { logger.warn("Evaluation Client (index " + i + ", class " + registered.get(i).getClass() + " throw an excpetion " + " when executing beforeCombiningAlg (" + e.getClass() + "): " + e.getMessage()); e.printStackTrace(); } } // for ( EvaluationEvents e : registered) { // e.beforeCombiningAlg(target, context, parameters, inputs); // } } /* * AFTER events * */ public void afterEvaluatable(Evaluatable target, EvaluationCtx context, EvaluationResult result) { for ( int i = registered.size() -1 ; i > -1; --i ) { try { registered.get(i).afterEvaluatable(target, context, result); } catch (Exception e) { logger.warn("Evaluation Client (index " + i + ", class " + registered.get(i).getClass() + " throw an excpetion " + " when executing afterEvaluatable (" + e.getClass() + "): " + e.getMessage()); e.printStackTrace(); } } // for ( EvaluationEvents e : registered) { // e.afterEvaluatable(target, context, result); // } } public void afterFunction(Function target, List<Expression> inputs, EvaluationCtx context, EvaluationResult result) { for ( int i = registered.size() -1 ; i > -1; --i ) { try { registered.get(i).afterFunction(target, inputs, context, result); } catch (Exception e) { logger.warn("Evaluation Client (index " + i + ", class " + registered.get(i).getClass() + " throw an excpetion " + " when executing afterFunction (" + e.getClass() + "): " + e.getMessage()); e.printStackTrace(); } } // for ( EvaluationEvents e : registered) { // e.afterFunction(target, inputs, context, result); // } } public void afterPolicyTreeElement(PolicyTreeElement target, EvaluationCtx context, Result result) { for ( int i = registered.size() -1 ; i > -1; --i ) { try { registered.get(i).afterPolicyTreeElement(target, context, result); } catch (Exception e) { logger.warn("Evaluation Client (index " + i + ", class " + registered.get(i).getClass() + " throw an excpetion " + " when executing afterPolicyTreeElement (" + e.getClass() + "): " + e.getMessage()); e.printStackTrace(); } } // for ( EvaluationEvents e : registered) { // e.afterPolicyTreeElement(target, context, result); // } } public void afterMatch(MatchElement target, EvaluationCtx context, MatchResult result) { for ( int i = registered.size() -1 ; i > -1; --i ) { try { registered.get(i).afterMatch(target, context, result); } catch (Exception e) { logger.warn("Evaluation Client (index " + i + ", class " + registered.get(i).getClass() + " throw an excpetion " + " when executing afterMatch (" + e.getClass() + "): " + e.getMessage()); e.printStackTrace(); } } // for ( EvaluationEvents e : registered) { // e.afterMatch(target, context, result); // } } public void afterCombiningAlg(CombiningAlgorithm target, EvaluationCtx context, List<CombinerParameter> parameters, List<CombinerElement> inputs, Result result) { for ( int i = registered.size() -1 ; i > -1; --i ) { try { registered.get(i).afterCombiningAlg(target, context, parameters, inputs, result); } catch (Exception e) { logger.warn("Evaluation Client (index " + i + ", class " + registered.get(i).getClass() + " throw an excpetion " + " when executing afterCombiningAlg (" + e.getClass() + "): " + e.getMessage()); e.printStackTrace(); } } // for ( EvaluationEvents e : registered) { // e.afterCombiningAlg(target, context, parameters, inputs, result); // } } }