KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > apache > tapestry > portlet > ApplicationPortlet


1 // Copyright 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.portlet;
16
17 import java.io.IOException JavaDoc;
18 import java.util.Locale JavaDoc;
19
20 import javax.portlet.ActionRequest;
21 import javax.portlet.ActionResponse;
22 import javax.portlet.Portlet;
23 import javax.portlet.PortletConfig;
24 import javax.portlet.PortletException;
25 import javax.portlet.RenderRequest;
26 import javax.portlet.RenderResponse;
27
28 import org.apache.hivemind.ClassResolver;
29 import org.apache.hivemind.Registry;
30 import org.apache.hivemind.Resource;
31 import org.apache.hivemind.impl.DefaultClassResolver;
32 import org.apache.hivemind.impl.RegistryBuilder;
33 import org.apache.hivemind.impl.XmlModuleDescriptorProvider;
34 import org.apache.tapestry.web.WebContext;
35 import org.apache.tapestry.web.WebContextResource;
36
37 /**
38  * Portlet implementation for Tapestry Portlet applilcations. It's job is to create and manage the
39  * HiveMind registry, to use the <code>tapestry.portlet.PortletApplicationInitializer</code>
40  * service to initialize HiveMind, and the delegate requests to the
41  * <code>tapestry.portlet.ActionRequestServicer</code> and
42  * <code>tapestry.portlet.RenderRequestServicer</code> services.
43  *
44  * @author Howard M. Lewis Ship
45  * @since 4.0
46  */

47 public class ApplicationPortlet implements Portlet
48 {
49     Registry _registry;
50
51     ActionRequestServicer _actionRequestServicer;
52
53     RenderRequestServicer _renderRequestServicer;
54
55     public void destroy()
56     {
57         try
58         {
59             _registry.shutdown();
60         }
61         finally
62         {
63             _registry = null;
64             _actionRequestServicer = null;
65             _renderRequestServicer = null;
66         }
67     }
68
69     public void init(PortletConfig config) throws PortletException
70     {
71         _registry = constructRegistry(config);
72
73         PortletApplicationInitializer initializer = (PortletApplicationInitializer) _registry
74                 .getService(
75                         "tapestry.portlet.PortletApplicationInitializer",
76                         PortletApplicationInitializer.class);
77
78         initializer.initialize(config);
79
80         _actionRequestServicer = (ActionRequestServicer) _registry.getService(
81                 "tapestry.portlet.ActionRequestServicer",
82                 ActionRequestServicer.class);
83
84         _renderRequestServicer = (RenderRequestServicer) _registry.getService(
85                 "tapestry.portlet.RenderRequestServicer",
86                 RenderRequestServicer.class);
87     }
88
89     /**
90      * Constructs the Registry. The Registry is constructed from the classpath, plus two optional
91      * files:
92      * <ul>
93      * <li>WEB-INF/ <em>name</em> /hivemodule.xml</li>
94      * <li>WEB-INF/hivemodule.xml</li>
95      * </ul>.
96      * <p>
97      * Where <em>name</em> is the name of the portlet.
98      */

99
100     protected Registry constructRegistry(PortletConfig config)
101     {
102         RegistryBuilder builder = new RegistryBuilder();
103
104         ClassResolver resolver = new DefaultClassResolver();
105
106         builder.addModuleDescriptorProvider(new XmlModuleDescriptorProvider(resolver));
107
108         String JavaDoc name = config.getPortletName();
109         WebContext context = new PortletWebContext(config.getPortletContext());
110
111         addModuleIfExists(builder, resolver, context, "/WEB-INF/" + name + "/hivemodule.xml");
112         addModuleIfExists(builder, resolver, context, "/WEB-INF/hivemodule.xml");
113
114         return builder.constructRegistry(Locale.getDefault());
115     }
116
117     /**
118      * Looks for a file in the context; if it exists, it is expected to be a HiveMind module
119      * descriptor, and is added to the builder.
120      *
121      * @since 4.0
122      */

123
124     protected void addModuleIfExists(RegistryBuilder builder, ClassResolver resolver,
125             WebContext context, String JavaDoc path)
126     {
127         Resource r = new WebContextResource(context, path);
128
129         if (r.getResourceURL() == null)
130             return;
131
132         builder.addModuleDescriptorProvider(new XmlModuleDescriptorProvider(resolver, r));
133     }
134
135     public void processAction(ActionRequest request, ActionResponse response)
136             throws PortletException, IOException JavaDoc
137     {
138         try
139         {
140             _registry.setupThread();
141
142             _actionRequestServicer.service(request, response);
143         }
144         catch (RuntimeException JavaDoc ex)
145         {
146             throw new PortletException(PortletMessages.errorProcessingAction(ex), ex);
147         }
148         finally
149         {
150             _registry.cleanupThread();
151         }
152     }
153
154     public void render(RenderRequest request, RenderResponse response) throws PortletException,
155             IOException JavaDoc
156     {
157         try
158         {
159             _registry.setupThread();
160
161             _renderRequestServicer.service(request, response);
162         }
163         catch (RuntimeException JavaDoc ex)
164         {
165             throw new PortletException(PortletMessages.errorProcessingRender(ex), ex);
166         }
167         finally
168         {
169             _registry.cleanupThread();
170         }
171     }
172 }
Popular Tags