package org.jolokia.detector; /* * Copyright 2009-2013 Roland Huss * * 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. */ import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.Map; import java.util.Set; import java.util.regex.Matcher; import java.util.regex.Pattern; import javax.management.*; import org.jolokia.backend.executor.MBeanServerExecutor; import org.jolokia.util.ClassUtil; import org.json.simple.JSONObject; /** * Detector for IBM Websphere 6 & 7 & 8 * * @author roland * @since 29.11.10 */ public class WebsphereDetector extends AbstractServerDetector { private static final Pattern SERVER_VERSION_PATTERN = Pattern.compile("^Version\\s+([0-9.]+)\\s*$.*?^Build Date\\s+([0-9/]+)\\s*$", Pattern.MULTILINE | Pattern.DOTALL | Pattern.CASE_INSENSITIVE); public static final String INTERNAL_ERROR_MSG = "Internal: Found AdminServiceFactory but can not call methods on it (wrong WAS version ?)"; // Whether running under Websphere private boolean isWebsphere = ClassUtil.checkForClass("com.ibm.websphere.management.AdminServiceFactory"); private boolean isWebsphere7 = ClassUtil.checkForClass("com.ibm.websphere.management.AdminContext"); private boolean isWebsphere6 = isWebsphere && !isWebsphere7; /** {@inheritDoc} * @param pMBeanServerExecutor*/ public ServerHandle detect(MBeanServerExecutor pMBeanServerExecutor) { String serverVersion = getSingleStringAttribute(pMBeanServerExecutor, "*:j2eeType=J2EEServer,type=Server,*", "serverVersion"); if (serverVersion != null && serverVersion.contains("WebSphere")) { Matcher matcher = SERVER_VERSION_PATTERN.matcher(serverVersion); if (matcher.find()) { String version = matcher.group(1); String date = matcher.group(2); JSONObject extraInfo = new JSONObject(); if (date != null) { extraInfo.put("buildDate",date); } return new WebsphereServerHandle(version, extraInfo.size() > 0 ? extraInfo : null); } return null; } else if (isWebsphere) { return new WebsphereServerHandle(isWebsphere6 ? "6" : "7 or 8", null); } return null; } /** {@inheritDoc} * @param servers*/ @Override public void addMBeanServers(Set<MBeanServerConnection> servers) { try { /* * this.mbeanServer = AdminServiceFactory.getMBeanFactory().getMBeanServer(); */ Class adminServiceClass = ClassUtil.classForName("com.ibm.websphere.management.AdminServiceFactory",getClass().getClassLoader()); if (adminServiceClass != null) { Method getMBeanFactoryMethod = adminServiceClass.getMethod("getMBeanFactory", new Class[0]); Object mbeanFactory = getMBeanFactoryMethod.invoke(null); if (mbeanFactory != null) { Method getMBeanServerMethod = mbeanFactory.getClass().getMethod("getMBeanServer", new Class[0]); servers.add((MBeanServer) getMBeanServerMethod.invoke(mbeanFactory)); } } } catch (InvocationTargetException ex) { // CNFE should be earlier throw new IllegalArgumentException(INTERNAL_ERROR_MSG,ex); } catch (IllegalAccessException ex) { throw new IllegalArgumentException(INTERNAL_ERROR_MSG,ex); } catch (NoSuchMethodException ex) { throw new IllegalArgumentException(INTERNAL_ERROR_MSG,ex); } } // ================================================================================== /** * Server handle for Websphere platforms */ class WebsphereServerHandle extends ServerHandle { /** {@inheritDoc} */ public WebsphereServerHandle(String pVersion, Map<String, String> pExtrainfo) { super("IBM","websphere", pVersion, pExtrainfo); } /** {@inheritDoc} */ @Override public ObjectName registerMBeanAtServer(MBeanServer pServer, Object pMBean, String pName) throws MBeanRegistrationException, InstanceAlreadyExistsException, NotCompliantMBeanException, MalformedObjectNameException { // Websphere adds extra parts to the object name if registered explicitly, but // we need a defined name on the client side. So we register it with 'null' in websphere // and let the bean define its name. if (isWebsphere6 && pMBean instanceof MBeanRegistration) { return pServer.registerMBean(pMBean,null).getObjectName(); } else { return super.registerMBeanAtServer(pServer, pMBean, pName); } } } }