001
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
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 }