/**
*
* Copyright 2003-2004 The Apache Software Foundation
*
* 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.util;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.geronimo.deployment.plugin.factories.DeploymentFactoryImpl;
import org.apache.geronimo.kernel.Kernel;
import org.apache.geronimo.kernel.KernelRegistry;
import org.apache.geronimo.kernel.proxy.GeronimoManagedBean;
import org.apache.geronimo.kernel.repository.ListableRepository;
import org.apache.geronimo.kernel.repository.Repository;
import org.apache.geronimo.kernel.repository.WriteableRepository;
import org.apache.geronimo.management.J2EEDomain;
import org.apache.geronimo.management.ResourceAdapter;
import org.apache.geronimo.management.geronimo.*;
import org.apache.geronimo.pool.GeronimoExecutor;
import org.apache.geronimo.security.realm.SecurityRealm;
import org.apache.geronimo.system.logging.SystemLog;
import org.apache.geronimo.system.serverinfo.ServerInfo;
import javax.enterprise.deploy.spi.DeploymentManager;
import javax.enterprise.deploy.spi.exceptions.DeploymentManagerCreationException;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.portlet.PortletRequest;
import javax.portlet.PortletSession;
import javax.portlet.RenderResponse;
import javax.security.auth.Subject;
import javax.security.auth.login.LoginException;
import javax.security.auth.spi.LoginModule;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpServletRequest;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.net.URI;
import java.net.URL;
import java.net.URISyntaxException;
import java.net.MalformedURLException;
/**
* @version $Rev$ $Date$
*/
public class PortletManager {
private final static Log log = LogFactory.getLog(PortletManager.class);
// The following are currently static due to having only one server/JVM/etc. per Geronimo
private final static String HELPER_KEY = "org.apache.geronimo.console.ManagementHelper";
private final static String DOMAIN_KEY = "org.apache.geronimo.console.J2EEDomain";
private final static String SERVER_KEY = "org.apache.geronimo.console.J2EEServer";
private final static String JVM_KEY = "org.apache.geronimo.console.JVM";
private final static String SYSTEM_LOG_KEY = "org.apache.geronimo.console.SystemLog";
// The following may change based on the user's selections
// nothing yet
private static ManagementHelper createHelper() {
//todo: consider making this configurable; we could easily connect to a remote kernel if we wanted to
Kernel kernel = null;
try {
kernel = (Kernel) new InitialContext().lookup("java:comp/GeronimoKernel");
} catch (NamingException e) {
// log.error("Unable to look up kernel in JNDI", e);
}
if(kernel == null) {
log.debug("Unable to find kernel in JNDI; using KernelRegistry instead");
kernel = KernelRegistry.getSingleKernel();
}
return new KernelManagementHelper(kernel);
}
public static DeploymentManager getDeploymentManager(PortletRequest request) {
DeploymentFactoryImpl factory = new DeploymentFactoryImpl();
try {
return factory.getDeploymentManager("deployer:geronimo:inVM", null, null);
} catch (DeploymentManagerCreationException e) {
e.printStackTrace();
return null;
}
}
public static ManagementHelper getManagementHelper(PortletRequest request) {
ManagementHelper helper = (ManagementHelper) request.getPortletSession(true).getAttribute(HELPER_KEY, PortletSession.APPLICATION_SCOPE);
if(helper == null) {
helper = createHelper();
request.getPortletSession().setAttribute(HELPER_KEY, helper, PortletSession.APPLICATION_SCOPE);
}
return helper;
}
public static ManagementHelper getManagementHelper(HttpSession session) {
ManagementHelper helper = (ManagementHelper) session.getAttribute(HELPER_KEY);
if(helper == null) {
helper = createHelper();
session.setAttribute(HELPER_KEY, helper);
}
return helper;
}
public static J2EEDomain getCurrentDomain(PortletRequest request) {
J2EEDomain domain = (J2EEDomain) request.getPortletSession(true).getAttribute(DOMAIN_KEY, PortletSession.APPLICATION_SCOPE);
if(domain == null) {
domain = getManagementHelper(request).getDomains()[0]; //todo: some day, select a domain
request.getPortletSession().setAttribute(DOMAIN_KEY, domain, PortletSession.APPLICATION_SCOPE);
}
return domain;
}
public static J2EEServer getCurrentServer(PortletRequest request) {
J2EEServer server = (J2EEServer) request.getPortletSession(true).getAttribute(SERVER_KEY, PortletSession.APPLICATION_SCOPE);
if(server == null) {
ManagementHelper helper = getManagementHelper(request);
server = helper.getServers(getCurrentDomain(request))[0]; //todo: some day, select a server from the domain
request.getPortletSession().setAttribute(SERVER_KEY, server, PortletSession.APPLICATION_SCOPE);
}
else {
// to do handle "should not occur" error - message?
}
return server;
}
public static JVM getCurrentJVM(PortletRequest request) {
JVM jvm = (JVM) request.getPortletSession(true).getAttribute(JVM_KEY, PortletSession.APPLICATION_SCOPE);
if(jvm == null) {
ManagementHelper helper = getManagementHelper(request);
jvm = helper.getJavaVMs(getCurrentServer(request))[0]; //todo: some day, select a JVM from the server
request.getPortletSession().setAttribute(JVM_KEY, jvm, PortletSession.APPLICATION_SCOPE);
}
return jvm;
}
public static Repository[] getRepositories(PortletRequest request) {
ManagementHelper helper = getManagementHelper(request);
return helper.getRepositories(getCurrentServer(request));
}
public static SecurityRealm[] getSecurityRealms(PortletRequest request) {
ManagementHelper helper = getManagementHelper(request);
return helper.getSecurityRealms(getCurrentServer(request));
}
public static ServerInfo getServerInfo(PortletRequest request) {
ManagementHelper helper = getManagementHelper(request);
return helper.getServerInfo(getCurrentServer(request));
}
public static void testLoginModule(PortletRequest request, LoginModule module, Map options) {
ManagementHelper helper = getManagementHelper(request);
helper.testLoginModule(getCurrentServer(request), module, options);
}
public static Subject testLoginModule(PortletRequest request, LoginModule module, Map options, String username, String password) throws LoginException {
ManagementHelper helper = getManagementHelper(request);
return helper.testLoginModule(getCurrentServer(request), module, options, username, password);
}
public static ListableRepository[] getListableRepositories(PortletRequest request) {
ManagementHelper helper = getManagementHelper(request);
Repository[] list = helper.getRepositories(getCurrentServer(request));
List result = new ArrayList();
for (int i = 0; i < list.length; i++) {
Repository repository = list[i];
if(repository instanceof ListableRepository) {
result.add(repository);
}
}
return (ListableRepository[]) result.toArray(new ListableRepository[result.size()]);
}
public static WriteableRepository[] getWritableRepositories(PortletRequest request) {
ManagementHelper helper = getManagementHelper(request);
Repository[] list = helper.getRepositories(getCurrentServer(request));
List result = new ArrayList();
for (int i = 0; i < list.length; i++) {
Repository repository = list[i];
if(repository instanceof WriteableRepository) {
result.add(repository);
}
}
return (WriteableRepository[]) result.toArray(new WriteableRepository[result.size()]);
}
public static ResourceAdapterModule[] getOutboundRAModules(PortletRequest request, String iface) {
ManagementHelper helper = getManagementHelper(request);
return helper.getOutboundRAModules(getCurrentServer(request), iface);
}
public static ResourceAdapterModule[] getOutboundRAModules(PortletRequest request, String[] iface) {
ManagementHelper helper = getManagementHelper(request);
return helper.getOutboundRAModules(getCurrentServer(request), iface);
}
public static ResourceAdapterModule[] getAdminObjectModules(PortletRequest request, String[] ifaces) {
ManagementHelper helper = getManagementHelper(request);
return helper.getAdminObjectModules(getCurrentServer(request), ifaces);
}
public static JCAManagedConnectionFactory[] getOutboundFactoriesOfType(PortletRequest request, String iface) {
ManagementHelper helper = getManagementHelper(request);
return helper.getOutboundFactories(getCurrentServer(request), iface);
}
public static JCAManagedConnectionFactory[] getOutboundFactoriesForRA(PortletRequest request, String resourceAdapterModuleName) {
ManagementHelper helper = getManagementHelper(request);
return helper.getOutboundFactories((ResourceAdapterModule)helper.getObject(resourceAdapterModuleName));
}
public static JCAManagedConnectionFactory[] getOutboundFactoriesForRA(PortletRequest request, String resourceAdapterModuleName, String iface) {
ManagementHelper helper = getManagementHelper(request);
return helper.getOutboundFactories((ResourceAdapterModule)helper.getObject(resourceAdapterModuleName), iface);
}
public static JCAManagedConnectionFactory[] getOutboundFactoriesForRA(PortletRequest request, ResourceAdapterModule module) {
ManagementHelper helper = getManagementHelper(request);
return helper.getOutboundFactories(module);
}
public static JCAManagedConnectionFactory[] getOutboundFactoriesForRA(PortletRequest request, ResourceAdapterModule module, String iface) {
ManagementHelper helper = getManagementHelper(request);
return helper.getOutboundFactories(module, iface);
}
public static JCAManagedConnectionFactory[] getOutboundFactoriesForRA(PortletRequest request, ResourceAdapterModule module, String[] iface) {
ManagementHelper helper = getManagementHelper(request);
return helper.getOutboundFactories(module, iface);
}
//todo: Create an interface for admin objects
public static JCAAdminObject[] getAdminObjectsForRA(PortletRequest request, ResourceAdapterModule module, String[] ifaces) {
ManagementHelper helper = getManagementHelper(request);
return helper.getAdminObjects(module, ifaces);
}
public static String[] getWebManagerNames(PortletRequest request) {
return getCurrentServer(request).getWebManagers();
}
public static WebManager[] getWebManagers(PortletRequest request) {
ManagementHelper helper = getManagementHelper(request);
return helper.getWebManagers(getCurrentServer(request));
}
public static WebManager getWebManager(PortletRequest request, String managerObjectName) {
ManagementHelper helper = getManagementHelper(request);
return (WebManager) helper.getObject(managerObjectName);
}
public static String[] getWebContainerNames(PortletRequest request, String managerObjectName) {
ManagementHelper helper = getManagementHelper(request);
WebManager manager = (WebManager) helper.getObject(managerObjectName);
return manager.getContainers();
}
public static WebAccessLog getWebAccessLog(PortletRequest request, String managerObjectName, String containerObjectName) {
ManagementHelper helper = getManagementHelper(request);
WebManager manager = (WebManager) helper.getObject(managerObjectName);
return helper.getWebAccessLog(manager, containerObjectName);
}
public static WebContainer getWebContainer(PortletRequest request, String containerObjectName) {
ManagementHelper helper = getManagementHelper(request);
return (WebContainer) helper.getObject(containerObjectName);
}
public static WebConnector createWebConnector(PortletRequest request, String managerObjectName, String containerObjectName, String name, String protocol, String host, int port) {
ManagementHelper helper = getManagementHelper(request);
WebManager manager = (WebManager) helper.getObject(managerObjectName);
String objectName = manager.addConnector(containerObjectName, name, protocol, host, port);
return (WebConnector)helper.getObject(objectName);
}
public static WebConnector[] getWebConnectors(PortletRequest request, String managerObjectName) {
ManagementHelper helper = getManagementHelper(request);
WebManager manager = (WebManager) helper.getObject(managerObjectName);
return helper.getWebConnectors(manager);
}
public static WebConnector[] getWebConnectors(PortletRequest request, String managerObjectName, String protocol) {
ManagementHelper helper = getManagementHelper(request);
WebManager manager = (WebManager) helper.getObject(managerObjectName);
return helper.getWebConnectors(manager, protocol);
}
public static WebConnector[] getWebConnectorsForContainer(PortletRequest request, String managerObjectName, String containerObjectName) {
ManagementHelper helper = getManagementHelper(request);
WebManager manager = (WebManager) helper.getObject(managerObjectName);
return helper.getWebConnectorsForContainer(manager, containerObjectName);
}
public static WebConnector[] getWebConnectorsForContainer(PortletRequest request, String managerObjectName, String containerObjectName, String protocol) {
ManagementHelper helper = getManagementHelper(request);
WebManager manager = (WebManager) helper.getObject(managerObjectName);
return helper.getWebConnectorsForContainer(manager, containerObjectName, protocol);
}
public static EJBManager[] getEJBManagers(PortletRequest request) {
ManagementHelper helper = getManagementHelper(request);
return helper.getEJBManagers(getCurrentServer(request));
}
public static EJBManager getEJBManager(PortletRequest request, String managerObjectName) {
ManagementHelper helper = getManagementHelper(request);
return (EJBManager) helper.getObject(managerObjectName);
}
public static String[] getJMSManagerNames(PortletRequest request) {
return getCurrentServer(request).getJMSManagers();
}
public static JMSManager getJMSManager(PortletRequest request, String managerObjectName) {
ManagementHelper helper = getManagementHelper(request);
return (JMSManager) helper.getObject(managerObjectName);
}
public static String[] getJMSBrokerNames(PortletRequest request, String managerObjectName) {
ManagementHelper helper = getManagementHelper(request);
JMSManager manager = (JMSManager) helper.getObject(managerObjectName);
return manager.getContainers();
}
public static JMSBroker getJMSBroker(PortletRequest request, String brokerObjectName) {
ManagementHelper helper = getManagementHelper(request);
return (JMSBroker) helper.getObject(brokerObjectName);
}
public static JMSConnector createJMSConnector(PortletRequest request, String managerObjectName, String containerObjectName, String name, String protocol, String host, int port) {
ManagementHelper helper = getManagementHelper(request);
JMSManager manager = (JMSManager) helper.getObject(managerObjectName);
String objectName = manager.addConnector(containerObjectName, name, protocol, host, port);
return (JMSConnector)helper.getObject(objectName);
}
public static JMSConnector[] getJMSConnectors(PortletRequest request, String managerObjectName) {
ManagementHelper helper = getManagementHelper(request);
JMSManager manager = (JMSManager) helper.getObject(managerObjectName);
return helper.getJMSConnectors(manager);
}
public static JMSConnector[] getJMSConnectors(PortletRequest request, String managerObjectName, String protocol) {
ManagementHelper helper = getManagementHelper(request);
JMSManager manager = (JMSManager) helper.getObject(managerObjectName);
return helper.getJMSConnectors(manager, protocol);
}
public static JMSConnector[] getJMSConnectorsForContainer(PortletRequest request, String managerObjectName, String brokerObjectName) {
ManagementHelper helper = getManagementHelper(request);
JMSManager manager = (JMSManager) helper.getObject(managerObjectName);
return helper.getJMSConnectorsForContainer(manager, brokerObjectName);
}
public static JMSConnector[] getJMSConnectorsForContainer(PortletRequest request, String managerObjectName, String brokerObjectName, String protocol) {
ManagementHelper helper = getManagementHelper(request);
JMSManager manager = (JMSManager) helper.getObject(managerObjectName);
return helper.getJMSConnectorsForContainer(manager, brokerObjectName, protocol);
}
public static ResourceAdapter[] getResourceAdapters(PortletRequest request, ResourceAdapterModule module) {
ManagementHelper helper = getManagementHelper(request);
return helper.getResourceAdapters(module);
}
public static JCAResource[] getJCAResources(PortletRequest request, ResourceAdapter adapter) {
ManagementHelper helper = getManagementHelper(request);
return helper.getRAResources(adapter);
}
public static GeronimoExecutor[] getThreadPools(PortletRequest request) {
ManagementHelper helper = getManagementHelper(request);
return helper.getThreadPools(getCurrentServer(request));
}
public static String getGBeanDescription(PortletRequest request, String objectName) {
ManagementHelper helper = getManagementHelper(request);
return helper.getGBeanDescription(objectName);
}
public static SystemLog getCurrentSystemLog(PortletRequest request) {
SystemLog log = (SystemLog) request.getPortletSession(true).getAttribute(SYSTEM_LOG_KEY, PortletSession.APPLICATION_SCOPE);
if(log == null) {
ManagementHelper helper = getManagementHelper(request);
log = helper.getSystemLog(getCurrentJVM(request));
request.getPortletSession().setAttribute(SYSTEM_LOG_KEY, log, PortletSession.APPLICATION_SCOPE);
}
return log;
}
public static GeronimoManagedBean[] getManagedBeans(PortletRequest request, Class intrface) {
ManagementHelper helper = getManagementHelper(request);
Object[] obs = helper.findByInterface(intrface);
GeronimoManagedBean[] results = new GeronimoManagedBean[obs.length];
for (int i = 0; i < results.length; i++) {
results[i] = (GeronimoManagedBean) obs[i];
}
return results;
}
public static GeronimoManagedBean getManagedBean(PortletRequest request, String name) {
ManagementHelper helper = getManagementHelper(request);
return (GeronimoManagedBean) helper.getObject(name);
}
public static URI getConfigurationFor(PortletRequest request, String objectName) {
ManagementHelper helper = getManagementHelper(request);
return helper.getConfigurationNameFor(objectName);
}
public static URL getRepositoryEntry(PortletRequest request, String repositoryURI) {
try {
Repository[] repos = getRepositories(request);
URI uri = new URI(repositoryURI);
for (int i = 0; i < repos.length; i++) {
Repository repo = repos[i];
if(repo.hasURI(uri)) {
return repo.getURL(uri);
}
}
} catch (URISyntaxException e) {
log.error("Unable to access repository entry '"+repositoryURI+"'", e);
} catch (MalformedURLException e) {
log.error("Unable to access repository entry '"+repositoryURI+"'", e);
}
return null;
}
/**
* Looks up the context prefix used by the portal, even if the thing running
* is in one of the portlets. We're kind of hacking our way there, but hey,
* it beats hardcoding.
*/
public static String getConsoleFrameworkServletPath (HttpServletRequest request) {
String contextPath = "";
Object o = request.getAttribute("javax.portlet.response");
if (o!=null && o instanceof RenderResponse) { // request came from a portlet
RenderResponse renderResponse = (RenderResponse)o;
contextPath = renderResponse.createRenderURL().toString();
int index = contextPath.indexOf(request.getPathInfo());
contextPath = contextPath.substring(0,index);
} else { // request did not come from a portlet
contextPath = request.getContextPath();
}
return contextPath;
}
}