001: /*******************************************************************************
002: * Licensed to the Apache Software Foundation (ASF) under one
003: * or more contributor license agreements. See the NOTICE file
004: * distributed with this work for additional information
005: * regarding copyright ownership. The ASF licenses this file
006: * to you under the Apache License, Version 2.0 (the
007: * "License"); you may not use this file except in compliance
008: * with the License. You may obtain a copy of the License at
009: *
010: * http://www.apache.org/licenses/LICENSE-2.0
011: *
012: * Unless required by applicable law or agreed to in writing,
013: * software distributed under the License is distributed on an
014: * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
015: * KIND, either express or implied. See the License for the
016: * specific language governing permissions and limitations
017: * under the License.
018: *******************************************************************************/package org.ofbiz.webapp.event;
019:
020: import java.util.HashMap;
021: import java.util.Iterator;
022: import java.util.List;
023: import java.util.Map;
024: import javax.servlet.ServletContext;
025: import javax.servlet.http.HttpServletRequest;
026: import javax.servlet.http.HttpServletResponse;
027:
028: import org.ofbiz.base.util.Debug;
029: import org.ofbiz.base.util.GeneralRuntimeException;
030: import org.ofbiz.base.util.ObjectType;
031: import org.ofbiz.webapp.control.RequestHandler;
032: import org.ofbiz.webapp.control.RequestManager;
033:
034: /**
035: * EventFactory - Event Handler Factory
036: */
037: public class EventFactory {
038:
039: public static final String module = EventFactory.class.getName();
040:
041: protected RequestHandler requestHandler = null;
042: protected RequestManager requestManager = null;
043: protected ServletContext context = null;
044: protected Map handlers = null;
045:
046: public EventFactory(RequestHandler requestHandler) {
047: handlers = new HashMap();
048: this .requestHandler = requestHandler;
049: this .requestManager = requestHandler.getRequestManager();
050: this .context = requestHandler.getServletContext();
051:
052: // pre-load all event handlers
053: try {
054: this .preLoadAll();
055: } catch (EventHandlerException e) {
056: Debug.logError(e, module);
057: throw new GeneralRuntimeException(e);
058: }
059: }
060:
061: private void preLoadAll() throws EventHandlerException {
062: List handlers = requestManager
063: .getHandlerKeys(RequestManager.EVENT_HANDLER_KEY);
064: if (handlers != null) {
065: Iterator i = handlers.iterator();
066: while (i.hasNext()) {
067: String type = (String) i.next();
068: this .handlers.put(type, this .loadEventHandler(type));
069: }
070: }
071: }
072:
073: public EventHandler getEventHandler(String type)
074: throws EventHandlerException {
075: // check if we are new / empty and add the default handler in
076: if (handlers.size() == 0) {
077: this .preLoadAll();
078: }
079:
080: // attempt to get a pre-loaded handler
081: EventHandler handler = (EventHandler) handlers.get(type);
082:
083: if (handler == null) {
084: synchronized (EventHandler.class) {
085: handler = (EventHandler) handlers.get(type);
086: if (handler == null) {
087: handler = this .loadEventHandler(type);
088: handlers.put(type, handler);
089: }
090: }
091: if (handler == null)
092: throw new EventHandlerException(
093: "No handler found for type: " + type);
094: }
095: return handler;
096: }
097:
098: public void clear() {
099: handlers.clear();
100: }
101:
102: private EventHandler loadEventHandler(String type)
103: throws EventHandlerException {
104: EventHandler handler = null;
105: String handlerClass = requestManager.getHandlerClass(type,
106: RequestManager.EVENT_HANDLER_KEY);
107: if (handlerClass == null) {
108: throw new EventHandlerException("Unknown handler type: "
109: + type);
110: }
111:
112: try {
113: handler = (EventHandler) ObjectType
114: .getInstance(handlerClass);
115: handler.init(context);
116: } catch (NoClassDefFoundError e) {
117: throw new EventHandlerException(
118: "No class def found for handler [" + handlerClass
119: + "]", e);
120: } catch (ClassNotFoundException cnf) {
121: throw new EventHandlerException(
122: "Cannot load handler class [" + handlerClass + "]",
123: cnf);
124: } catch (InstantiationException ie) {
125: throw new EventHandlerException(
126: "Cannot get instance of the handler ["
127: + handlerClass + "]", ie);
128: } catch (IllegalAccessException iae) {
129: throw new EventHandlerException(iae.getMessage(), iae);
130: }
131: return handler;
132: }
133:
134: public static String runRequestEvent(HttpServletRequest request,
135: HttpServletResponse response, String requestUri)
136: throws EventHandlerException {
137: ServletContext application = ((ServletContext) request
138: .getAttribute("servletContext"));
139: RequestHandler handler = (RequestHandler) application
140: .getAttribute("_REQUEST_HANDLER_");
141: RequestManager rm = handler.getRequestManager();
142: String eventType = rm.getEventType(requestUri);
143: String eventPath = rm.getEventPath(requestUri);
144: String eventMethod = rm.getEventMethod(requestUri);
145: return handler.runEvent(request, response, eventType,
146: eventPath, eventMethod);
147: }
148: }
|