KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > apache > tapestry > binding > ListenerBinding


1 // Copyright 2004, 2005 The Apache Software Foundation
2
//
3
// Licensed under the Apache License, Version 2.0 (the "License");
4
// you may not use this file except in compliance with the License.
5
// You may obtain a copy of the License at
6
//
7
// http://www.apache.org/licenses/LICENSE-2.0
8
//
9
// Unless required by applicable law or agreed to in writing, software
10
// distributed under the License is distributed on an "AS IS" BASIS,
11
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
// See the License for the specific language governing permissions and
13
// limitations under the License.
14

15 package org.apache.tapestry.binding;
16
17 import org.apache.bsf.BSFException;
18 import org.apache.bsf.BSFManager;
19 import org.apache.hivemind.ApplicationRuntimeException;
20 import org.apache.hivemind.Location;
21 import org.apache.hivemind.util.Defense;
22 import org.apache.tapestry.IActionListener;
23 import org.apache.tapestry.IComponent;
24 import org.apache.tapestry.IEngine;
25 import org.apache.tapestry.IPage;
26 import org.apache.tapestry.IRequestCycle;
27 import org.apache.tapestry.Tapestry;
28 import org.apache.tapestry.coerce.ValueConverter;
29 import org.apache.tapestry.services.BSFManagerFactory;
30
31 /**
32  * A very specialized binding that can be used as an {@link org.apache.tapestry.IActionListener},
33  * executing a script in a scripting language, via <a HREF="http://jakarta.apache.org/bsf">Bean
34  * Scripting Framework </a>.
35  *
36  * @author Howard Lewis Ship
37  * @since 3.0
38  */

39
40 public class ListenerBinding extends AbstractBinding implements IActionListener
41 {
42     private final String JavaDoc _language;
43
44     private final String JavaDoc _script;
45
46     private final IComponent _component;
47
48     /** @since 4.0 */
49
50     private BSFManagerFactory _managerFactory;
51
52     public ListenerBinding(String JavaDoc description, ValueConverter valueConverter, Location location,
53             IComponent component, String JavaDoc language, String JavaDoc script,
54             BSFManagerFactory managerFactory)
55     {
56         super(description, valueConverter, location);
57
58         Defense.notNull(component, "component");
59         Defense.notNull(language, "language");
60         Defense.notNull(script, "script");
61
62         _component = component;
63         _language = language;
64         _script = script;
65         _managerFactory = managerFactory;
66     }
67
68     /**
69      * Returns this.
70      */

71
72     public Object JavaDoc getObject()
73     {
74         return this;
75     }
76
77     /**
78      * A ListenerBinding is also a {@link org.apache.tapestry.IActionListener}. It registers a
79      * number of beans with the BSF manager and invokes the script.
80      * <p>
81      * Registers the following bean:
82      * <ul>
83      * <li>component - the relevant {@link IComponent}, typically the same as the page
84      * <li>page - the {@link IPage}trigged by the request (obtained by
85      * {@link IRequestCycle#getPage()}
86      * <li>cycle - the {@link IRequestCycle}, from which can be found the {@link IEngine}, etc.
87      * </ul>
88      */

89
90     public void actionTriggered(IComponent component, IRequestCycle cycle)
91     {
92         BSFManager bsf = _managerFactory.createBSFManager();
93
94         Location location = getLocation();
95
96         try
97         {
98             IPage page = cycle.getPage();
99
100             bsf.declareBean("component", _component, _component.getClass());
101             bsf.declareBean("page", page, page.getClass());
102             bsf.declareBean("cycle", cycle, cycle.getClass());
103
104             bsf.exec(
105                     _language,
106                     location.getResource().toString(),
107                     location.getLineNumber(),
108                     location.getLineNumber(),
109                     _script);
110         }
111         catch (BSFException ex)
112         {
113             String JavaDoc message = Tapestry.format("ListenerBinding.bsf-exception", location, ex
114                     .getMessage());
115
116             throw new ApplicationRuntimeException(message, _component, getLocation(), ex);
117         }
118     }
119
120     /** @since 4.0 */
121
122     public Object JavaDoc getComponent()
123     {
124         return _component;
125     }
126 }
Popular Tags