001 /**
002 * Licensed to the Apache Software Foundation (ASF) under one or more
003 * contributor license agreements. See the NOTICE file distributed with
004 * this work for additional information regarding copyright ownership.
005 * The ASF licenses this file to You under the Apache License, Version 2.0
006 * (the "License"); you may not use this file except in compliance with
007 * the License. You may obtain a copy of the License at
008 *
009 * http://www.apache.org/licenses/LICENSE-2.0
010 *
011 * Unless required by applicable law or agreed to in writing, software
012 * distributed under the License is distributed on an "AS IS" BASIS,
013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014 * See the License for the specific language governing permissions and
015 * limitations under the License.
016 */
017
018 package org.apache.geronimo.console.jmsmanager;
019
020 import java.io.IOException;
021 import java.util.ArrayList;
022 import java.util.Collections;
023 import java.util.HashMap;
024 import java.util.HashSet;
025 import java.util.Iterator;
026 import java.util.List;
027 import java.util.Map;
028 import java.util.Set;
029
030 import javax.jms.Connection;
031 import javax.jms.ConnectionFactory;
032 import javax.management.MalformedObjectNameException;
033 import javax.management.ObjectName;
034 import javax.portlet.ActionRequest;
035 import javax.portlet.ActionResponse;
036 import javax.portlet.PortletConfig;
037 import javax.portlet.PortletContext;
038 import javax.portlet.PortletException;
039 import javax.portlet.PortletRequestDispatcher;
040 import javax.portlet.RenderRequest;
041 import javax.portlet.RenderResponse;
042 import javax.portlet.WindowState;
043
044 import org.apache.geronimo.console.BasePortlet;
045 import org.apache.geronimo.console.jmsmanager.DataSourceInfo;
046 import org.apache.geronimo.console.jmsmanager.activemqCF.ActiveMQConnectorHelper;
047 import org.apache.geronimo.gbean.GAttributeInfo;
048 import org.apache.geronimo.gbean.GBeanInfo;
049 import org.apache.geronimo.kernel.Kernel;
050 import org.apache.geronimo.kernel.KernelRegistry;
051 import org.apache.geronimo.kernel.ObjectNameUtil;
052
053 public class JMSConnectionFactoryManagerPortlet extends BasePortlet {
054
055 private final static ActiveMQConnectorHelper helper = new ActiveMQConnectorHelper();
056
057 private final static String PARENT_ID = "geronimo/activemq-broker/" + org.apache.geronimo.system.serverinfo.ServerConstants.getVersion() + "/car";
058
059 private final static String ADD_MODE = "addACF";
060
061 private final static String SUBMIT_CREATE = "Create";
062
063 private final ObjectName DATABASE_QUERY = ObjectNameUtil
064 .getObjectName("*:j2eeType=JCAManagedConnectionFactory,*");
065
066 protected final String NORMAL_VIEW = "/WEB-INF/view/jmsmanager/activemq/normal.jsp";;
067
068 protected final String DETAIL_VIEW = "/WEB-INF/view/jmsmanager/activemq/detail.jsp";
069
070 protected final String HELP_VIEW = "/WEB-INF/view/jmsmanager/activemq/help.jsp";;
071
072 protected final String ADD_VIEW = "/WEB-INF/view/jmsmanager/activemq/addACF.jsp";
073
074 protected Kernel kernel;
075
076 private PortletRequestDispatcher normalView;
077
078 private PortletRequestDispatcher detailView;
079
080 private PortletRequestDispatcher helpView;
081
082 private PortletRequestDispatcher addView;
083
084 private static final Set HIDDEN_ATTRIBUTES;
085
086 static {
087 HIDDEN_ATTRIBUTES = new HashSet();
088 HIDDEN_ATTRIBUTES.add("kernel");
089 HIDDEN_ATTRIBUTES.add("connectionImplClass");
090 HIDDEN_ATTRIBUTES.add("connectionInterface");
091 HIDDEN_ATTRIBUTES.add("connectionFactoryInterface");
092 HIDDEN_ATTRIBUTES.add("connectionFactoryImplClass");
093 HIDDEN_ATTRIBUTES.add("implementedInterfaces");
094 HIDDEN_ATTRIBUTES.add("managedConnectionFactoryClass");
095 HIDDEN_ATTRIBUTES.add("recoveryXAResources");
096 }
097
098 public void init(PortletConfig portletConfig) throws PortletException {
099 super.init(portletConfig);
100 kernel = KernelRegistry.getSingleKernel();
101 PortletContext context = portletConfig.getPortletContext();
102 normalView = context.getRequestDispatcher(NORMAL_VIEW);
103 detailView = context.getRequestDispatcher(DETAIL_VIEW);
104 helpView = context.getRequestDispatcher(HELP_VIEW);
105 addView = context.getRequestDispatcher(ADD_VIEW);
106 }
107
108 public void processAction(ActionRequest actionRequest,
109 ActionResponse actionResponse) throws PortletException, IOException {
110 String mode = actionRequest.getParameter("mode");
111 String submit = actionRequest.getParameter("submit");
112
113 if (mode == null) {
114 return;
115 } else if (ADD_MODE.equals(mode)) {
116 actionResponse.setRenderParameter("mode", mode);
117 if (SUBMIT_CREATE.equals(submit)) {
118 String acfName = actionRequest.getParameter("acfName");
119 String serverURL = actionRequest.getParameter("serverURL");
120 String userName = actionRequest.getParameter("userName");
121 String pword = actionRequest.getParameter("pword");
122 String poolMaxSize = actionRequest.getParameter("poolMaxSize");
123 String blocking = actionRequest.getParameter("blocking");
124
125 String[] args = { trimStr(acfName), trimStr(PARENT_ID),
126 trimStr(acfName), trimStr(serverURL),
127 trimStr(userName), pword, trimStr(acfName),
128 trimStr(poolMaxSize), trimStr(blocking) };
129 helper.deployPlan(actionRequest, args);
130 // Set mode to list after creating the new ConnectionFactories
131 actionResponse.setRenderParameter("mode", "list");
132 }
133 return;
134 }
135
136 String name = actionRequest.getParameter("name");
137 if (name != null) {
138 actionResponse.setRenderParameter("mode", "list");
139 return;
140 }
141 }
142
143 protected void doView(RenderRequest renderRequest,
144 RenderResponse renderResponse) throws IOException, PortletException {
145 if (WindowState.MINIMIZED.equals(renderRequest.getWindowState())) {
146 return;
147 }
148
149 List dependencies = helper.getDependencies(renderRequest);
150 // pass them to the render request
151 renderRequest.setAttribute("dependencies", (String[]) dependencies
152 .toArray(new String[dependencies.size()]));
153
154 String name = renderRequest.getParameter("name");
155 String mode = renderRequest.getParameter("mode");
156 String check = renderRequest.getParameter("check");
157
158 if (ADD_MODE.equals(mode)) {
159 addView.include(renderRequest, renderResponse);
160 return;
161 }
162
163 boolean test = false;
164 if (name == null || mode == null) {
165 mode = "list";
166 }
167 if ("true".equals(check)) {
168 test = true;
169 }
170 if ("detail".equals(mode) || "config".equals(mode)) {
171 renderDetail(renderRequest, renderResponse, name);
172 } else {
173 renderList(renderRequest, renderResponse, name, test);
174 }
175 }
176
177 private void renderList(RenderRequest renderRequest,
178 RenderResponse renderResponse, String name, boolean check)
179 throws PortletException, IOException {
180
181 Set gbeanNames = kernel.listGBeans(DATABASE_QUERY);
182 List connectionFactories = new ArrayList(gbeanNames.size());
183 for (Iterator i = gbeanNames.iterator(); i.hasNext();) {
184 ObjectName gbeanName = (ObjectName) i.next();
185
186 // check that this connector is a DataSource
187 try {
188 Class cfInterface = Class.forName((String) kernel.getAttribute(
189 gbeanName, "connectionFactoryInterface"));
190 if (!(ConnectionFactory.class).isAssignableFrom(cfInterface)) {
191 continue;
192 }
193 } catch (Exception e) {
194 throw new PortletException(e);
195 }
196
197 DataSourceInfo info = new DataSourceInfo();
198 info.setObjectName(gbeanName);
199 info.setName(gbeanName.getKeyProperty("name"));
200 try {
201 info.setState(new Integer(kernel.getGBeanState(gbeanName)));
202 //check if user asked this connection to be tested
203 if ((gbeanName.toString().equals(name)) && (check)) {
204 info.setWorking(true);
205 try {
206 Object cf = kernel.invoke(gbeanName, "$getResource");
207 testConnection(cf);
208 info.setMessage("Connected");
209 } catch (Exception e) {
210 Throwable t = e;
211 String message = "Failed: ";
212 if (t.getMessage() != null) {
213 message = message + t.getMessage();
214 } else {
215 while (t.getMessage() == null) {
216 t = t.getCause();
217 if (t != null) {
218 message = message + t.getMessage();
219 } else {
220 message = message + "Unknown reason";
221 }
222 }
223 }
224 info.setMessage(message);
225 }
226 } else {
227 info.setWorking(false);
228 }
229
230 } catch (Exception e) {
231 throw new PortletException(e);
232 }
233 connectionFactories.add(info);
234 }
235 Collections.sort(connectionFactories);
236 renderRequest.setAttribute("cFactories", connectionFactories);
237
238 normalView.include(renderRequest, renderResponse);
239 }
240
241 private void renderDetail(RenderRequest renderRequest,
242 RenderResponse renderResponse, String name)
243 throws PortletException, IOException {
244 ObjectName gbeanName;
245
246 try {
247 gbeanName = new ObjectName(name);
248 } catch (MalformedObjectNameException e) {
249 throw new PortletException("Malformed parameter name: "
250 + renderRequest.getParameter("name"));
251 }
252
253 try {
254 GBeanInfo gbeanInfo = kernel.getGBeanInfo(gbeanName);
255 Set attributes = gbeanInfo.getAttributes();
256 Map values = new HashMap(attributes.size());
257 for (Iterator i = attributes.iterator(); i.hasNext();) {
258 GAttributeInfo attribute = (GAttributeInfo) i.next();
259 String gname = attribute.getName();
260 if (HIDDEN_ATTRIBUTES.contains(gname)) {
261 continue;
262 }
263 Object value = kernel.getAttribute(gbeanName, gname);
264 values.put(gname, value);
265 }
266 renderRequest.setAttribute("attributeMap", values);
267 } catch (Exception e) {
268 throw new PortletException(e);
269 }
270
271 detailView.include(renderRequest, renderResponse);
272 }
273
274 protected void doHelp(RenderRequest renderRequest,
275 RenderResponse renderResponse) throws PortletException, IOException {
276 helpView.include(renderRequest, renderResponse);
277 }
278
279 public void destroy() {
280 normalView = null;
281 helpView = null;
282 addView = null;
283 kernel = null;
284 super.destroy();
285 }
286
287 private String trimStr(String str) {
288 if (str != null) {
289 return str.trim();
290 }
291 return "";
292 }
293
294 protected void testConnection(Object cf) throws Exception {
295 ConnectionFactory jmscf = (ConnectionFactory) cf;
296 Connection c = jmscf.createConnection();
297 c.close();
298 }
299
300 }