| package org.apache.turbine.services.assemblerbroker; |
| |
| /* ==================================================================== |
| * The Apache Software License, Version 1.1 |
| * |
| * Copyright (c) 2001-2003 The Apache Software Foundation. All rights |
| * reserved. |
| * |
| * Redistribution and use in source and binary forms, with or without |
| * modification, are permitted provided that the following conditions |
| * are met: |
| * |
| * 1. Redistributions of source code must retain the above copyright |
| * notice, this list of conditions and the following disclaimer. |
| * |
| * 2. Redistributions in binary form must reproduce the above copyright |
| * notice, this list of conditions and the following disclaimer in |
| * the documentation and/or other materials provided with the |
| * distribution. |
| * |
| * 3. The end-user documentation included with the redistribution, |
| * if any, must include the following acknowledgment: |
| * "This product includes software developed by the |
| * Apache Software Foundation (http://www.apache.org/)." |
| * Alternately, this acknowledgment may appear in the software itself, |
| * if and wherever such third-party acknowledgments normally appear. |
| * |
| * 4. The names "Apache" and "Apache Software Foundation" and |
| * "Apache Turbine" must not be used to endorse or promote products |
| * derived from this software without prior written permission. For |
| * written permission, please contact apache@apache.org. |
| * |
| * 5. Products derived from this software may not be called "Apache", |
| * "Apache Turbine", nor may "Apache" appear in their name, without |
| * prior written permission of the Apache Software Foundation. |
| * |
| * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED |
| * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
| * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE |
| * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR |
| * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
| * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
| * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF |
| * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND |
| * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, |
| * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT |
| * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
| * SUCH DAMAGE. |
| * ==================================================================== |
| * |
| * This software consists of voluntary contributions made by many |
| * individuals on behalf of the Apache Software Foundation. For more |
| * information on the Apache Software Foundation, please see |
| * <http://www.apache.org/>. |
| */ |
| |
| import java.util.HashMap; |
| import java.util.Iterator; |
| import java.util.List; |
| import java.util.Map; |
| import java.util.Vector; |
| |
| import org.apache.commons.logging.Log; |
| import org.apache.commons.logging.LogFactory; |
| |
| import org.apache.turbine.modules.Assembler; |
| import org.apache.turbine.services.InitializationException; |
| import org.apache.turbine.services.TurbineBaseService; |
| import org.apache.turbine.services.assemblerbroker.util.AssemblerFactory; |
| import org.apache.turbine.util.TurbineException; |
| |
| /** |
| * TurbineAssemblerBrokerService allows assemblers (like screens, |
| * actions and layouts) to be loaded from one or more AssemblerFactory |
| * classes. AssemblerFactory classes are registered with this broker |
| * by adding them to the TurbineResources.properties file. |
| * |
| * @author <a href="mailto:leon@opticode.co.za">Leon Messerschmidt</a> |
| * @author <a href="mailto:hps@intermeta.de">Henning P. Schmiedehausen</a> |
| * @version $Id$ |
| */ |
| public class TurbineAssemblerBrokerService |
| extends TurbineBaseService |
| implements AssemblerBrokerService |
| { |
| /** Logging */ |
| private static Log log |
| = LogFactory.getLog(TurbineAssemblerBrokerService.class); |
| |
| /** A structure that holds the registered AssemblerFactories */ |
| private Map factories = null; |
| |
| /** |
| * Get a list of AssemblerFactories of a certain type |
| * |
| * @param type type of Assembler |
| * @return list of AssemblerFactories |
| */ |
| private List getFactoryGroup(String type) |
| { |
| if (!factories.containsKey(type)) |
| { |
| factories.put(type, new Vector()); |
| } |
| return (List) factories.get(type); |
| } |
| |
| /** |
| * Utiltiy method to register all factories for a given type. |
| * |
| * @param type type of Assembler |
| * @throws TurbineException |
| */ |
| private void registerFactories(String type) |
| throws TurbineException |
| { |
| List names = getConfiguration().getList(type); |
| |
| log.info("Registering " + names.size() + " " + type + " factories."); |
| |
| for (Iterator it = names.iterator(); it.hasNext(); ) |
| { |
| String factory = (String) it.next(); |
| try |
| { |
| Object o = Class.forName(factory).newInstance(); |
| registerFactory(type, (AssemblerFactory) o); |
| } |
| // these must be passed to the VM |
| catch (ThreadDeath e) |
| { |
| throw e; |
| } |
| catch (OutOfMemoryError e) |
| { |
| throw e; |
| } |
| // when using Class.forName(), NoClassDefFoundErrors are likely |
| // to happen (missing jar files) |
| catch (Throwable t) |
| { |
| throw new TurbineException("Failed registering " + type |
| + " factory: " + factory, t); |
| } |
| } |
| } |
| |
| /** |
| * Initializes the AssemblerBroker and loads the AssemblerFactory |
| * classes registered in TurbineResources.Properties. |
| * |
| * @throws InitializationException |
| */ |
| public void init() |
| throws InitializationException |
| { |
| factories = new HashMap(); |
| try |
| { |
| registerFactories(AssemblerBrokerService.ACTION_TYPE); |
| registerFactories(AssemblerBrokerService.SCREEN_TYPE); |
| registerFactories(AssemblerBrokerService.NAVIGATION_TYPE); |
| registerFactories(AssemblerBrokerService.LAYOUT_TYPE); |
| registerFactories(AssemblerBrokerService.PAGE_TYPE); |
| registerFactories(AssemblerBrokerService.SCHEDULEDJOB_TYPE); |
| } |
| catch (TurbineException e) |
| { |
| throw new InitializationException( |
| "AssemblerBrokerService failed to initialize", e); |
| } |
| setInit(true); |
| } |
| |
| /** |
| * Register a new AssemblerFactory under a certain type |
| * |
| * @param type type of Assembler |
| * @param factory factory to register |
| */ |
| public void registerFactory(String type, AssemblerFactory factory) |
| { |
| getFactoryGroup(type).add(factory); |
| } |
| |
| /** |
| * Attempt to retrieve an Assembler of a given type with |
| * a name. Cycle through all the registered AssemblerFactory |
| * classes of type and return the first non-null assembly |
| * found. If an assembly was not found return null. |
| * |
| * @param type type of Assembler |
| * @param name name of the requested Assembler |
| * @return an Assembler or null |
| * @throws TurbineException |
| */ |
| public Assembler getAssembler(String type, String name) |
| throws TurbineException |
| { |
| List facs = getFactoryGroup(type); |
| |
| Assembler assembler = null; |
| for (Iterator it = facs.iterator(); (assembler == null) && it.hasNext();) |
| { |
| AssemblerFactory fac = (AssemblerFactory) it.next(); |
| try |
| { |
| assembler = fac.getAssembler(name); |
| } |
| catch (Exception e) |
| { |
| throw new TurbineException("Failed to load an assembler for " |
| + name + " from the " |
| + type + " factory " |
| + fac.getClass().getName(), e); |
| } |
| } |
| return assembler; |
| } |
| } |