001    /**
002     * Copyright (c) 2000-2010 Liferay, Inc. All rights reserved.
003     *
004     * This library is free software; you can redistribute it and/or modify it under
005     * the terms of the GNU Lesser General Public License as published by the Free
006     * Software Foundation; either version 2.1 of the License, or (at your option)
007     * any later version.
008     *
009     * This library is distributed in the hope that it will be useful, but WITHOUT
010     * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
011     * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
012     * details.
013     */
014    
015    package com.liferay.portal.kernel.deploy.hot;
016    
017    import com.liferay.portal.kernel.messaging.DestinationNames;
018    import com.liferay.portal.kernel.messaging.MessageBusUtil;
019    import com.liferay.portal.kernel.messaging.MessageListener;
020    import com.liferay.portal.kernel.servlet.ServletContextUtil;
021    import com.liferay.portal.kernel.util.ProxyFactory;
022    import com.liferay.portal.kernel.util.WebKeys;
023    
024    import java.lang.reflect.Field;
025    
026    import java.util.ArrayList;
027    import java.util.List;
028    import java.util.Set;
029    
030    import javax.servlet.ServletContext;
031    
032    /**
033     * @author Brian Wing Shun Chan
034     */
035    public abstract class BaseHotDeployListener implements HotDeployListener {
036    
037            public void throwHotDeployException(
038                            HotDeployEvent event, String msg, Throwable t)
039                    throws HotDeployException {
040    
041                    ServletContext servletContext = event.getServletContext();
042    
043                    String servletContextName = servletContext.getServletContextName();
044    
045                    throw new HotDeployException(msg + servletContextName, t);
046            }
047    
048            protected Object newInstance(
049                            ClassLoader portletClassLoader, Class<?> interfaceClass,
050                            String implClassName)
051                    throws Exception {
052    
053                    return ProxyFactory.newInstance(
054                            portletClassLoader, interfaceClass, implClassName);
055            }
056    
057            protected Object newInstance(
058                            ClassLoader portletClassLoader, Class<?>[] interfaceClasses,
059                            String implClassName)
060                    throws Exception {
061    
062                    return ProxyFactory.newInstance(
063                            portletClassLoader, interfaceClasses, implClassName);
064            }
065    
066            protected void registerClpMessageListeners(
067                            ServletContext servletContext, ClassLoader portletClassLoader)
068                    throws Exception {
069    
070                    List<MessageListener> clpMessageListeners =
071                            (List<MessageListener>)servletContext.getAttribute(
072                                    WebKeys.CLP_MESSAGE_LISTENERS);
073    
074                    if (clpMessageListeners != null) {
075                            return;
076                    }
077    
078                    clpMessageListeners = new ArrayList<MessageListener>();
079    
080                    Set<String> classNames = ServletContextUtil.getClassNames(
081                            servletContext);
082    
083                    for (String className : classNames) {
084                            if (className.endsWith(".ClpMessageListener")) {
085                                    Class<?> clpMessageListenerClass = portletClassLoader.loadClass(
086                                            className);
087    
088                                    MessageListener clpMessageListener =
089                                            (MessageListener)clpMessageListenerClass.newInstance();
090    
091                                    Field servletContextNameField =
092                                            clpMessageListenerClass.getField(
093                                                    "SERVLET_CONTEXT_NAME");
094    
095                                    String clpServletContextName = servletContextNameField.get(
096                                            clpMessageListener).toString();
097    
098                                    if (clpServletContextName.equals(
099                                                    servletContext.getServletContextName())) {
100    
101                                            continue;
102                                    }
103    
104                                    clpMessageListeners.add(clpMessageListener);
105    
106                                    MessageBusUtil.registerMessageListener(
107                                            DestinationNames.HOT_DEPLOY, clpMessageListener);
108                            }
109                    }
110    
111                    servletContext.setAttribute(
112                            WebKeys.CLP_MESSAGE_LISTENERS, clpMessageListeners);
113            }
114    
115            protected void unregisterClpMessageListeners(ServletContext servletContext)
116                    throws Exception {
117    
118                    List<MessageListener> clpMessageListeners =
119                            (List<MessageListener>)servletContext.getAttribute(
120                                    WebKeys.CLP_MESSAGE_LISTENERS);
121    
122                    if (clpMessageListeners != null) {
123                            servletContext.removeAttribute(WebKeys.CLP_MESSAGE_LISTENERS);
124    
125                            for (MessageListener clpMessageListener : clpMessageListeners) {
126                                    MessageBusUtil.unregisterMessageListener(
127                                            DestinationNames.HOT_DEPLOY, clpMessageListener);
128                            }
129                    }
130            }
131    
132    }