%line | %branch | |||||||||
---|---|---|---|---|---|---|---|---|---|---|
org.apache.commons.jexl.ScriptFactory |
|
|
1 | /* |
|
2 | * Copyright 2002-2006 The Apache Software Foundation. |
|
3 | * |
|
4 | * Licensed under the Apache License, Version 2.0 (the "License"); |
|
5 | * you may not use this file except in compliance with the License. |
|
6 | * You may obtain a copy of the License at |
|
7 | * |
|
8 | * http://www.apache.org/licenses/LICENSE-2.0 |
|
9 | * |
|
10 | * Unless required by applicable law or agreed to in writing, software |
|
11 | * distributed under the License is distributed on an "AS IS" BASIS, |
|
12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
|
13 | * See the License for the specific language governing permissions and |
|
14 | * limitations under the License. |
|
15 | */ |
|
16 | package org.apache.commons.jexl; |
|
17 | ||
18 | import java.io.BufferedReader; |
|
19 | import java.io.File; |
|
20 | import java.io.FileReader; |
|
21 | import java.io.IOException; |
|
22 | import java.io.InputStreamReader; |
|
23 | import java.io.StringReader; |
|
24 | import java.net.URL; |
|
25 | import java.net.URLConnection; |
|
26 | ||
27 | import org.apache.commons.jexl.parser.ASTJexlScript; |
|
28 | import org.apache.commons.jexl.parser.ParseException; |
|
29 | import org.apache.commons.jexl.parser.Parser; |
|
30 | import org.apache.commons.jexl.parser.SimpleNode; |
|
31 | import org.apache.commons.jexl.parser.TokenMgrError; |
|
32 | import org.apache.commons.logging.Log; |
|
33 | import org.apache.commons.logging.LogFactory; |
|
34 | ||
35 | /** |
|
36 | * <p> |
|
37 | * Creates {@link Script}s. To create a JEXL Script, pass |
|
38 | * valid JEXL syntax to the static createScript() method: |
|
39 | * </p> |
|
40 | * |
|
41 | * <pre> |
|
42 | * String jexl = "y = x * 12 + 44; y = y * 4;"; |
|
43 | * Script script = ScriptFactory.createScript( jexl ); |
|
44 | * </pre> |
|
45 | * |
|
46 | * <p> |
|
47 | * When an {@link Script} is created, the JEXL syntax is |
|
48 | * parsed and verified. |
|
49 | * </p> |
|
50 | * @since 1.1 |
|
51 | * @version $Id: ScriptFactory.java 429175 2006-08-06 19:05:23Z rahul $ |
|
52 | */ |
|
53 | public class ScriptFactory { |
|
54 | ||
55 | /** The Log to which all ScriptFactory messages will be logged.*/ |
|
56 | 6 | protected static Log log = |
57 | LogFactory.getLog("org.apache.commons.jexl.ScriptFactory"); |
|
58 | ||
59 | /** |
|
60 | * The singleton ScriptFactory also holds a single instance of |
|
61 | * {@link Parser}. When parsing expressions, ScriptFactory |
|
62 | * synchronizes on Parser. |
|
63 | */ |
|
64 | 3 | protected static Parser parser = new Parser(class="keyword">new StringReader(";")); |
65 | ||
66 | /** |
|
67 | * ScriptFactory is a singleton and this is the private |
|
68 | * instance fufilling that pattern. |
|
69 | */ |
|
70 | 3 | protected static ScriptFactory factory = new ScriptFactory(); |
71 | ||
72 | /** |
|
73 | * Private constructor, the single instance is always obtained |
|
74 | * with a call to getInstance(). |
|
75 | */ |
|
76 | 3 | private ScriptFactory() { |
77 | ||
78 | 3 | } |
79 | ||
80 | /** |
|
81 | * Returns the single instance of ScriptFactory. |
|
82 | * @return the instance of ScriptFactory. |
|
83 | */ |
|
84 | protected static ScriptFactory getInstance() { |
|
85 | 11 | return factory; |
86 | } |
|
87 | ||
88 | /** |
|
89 | * Creates a Script from a String containing valid JEXL syntax. |
|
90 | * This method parses the script which validates the syntax. |
|
91 | * |
|
92 | * @param scriptText A String containing valid JEXL syntax |
|
93 | * @return A {@link Script} which can be executed with a |
|
94 | * {@link JexlContext}. |
|
95 | * @throws Exception An exception can be thrown if there is a |
|
96 | * problem parsing the script. |
|
97 | */ |
|
98 | public static Script createScript(String scriptText) throws Exception { |
|
99 | 11 | return getInstance().createNewScript(scriptText); |
100 | } |
|
101 | ||
102 | /** |
|
103 | * Creates a Script from a {@link File} containing valid JEXL syntax. |
|
104 | * This method parses the script and validates the syntax. |
|
105 | * |
|
106 | * @param scriptFile A {@link File} containing valid JEXL syntax. |
|
107 | * Must not be null. Must be a readable file. |
|
108 | * @return A {@link Script} which can be executed with a |
|
109 | * {@link JexlContext}. |
|
110 | * @throws Exception An exception can be thrown if there is a problem |
|
111 | * parsing the script. |
|
112 | */ |
|
113 | public static Script createScript(File scriptFile) throws Exception { |
|
114 | 3 | if (scriptFile == null) { |
115 | 1 | throw new NullPointerException("scriptFile is null"); |
116 | } |
|
117 | 2 | if (!scriptFile.canRead()) { |
118 | 0 | throw new IOException("Can't read scriptFile (" |
119 | + scriptFile.getCanonicalPath() + ")"); |
|
120 | } |
|
121 | 2 | BufferedReader reader = new BufferedReader(class="keyword">new FileReader(scriptFile)); |
122 | 2 | return createScript(readerToString(reader)); |
123 | ||
124 | } |
|
125 | ||
126 | /** |
|
127 | * Creates a Script from a {@link URL} containing valid JEXL syntax. |
|
128 | * This method parses the script and validates the syntax. |
|
129 | * |
|
130 | * @param scriptUrl A {@link URL} containing valid JEXL syntax. |
|
131 | * Must not be null. Must be a readable file. |
|
132 | * @return A {@link Script} which can be executed with a |
|
133 | * {@link JexlContext}. |
|
134 | * @throws Exception An exception can be thrown if there is a problem |
|
135 | * parsing the script. |
|
136 | */ |
|
137 | public static Script createScript(URL scriptUrl) throws Exception { |
|
138 | 3 | if (scriptUrl == null) { |
139 | 1 | throw new NullPointerException("scriptUrl is null"); |
140 | } |
|
141 | 2 | URLConnection connection = scriptUrl.openConnection(); |
142 | ||
143 | 2 | BufferedReader reader = new BufferedReader( |
144 | new InputStreamReader(connection.getInputStream())); |
|
145 | 2 | return createScript(readerToString(reader)); |
146 | } |
|
147 | ||
148 | /** |
|
149 | * Creates a new Script based on the string. |
|
150 | * |
|
151 | * @param scriptText valid Jexl script |
|
152 | * @return Script a new script |
|
153 | * @throws Exception for a variety of reasons - mostly malformed scripts |
|
154 | */ |
|
155 | protected Script createNewScript(String scriptText) throws Exception { |
|
156 | 11 | String cleanText = cleanScript(scriptText); |
157 | SimpleNode script; |
|
158 | // Parse the Expression |
|
159 | 10 | synchronized (parser) { |
160 | 10 | log.debug("Parsing script: " + cleanText); |
161 | try { |
|
162 | 10 | script = parser.parse(new StringReader(cleanText)); |
163 | 7 | } catch (TokenMgrError tme) { |
164 | 2 | throw new ParseException(tme.getMessage()); |
165 | } |
|
166 | 7 | } |
167 | 7 | if (script instanceof ASTJexlScript) { |
168 | 7 | return new ScriptImpl(cleanText, (ASTJexlScript) script); |
169 | } else { |
|
170 | 0 | throw new IllegalStateException("Parsed script is not " |
171 | + "an ASTJexlScript"); |
|
172 | } |
|
173 | } |
|
174 | ||
175 | /** |
|
176 | * @todo move to ParseUtils? |
|
177 | * Trims the expression and adds a semi-colon if missing. |
|
178 | * @param script to clean |
|
179 | * @return trimmed expression ending in a semi-colon |
|
180 | */ |
|
181 | private String cleanScript(String script) { |
|
182 | 11 | String expr = script.trim(); |
183 | 10 | if (!expr.endsWith(";")) { |
184 | 3 | expr += ";"; |
185 | } |
|
186 | 10 | return expr; |
187 | } |
|
188 | ||
189 | /** |
|
190 | * Read a buffered reader into a StringBuffer and return a String with |
|
191 | * the contents of the reader. |
|
192 | * @param reader to be read. |
|
193 | * @return the contents of the reader as a String. |
|
194 | * @throws IOException on any error reading the reader. |
|
195 | */ |
|
196 | private static String readerToString(BufferedReader reader) |
|
197 | throws IOException { |
|
198 | 4 | StringBuffer buffer = new StringBuffer(); |
199 | try { |
|
200 | 4 | String line = null; |
201 | 48 | while ((line = reader.readLine()) != null) { |
202 | 40 | buffer.append(line).append('\n'); |
203 | } |
|
204 | 4 | return buffer.toString(); |
205 | } finally { |
|
206 | 0 | reader.close(); |
207 | } |
|
208 | ||
209 | } |
|
210 | ||
211 | } |
This report is generated by jcoverage, Maven and Maven JCoverage Plugin. |