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