/** * * Copyright 2004, 2005 The Apache Software Foundation or its licensors, as applicable. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.geronimo.console.jmsmanager; import org.apache.geronimo.console.BasePortlet; import org.apache.geronimo.console.GeronimoVersion; import org.apache.geronimo.console.databasemanager.DataSourceInfo; import org.apache.geronimo.console.jmsmanager.activemqCF.ActiveMQConnectorHelper; import org.apache.geronimo.gbean.GAttributeInfo; import org.apache.geronimo.gbean.GBeanInfo; import org.apache.geronimo.kernel.Kernel; import org.apache.geronimo.kernel.KernelRegistry; import org.apache.geronimo.kernel.jmx.JMXUtil; import javax.jms.Connection; import javax.jms.ConnectionFactory; import javax.management.MalformedObjectNameException; import javax.management.ObjectName; import javax.portlet.ActionRequest; import javax.portlet.ActionResponse; import javax.portlet.PortletConfig; import javax.portlet.PortletContext; import javax.portlet.PortletException; import javax.portlet.PortletRequestDispatcher; import javax.portlet.RenderRequest; import javax.portlet.RenderResponse; import javax.portlet.WindowState; import java.io.IOException; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; public class JMSConnectionFactoryManagerPortlet extends BasePortlet { private final static ActiveMQConnectorHelper helper = new ActiveMQConnectorHelper(); private final static String PARENT_ID = "geronimo/activemq-broker/" + GeronimoVersion.GERONIMO_VERSION + "/car"; private final static String ADD_MODE = "addACF"; private final static String SUBMIT_CREATE = "Create"; private final ObjectName DATABASE_QUERY = JMXUtil .getObjectName("*:j2eeType=JCAManagedConnectionFactory,*"); protected final String NORMAL_VIEW = "/WEB-INF/view/jmsmanager/activemq/normal.jsp";; protected final String DETAIL_VIEW = "/WEB-INF/view/jmsmanager/activemq/detail.jsp"; protected final String HELP_VIEW = "/WEB-INF/view/jmsmanager/activemq/help.jsp";; protected final String ADD_VIEW = "/WEB-INF/view/jmsmanager/activemq/addACF.jsp"; protected Kernel kernel; private PortletRequestDispatcher normalView; private PortletRequestDispatcher detailView; private PortletRequestDispatcher helpView; private PortletRequestDispatcher addView; private static final Set HIDDEN_ATTRIBUTES; static { HIDDEN_ATTRIBUTES = new HashSet(); HIDDEN_ATTRIBUTES.add("kernel"); HIDDEN_ATTRIBUTES.add("connectionImplClass"); HIDDEN_ATTRIBUTES.add("connectionInterface"); HIDDEN_ATTRIBUTES.add("connectionFactoryInterface"); HIDDEN_ATTRIBUTES.add("connectionFactoryImplClass"); HIDDEN_ATTRIBUTES.add("implementedInterfaces"); HIDDEN_ATTRIBUTES.add("managedConnectionFactoryClass"); HIDDEN_ATTRIBUTES.add("recoveryXAResources"); } public void init(PortletConfig portletConfig) throws PortletException { super.init(portletConfig); kernel = KernelRegistry.getSingleKernel(); PortletContext context = portletConfig.getPortletContext(); normalView = context.getRequestDispatcher(NORMAL_VIEW); detailView = context.getRequestDispatcher(DETAIL_VIEW); helpView = context.getRequestDispatcher(HELP_VIEW); addView = context.getRequestDispatcher(ADD_VIEW); } public void processAction(ActionRequest actionRequest, ActionResponse actionResponse) throws PortletException, IOException { String mode = actionRequest.getParameter("mode"); String submit = actionRequest.getParameter("submit"); if (mode == null) { return; } else if (ADD_MODE.equals(mode)) { actionResponse.setRenderParameter("mode", mode); if (SUBMIT_CREATE.equals(submit)) { String acfName = actionRequest.getParameter("acfName"); String serverURL = actionRequest.getParameter("serverURL"); String userName = actionRequest.getParameter("userName"); String pword = actionRequest.getParameter("pword"); String poolMaxSize = actionRequest.getParameter("poolMaxSize"); String blocking = actionRequest.getParameter("blocking"); String[] args = { trimStr(acfName), trimStr(PARENT_ID), trimStr(acfName), trimStr(serverURL), trimStr(userName), pword, trimStr(acfName), trimStr(poolMaxSize), trimStr(blocking) }; helper.deployPlan(actionRequest, args); // Set mode to list after creating the new ConnectionFactories actionResponse.setRenderParameter("mode", "list"); } return; } String name = actionRequest.getParameter("name"); if (name != null) { actionResponse.setRenderParameter("mode", "list"); return; } } protected void doView(RenderRequest renderRequest, RenderResponse renderResponse) throws IOException, PortletException { if (WindowState.MINIMIZED.equals(renderRequest.getWindowState())) { return; } List dependencies = helper.getDependencies(renderRequest); // pass them to the render request renderRequest.setAttribute("dependencies", (String[]) dependencies .toArray(new String[dependencies.size()])); String name = renderRequest.getParameter("name"); String mode = renderRequest.getParameter("mode"); String check = renderRequest.getParameter("check"); if (ADD_MODE.equals(mode)) { addView.include(renderRequest, renderResponse); return; } boolean test = false; if (name == null || mode == null) { mode = "list"; } if ("true".equals(check)) { test = true; } if ("detail".equals(mode) || "config".equals(mode)) { renderDetail(renderRequest, renderResponse, name); } else { renderList(renderRequest, renderResponse, name, test); } } private void renderList(RenderRequest renderRequest, RenderResponse renderResponse, String name, boolean check) throws PortletException, IOException { Set gbeanNames = kernel.listGBeans(DATABASE_QUERY); List connectionFactories = new ArrayList(gbeanNames.size()); for (Iterator i = gbeanNames.iterator(); i.hasNext();) { ObjectName gbeanName = (ObjectName) i.next(); // check that this connector is a DataSource try { Class cfInterface = Class.forName((String) kernel.getAttribute( gbeanName, "connectionFactoryInterface")); if (!(ConnectionFactory.class).isAssignableFrom(cfInterface)) { continue; } } catch (Exception e) { throw new PortletException(e); } DataSourceInfo info = new DataSourceInfo(); info.setObjectName(gbeanName); info.setName(gbeanName.getKeyProperty("name")); try { info.setState(new Integer(kernel.getGBeanState(gbeanName))); //check if user asked this connection to be tested if ((gbeanName.toString().equals(name)) && (check)) { info.setWorking(true); try { Object cf = kernel.invoke(gbeanName, "$getResource"); testConnection(cf); info.setMessage("Connected"); } catch (Exception e) { Throwable t = e; String message = "Failed: "; if (t.getMessage() != null) { message = message + t.getMessage(); } else { while (t.getMessage() == null) { t = t.getCause(); if (t != null) { message = message + t.getMessage(); } else { message = message + "Unknown reason"; } } } info.setMessage(message); } } else { info.setWorking(false); } } catch (Exception e) { throw new PortletException(e); } connectionFactories.add(info); } Collections.sort(connectionFactories); renderRequest.setAttribute("cFactories", connectionFactories); normalView.include(renderRequest, renderResponse); } private void renderDetail(RenderRequest renderRequest, RenderResponse renderResponse, String name) throws PortletException, IOException { ObjectName gbeanName; try { gbeanName = new ObjectName(name); } catch (MalformedObjectNameException e) { throw new PortletException("Malformed parameter name: " + renderRequest.getParameter("name")); } try { GBeanInfo gbeanInfo = kernel.getGBeanInfo(gbeanName); Set attributes = gbeanInfo.getAttributes(); Map values = new HashMap(attributes.size()); for (Iterator i = attributes.iterator(); i.hasNext();) { GAttributeInfo attribute = (GAttributeInfo) i.next(); String gname = attribute.getName(); if (HIDDEN_ATTRIBUTES.contains(gname)) { continue; } Object value = kernel.getAttribute(gbeanName, gname); values.put(gname, value); } renderRequest.setAttribute("attributeMap", values); } catch (Exception e) { throw new PortletException(e); } detailView.include(renderRequest, renderResponse); } protected void doHelp(RenderRequest renderRequest, RenderResponse renderResponse) throws PortletException, IOException { helpView.include(renderRequest, renderResponse); } public void destroy() { normalView = null; helpView = null; addView = null; kernel = null; super.destroy(); } private String trimStr(String str) { if (str != null) { return str.trim(); } return ""; } protected void testConnection(Object cf) throws Exception { ConnectionFactory jmscf = (ConnectionFactory) cf; Connection c = jmscf.createConnection(); c.close(); } }