1 |
| package org.drools.semantics.java; |
2 |
| |
3 |
| |
4 |
| |
5 |
| |
6 |
| |
7 |
| |
8 |
| |
9 |
| |
10 |
| |
11 |
| |
12 |
| |
13 |
| |
14 |
| |
15 |
| |
16 |
| |
17 |
| |
18 |
| |
19 |
| |
20 |
| |
21 |
| |
22 |
| |
23 |
| |
24 |
| |
25 |
| |
26 |
| |
27 |
| |
28 |
| |
29 |
| |
30 |
| |
31 |
| |
32 |
| |
33 |
| |
34 |
| |
35 |
| |
36 |
| |
37 |
| |
38 |
| |
39 |
| |
40 |
| |
41 |
| |
42 |
| |
43 |
| |
44 |
| import java.io.IOException; |
45 |
| import java.util.HashMap; |
46 |
| |
47 |
| import org.codehaus.janino.ByteArrayClassLoader; |
48 |
| import org.codehaus.janino.Scanner; |
49 |
| |
50 |
| import org.drools.rule.Declaration; |
51 |
| import org.drools.rule.Rule; |
52 |
| import org.drools.spi.RuleBaseContext; |
53 |
| |
54 |
| class JavaCompiler |
55 |
| { |
56 |
| private static final String[] PARAM_NAMES = new String[]{"tuple", "decls", "drools", "applicationData"}; |
57 |
| |
58 |
209
| public static Object compile(Rule rule,
|
59 |
| String className, |
60 |
| Class clazz, |
61 |
| String expression, |
62 |
| String originalExpression, |
63 |
| Declaration[] params) throws IOException, |
64 |
| CompilationException, |
65 |
| ClassNotFoundException |
66 |
| { |
67 |
209
| try
|
68 |
| { |
69 |
209
| JavaFunctions functions = (JavaFunctions) rule.getRuleSet( ).getFunctions( "java" );
|
70 |
209
| Class functionsClass = null;
|
71 |
| |
72 |
209
| if ( functions != null )
|
73 |
| { |
74 |
0
| functionsClass = functions.getFunctionsClass( );
|
75 |
| } |
76 |
| |
77 |
209
| RuleBaseContext ruleBaseContext = rule.getRuleSet( ).getRuleBaseContext( );
|
78 |
209
| ClassLoader classLoader = (ClassLoader) ruleBaseContext.get( "java-classLoader" );
|
79 |
| |
80 |
209
| if ( classLoader == null )
|
81 |
| { |
82 |
68
| ClassLoader cl = (ClassLoader) ruleBaseContext.get( "smf-classLoader" );
|
83 |
| |
84 |
68
| if ( cl == null )
|
85 |
| { |
86 |
2
| cl = Thread.currentThread( ).getContextClassLoader( );
|
87 |
2
| ruleBaseContext.put( "smf-classLoader",
|
88 |
| cl ); |
89 |
| } |
90 |
| |
91 |
68
| if ( cl == null )
|
92 |
| { |
93 |
0
| cl = JavaCompiler.class.getClassLoader( );
|
94 |
0
| ruleBaseContext.put( "smf-classLoader",
|
95 |
| cl ); |
96 |
| } |
97 |
| |
98 |
68
| classLoader = new ByteArrayClassLoader( new HashMap( ),
|
99 |
| cl ); |
100 |
| |
101 |
68
| ruleBaseContext.put( "java-classLoader",
|
102 |
| classLoader ); |
103 |
| } |
104 |
| |
105 |
209
| return JavaScriptEvaluator.compile( expression,
|
106 |
| className, |
107 |
| clazz, |
108 |
| PARAM_NAMES, |
109 |
| params, |
110 |
| rule.getImporter( ), |
111 |
| rule.getApplicationData( ), |
112 |
| functionsClass, |
113 |
| classLoader ); |
114 |
| } |
115 |
| catch ( Scanner.LocatedException e ) |
116 |
| { |
117 |
2
| throw new CompilationException( rule.getRuleSet(),
|
118 |
| rule, |
119 |
| originalExpression, |
120 |
2
| e.getLocation( ) != null ? e.getLocation( ).getLineNumber( ) : -1,
|
121 |
2
| e.getLocation( ) != null ? e.getLocation( ).getColumnNumber( ) : -1,
|
122 |
| e.getMessage( ) ); |
123 |
| } |
124 |
| } |
125 |
| } |