1
14
15 package com.liferay.portal.kernel.deploy.hot;
16
17 import com.liferay.portal.kernel.bean.ContextClassLoaderBeanHandler;
18 import com.liferay.portal.kernel.messaging.DestinationNames;
19 import com.liferay.portal.kernel.messaging.MessageBusUtil;
20 import com.liferay.portal.kernel.messaging.MessageListener;
21 import com.liferay.portal.kernel.servlet.ServletContextUtil;
22 import com.liferay.portal.kernel.util.WebKeys;
23
24 import java.lang.reflect.Field;
25 import java.lang.reflect.Proxy;
26
27 import java.util.ArrayList;
28 import java.util.List;
29 import java.util.Set;
30
31 import javax.servlet.ServletContext;
32
33
38 public abstract class BaseHotDeployListener implements HotDeployListener {
39
40 public void throwHotDeployException(
41 HotDeployEvent event, String msg, Throwable t)
42 throws HotDeployException {
43
44 ServletContext servletContext = event.getServletContext();
45
46 String servletContextName = servletContext.getServletContextName();
47
48 throw new HotDeployException(msg + servletContextName, t);
49 }
50
51 protected Object newInstance(
52 ClassLoader portletClassLoader, Class<?> interfaceClass,
53 String implClassName)
54 throws Exception {
55
56 return newInstance(
57 portletClassLoader, new Class[] {interfaceClass}, implClassName);
58 }
59
60 protected Object newInstance(
61 ClassLoader portletClassLoader, Class<?>[] interfaceClasses,
62 String implClassName)
63 throws Exception {
64
65 Object instance = portletClassLoader.loadClass(
66 implClassName).newInstance();
67
68 return Proxy.newProxyInstance(
69 portletClassLoader, interfaceClasses,
70 new ContextClassLoaderBeanHandler(instance, portletClassLoader));
71 }
72
73 protected void registerClpMessageListeners(
74 ServletContext servletContext, ClassLoader portletClassLoader)
75 throws Exception {
76
77 List<MessageListener> clpMessageListeners =
78 (List<MessageListener>)servletContext.getAttribute(
79 WebKeys.CLP_MESSAGE_LISTENERS);
80
81 if (clpMessageListeners != null) {
82 return;
83 }
84
85 clpMessageListeners = new ArrayList<MessageListener>();
86
87 Set<String> classNames = ServletContextUtil.getClassNames(
88 servletContext);
89
90 for (String className : classNames) {
91 if (className.endsWith(".ClpMessageListener")) {
92 Class<?> clpMessageListenerClass = portletClassLoader.loadClass(
93 className);
94
95 MessageListener clpMessageListener =
96 (MessageListener)clpMessageListenerClass.newInstance();
97
98 Field servletContextNameField =
99 clpMessageListenerClass.getField(
100 "SERVLET_CONTEXT_NAME");
101
102 String clpServletContextName = servletContextNameField.get(
103 clpMessageListener).toString();
104
105 if (clpServletContextName.equals(
106 servletContext.getServletContextName())) {
107
108 continue;
109 }
110
111 clpMessageListeners.add(clpMessageListener);
112
113 MessageBusUtil.registerMessageListener(
114 DestinationNames.HOT_DEPLOY, clpMessageListener);
115 }
116 }
117
118 servletContext.setAttribute(
119 WebKeys.CLP_MESSAGE_LISTENERS, clpMessageListeners);
120 }
121
122 protected void unregisterClpMessageListeners(ServletContext servletContext)
123 throws Exception {
124
125 List<MessageListener> clpMessageListeners =
126 (List<MessageListener>)servletContext.getAttribute(
127 WebKeys.CLP_MESSAGE_LISTENERS);
128
129 if (clpMessageListeners != null) {
130 servletContext.removeAttribute(WebKeys.CLP_MESSAGE_LISTENERS);
131
132 for (MessageListener clpMessageListener : clpMessageListeners) {
133 MessageBusUtil.unregisterMessageListener(
134 DestinationNames.HOT_DEPLOY, clpMessageListener);
135 }
136 }
137 }
138
139 }