package eu.aniketos.pdplib; import org.jdom.Element; import security.iit.pdp.EnvException; import security.iit.pdp.VarEnvironment; import eu.aniketos.spec.AExp; import eu.aniketos.spec.RExp; import eu.aniketos.spec.ROp; import eu.aniketos.spec.Tag; public class RExpOpPDP extends RExpPDP{ protected ROp rop; public RExpOpPDP(String tag, AExp e1, AExp e2) { rop = new ROp(tag, e1, e2); } public RExpOpPDP(String tag, RExp e1, AExp e2) { rop = new ROp(tag, e1, e2); } public RExpOpPDP(String tag, AExp e1, RExp e2) { rop = new ROp(tag, e1, e2); } public RExpOpPDP(String tag, RExp e1, RExp e2) { rop = new ROp(tag, e1, e2); } public RExpOpPDP(Element e){ rop = new ROp(e); } public Element toElement() { return rop.toElement(); } public RExpOpPDP(RExp rexp){ rop= new ROp(((ROp) rexp).type, ((ROp) rexp).exp1, ((ROp) rexp).exp2); } @Override public double eval(VarEnvironment env) throws EnvException { RExpPDP l = RExpPDP.generateRExpPDP(rop.exp1); AExpPDP il=null; if(l==null) il = AExpPDP.generateAExpPDP(rop.aexp1); RExpPDP r = RExpPDP.generateRExpPDP(rop.exp2); AExpPDP ir=null; if(r==null) ir = AExpPDP.generateAExpPDP(rop.aexp2); if(rop.type.equals(Tag.rsum_tag)) if(l==null && r==null) {return (double) il.eval(env) + ir.eval(env);} else if(l==null) {return il.eval(env) + r.eval(env);} else if(r==null) {return (double) l.eval(env) + ir.eval(env);} else return l.eval(env) + r.eval(env); if(rop.type.equals(Tag.rdif_tag)) if(l==null && r==null) {return (double) il.eval(env) - ir.eval(env);} else if(l==null) {return il.eval(env) - r.eval(env);} else if(r==null) {return (double) l.eval(env) - ir.eval(env);} else return l.eval(env) - r.eval(env); if(rop.type.equals(Tag.rmul_tag)) if(l==null && r==null) {return (double) il.eval(env) * ir.eval(env);} else if(l==null) {return il.eval(env) * r.eval(env);} else if(r==null) {return (double) l.eval(env) * ir.eval(env);} else return l.eval(env) * r.eval(env); if(rop.type.equals(Tag.rmod_tag)) if(l==null && r==null) { return (double) il.eval(env) % ir.eval(env);} else if(l==null) { return (double) il.eval(env) % r.eval(env);} else if(r==null) { return (double) l.eval(env) % ir.eval(env);} else { return (double) l.eval(env) % r.eval(env);} if(rop.type.equals(Tag.round_tag)) if(l==null && r==null) { return (double) ((int) (il.eval(env) / ir.eval(env)));} else if(l==null) { return (double) ((int) (il.eval(env) / r.eval(env)));} else if(r==null) { return (double) ((int) (l.eval(env) / ir.eval(env)));} else { return (double) ((int) (l.eval(env) / r.eval(env)));} if(rop.type.equals(Tag.rdiv_tag)) if(l==null && r==null) {return (double) il.eval(env) / ir.eval(env);} else if(l==null) {return il.eval(env) / r.eval(env);} else if(r==null) {return (double) l.eval(env) / ir.eval(env);} else return l.eval(env) / r.eval(env); else throw new EnvException("Type of ROperation not recognized"); } }