KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > apache > cocoon > generation > EventCacheGenerator


1 /*
2  * Copyright 1999-2004 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.cocoon.generation;
17
18 import java.io.IOException JavaDoc;
19 import java.io.Serializable JavaDoc;
20 import java.util.HashMap JavaDoc;
21 import java.util.Map JavaDoc;
22
23 import org.apache.avalon.framework.configuration.Configurable;
24 import org.apache.avalon.framework.configuration.Configuration;
25 import org.apache.avalon.framework.configuration.ConfigurationException;
26 import org.apache.avalon.framework.parameters.ParameterException;
27 import org.apache.avalon.framework.parameters.Parameters;
28 import org.apache.avalon.framework.service.ServiceException;
29 import org.apache.avalon.framework.service.ServiceManager;
30 import org.apache.avalon.framework.service.ServiceSelector;
31 import org.apache.cocoon.ProcessingException;
32 import org.apache.cocoon.caching.CacheableProcessingComponent;
33 import org.apache.cocoon.caching.validity.Event;
34 import org.apache.cocoon.caching.validity.EventFactory;
35 import org.apache.cocoon.caching.validity.EventValidity;
36 import org.apache.cocoon.caching.validity.NameValueEventFactory;
37 import org.apache.cocoon.caching.validity.NamedEventFactory;
38 import org.apache.cocoon.environment.SourceResolver;
39 import org.apache.cocoon.xml.XMLConsumer;
40 import org.apache.excalibur.source.SourceUtil;
41 import org.apache.excalibur.source.SourceValidity;
42 import org.xml.sax.SAXException JavaDoc;
43
44 /**
45  * Generator wrapper that forwards generation to
46  * to its delegate but overides its caching strategy
47  * by replacing it with an event-cache aware implementation.
48  *
49  * <p>
50  * Sitemap configuration is as follows:<br>
51  * &lt;map:generator name="event-cache" SRC="org.apache.cocoon.generation.EventCacheGenerator" &gt;<br>
52  * &nbsp;&nbsp;&lt;factory name="my-event" value="com.my.EventFactoryImpl" /&gt;<br>
53  * &nbsp;&nbsp;&lt;factory name="my-other-event" value="com.myother.EventFactoryImpl" /&gt;<br>
54  * &lt;/map:generator&gt;<br>
55  * </p>
56  *
57  * Two event types are preconfigured: NamedEvent (name="named") and NameValueEvent
58  * (name="name-value").
59  *
60  * <p>
61  * Pipeline usage is as follows:<br>
62  * &lt;map:generate type="event-cache" SRC="delegate-src"&gt;<br>
63  * &nbsp;&nbsp;&lt;map:parameter name="delegate" value="delegate-type" /&gt;<br>
64  * &nbsp;&nbsp;&lt;map:parameter name="event-type" value="my-event" /&gt;<br>
65  * &nbsp;&nbsp;&lt;!-- my event parameters --&gt;<br>
66  * &nbsp;&nbsp;&lt;map:parameter name="event-name" value="some name" /&gt;<br>
67  * &nbsp;&nbsp;&lt;map:parameter name="event-value" value="some value" /&gt;<br>
68  * &lt;/map:generate&gt;
69  * </p>
70  *
71  * The two preconfigured event types take the following parameters:<br>
72  * - event-type 'named': parameter 'event-name'<br>
73  * - event-type 'name-value': parameter 'event-name' and parameter 'event-value'<br>
74  *
75  * <p>
76  * The src attribute and all parameters are passed as is to delegate generator.
77  * </p>
78  *
79  * TODO: share common code with EventCacheTransformer
80  * @author Unico Hommes
81  */

82 public class EventCacheGenerator extends ServiceableGenerator
83 implements Configurable, CacheableProcessingComponent {
84
85
86     // ---------------------------------------------------- constants
87

88     public static final String JavaDoc NAME_VALUE_EVENT_TYPE = "name-value";
89     public static final String JavaDoc EVENT_TYPE_DEFAULT = "named";
90     public static final String JavaDoc NAMED_EVENT_TYPE = EVENT_TYPE_DEFAULT;
91         
92     public static final String JavaDoc FACTORY_CONF = "factory";
93     public static final String JavaDoc FACTORY_NAME_CONF = "name";
94     public static final String JavaDoc FACTORY_NAME_TYPE = "src";
95     
96     public static final String JavaDoc DELEGATE_PARAM = "delegate";
97     public static final String JavaDoc EVENT_TYPE_PARAM = "event-type";
98
99     
100     // ---------------------------------------------------- member variables
101

102     private ServiceSelector m_generatorSelector;
103     private Generator m_delegate;
104     private Serializable JavaDoc m_key;
105     private Event m_event;
106     
107     private Map JavaDoc m_types = new HashMap JavaDoc();
108     
109     
110     /* (non-Javadoc)
111      * @see org.apache.avalon.framework.service.Serviceable#service(org.apache.avalon.framework.service.ServiceManager)
112      */

113     public void service(ServiceManager manager) throws ServiceException {
114         super.service(manager);
115         m_generatorSelector = (ServiceSelector)
116             manager.lookup(Generator.ROLE + "Selector");
117     }
118
119     /* (non-Javadoc)
120      * @see org.apache.avalon.framework.configuration.Configurable#configure(org.apache.avalon.framework.configuration.Configuration)
121      */

122     public void configure(Configuration configuration) throws ConfigurationException {
123         Configuration[] factories = configuration.getChildren(FACTORY_CONF);
124         for (int i = 0; i < factories.length; i++) {
125             Configuration child = factories[i];
126             String JavaDoc name = child.getAttribute(FACTORY_NAME_CONF);
127             String JavaDoc src = child.getAttribute(FACTORY_NAME_TYPE);
128             try {
129                 EventFactory factory = (EventFactory) Class.forName(src).newInstance();
130                 m_types.put(name,factory);
131             } catch (Exception JavaDoc e) {
132                 final String JavaDoc message =
133                     "Unable to create EventFactory of type " + src;
134                 throw new ConfigurationException(message, e);
135             }
136         }
137         if (!m_types.containsKey(NAMED_EVENT_TYPE)) {
138             m_types.put(NAMED_EVENT_TYPE,new NamedEventFactory());
139         }
140         if (!m_types.containsKey(NAME_VALUE_EVENT_TYPE)) {
141             m_types.put(NAME_VALUE_EVENT_TYPE,new NameValueEventFactory());
142         }
143     }
144     
145     /* (non-Javadoc)
146      * @see org.apache.cocoon.sitemap.SitemapModelComponent#setup(org.apache.cocoon.environment.SourceResolver, java.util.Map, java.lang.String, org.apache.avalon.framework.parameters.Parameters)
147      */

148     public void setup(SourceResolver resolver, Map JavaDoc objectModel, String JavaDoc src,
149                       Parameters par)
150     throws ProcessingException, SAXException JavaDoc, IOException JavaDoc {
151
152         // delegate
153
String JavaDoc delegate = par.getParameter(DELEGATE_PARAM, null);
154         if (delegate == null) {
155             String JavaDoc message =
156                 "Required parameter 'delegate' is missing";
157             throw new ProcessingException(message);
158         }
159         try {
160             m_delegate = (Generator) m_generatorSelector.select(delegate);
161         } catch (ServiceException e) {
162             final String JavaDoc message =
163                 "Generator '" + delegate + "' could not be found.";
164             throw new ProcessingException(message);
165         }
166         m_delegate.setup(resolver, objectModel, src, par);
167         
168         // event
169
String JavaDoc eventType = par.getParameter(EVENT_TYPE_PARAM, EVENT_TYPE_DEFAULT);
170         EventFactory factory = (EventFactory) m_types.get(eventType);
171         if (factory == null) {
172             throw new ProcessingException("No such type of event: " + eventType);
173         }
174         try {
175             m_event = factory.createEvent(par);
176         } catch (ParameterException e) {
177             final String JavaDoc message = "Failure creating Event";
178             throw new ProcessingException(message,e);
179         }
180         
181         // key - TODO: use delegates key?
182
m_key = SourceUtil.appendParameters(src,par);
183     }
184
185     /* (non-Javadoc)
186      * @see org.apache.cocoon.xml.XMLProducer#setConsumer(org.apache.cocoon.xml.XMLConsumer)
187      */

188     public void setConsumer(XMLConsumer consumer) {
189         m_delegate.setConsumer(consumer);
190     }
191
192     /* (non-Javadoc)
193      * @see org.apache.cocoon.generation.Generator#generate()
194      */

195     public void generate() throws IOException JavaDoc, SAXException JavaDoc, ProcessingException {
196         m_delegate.generate();
197     }
198
199     /* (non-Javadoc)
200      * @see org.apache.avalon.excalibur.pool.Recyclable#recycle()
201      */

202     public void recycle() {
203         if ( m_delegate != null ) {
204             m_generatorSelector.release(m_delegate);
205         }
206         m_delegate = null;
207         m_key = null;
208         m_event = null;
209         super.recycle();
210     }
211
212     
213     /* (non-Javadoc)
214      * @see org.apache.cocoon.caching.CacheableProcessingComponent#getKey()
215      */

216     public Serializable JavaDoc getKey() {
217         return m_key;
218     }
219
220     /* (non-Javadoc)
221      * @see org.apache.cocoon.caching.CacheableProcessingComponent#getValidity()
222      */

223     public SourceValidity getValidity() {
224         return new EventValidity(m_event);
225     }
226
227     /* (non-Javadoc)
228      * @see org.apache.avalon.framework.activity.Disposable#dispose()
229      */

230     public void dispose() {
231         if ( this.manager != null ) {
232             this.manager.release(m_generatorSelector);
233             m_generatorSelector = null;
234         }
235         super.dispose();
236     }
237 }
238
Popular Tags