1   /**
2    * Copyright (c) 2000-2010 Liferay, Inc. All rights reserved.
3    *
4    * The contents of this file are subject to the terms of the Liferay Enterprise
5    * Subscription License ("License"). You may not use this file except in
6    * compliance with the License. You can obtain a copy of the License by
7    * contacting Liferay, Inc. See the License for the specific language governing
8    * permissions and limitations under the License, including but not limited to
9    * distribution rights of the Software.
10   *
11   *
12   *
13   */
14  
15  package com.liferay.portal.kernel.deploy.hot;
16  
17  import com.liferay.portal.kernel.messaging.DestinationNames;
18  import com.liferay.portal.kernel.messaging.MessageBusUtil;
19  import com.liferay.portal.kernel.messaging.MessageListener;
20  import com.liferay.portal.kernel.servlet.ServletContextUtil;
21  import com.liferay.portal.kernel.util.ProxyFactory;
22  import com.liferay.portal.kernel.util.WebKeys;
23  
24  import java.lang.reflect.Field;
25  
26  import java.util.ArrayList;
27  import java.util.List;
28  import java.util.Set;
29  
30  import javax.servlet.ServletContext;
31  
32  /**
33   * <a href="BaseHotDeployListener.java.html"><b><i>View Source</i></b></a>
34   *
35   * @author Brian Wing Shun Chan
36   */
37  public abstract class BaseHotDeployListener implements HotDeployListener {
38  
39      public void throwHotDeployException(
40              HotDeployEvent event, String msg, Throwable t)
41          throws HotDeployException {
42  
43          ServletContext servletContext = event.getServletContext();
44  
45          String servletContextName = servletContext.getServletContextName();
46  
47          throw new HotDeployException(msg + servletContextName, t);
48      }
49  
50      protected Object newInstance(
51              ClassLoader portletClassLoader, Class<?> interfaceClass,
52              String implClassName)
53          throws Exception {
54  
55          return ProxyFactory.newInstance(
56              portletClassLoader, interfaceClass, implClassName);
57      }
58  
59      protected Object newInstance(
60              ClassLoader portletClassLoader, Class<?>[] interfaceClasses,
61              String implClassName)
62          throws Exception {
63  
64          return ProxyFactory.newInstance(
65              portletClassLoader, interfaceClasses, implClassName);
66      }
67  
68      protected void registerClpMessageListeners(
69              ServletContext servletContext, ClassLoader portletClassLoader)
70          throws Exception {
71  
72          List<MessageListener> clpMessageListeners =
73              (List<MessageListener>)servletContext.getAttribute(
74                  WebKeys.CLP_MESSAGE_LISTENERS);
75  
76          if (clpMessageListeners != null) {
77              return;
78          }
79  
80          clpMessageListeners = new ArrayList<MessageListener>();
81  
82          Set<String> classNames = ServletContextUtil.getClassNames(
83              servletContext);
84  
85          for (String className : classNames) {
86              if (className.endsWith(".ClpMessageListener")) {
87                  Class<?> clpMessageListenerClass = portletClassLoader.loadClass(
88                      className);
89  
90                  MessageListener clpMessageListener =
91                      (MessageListener)clpMessageListenerClass.newInstance();
92  
93                  Field servletContextNameField =
94                      clpMessageListenerClass.getField(
95                          "SERVLET_CONTEXT_NAME");
96  
97                  String clpServletContextName = servletContextNameField.get(
98                      clpMessageListener).toString();
99  
100                 if (clpServletContextName.equals(
101                         servletContext.getServletContextName())) {
102 
103                     continue;
104                 }
105 
106                 clpMessageListeners.add(clpMessageListener);
107 
108                 MessageBusUtil.registerMessageListener(
109                     DestinationNames.HOT_DEPLOY, clpMessageListener);
110             }
111         }
112 
113         servletContext.setAttribute(
114             WebKeys.CLP_MESSAGE_LISTENERS, clpMessageListeners);
115     }
116 
117     protected void unregisterClpMessageListeners(ServletContext servletContext)
118         throws Exception {
119 
120         List<MessageListener> clpMessageListeners =
121             (List<MessageListener>)servletContext.getAttribute(
122                 WebKeys.CLP_MESSAGE_LISTENERS);
123 
124         if (clpMessageListeners != null) {
125             servletContext.removeAttribute(WebKeys.CLP_MESSAGE_LISTENERS);
126 
127             for (MessageListener clpMessageListener : clpMessageListeners) {
128                 MessageBusUtil.unregisterMessageListener(
129                     DestinationNames.HOT_DEPLOY, clpMessageListener);
130             }
131         }
132     }
133 
134 }