KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > jboss > aspects > dbc > condition > ExecutableCondition


1 /*
2   * JBoss, Home of Professional Open Source
3   * Copyright 2005, JBoss Inc., and individual contributors as indicated
4   * by the @authors tag. See the copyright.txt in the distribution for a
5   * full listing of individual contributors.
6   *
7   * This is free software; you can redistribute it and/or modify it
8   * under the terms of the GNU Lesser General Public License as
9   * published by the Free Software Foundation; either version 2.1 of
10   * the License, or (at your option) any later version.
11   *
12   * This software is distributed in the hope that it will be useful,
13   * but WITHOUT ANY WARRANTY; without even the implied warranty of
14   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15   * Lesser General Public License for more details.
16   *
17   * You should have received a copy of the GNU Lesser General Public
18   * License along with this software; if not, write to the Free
19   * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
20   * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
21   */

22 package org.jboss.aspects.dbc.condition;
23
24 import java.util.Iterator JavaDoc;
25
26 import org.jboss.aop.joinpoint.Invocation;
27 import org.jboss.aspects.dbc.DesignByContractAspect;
28
29 import bsh.EvalError;
30 import bsh.Interpreter;
31
32 /**
33  * A pre or post consition
34  * @author <a HREF="mailto:kabir.khan@jboss.org">Kabir Khan</a>
35  * @version $Revision: 37406 $
36  */

37 public abstract class ExecutableCondition extends Condition
38 {
39    public ExecutableCondition(String JavaDoc condExpr, Class JavaDoc clazz, boolean isStatic)
40    {
41       super(condExpr, clazz, isStatic);
42    }
43
44    public void evaluateCondition(DesignByContractAspect aspect, Invocation inv, Object JavaDoc[] args, Object JavaDoc ret)
45    {
46       try
47       {
48          if (DesignByContractAspect.verbose) System.out.println("[dbc] Evaluate condition : '" + originalExpr + "' for: " + executableObject());
49    
50          Interpreter interpreter = new Interpreter();
51          for (Iterator JavaDoc it = parameterLookup.keySet().iterator() ; it.hasNext() ; )
52          {
53             String JavaDoc beanshellname = (String JavaDoc)it.next();
54             String JavaDoc originalname = (String JavaDoc)parameterLookup.get(beanshellname);
55             Object JavaDoc value = getValueForToken(inv, args, ret, originalname);
56             interpreter.set(beanshellname, value);
57             if (DesignByContractAspect.verbose) System.out.println("[dbc] Setting $" + originalname + " to " + value +
58                   ((value != null) ? " (type: " + value.getClass().getName() + ")" : "")) ;
59          }
60    
61          Boolean JavaDoc eval = (Boolean JavaDoc)interpreter.eval(condExpr);
62    
63          if (!eval.booleanValue())
64          {
65             System.out.println("CONDITION BROKEN: "+ originalExpr + " - " + executableObject());
66             throw new RuntimeException JavaDoc("Condition " + originalExpr + " was broken " + "for: " + executableObject());
67          }
68       }
69       catch (EvalError e)
70       {
71          throw new RuntimeException JavaDoc("There was an error in the expression: " + originalExpr, e);
72       }
73    }
74    
75    public String JavaDoc toString()
76    {
77       return executableObject() + ":" + super.toString();
78    }
79    
80    protected Object JavaDoc getValueForToken(Invocation invocation, Object JavaDoc[] args, Object JavaDoc rtn, String JavaDoc token)
81    {
82       if (isPredefinedToken(token))
83       {
84         return getValueForPredefinedToken(invocation, rtn, token);
85       }
86      
87       try
88       {
89          int i = Integer.parseInt(token);
90          return args[i];
91       }
92       catch(NumberFormatException JavaDoc e)
93       {
94          throw new RuntimeException JavaDoc("Invalid token '$" + token + "' in condition: " + originalExpr);
95       }
96       catch(ArrayIndexOutOfBoundsException JavaDoc e)
97       {
98          throw new RuntimeException JavaDoc("invalid parameter number '$" + token + "' in condition: "
99                + originalExpr + ". " + executableObject() + " takes " + parameterTypes().length);
100       }
101    }
102    
103    protected abstract boolean isPredefinedToken(String JavaDoc token);
104    protected abstract Object JavaDoc getValueForPredefinedToken(Invocation invocation, Object JavaDoc rtn, String JavaDoc token);
105    protected abstract Object JavaDoc executableObject();
106    protected abstract Class JavaDoc[] parameterTypes();
107    
108 }
109
Popular Tags