001: /*
002: * This file is part of PFIXCORE.
003: *
004: * PFIXCORE is free software; you can redistribute it and/or modify
005: * it under the terms of the GNU Lesser General Public License as published by
006: * the Free Software Foundation; either version 2 of the License, or
007: * (at your option) any later version.
008: *
009: * PFIXCORE is distributed in the hope that it will be useful,
010: * but WITHOUT ANY WARRANTY; without even the implied warranty of
011: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
012: * GNU Lesser General Public License for more details.
013: *
014: * You should have received a copy of the GNU Lesser General Public License
015: * along with PFIXCORE; if not, write to the Free Software
016: * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
017: *
018: */
019:
020: package de.schlund.pfixcore.workflow.app;
021:
022: import java.util.HashMap;
023: import java.util.Properties;
024:
025: import de.schlund.pfixcore.workflow.Context;
026: import de.schlund.pfixcore.workflow.PageRequest;
027: import de.schlund.pfixxml.ConfigurableObject;
028: import de.schlund.pfixxml.XMLException;
029:
030: /**
031: * This class is responsible for managing all {@link IHandlerContainer}.
032: * For every servlet in the Pustefix system one IHandlerContainerManager exists.
033: * <br/>
034: * @author <a href="mailto:jtl@schlund.de">Jens Lautenbacher</a>
035: */
036:
037: public class IHandlerContainerManager implements ConfigurableObject {
038: // private static Logger LOG = Logger.getLogger(IHandlerContainerManager.class);
039: private static String DEF_HDL_CONTAINER = "de.schlund.pfixcore.workflow.app.IHandlerSimpleContainer";
040: /** Store the already created IHandlerContainer here, use the page as key*/
041: private HashMap<PageRequest, IHandlerContainer> known = new HashMap<PageRequest, IHandlerContainer>();
042:
043: /**
044: * @see de.schlund.pfixxml.PropertyObject#init(Properties)
045: */
046: public void init(Object dummy) {
047: // Takes a dummy context config object, which is only used to ensure
048: // there is one instance if IHandlerContainerManager per context
049: // Intentionally do nothing here :-)
050: }
051:
052: /**
053: * Get the IHandler according to the passed context. If the IHandler is already
054: * known it will be returned, else it will be created.
055: * @param context the context containing the {@link PageRequest} where
056: * the desired IHandlerContainer is responsible for.
057: * @return the desired IHandlerContainer
058: * @throws XMLException on errors when creating the IHandlerContainer.
059: */
060: public IHandlerContainer getIHandlerContainer(Context context)
061: throws XMLException {
062: String classname = null;
063: Properties props = context.getPropertiesForCurrentPageRequest();
064:
065: synchronized (known) {
066: PageRequest page = context.getCurrentPageRequest();
067: IHandlerContainer retval = known.get(page);
068: if (retval == null) {
069: // LOG.debug("----- cachemiss for IHandlerContainer on page " + page.getName());
070: try {
071:
072: classname = props
073: .getProperty(IHandlerSimpleContainer.PROP_CONTAINER);
074: if (classname == null) {
075: classname = DEF_HDL_CONTAINER;
076: }
077: retval = (IHandlerContainer) Class.forName(
078: classname).newInstance();
079: retval.initIHandlers(context
080: .getConfigForCurrentPageRequest());
081: } catch (InstantiationException e) {
082: throw new XMLException(
083: "unable to instantiate class [" + classname
084: + "]" + e.getMessage());
085: } catch (IllegalAccessException e) {
086: throw new XMLException("unable access class ["
087: + classname + "]" + e.getMessage());
088: } catch (ClassNotFoundException e) {
089: throw new XMLException("unable to find class ["
090: + classname + "]" + e.getMessage());
091: } catch (ClassCastException e) {
092: throw new XMLException(
093: "class ["
094: + classname
095: + "] does not implement the interface IHandlerContainer"
096: + e.getMessage());
097: }
098: known.put(page, retval);
099: } else {
100: // LOG.debug("+++++ cachehit for IHandlerContainer on page " + page.getName());
101: }
102: return retval;
103: }
104: }
105:
106: }// IHandlerContainerFactory
|