package eu.aniketos.pdplib; import org.jdom.Element; import security.iit.pdp.EnvException; import security.iit.pdp.VarEnvironment; import security.iit.pdp.PDP.WHEN; import eu.aniketos.spec.When; import eu.aniketos.spec.Return; import eu.aniketos.spec.After; import eu.aniketos.spec.Declaration; import eu.aniketos.spec.BaseType; public class WhenAfterPDP extends WhenPDP{ public After after; public WhenAfterPDP(Element e){ after=new After(e); } public WhenAfterPDP(When whenTmp){ after = new After(whenTmp.identifier, whenTmp.parameters, ((After) whenTmp).ret); //after.identifier=whenTmp.identifier; //after.parameters=whenTmp.parameters; //after.ret=((WhenAfterPDP) whenTmp).after.ret; } public Element toElement(){ return after.toElement(); } /** * check if the method passed to the PDP matches the method represented in this after tag */ @Override public boolean matchWhen(VarEnvironment env, WHEN when, String signature, Object[] params, Object returnz) throws EnvException { //if it is not an after call, return false //if method signatures don't match, return false //if number of parameters doesn't match, return false if(when!=WHEN.AFTER || !signature.equals(after.identifier.identifier) || (params!=null && params.length!= after.parameters.size()) || (params==null && after.parameters.size()!=0)){ System.out.println("WHEN doesn't match"); return false; } if(params!=null){ for(int i=0;i<params.length;i++){ String par1 = after.parameters.get(i).type.t; //if parameters match, continue and insert current parameter in the environment if( (params[i] instanceof Integer && par1.equals(BaseType.INT)) || (params[i] instanceof Boolean && par1.equals(BaseType.BOOL)) || (params[i] instanceof Double && par1.equals(BaseType.REAL)) || (params[i] instanceof String && par1.equals(BaseType.STRING))){ System.out.println("parameter "+i+" match, bind it"); env.parBind(after.parameters.get(i).identifier.identifier, params[i]); continue; } System.out.println("parameter "+i+" doesn't match , return false and remove parameters"); //else, return false and flush parameters just inserted env.flushParHash(); return false; } } if( after.ret==null ){ System.out.println("WHEN match(no returns)"); return true; } String ret1 = after.ret.type.t; if((returnz instanceof Integer && ret1.equals(BaseType.INT)) || (returnz instanceof Boolean && ret1.equals(BaseType.BOOL)) || (returnz instanceof Double && ret1.equals(BaseType.REAL)) || (returnz instanceof String && ret1.equals(BaseType.STRING)) ){ System.out.println("return match, bind it"); env.parBind(after.ret.identifier.identifier, returnz); System.out.println("WHEN match (return match)"); return true; } System.out.println("return doesn't match , return false and remove parameters"); env.flushParHash(); return false; } }