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 package org.apache.geronimo.console.jmsmanager.wizard;
018
019 import java.io.IOException;
020 import java.io.Serializable;
021 import java.util.ArrayList;
022 import java.util.Collections;
023 import java.util.List;
024 import javax.management.MalformedObjectNameException;
025 import javax.management.ObjectName;
026 import javax.portlet.ActionRequest;
027 import javax.portlet.ActionResponse;
028 import javax.portlet.PortletException;
029 import javax.portlet.PortletRequest;
030 import javax.portlet.RenderRequest;
031 import javax.portlet.RenderResponse;
032
033 import org.apache.geronimo.console.MultiPageModel;
034 import org.apache.geronimo.console.util.PortletManager;
035 import org.apache.geronimo.j2ee.j2eeobjectnames.NameFactory;
036 import org.apache.geronimo.kernel.management.State;
037 import org.apache.geronimo.kernel.proxy.GeronimoManagedBean;
038 import org.apache.geronimo.management.geronimo.JCAAdminObject;
039 import org.apache.geronimo.management.geronimo.JCAManagedConnectionFactory;
040 import org.apache.geronimo.management.geronimo.JCAResource;
041 import org.apache.geronimo.management.geronimo.ResourceAdapter;
042 import org.apache.geronimo.management.geronimo.ResourceAdapterModule;
043 import org.apache.commons.logging.Log;
044 import org.apache.commons.logging.LogFactory;
045
046 /**
047 * A handles for the front page that lists available resources.
048 *
049 * @version $Rev: 476061 $ $Date: 2006-11-17 01:36:50 -0500 (Fri, 17 Nov 2006) $
050 */
051 public class ListScreenHandler extends AbstractHandler {
052 private static final Log log = LogFactory.getLog(ListScreenHandler.class);
053
054 public ListScreenHandler() {
055 super(LIST_MODE, "/WEB-INF/view/jmswizard/list.jsp");
056 }
057
058 public String actionBeforeView(ActionRequest request, ActionResponse response, MultiPageModel model) throws PortletException, IOException {
059 return getMode();
060 }
061
062 public void renderView(RenderRequest request, RenderResponse response, MultiPageModel model) throws PortletException, IOException {
063 populateExistingList(request);
064 }
065
066 public String actionAfterView(ActionRequest request, ActionResponse response, MultiPageModel model) throws PortletException, IOException {
067 JMSResourceData data = (JMSResourceData) model;
068 String provider = request.getParameter(PROVIDER_PARAMETER);
069 if (isEmpty(provider)) {
070 return SELECT_PROVIDER_MODE + BEFORE_ACTION;
071 }
072 JMSProviderData providerData = JMSProviderData.getProviderByName(provider);
073 data.setRarURI(providerData.getRaURI());
074 data.setDependency(providerData.getDependency());
075 return CONFIGURE_RA_MODE + BEFORE_ACTION;
076 }
077
078
079 private void populateExistingList(PortletRequest renderRequest) {
080 // Prepare a list of JMS configurations
081 List resources = new ArrayList();
082
083 // Get the list of connection factories
084 ResourceAdapterModule[] modules = PortletManager.getOutboundRAModules(renderRequest, new String[]{
085 "javax.jms.ConnectionFactory", "javax.jms.QueueConnectionFactory", "javax.jms.TopicConnectionFactory",});
086 try {
087 for (int i = 0; i < modules.length; i++) {
088 ResourceAdapterModule module = modules[i];
089
090 JMSResourceSummary target = null;
091 for (int j = 0; j < resources.size(); j++) {
092 JMSResourceSummary data = (JMSResourceSummary) resources.get(j);
093 if (data.adapterObjectName.equals(module.getObjectName())) {
094 target = data;
095 break;
096 }
097 }
098 if (target == null) {
099 ResourceAdapter[] adapters = PortletManager.getResourceAdapters(renderRequest, module);
100 String name = null;
101 if (adapters.length == 1 && adapters[0].getJCAResources().length == 1) {
102 JCAResource[] resource = PortletManager.getJCAResources(renderRequest, adapters[0]);
103 if (resource.length == 1 && resource[0].getResourceAdapterInstances().length == 1) {
104 name = ObjectName.getInstance(resource[0].getResourceAdapterInstanceNames()[0]).getKeyProperty(NameFactory.J2EE_NAME);
105 }
106 }
107 if (name == null) {
108 name = ObjectName.getInstance(module.getObjectName()).getKeyProperty(NameFactory.J2EE_NAME);
109 }
110 target = new JMSResourceSummary(PortletManager.getConfigurationFor(renderRequest, PortletManager.getNameFor(renderRequest, module)).toString(),
111 module.getObjectName(), name, ((GeronimoManagedBean) module).getState());
112 resources.add(target);
113 }
114
115 JCAManagedConnectionFactory[] factories = PortletManager.getOutboundFactoriesForRA(renderRequest, module, new String[]{
116 "javax.jms.ConnectionFactory", "javax.jms.QueueConnectionFactory", "javax.jms.TopicConnectionFactory",});
117 for (int j = 0; j < factories.length; j++) {
118 JCAManagedConnectionFactory factory = factories[j];
119 ObjectName name = ObjectName.getInstance(factory.getObjectName());
120 target.getConnectionFactories().add(new ConnectionFactorySummary(factory.getObjectName(), name.getKeyProperty(NameFactory.J2EE_NAME),
121 ((GeronimoManagedBean) factory).getState()));
122 }
123 }
124
125 // Get the list of admin objects
126 modules = PortletManager.getAdminObjectModules(renderRequest, new String[]{"javax.jms.Queue", "javax.jms.Topic"});
127 for (int i = 0; i < modules.length; i++) {
128 ResourceAdapterModule module = modules[i];
129
130 JMSResourceSummary target = null;
131 for (int j = 0; j < resources.size(); j++) {
132 JMSResourceSummary data = (JMSResourceSummary) resources.get(j);
133 if (data.adapterObjectName.equals(module.getObjectName())) {
134 target = data;
135 break;
136 }
137 }
138 if (target == null) {
139 ResourceAdapter[] adapters = PortletManager.getResourceAdapters(renderRequest, module);
140 String name = null;
141 if (adapters.length == 1 && adapters[0].getJCAResources().length == 1) {
142 JCAResource[] resource = PortletManager.getJCAResources(renderRequest, adapters[0]);
143 if (resource.length == 1 && resource[0].getResourceAdapterInstances().length == 1) {
144 name = ObjectName.getInstance(resource[0].getResourceAdapterInstanceNames()[0]).getKeyProperty(NameFactory.J2EE_NAME);
145 }
146 }
147 if (name == null) {
148 name = ObjectName.getInstance(module.getObjectName()).getKeyProperty(NameFactory.J2EE_NAME);
149 }
150 target = new JMSResourceSummary(PortletManager.getConfigurationFor(renderRequest, PortletManager.getNameFor(renderRequest, module)).toString(),
151 module.getObjectName(), name, ((GeronimoManagedBean) module).getState());
152 resources.add(target);
153 }
154
155 JCAAdminObject[] admins = PortletManager.getAdminObjectsForRA(renderRequest, module, new String[]{"javax.jms.Queue", "javax.jms.Topic"});
156 for (int j = 0; j < admins.length; j++) {
157 GeronimoManagedBean bean = (GeronimoManagedBean) admins[j];
158 ObjectName name = ObjectName.getInstance(bean.getObjectName());
159 target.getAdminObjects().add(new AdminObjectSummary(bean.getObjectName(), name.getKeyProperty(NameFactory.J2EE_NAME),
160 admins[j].getAdminObjectInterface().indexOf("Queue") > -1 ? "Queue" : "Topic",
161 bean.getState()));
162 }
163 }
164 } catch (MalformedObjectNameException e) {
165 log.error(e.getMessage(), e);
166 }
167
168 Collections.sort(resources);
169 renderRequest.setAttribute("resources", resources);
170 // Get the list of JMS providers
171 renderRequest.setAttribute("providers", JMSProviderData.getAllProviders());
172 }
173
174
175 public static class JMSResourceSummary implements Serializable, Comparable {
176 private static final long serialVersionUID = -2788803234448047035L;
177 private final String configurationName;
178 private final String adapterObjectName;
179 private final String name;
180 private final String parentName;
181 private final int state;
182 private final List connectionFactories = new ArrayList();
183 private final List adminObjects = new ArrayList();
184
185 public JMSResourceSummary(String configurationName, String adapterObjectName, String name, int state) {
186 this.configurationName = configurationName;
187 this.adapterObjectName = adapterObjectName;
188 this.state = state;
189 try {
190 ObjectName objectName = ObjectName.getInstance(adapterObjectName);
191 String parent = objectName.getKeyProperty(NameFactory.J2EE_APPLICATION);
192 if (parent != null && parent.equals("null")) {
193 parent = null;
194 }
195 parentName = parent;
196 this.name = name;
197 } catch (MalformedObjectNameException e) {
198 throw new RuntimeException("Can't parse ObjectName", e);
199 }
200 }
201
202 public String getConfigurationName() {
203 return configurationName;
204 }
205
206 public String getAdapterObjectName() {
207 return adapterObjectName;
208 }
209
210 public String getName() {
211 return name;
212 }
213
214 public String getParentName() {
215 return parentName;
216 }
217
218 public int getState() {
219 return state;
220 }
221
222 public List getConnectionFactories() {
223 return connectionFactories;
224 }
225
226 public List getAdminObjects() {
227 return adminObjects;
228 }
229
230 public String getStateName() {
231 return State.toString(state);
232 }
233
234 public int compareTo(Object o) {
235 final JMSResourceSummary pool = (JMSResourceSummary) o;
236 int names = name.toLowerCase().compareTo(pool.name.toLowerCase());
237 if (parentName == null) {
238 if (pool.parentName == null) {
239 return names;
240 } else {
241 return -1;
242 }
243 } else {
244 if (pool.parentName == null) {
245 return 1;
246 } else {
247 int test = parentName.compareTo(pool.parentName);
248 if (test != 0) {
249 return test;
250 } else {
251 return names;
252 }
253 }
254 }
255 }
256 }
257
258 public static class ConnectionFactorySummary implements Serializable, Comparable {
259 private static final long serialVersionUID = 5777507920880039759L;
260 private final String factoryObjectName;
261 private final String name;
262 private final int state;
263
264 public ConnectionFactorySummary(String factoryObjectName, String name, int state) {
265 this.factoryObjectName = factoryObjectName;
266 this.name = name;
267 this.state = state;
268 }
269
270 public String getFactoryObjectName() {
271 return factoryObjectName;
272 }
273
274 public String getName() {
275 return name;
276 }
277
278 public int getState() {
279 return state;
280 }
281
282 public String getStateName() {
283 return State.toString(state);
284 }
285
286 public int compareTo(Object o) {
287 final ConnectionFactorySummary pool = (ConnectionFactorySummary) o;
288 return name.compareTo(pool.name);
289 }
290 }
291
292
293 public static class AdminObjectSummary implements Serializable, Comparable {
294 private static final long serialVersionUID = 3941332145785485903L;
295 private final String adminObjectName;
296 private final String name;
297 private final String type;
298 private final int state;
299
300 public AdminObjectSummary(String adminObjectName, String name, String type, int state) {
301 this.adminObjectName = adminObjectName;
302 this.name = name;
303 this.type = type;
304 this.state = state;
305 }
306
307 public String getAdminObjectName() {
308 return adminObjectName;
309 }
310
311 public String getName() {
312 return name;
313 }
314
315 public String getType() {
316 return type;
317 }
318
319 public int getState() {
320 return state;
321 }
322
323 public String getStateName() {
324 return State.toString(state);
325 }
326
327 public int compareTo(Object o) {
328 final AdminObjectSummary pool = (AdminObjectSummary) o;
329 int result = name.compareTo(pool.name);
330 return result == 0 ? type.compareTo(pool.type) : result;
331 }
332 }
333 }