| /******************************************************************************* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| *******************************************************************************/ |
| package org.apache.ofbiz.webapp.event; |
| |
| import java.lang.reflect.Method; |
| import java.util.HashMap; |
| import java.util.Map; |
| |
| import javax.servlet.ServletContext; |
| import javax.servlet.http.HttpServletRequest; |
| import javax.servlet.http.HttpServletResponse; |
| |
| import org.apache.ofbiz.base.util.Debug; |
| import org.apache.ofbiz.entity.transaction.GenericTransactionException; |
| import org.apache.ofbiz.entity.transaction.TransactionUtil; |
| import org.apache.ofbiz.webapp.control.ConfigXMLReader; |
| import org.apache.ofbiz.webapp.control.ConfigXMLReader.Event; |
| import org.apache.ofbiz.webapp.control.ConfigXMLReader.RequestMap; |
| |
| /** |
| * JavaEventHandler - Static Method Java Event Handler |
| */ |
| public class JavaEventHandler implements EventHandler { |
| |
| public static final String module = JavaEventHandler.class.getName(); |
| |
| private Map<String, Class<?>> eventClassMap = new HashMap<String, Class<?>>(); |
| |
| /** |
| * @see org.apache.ofbiz.webapp.event.EventHandler#init(javax.servlet.ServletContext) |
| */ |
| public void init(ServletContext context) throws EventHandlerException { |
| } |
| |
| /** |
| * @see org.apache.ofbiz.webapp.event.EventHandler#invoke(ConfigXMLReader.Event, ConfigXMLReader.RequestMap, javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse) |
| */ |
| public String invoke(Event event, RequestMap requestMap, HttpServletRequest request, HttpServletResponse response) throws EventHandlerException { |
| Class<?> eventClass = this.eventClassMap.get(event.path); |
| |
| if (eventClass == null) { |
| synchronized (this) { |
| eventClass = this.eventClassMap.get(event.path); |
| if (eventClass == null) { |
| try { |
| ClassLoader loader = Thread.currentThread().getContextClassLoader(); |
| eventClass = loader.loadClass(event.path); |
| } catch (ClassNotFoundException e) { |
| Debug.logError(e, "Error loading class with name: " + event.path + ", will not be able to run event...", module); |
| } |
| if (eventClass != null) { |
| eventClassMap.put(event.path, eventClass); |
| } |
| } |
| } |
| } |
| if (Debug.verboseOn()) Debug.logVerbose("[Set path/method]: " + event.path + " / " + event.invoke, module); |
| |
| Class<?>[] paramTypes = new Class<?>[] {HttpServletRequest.class, HttpServletResponse.class}; |
| |
| Debug.logVerbose("*[[Event invocation]]*", module); |
| Object[] params = new Object[] {request, response}; |
| |
| return invoke(event.path, event.invoke, eventClass, paramTypes, params); |
| } |
| |
| private String invoke(String eventPath, String eventMethod, Class<?> eventClass, Class<?>[] paramTypes, Object[] params) throws EventHandlerException { |
| boolean beganTransaction = false; |
| if (eventClass == null) { |
| throw new EventHandlerException("Error invoking event, the class " + eventPath + " was not found"); |
| } |
| if (eventPath == null || eventMethod == null) { |
| throw new EventHandlerException("Invalid event method or path; call initialize()"); |
| } |
| |
| Debug.logVerbose("[Processing]: JAVA Event", module); |
| try { |
| beganTransaction = TransactionUtil.begin(); |
| Method m = eventClass.getMethod(eventMethod, paramTypes); |
| String eventReturn = (String) m.invoke(null, params); |
| |
| if (Debug.verboseOn()) Debug.logVerbose("[Event Return]: " + eventReturn, module); |
| return eventReturn; |
| } catch (java.lang.reflect.InvocationTargetException e) { |
| Throwable t = e.getTargetException(); |
| |
| if (t != null) { |
| Debug.logError(t, "Problems Processing Event", module); |
| throw new EventHandlerException("Problems processing event: " + t.toString(), t); |
| } else { |
| Debug.logError(e, "Problems Processing Event", module); |
| throw new EventHandlerException("Problems processing event: " + e.toString(), e); |
| } |
| } catch (Exception e) { |
| Debug.logError(e, "Problems Processing Event", module); |
| throw new EventHandlerException("Problems processing event: " + e.toString(), e); |
| } finally { |
| try { |
| TransactionUtil.commit(beganTransaction); |
| } catch (GenericTransactionException e) { |
| Debug.logError(e, module); |
| } |
| } |
| } |
| } |