%line | %branch | |||||||||
---|---|---|---|---|---|---|---|---|---|---|
org.apache.turbine.services.assemblerbroker.util.python.PythonBaseFactory |
|
|
1 | package org.apache.turbine.services.assemblerbroker.util.python; |
|
2 | ||
3 | /* |
|
4 | * Copyright 2001-2005 The Apache Software Foundation. |
|
5 | * |
|
6 | * Licensed under the Apache License, Version 2.0 (the "License") |
|
7 | * you may not use this file except in compliance with the License. |
|
8 | * You may obtain a copy of the License at |
|
9 | * |
|
10 | * http://www.apache.org/licenses/LICENSE-2.0 |
|
11 | * |
|
12 | * Unless required by applicable law or agreed to in writing, software |
|
13 | * distributed under the License is distributed on an "AS IS" BASIS, |
|
14 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
|
15 | * See the License for the specific language governing permissions and |
|
16 | * limitations under the License. |
|
17 | */ |
|
18 | ||
19 | import java.io.File; |
|
20 | ||
21 | import org.apache.commons.configuration.Configuration; |
|
22 | ||
23 | import org.apache.commons.lang.StringUtils; |
|
24 | ||
25 | import org.apache.commons.logging.Log; |
|
26 | import org.apache.commons.logging.LogFactory; |
|
27 | ||
28 | import org.apache.turbine.modules.Assembler; |
|
29 | import org.apache.turbine.services.assemblerbroker.TurbineAssemblerBroker; |
|
30 | import org.apache.turbine.services.assemblerbroker.util.AssemblerFactory; |
|
31 | ||
32 | import org.python.core.Py; |
|
33 | import org.python.util.PythonInterpreter; |
|
34 | ||
35 | /** |
|
36 | * A factory that attempts to load a python class in the |
|
37 | * JPython interpreter and execute it as a Turbine screen. |
|
38 | * The JPython script should inherit from Turbine Screen or one |
|
39 | * of its subclasses. |
|
40 | * |
|
41 | * @author <a href="mailto:leon@opticode.co.za">Leon Messerschmidt</a> |
|
42 | * @author <a href="mailto:hps@intermeta.de">Henning P. Schmiedehausen</a> |
|
43 | * @version $Id: PythonBaseFactory.java 264148 2005-08-29 14:21:04Z henning $ |
|
44 | */ |
|
45 | 0 | public abstract class PythonBaseFactory |
46 | implements AssemblerFactory |
|
47 | { |
|
48 | /** Key for the python path */ |
|
49 | public static final String PYTHON_PATH = "python.path"; |
|
50 | ||
51 | /** Global config file. This is executed before every screen */ |
|
52 | public static final String PYTHON_CONFIG_FILE = "conf.py"; |
|
53 | ||
54 | /** Logging */ |
|
55 | 0 | private static Log log = LogFactory.getLog(PythonBaseFactory.class); |
56 | ||
57 | /** Our configuration */ |
|
58 | 0 | private Configuration conf = |
59 | TurbineAssemblerBroker.getService().getConfiguration(); |
|
60 | ||
61 | /** |
|
62 | * Get an Assembler. |
|
63 | * |
|
64 | * @param subDirectory subdirectory within python.path |
|
65 | * @param name name of the requested Assembler |
|
66 | * @return an Assembler |
|
67 | * @throws Exception generic exception |
|
68 | */ |
|
69 | public Assembler getAssembler(String subDirectory, String name) |
|
70 | throws Exception |
|
71 | { |
|
72 | 0 | String path = conf.getString(PYTHON_PATH); |
73 | ||
74 | 0 | if (StringUtils.isEmpty(path)) |
75 | { |
|
76 | 0 | throw new Exception( |
77 | "Python path not found - check your Properties"); |
|
78 | } |
|
79 | ||
80 | 0 | log.debug("Screen name for JPython: " + name); |
81 | ||
82 | 0 | Assembler assembler = null; |
83 | ||
84 | 0 | String confName = path + "/" + PYTHON_CONFIG_FILE; |
85 | ||
86 | // The filename of the Python script |
|
87 | 0 | StringBuffer fName = new StringBuffer(); |
88 | ||
89 | 0 | fName.append(path); |
90 | 0 | fName.append("/"); |
91 | 0 | fName.append(subDirectory); |
92 | 0 | fName.append("/"); |
93 | 0 | fName.append(name.toLowerCase()); |
94 | 0 | fName.append(".py"); |
95 | ||
96 | 0 | File f = new File(fName.toString()); |
97 | ||
98 | 0 | if (f.exists()) |
99 | { |
|
100 | try |
|
101 | { |
|
102 | // We try to open the Py Interpreter |
|
103 | 0 | PythonInterpreter interp = new PythonInterpreter(); |
104 | ||
105 | // Make sure the Py Interpreter use the right classloader |
|
106 | // This is necessary for servlet engines generally has |
|
107 | // their own classloader implementations and servlets aren't |
|
108 | // loaded in the system classloader. The python script will |
|
109 | // load java package |
|
110 | // org.apache.turbine.services.assemblerbroker.util.python; |
|
111 | // the new classes to it as well. |
|
112 | 0 | Py.getSystemState().setClassLoader( |
113 | this.getClass().getClassLoader()); |
|
114 | ||
115 | // We import the Python SYS module. Now we don't need to do this |
|
116 | // explicitely in the script. We always use the sys module to |
|
117 | // do stuff like loading java package |
|
118 | // org.apache.turbine.services.assemblerbroker.util.python; |
|
119 | 0 | interp.exec("import sys"); |
120 | ||
121 | // Now we try to load the script file |
|
122 | 0 | interp.execfile(confName); |
123 | 0 | interp.execfile(fName.toString()); |
124 | ||
125 | try |
|
126 | { |
|
127 | // We create an instance of the screen class from the |
|
128 | // python script |
|
129 | 0 | interp.exec("scr = " + name + "()"); |
130 | } |
|
131 | 0 | catch (Throwable e) |
132 | { |
|
133 | 0 | throw new Exception( |
134 | "\nCannot create an instance of the python class.\n" |
|
135 | + "You probably gave your class the wrong name.\n" |
|
136 | + "Your class should have the same name as your " |
|
137 | + "filename.\nFilenames should be all lowercase and " |
|
138 | + "classnames should start with a capital.\n" |
|
139 | + "Expected class name: " + name + "\n"); |
|
140 | 0 | } |
141 | ||
142 | // Here we convert the python sceen instance to a java instance. |
|
143 | 0 | assembler = (Assembler) interp.get("scr", Assembler.class); |
144 | } |
|
145 | 0 | catch (Exception e) |
146 | { |
|
147 | // We log the error here because this code is not widely tested |
|
148 | // yet. After we tested the code on a range of platforms this |
|
149 | // won't be usefull anymore. |
|
150 | 0 | log.error("PYTHON SCRIPT SCREEN LOADER ERROR:", e); |
151 | 0 | throw e; |
152 | 0 | } |
153 | } |
|
154 | 0 | return assembler; |
155 | } |
|
156 | } |
This report is generated by jcoverage, Maven and Maven JCoverage Plugin. |