1 16 package org.apache.cocoon.generation; 17 18 import java.io.IOException ; 19 import java.io.Serializable ; 20 import java.util.HashMap ; 21 import java.util.Map ; 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 ; 43 44 82 public class EventCacheGenerator extends ServiceableGenerator 83 implements Configurable, CacheableProcessingComponent { 84 85 86 88 public static final String NAME_VALUE_EVENT_TYPE = "name-value"; 89 public static final String EVENT_TYPE_DEFAULT = "named"; 90 public static final String NAMED_EVENT_TYPE = EVENT_TYPE_DEFAULT; 91 92 public static final String FACTORY_CONF = "factory"; 93 public static final String FACTORY_NAME_CONF = "name"; 94 public static final String FACTORY_NAME_TYPE = "src"; 95 96 public static final String DELEGATE_PARAM = "delegate"; 97 public static final String EVENT_TYPE_PARAM = "event-type"; 98 99 100 102 private ServiceSelector m_generatorSelector; 103 private Generator m_delegate; 104 private Serializable m_key; 105 private Event m_event; 106 107 private Map m_types = new HashMap (); 108 109 110 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 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 name = child.getAttribute(FACTORY_NAME_CONF); 127 String 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 e) { 132 final String 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 148 public void setup(SourceResolver resolver, Map objectModel, String src, 149 Parameters par) 150 throws ProcessingException, SAXException , IOException { 151 152 String delegate = par.getParameter(DELEGATE_PARAM, null); 154 if (delegate == null) { 155 String 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 message = 163 "Generator '" + delegate + "' could not be found."; 164 throw new ProcessingException(message); 165 } 166 m_delegate.setup(resolver, objectModel, src, par); 167 168 String 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 message = "Failure creating Event"; 178 throw new ProcessingException(message,e); 179 } 180 181 m_key = SourceUtil.appendParameters(src,par); 183 } 184 185 188 public void setConsumer(XMLConsumer consumer) { 189 m_delegate.setConsumer(consumer); 190 } 191 192 195 public void generate() throws IOException , SAXException , ProcessingException { 196 m_delegate.generate(); 197 } 198 199 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 216 public Serializable getKey() { 217 return m_key; 218 } 219 220 223 public SourceValidity getValidity() { 224 return new EventValidity(m_event); 225 } 226 227 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 |