1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package org.apache.commons.jelly.tags.bsf;
17
18 import java.util.Iterator;
19
20 import org.apache.commons.jelly.JellyTagException;
21 import org.apache.commons.jelly.LocationAware;
22 import org.apache.commons.jelly.MissingAttributeException;
23 import org.apache.commons.jelly.TagSupport;
24 import org.apache.commons.jelly.XMLOutput;
25 import org.apache.commons.logging.Log;
26 import org.apache.commons.logging.LogFactory;
27
28 import org.apache.bsf.BSFEngine;
29 import org.apache.bsf.BSFManager;
30 import org.apache.bsf.BSFException;
31
32 /***
33 * A tag which evaluates its body using the current scripting language
34 *
35 * @author <a href="mailto:jstrachan@apache.org">James Strachan</a>
36 * @version $Revision: 155420 $
37 */
38 public class ScriptTag extends TagSupport implements LocationAware {
39
40 /*** The Log to which logging calls will be made. */
41 private static final Log log = LogFactory.getLog(ScriptTag.class.getName() + ".evaluating");
42
43 private BSFEngine engine;
44 private BSFManager manager;
45 private String elementName;
46 private String fileName;
47 private int columnNumber;
48 private int lineNumber;
49
50 public ScriptTag(BSFEngine engine, BSFManager manager) {
51 this.engine = engine;
52 this.manager = manager;
53 }
54
55
56
57 public void doTag(XMLOutput output) throws MissingAttributeException, JellyTagException {
58 String text = getBodyText();
59
60 log.debug(text);
61
62
63
64
65
66 synchronized (getRegistry()) {
67 getRegistry().setJellyContext(context);
68
69 try {
70
71 for ( Iterator iter = context.getVariableNames(); iter.hasNext(); ) {
72 String name = (String) iter.next();
73 Object value = context.getVariable( name );
74 manager.declareBean( name, value, value.getClass() );
75 }
76 engine.exec(fileName, lineNumber, columnNumber, text);
77 }
78 catch (BSFException e) {
79 throw new JellyTagException("Error occurred with script: " + e, e);
80 }
81 }
82 }
83
84
85
86 /***
87 * @return int
88 */
89 public int getColumnNumber() {
90 return columnNumber;
91 }
92
93 /***
94 * @return String
95 */
96 public String getElementName() {
97 return elementName;
98 }
99
100 /***
101 * @return BSFEngine
102 */
103 public BSFEngine getEngine() {
104 return engine;
105 }
106
107 /***
108 * @return String
109 */
110 public String getFileName() {
111 return fileName;
112 }
113
114 /***
115 * @return int
116 */
117 public int getLineNumber() {
118 return lineNumber;
119 }
120
121 /***
122 * Sets the columnNumber.
123 * @param columnNumber The columnNumber to set
124 */
125 public void setColumnNumber(int columnNumber) {
126 this.columnNumber = columnNumber;
127 }
128
129 /***
130 * Sets the elementName.
131 * @param elementName The elementName to set
132 */
133 public void setElementName(String elementName) {
134 this.elementName = elementName;
135 }
136
137 /***
138 * Sets the engine.
139 * @param engine The engine to set
140 */
141 public void setEngine(BSFEngine engine) {
142 this.engine = engine;
143 }
144
145 /***
146 * Sets the fileName.
147 * @param fileName The fileName to set
148 */
149 public void setFileName(String fileName) {
150 this.fileName = fileName;
151 }
152
153 /***
154 * Sets the lineNumber.
155 * @param lineNumber The lineNumber to set
156 */
157 public void setLineNumber(int lineNumber) {
158 this.lineNumber = lineNumber;
159 }
160
161 private JellyContextRegistry getRegistry()
162 {
163 return (JellyContextRegistry) this.manager.getObjectRegistry();
164 }
165 }