001    /**
002     * Copyright (c) 2000-2013 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    import java.lang.reflect.Method;
026    
027    import java.util.ArrayList;
028    import java.util.List;
029    import java.util.Set;
030    
031    import javax.servlet.ServletContext;
032    
033    /**
034     * @author Brian Wing Shun Chan
035     */
036    public abstract class BaseHotDeployListener implements HotDeployListener {
037    
038            public void throwHotDeployException(
039                            HotDeployEvent event, String msg, Throwable t)
040                    throws HotDeployException {
041    
042                    ServletContext servletContext = event.getServletContext();
043    
044                    String servletContextName = servletContext.getServletContextName();
045    
046                    throw new HotDeployException(msg + servletContextName, t);
047            }
048    
049            protected String getClpServletContextName(
050                            Class<?> clpMessageListenerClass,
051                            MessageListener clpMessageListener)
052                    throws Exception {
053    
054                    Exception e = null;
055    
056                    try {
057                            Method servletContextNameMethod = clpMessageListenerClass.getMethod(
058                                    "getServletContextName");
059    
060                            String clpServletContextName =
061                                    (String)servletContextNameMethod.invoke(null);
062    
063                            return clpServletContextName;
064                    }
065                    catch (Exception e1) {
066                            e = e1;
067                    }
068    
069                    try {
070                            Field servletContextNameField = clpMessageListenerClass.getField(
071                                    "SERVLET_CONTEXT_NAME");
072    
073                            Object clpServletContextName = servletContextNameField.get(
074                                    clpMessageListener);
075    
076                            return clpServletContextName.toString();
077                    }
078                    catch (Exception e2) {
079                    }
080    
081                    throw e;
082            }
083    
084            protected Object newInstance(
085                            ClassLoader portletClassLoader, Class<?> interfaceClass,
086                            String implClassName)
087                    throws Exception {
088    
089                    return ProxyFactory.newInstance(
090                            portletClassLoader, interfaceClass, implClassName);
091            }
092    
093            protected Object newInstance(
094                            ClassLoader portletClassLoader, Class<?>[] interfaceClasses,
095                            String implClassName)
096                    throws Exception {
097    
098                    return ProxyFactory.newInstance(
099                            portletClassLoader, interfaceClasses, implClassName);
100            }
101    
102            protected void registerClpMessageListeners(
103                            ServletContext servletContext, ClassLoader portletClassLoader)
104                    throws Exception {
105    
106                    List<MessageListener> clpMessageListeners =
107                            (List<MessageListener>)servletContext.getAttribute(
108                                    WebKeys.CLP_MESSAGE_LISTENERS);
109    
110                    if (clpMessageListeners != null) {
111                            return;
112                    }
113    
114                    clpMessageListeners = new ArrayList<MessageListener>();
115    
116                    Set<String> classNames = ServletContextUtil.getClassNames(
117                            servletContext);
118    
119                    for (String className : classNames) {
120                            if (className.endsWith(".ClpMessageListener")) {
121                                    Class<?> clpMessageListenerClass = portletClassLoader.loadClass(
122                                            className);
123    
124                                    MessageListener clpMessageListener =
125                                            (MessageListener)clpMessageListenerClass.newInstance();
126    
127                                    String clpServletContextName = getClpServletContextName(
128                                            clpMessageListenerClass, clpMessageListener);
129    
130                                    if (clpServletContextName.equals(
131                                                    servletContext.getServletContextName())) {
132    
133                                            continue;
134                                    }
135    
136                                    clpMessageListeners.add(clpMessageListener);
137    
138                                    MessageBusUtil.registerMessageListener(
139                                            DestinationNames.HOT_DEPLOY, clpMessageListener);
140                            }
141                    }
142    
143                    servletContext.setAttribute(
144                            WebKeys.CLP_MESSAGE_LISTENERS, clpMessageListeners);
145            }
146    
147            protected void unregisterClpMessageListeners(ServletContext servletContext)
148                    throws Exception {
149    
150                    List<MessageListener> clpMessageListeners =
151                            (List<MessageListener>)servletContext.getAttribute(
152                                    WebKeys.CLP_MESSAGE_LISTENERS);
153    
154                    if (clpMessageListeners != null) {
155                            servletContext.removeAttribute(WebKeys.CLP_MESSAGE_LISTENERS);
156    
157                            for (MessageListener clpMessageListener : clpMessageListeners) {
158                                    MessageBusUtil.unregisterMessageListener(
159                                            DestinationNames.HOT_DEPLOY, clpMessageListener);
160                            }
161                    }
162            }
163    
164    }