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.util;
018
019 import java.io.File;
020 import java.util.Map;
021
022 import javax.naming.InitialContext;
023 import javax.naming.NamingException;
024 import javax.portlet.PortletRequest;
025 import javax.portlet.PortletSession;
026 import javax.security.auth.Subject;
027 import javax.security.auth.login.LoginException;
028 import javax.security.auth.spi.LoginModule;
029 import javax.servlet.http.HttpSession;
030
031 import org.apache.commons.logging.Log;
032 import org.apache.commons.logging.LogFactory;
033 import org.apache.geronimo.gbean.AbstractName;
034 import org.apache.geronimo.gbean.GBeanData;
035 import org.apache.geronimo.kernel.Kernel;
036 import org.apache.geronimo.kernel.KernelRegistry;
037 import org.apache.geronimo.kernel.config.ConfigurationManager;
038 import org.apache.geronimo.kernel.config.ConfigurationModuleType;
039 import org.apache.geronimo.kernel.config.ConfigurationUtil;
040 import org.apache.geronimo.kernel.proxy.GeronimoManagedBean;
041 import org.apache.geronimo.kernel.repository.Artifact;
042 import org.apache.geronimo.kernel.repository.Repository;
043 import org.apache.geronimo.management.J2EEDeployedObject;
044 import org.apache.geronimo.management.geronimo.J2EEDomain;
045 import org.apache.geronimo.management.geronimo.J2EEServer;
046 import org.apache.geronimo.management.geronimo.JCAAdminObject;
047 import org.apache.geronimo.management.geronimo.JCAManagedConnectionFactory;
048 import org.apache.geronimo.management.geronimo.JCAResource;
049 import org.apache.geronimo.management.geronimo.JMSBroker;
050 import org.apache.geronimo.management.geronimo.JMSConnector;
051 import org.apache.geronimo.management.geronimo.JMSManager;
052 import org.apache.geronimo.management.geronimo.JVM;
053 import org.apache.geronimo.management.geronimo.NetworkConnector;
054 import org.apache.geronimo.management.geronimo.ResourceAdapter;
055 import org.apache.geronimo.management.geronimo.ResourceAdapterModule;
056 import org.apache.geronimo.management.geronimo.WebAccessLog;
057 import org.apache.geronimo.management.geronimo.WebContainer;
058 import org.apache.geronimo.management.geronimo.WebManager;
059 import org.apache.geronimo.system.logging.SystemLog;
060
061 /**
062 * @version $Rev: 706640 $ $Date: 2008-10-21 14:44:05 +0000 (Tue, 21 Oct 2008) $
063 */
064 public class PortletManager {
065 private final static Log log = LogFactory.getLog(PortletManager.class);
066 // The following are currently static due to having only one server/JVM/etc. per Geronimo
067 private final static String HELPER_KEY = "org.apache.geronimo.console.ManagementHelper";
068 private final static String DOMAIN_KEY = "org.apache.geronimo.console.J2EEDomain";
069 private final static String SERVER_KEY = "org.apache.geronimo.console.J2EEServer";
070 private final static String JVM_KEY = "org.apache.geronimo.console.JVM";
071 private final static String SYSTEM_LOG_KEY = "org.apache.geronimo.console.SystemLog";
072 // The following may change based on the user's selections
073 // nothing yet
074
075 private static ManagementHelper createHelper() {
076 Kernel kernel = getKernel();
077 return new KernelManagementHelper(kernel);
078 }
079
080 public static Kernel getKernel() {
081 //todo: consider making this configurable; we could easily connect to a remote kernel if we wanted to
082 Kernel kernel = null;
083 try {
084 kernel = (Kernel) new InitialContext().lookup("java:comp/GeronimoKernel");
085 } catch (NamingException e) {
086 // log.error("Unable to look up kernel in JNDI", e);
087 }
088 if (kernel == null) {
089 log.debug("Unable to find kernel in JNDI; using KernelRegistry instead");
090 kernel = KernelRegistry.getSingleKernel();
091 }
092 return kernel;
093 }
094
095 public static ConfigurationManager getConfigurationManager() {
096 return ConfigurationUtil.getConfigurationManager(getKernel());
097 }
098
099 public static ManagementHelper getManagementHelper(PortletRequest request) {
100 ManagementHelper helper = (ManagementHelper) request.getPortletSession(true).getAttribute(HELPER_KEY, PortletSession.APPLICATION_SCOPE);
101 if (helper == null) {
102 helper = createHelper();
103 request.getPortletSession().setAttribute(HELPER_KEY, helper, PortletSession.APPLICATION_SCOPE);
104 }
105 return helper;
106 }
107
108 public static ManagementHelper getManagementHelper(HttpSession session) {
109 ManagementHelper helper = (ManagementHelper) session.getAttribute(HELPER_KEY);
110 if (helper == null) {
111 helper = createHelper();
112 session.setAttribute(HELPER_KEY, helper);
113 }
114 return helper;
115 }
116
117 public static J2EEDomain getCurrentDomain(PortletRequest request) {
118 J2EEDomain domain = (J2EEDomain) request.getPortletSession(true).getAttribute(DOMAIN_KEY, PortletSession.APPLICATION_SCOPE);
119 if (domain == null) {
120 domain = getManagementHelper(request).getDomains()[0]; //todo: some day, select a domain
121 request.getPortletSession().setAttribute(DOMAIN_KEY, domain, PortletSession.APPLICATION_SCOPE);
122 }
123 return domain;
124
125 }
126
127 public static J2EEServer getCurrentServer(PortletRequest request) {
128 J2EEServer server = (J2EEServer) request.getPortletSession(true).getAttribute(SERVER_KEY, PortletSession.APPLICATION_SCOPE);
129 if (server == null) {
130 server = getCurrentDomain(request).getServerInstances()[0]; //todo: some day, select a server from the domain
131 request.getPortletSession().setAttribute(SERVER_KEY, server, PortletSession.APPLICATION_SCOPE);
132 } else {
133 // to do handle "should not occur" error - message?
134 }
135 return server;
136 }
137
138 public static JVM getCurrentJVM(PortletRequest request) {
139 JVM jvm = (JVM) request.getPortletSession(true).getAttribute(JVM_KEY, PortletSession.APPLICATION_SCOPE);
140 if (jvm == null) {
141 ManagementHelper helper = getManagementHelper(request);
142 jvm = helper.getJavaVMs(getCurrentServer(request))[0]; //todo: some day, select a JVM from the server
143 request.getPortletSession().setAttribute(JVM_KEY, jvm, PortletSession.APPLICATION_SCOPE);
144 }
145 return jvm;
146 }
147
148 public static void testLoginModule(PortletRequest request, LoginModule module, Map options) {
149 ManagementHelper helper = getManagementHelper(request);
150 helper.testLoginModule(getCurrentServer(request), module, options);
151 }
152
153 public static Subject testLoginModule(PortletRequest request, LoginModule module, Map options, String username, String password) throws LoginException {
154 ManagementHelper helper = getManagementHelper(request);
155 return helper.testLoginModule(getCurrentServer(request), module, options, username, password);
156 }
157
158 public static ResourceAdapterModule[] getOutboundRAModules(PortletRequest request, String iface) {
159 ManagementHelper helper = getManagementHelper(request);
160 return helper.getOutboundRAModules(getCurrentServer(request), iface);
161 }
162
163 public static ResourceAdapterModule[] getOutboundRAModules(PortletRequest request, String[] iface) {
164 ManagementHelper helper = getManagementHelper(request);
165 return helper.getOutboundRAModules(getCurrentServer(request), iface);
166 }
167
168 public static ResourceAdapterModule[] getAdminObjectModules(PortletRequest request, String[] ifaces) {
169 ManagementHelper helper = getManagementHelper(request);
170 return helper.getAdminObjectModules(getCurrentServer(request), ifaces);
171 }
172
173 public static JCAManagedConnectionFactory[] getOutboundFactoriesOfType(PortletRequest request, String iface) {
174 ManagementHelper helper = getManagementHelper(request);
175 return helper.getOutboundFactories(getCurrentServer(request), iface);
176 }
177
178 public static JCAManagedConnectionFactory[] getOutboundFactoriesForRA(PortletRequest request, AbstractName resourceAdapterModuleName) {
179 ManagementHelper helper = getManagementHelper(request);
180 return helper.getOutboundFactories((ResourceAdapterModule) helper.getObject(resourceAdapterModuleName));
181 }
182
183 public static JCAManagedConnectionFactory[] getOutboundFactoriesForRA(PortletRequest request, AbstractName resourceAdapterModuleName, String iface) {
184 ManagementHelper helper = getManagementHelper(request);
185 return helper.getOutboundFactories((ResourceAdapterModule) helper.getObject(resourceAdapterModuleName), iface);
186 }
187
188 public static JCAManagedConnectionFactory[] getOutboundFactoriesForRA(PortletRequest request, ResourceAdapterModule module) {
189 ManagementHelper helper = getManagementHelper(request);
190 return helper.getOutboundFactories(module);
191 }
192
193 public static JCAManagedConnectionFactory[] getOutboundFactoriesForRA(PortletRequest request, ResourceAdapterModule module, String iface) {
194 ManagementHelper helper = getManagementHelper(request);
195 return helper.getOutboundFactories(module, iface);
196 }
197
198 public static JCAManagedConnectionFactory[] getOutboundFactoriesForRA(PortletRequest request, ResourceAdapterModule module, String[] iface) {
199 ManagementHelper helper = getManagementHelper(request);
200 return helper.getOutboundFactories(module, iface);
201 }
202
203 //todo: Create an interface for admin objects
204 public static JCAAdminObject[] getAdminObjectsForRA(PortletRequest request, ResourceAdapterModule module, String[] ifaces) {
205 ManagementHelper helper = getManagementHelper(request);
206 return helper.getAdminObjects(module, ifaces);
207 }
208
209 public static WebManager[] getWebManagers(PortletRequest request) {
210 return getCurrentServer(request).getWebManagers();
211 }
212
213 public static WebManager getWebManager(PortletRequest request, AbstractName managerName) {
214 ManagementHelper helper = getManagementHelper(request);
215 return (WebManager) helper.getObject(managerName);
216 }
217
218 // private static String[] namesToStrings(AbstractName[] names) {
219 // String[] result = new String[names.length];
220 // for (int i = 0; i < names.length; i++) {
221 // AbstractName name = names[i];
222 // result[i] = name.toURI().toString();
223 // }
224 // return result;
225 // }
226 //
227
228 public static WebAccessLog getWebAccessLog(PortletRequest request, AbstractName managerName, AbstractName containerName) {
229 ManagementHelper helper = getManagementHelper(request);
230 WebManager manager = (WebManager) helper.getObject(managerName);
231 return manager.getAccessLog((WebContainer) helper.getObject(containerName));
232 }
233
234 public static WebContainer getWebContainer(PortletRequest request, AbstractName containerName) {
235 ManagementHelper helper = getManagementHelper(request);
236 return (WebContainer) helper.getObject(containerName);
237 }
238
239 public static NetworkConnector[] getNetworkConnectors(PortletRequest request, AbstractName managerName) {
240 ManagementHelper helper = getManagementHelper(request);
241 WebManager manager = (WebManager) helper.getObject(managerName);
242 return manager.getConnectors();
243 }
244
245 public static NetworkConnector[] getNetworkConnectors(PortletRequest request, AbstractName managerName, String protocol) {
246 ManagementHelper helper = getManagementHelper(request);
247 WebManager manager = (WebManager) helper.getObject(managerName);
248 return manager.getConnectors(protocol);
249 }
250
251 public static NetworkConnector getNetworkConnector(PortletRequest request, AbstractName connectorName) {
252 ManagementHelper helper = getManagementHelper(request);
253 return (NetworkConnector) helper.getObject(connectorName);
254 }
255
256 public static NetworkConnector[] getNetworkConnectorsForContainer(PortletRequest request, AbstractName managerName, AbstractName containerName, String protocol) {
257 ManagementHelper helper = getManagementHelper(request);
258 WebManager manager = (WebManager) helper.getObject(managerName);
259 return manager.getConnectorsForContainer(containerName, protocol);
260 }
261
262 public static JMSBroker getJMSBroker(PortletRequest request, AbstractName brokerName) {
263 ManagementHelper helper = getManagementHelper(request);
264 return (JMSBroker) helper.getObject(brokerName);
265 }
266
267 public static JMSConnector createJMSConnector(PortletRequest request, JMSManager manager, AbstractName containerName, String name, String protocol, String host, int port) {
268 return manager.addConnector(getJMSBroker(request, containerName), name, protocol, host, port);
269 }
270
271 public static JMSConnector[] getJMSConnectors(PortletRequest request, AbstractName managerName) {
272 ManagementHelper helper = getManagementHelper(request);
273 JMSManager manager = (JMSManager) helper.getObject(managerName);
274 return (JMSConnector[]) manager.getConnectors();
275 }
276
277 public static JMSConnector[] getJMSConnectors(PortletRequest request, AbstractName managerName, String protocol) {
278 ManagementHelper helper = getManagementHelper(request);
279 JMSManager manager = (JMSManager) helper.getObject(managerName);
280 return (JMSConnector[]) manager.getConnectors(protocol);
281 }
282
283 public static JMSConnector[] getJMSConnectorsForContainer(PortletRequest request, AbstractName managerName, AbstractName brokerName) {
284 ManagementHelper helper = getManagementHelper(request);
285 JMSManager manager = (JMSManager) helper.getObject(managerName);
286 return (JMSConnector[]) manager.getConnectorsForContainer(brokerName);
287 }
288
289 public static JMSConnector[] getJMSConnectorsForContainer(PortletRequest request, AbstractName managerName, AbstractName brokerName, String protocol) {
290 ManagementHelper helper = getManagementHelper(request);
291 JMSManager manager = (JMSManager) helper.getObject(managerName);
292 return (JMSConnector[]) manager.getConnectorsForContainer(brokerName, protocol);
293 }
294
295 public static ResourceAdapter[] getResourceAdapters(PortletRequest request, ResourceAdapterModule module) {
296 ManagementHelper helper = getManagementHelper(request);
297 return helper.getResourceAdapters(module);
298 }
299
300 public static JCAResource[] getJCAResources(PortletRequest request, ResourceAdapter adapter) {
301 ManagementHelper helper = getManagementHelper(request);
302 return helper.getRAResources(adapter);
303 }
304
305 public static String getGBeanDescription(PortletRequest request, AbstractName objectName) {
306 ManagementHelper helper = getManagementHelper(request);
307 return helper.getGBeanDescription(objectName);
308 }
309
310 public static SystemLog getCurrentSystemLog(PortletRequest request) {
311 SystemLog log = (SystemLog) request.getPortletSession(true).getAttribute(SYSTEM_LOG_KEY, PortletSession.APPLICATION_SCOPE);
312 if (log == null) {
313 ManagementHelper helper = getManagementHelper(request);
314 log = helper.getSystemLog(getCurrentJVM(request));
315 request.getPortletSession().setAttribute(SYSTEM_LOG_KEY, log, PortletSession.APPLICATION_SCOPE);
316 }
317 return log;
318 }
319
320 public static GeronimoManagedBean[] getManagedBeans(PortletRequest request, Class intrface) {
321 ManagementHelper helper = getManagementHelper(request);
322 Object[] obs = helper.findByInterface(intrface);
323 GeronimoManagedBean[] results = new GeronimoManagedBean[obs.length];
324 for (int i = 0; i < results.length; i++) {
325 results[i] = (GeronimoManagedBean) obs[i];
326 }
327 return results;
328 }
329
330 public static GeronimoManagedBean getManagedBean(PortletRequest request, AbstractName name) {
331 ManagementHelper helper = getManagementHelper(request);
332 return (GeronimoManagedBean) helper.getObject(name);
333 }
334
335 public static Artifact getConfigurationFor(PortletRequest request, AbstractName objectName) {
336 ManagementHelper helper = getManagementHelper(request);
337 return helper.getConfigurationNameFor(objectName);
338 }
339
340 public static AbstractName getNameFor(PortletRequest request, Object component) {
341 ManagementHelper helper = getManagementHelper(request);
342 return helper.getNameFor(component);
343 }
344
345 public static File getRepositoryEntry(PortletRequest request, String repositoryURI) {
346 J2EEServer server = getCurrentServer(request);
347 Repository[] repos = server.getRepositories();
348 Artifact uri = Artifact.create(repositoryURI);
349 if (!uri.isResolved()) {
350 Artifact[] all = server.getConfigurationManager().getArtifactResolver().queryArtifacts(uri);
351 if (all.length == 0) {
352 return null;
353 } else {
354 uri = all[all.length - 1];
355 }
356 }
357 for (int i = 0; i < repos.length; i++) {
358 Repository repo = repos[i];
359 if (repo.contains(uri)) {
360 return repo.getLocation(uri);
361 }
362 }
363 return null;
364 }
365
366 public static J2EEDeployedObject getModule(PortletRequest request, Artifact configuration) {
367 ManagementHelper helper = getManagementHelper(request);
368 return helper.getModuleForConfiguration(configuration);
369 }
370
371 public static ConfigurationData[] getConfigurations(PortletRequest request, ConfigurationModuleType type, boolean includeChildModules) {
372 ManagementHelper helper = getManagementHelper(request);
373 return helper.getConfigurations(type, includeChildModules);
374 }
375
376 public static Object[] getGBeansImplementing(PortletRequest request, Class iface) {
377 ManagementHelper helper = getManagementHelper(request);
378 return helper.getGBeansImplementing(iface);
379 }
380
381 /**
382 * This methods adds a GBean to an existing configuration.
383 * @param request PortletRequest object to get hold of ManagementHelper
384 * @param configID The configuration to add the GBean to.
385 * @param gbean The data representing the GBean to add.
386 * @param start If true, the GBean should be started as part of this call.
387 */
388 public static void addGBeanToConfiguration(PortletRequest request, Artifact configID, GBeanData gbean, boolean start) {
389 ManagementHelper helper = getManagementHelper(request);
390 helper.addGBeanToConfiguration(configID, gbean, start);
391 }
392
393 }