alvinalexander.com | career | drupal | java | mac | mysql | perl | scala | uml | unix  

Glassfish example source code file (AMXTestBase.java)

This example Glassfish source code file (AMXTestBase.java) is included in the DevDaily.com "Java Source Code Warehouse" project. The intent of this project is to help you "Learn Java by Example" TM.

Java - Glassfish tags/keywords

amx, class, configconfig, exception, exception, io, management, map, modulemonitoringlevelsconfig, objectname, objectname, reflection, set, set, string, string, t, util

The Glassfish AMXTestBase.java source code

/*
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
 *
 * Copyright (c) 1997-2010 Oracle and/or its affiliates. All rights reserved.
 *
 * The contents of this file are subject to the terms of either the GNU
 * General Public License Version 2 only ("GPL") or the Common Development
 * and Distribution License("CDDL") (collectively, the "License").  You
 * may not use this file except in compliance with the License.  You can
 * obtain a copy of the License at
 * https://glassfish.dev.java.net/public/CDDL+GPL_1_1.html
 * or packager/legal/LICENSE.txt.  See the License for the specific
 * language governing permissions and limitations under the License.
 *
 * When distributing the software, include this License Header Notice in each
 * file and include the License file at packager/legal/LICENSE.txt.
 *
 * GPL Classpath Exception:
 * Oracle designates this particular file as subject to the "Classpath"
 * exception as provided by Oracle in the GPL Version 2 section of the License
 * file that accompanied this code.
 *
 * Modifications:
 * If applicable, add the following below the License Header, with the fields
 * enclosed by brackets [] replaced by your own identifying information:
 * "Portions Copyright [year] [name of copyright owner]"
 *
 * Contributor(s):
 * If you wish your version of this file to be governed by only the CDDL or
 * only the GPL Version 2, indicate your decision by adding "[Contributor]
 * elects to include this software in this distribution under the [CDDL or GPL
 * Version 2] license."  If you don't indicate a single choice of license, a
 * recipient has the option to distribute your version of this file under
 * either the CDDL, the GPL Version 2 or to extend the choice of license to
 * its licensees as provided above.  However, if you add GPL Version 2 code
 * and therefore, elected the GPL Version 2 license, then the option applies
 * only if the new code is made subject to such option by the copyright
 * holder.
 */

package org.glassfish.admin.amxtest;

import com.sun.appserv.management.DomainRoot;
import com.sun.appserv.management.base.AMX;
import com.sun.appserv.management.base.BulkAccess;
import com.sun.appserv.management.base.NotificationServiceMgr;
import com.sun.appserv.management.base.QueryMgr;
import com.sun.appserv.management.base.SystemInfo;
import com.sun.appserv.management.base.Util;
import com.sun.appserv.management.base.XTypes;
import com.sun.appserv.management.client.AppserverConnectionSource;
import com.sun.appserv.management.client.ConnectionSource;
import com.sun.appserv.management.client.ProxyFactory;
import com.sun.appserv.management.config.AMXConfig;
import com.sun.appserv.management.config.ConfigConfig;
import com.sun.appserv.management.config.DomainConfig;
import com.sun.appserv.management.config.ModuleMonitoringLevelValues;
import com.sun.appserv.management.config.ModuleMonitoringLevelsConfig;
import com.sun.appserv.management.config.NodeAgentConfig;
import com.sun.appserv.management.config.ServerConfig;
import com.sun.appserv.management.config.ServersConfig;
import com.sun.appserv.management.j2ee.J2EEDomain;
import com.sun.appserv.management.util.jmx.JMXUtil;
import com.sun.appserv.management.util.jmx.MBeanServerConnectionConnectionSource;
import com.sun.appserv.management.util.misc.ClassUtil;
import com.sun.appserv.management.util.misc.ExceptionUtil;
import com.sun.appserv.management.util.misc.GSetUtil;
import com.sun.appserv.management.util.misc.TypeCast;
import com.sun.appserv.management.base.AMXDebugSupportMBean;

import javax.management.MBeanServerConnection;
import javax.management.ObjectName;
import javax.management.Attribute;
import javax.management.AttributeList;
import java.io.IOException;
import java.lang.reflect.Method;
import java.util.Collection;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import java.util.HashMap;

/**
 Base class for testing the AMX API
 */
public class AMXTestBase
        extends JMXTestBase {
    private ConnectionSource mConnectionSource;
    private final DomainRoot mDomainRoot;
    private final ProxyFactory mProxyFactory;
    private final Set<ObjectName> mNotTested;
    private final TestUtil mTestUtil;

    /**
     config name for PE (non-EE) configuration
     */
    protected static final String PE_CONFIG_NAME = "server-config";

    private final static boolean WEB_MODULE_MONITOR_BROKEN = true;

    private static boolean MONITORING_ENABLED = false;

    protected static final String NEWLINE = System.getProperty("line.separator");


    public AMXTestBase() {
        checkConnection(getConnection());

        mNotTested = new HashSet<ObjectName>();
        try {
            mConnectionSource =
                    new MBeanServerConnectionConnectionSource(getConnection());

            mProxyFactory = ProxyFactory.getInstance(mConnectionSource, true);
            mDomainRoot = mProxyFactory.getDomainRoot();
        }
        catch (Exception e) {
            throw new RuntimeException(e.toString(), e);
        }

        mTestUtil = new TestUtil(getDomainRoot());
    }


        protected Map<String, ServerConfig>
    getServerConfigMap( final ServersConfig sc )
    {
        final Map<String,ServerConfig> all = new HashMap();

        all.putAll( sc.getStandaloneServerConfigMap() );
        all.putAll( sc.getClusteredServerConfigMap() );
        return all;
    }

    
    protected Set<AMX>
    getAllAMX() {
        return getTestUtil().getAllAMX();
    }

    protected ModuleMonitoringLevelsConfig
    getModuleMonitoringLevelsConfig(final String configName) {
        final ConfigConfig cc = configName == null ? getConfigConfig() : getConfigConfig(configName);
        assert (cc != null);

        final ModuleMonitoringLevelsConfig mon =
                cc.getMonitoringServiceConfig().getModuleMonitoringLevelsConfig();

        return (mon);
    }

    protected ModuleMonitoringLevelsConfig
    getModuleMonitoringLevelsConfig() {
        return getModuleMonitoringLevelsConfig(null);
    }


   private void changeAllLevels( final ModuleMonitoringLevelsConfig config, final String value )
   {
        final Set<String> names = ModuleMonitoringLevelsConfig.ALL_LEVEL_NAMES;
        
        final AttributeList attrs = new AttributeList();
        for( final String name : names )
        {
            attrs.add( new Attribute( name, value ) );
        }
        try {
            Util.getExtra(config).setAttributes( attrs );
        } catch ( Exception e ) {
           // ignore
        }
   }
   
    /**
     Ensure that monitoring is enabled so that unit tests don't miss anything
     */
    protected synchronized void
    setMonitoring( final String value ) {
        synchronized (AMXTestBase.class) {
            final String[] configNames = getConfigNames();
            for (int i = 0; i < configNames.length; ++i) {
                final ModuleMonitoringLevelsConfig mml =   getModuleMonitoringLevelsConfig(configNames[i] );
                changeAllLevels( mml, value );
            }
        }
    }

    protected void
    turnOffMonitoring() {
        setMonitoring( ModuleMonitoringLevelValues.OFF );
        MONITORING_ENABLED = false;
    }

    protected void
    turnOnMonitoring() {
        setMonitoring( ModuleMonitoringLevelValues.HIGH );
        MONITORING_ENABLED = true;
    }

    private static final Set<String> EXPECTED_REMOTE_INCOMPLETE_TYPES =
            GSetUtil.newUnmodifiableStringSet(XTypes.CALL_FLOW_MONITOR, XTypes.LOGGING);

    protected boolean
    isRemoteIncomplete(final ObjectName objectName) {
        final AMX amx = getProxyFactory().getProxy(objectName, AMX.class);
        final String j2eeType = amx.getJ2EEType();

        final boolean isRemote = !amx.isDAS();

        if (isRemote &&
                !EXPECTED_REMOTE_INCOMPLETE_TYPES.contains(j2eeType)) {
            warning("isRemoteIncomplete: not expecting j2eeType=" + j2eeType +
                    ", has the implementation changed?");
        }

        return isRemote;
    }


    protected boolean
    shouldTest(final ObjectName objectName) {
        boolean shouldTest = !isRemoteIncomplete(objectName);

        return (shouldTest);
    }

    protected void
    waitUnregistered(final ObjectName objectName)
            throws IOException {
        final MBeanServerConnection conn = getConnection();
        if (conn.isRegistered(objectName)) {
            mySleep(100);
        }

        while (conn.isRegistered(objectName)) {
            trace("waitUnregistered: " + objectName);
            mySleep(100);
        }
    }


    /**
     Because proxies are cleaned up asynchronously, it's possible for one
     to remain in the factory until the factory processes the Notification
     that it's MBean has been unregistered.
     */
    protected void
    waitProxyGone(
            final ProxyFactory factory,
            final ObjectName objectName) {
        long millis = 1;

        while (factory.getProxy(objectName, AMX.class, false) != null) {
            mySleep(millis);
            millis *= 2;
            trace("waitProxyGone: waiting for proxy to disappear: " + objectName);
        }
    }

    protected final void
    notTested(final ObjectName objectName) {
        if (isRemoteIncomplete(objectName)) {
            trace("remoteIncomplete (this is OK): " + objectName);
        } else {
            mNotTested.add(objectName);
        }
    }

    protected final Set<ObjectName>
    getNotTestedSet() {
        return (mNotTested);
    }

    public static void
    mySleep(final long millis) {
        try {
            Thread.sleep(millis);
        }
        catch (InterruptedException e) {
        }
    }

    protected final void
    warnNotTested() {
        final Set<ObjectName> notTested = getNotTestedSet();

        if (notTested.size() != 0) {
            final Set j2eeTypes =
                    JMXUtil.getKeyPropertySet(AMX.J2EE_TYPE_KEY, notTested);

            trace("WARNING: DID NOT TEST: " + notTested.size() + " MBeans of types {" +
                    toString(j2eeTypes) + "}");
        }
    }


    protected void
    checkConnection(final MBeanServerConnection conn) {
        assert (getConnection() != null);

        try {
            conn.isRegistered(JMXUtil.getMBeanServerDelegateObjectName());
        }
        catch (Exception e) {
            fail("Connection failed:\n" +
                    ExceptionUtil.getStackTrace(getRootCause(e)));
        }
    }

    protected void
    checkConnection() {
        checkConnection(getConnection());
    }

    protected TestUtil
    getTestUtil() {
        return mTestUtil;
    }


    protected final AMX
    getProxy(final ObjectName objectName) {
        final ProxyFactory factory = ProxyFactory.getInstance(getConnectionSource(), true);

        final AMX proxy = factory.getProxy(objectName, AMX.class);

        return (proxy);
    }

    /**
     We don't have T extend AMX because not all mixin interfaces extend AMX.
     */
    protected final <T> T
    getProxy(
            final ObjectName objectName,
            final Class<T> theClass) {
        return (theClass.cast(getProxy(objectName)));
    }


    protected final DomainRoot
    getDomainRoot() {
        assert (mDomainRoot != null) : "mDomainRoot is null";
        return (mDomainRoot);
    }

    protected final DomainConfig
    getDomainConfig() {
        return (getDomainRoot().getDomainConfig());
    }

    protected final J2EEDomain
    getJ2EEDomain() {
        return (getDomainRoot().getJ2EEDomain());
    }

    protected String[]
    getConfigNames() {
        final Map<String, ConfigConfig> configMap =
                getDomainConfig().getConfigsConfig().getConfigConfigMap();

        return (GSetUtil.toStringArray(configMap.keySet()));
    }

    protected ConfigConfig
    getConfigConfig(final String name) {
        final Map<String, ConfigConfig> configs = getDomainConfig().getConfigsConfig().getConfigConfigMap();

        return configs.get(name == null ? PE_CONFIG_NAME : name);
    }

    protected static ConfigConfig
    getConfigConfig(final AMXConfig any) {
        final ObjectName objectName = Util.getObjectName(any);
        final String configName = objectName.getKeyProperty(XTypes.CONFIG_CONFIG);

        return any.getDomainRoot().getDomainConfig().getConfigsConfig().getConfigConfigMap().get(configName);
    }

    protected ConfigConfig
    getConfigConfig() {
        return (getConfigConfig(PE_CONFIG_NAME));
    }


    protected QueryMgr
    getQueryMgr() {
        assert (mDomainRoot != null);
        final QueryMgr proxy = getDomainRoot().getQueryMgr();
        assert (proxy != null);
        return (proxy);
    }


    protected NotificationServiceMgr
    getNotificationServiceMgr() {
        return (getDomainRoot().getNotificationServiceMgr());
    }

    protected BulkAccess
    getBulkAccess() {
        return (getDomainRoot().getBulkAccess());
    }

    protected ConnectionSource
    getConnectionSource() {
        assert (mConnectionSource != null);
        return (mConnectionSource);
    }

    protected MBeanServerConnection
    getConnection() {
        return (getGlobalMBeanServerConnection());
    }

    protected ProxyFactory
    getProxyFactory() {
        return (mProxyFactory);
    }


    protected Class
    getInterfaceClass(AMX proxy)
            throws ClassNotFoundException {
        final String name = Util.getExtra(proxy).getInterfaceName();
        return (ClassUtil.getClassFromName(name));
    }

    protected <T extends AMX> boolean
    testOnProxies(
            final Collection<T> proxies,
            final Method method)
            throws Exception {
        final long start = now();

        boolean failed = false;

        int testCount = 0;

        final Object[] args = new Object[1];
        for (final T proxy : proxies) {
            final ObjectName objectName = Util.getExtra(proxy).getObjectName();

            if (!shouldTest(objectName)) {
                notTested(objectName);
                continue;
            }

            ++testCount;
            try {
                args[0] = proxy;
                method.invoke(this, args);
            }
            catch (Exception e) {
                trace(method.getName() + " failed for proxy: " +
                        quote(JMXUtil.toString(objectName)));
                failed = true;
                trace(ExceptionUtil.toString(e));
            }
        }


        final long elapsed = now() - start;
        printVerbose("Ran test method " + method.getName() + " on " + testCount +
                " candidates in " + elapsed + "ms");
        warnNotTested();

        warnNotTested();

        return (!failed);
    }


    protected boolean
    testOnObjectNames(
            final Collection<ObjectName> objectNames,
            final Method method)
            throws Exception {
        boolean failed = false;

        final Object[] args = new Object[1];

        int testCount = 0;
        final long start = now();

        for (final ObjectName objectName : objectNames) {
            if (!shouldTest(objectName)) {
                notTested(objectName);
                continue;
            }

            ++testCount;
            try {
                args[0] = objectName;
                method.invoke(this, args);
            }
            catch (Exception e) {
                final Throwable rootCause = getRootCause(e);
                trace(method.getName() + " failed for: " +
                        quote(JMXUtil.toString(objectName)) + " with Exception of type " +
                        rootCause.getClass().getName() + ", msg = " + rootCause.getMessage());
                failed = true;
            }
        }

        final long elapsed = now() - start;
        printVerbose("Ran test method " + method.getName() + " on " + testCount +
                " candidates in " + elapsed + "ms");
        warnNotTested();

        return (!failed);
    }


    protected final static Class[] OBJECTNAME_SIG = new Class[]{ObjectName.class};
    protected final static Class[] PROXY_SIG = new Class[]{AMX.class};

    protected void
    testAll(
            final Collection<ObjectName> objectNames,
            final String methodName)
            throws Exception {
        final boolean success = testOnObjectNames(objectNames,
                                                  this.getClass().getMethod(methodName, OBJECTNAME_SIG));

        assert (success);
    }

    protected <T extends AMX> void
    testAllProxies(
            final Collection<T> proxies,
            final String methodName)
            throws Exception {
        final boolean success = testOnProxies(proxies,
                                              this.getClass().getMethod(methodName, PROXY_SIG));

        assert (success);
    }

    protected void
    testAll(String methodName)
            throws Exception {
        final Set<ObjectName> names = getTestUtil().getAllObjectNames();

        testAll(names, methodName);
    }

    public void
    setUp()
            throws Exception {
        super.setUp();

        turnOnMonitoring();
    }

    public void
    testAssertsOn() {
        checkAssertsOn();
    }

    private static final String DEFAULT_INSTANCE_NAME = "test";

    protected static String
    getDefaultInstanceName(final String qualifier) {
        String name = null;

        if (qualifier == null) {
            name = DEFAULT_INSTANCE_NAME;
        } else {
            name = qualifier + "." + DEFAULT_INSTANCE_NAME;
        }
        return name;
    }

    protected Throwable
    getRootCause(Throwable t) {
        return ExceptionUtil.getRootCause(t);
    }

    protected String
    getStackTrace(Throwable t) {
        return ExceptionUtil.getStackTrace(t);
    }

    protected String
    getRootCauseStackTrace(Throwable t) {
        return getStackTrace(getRootCause(t));
    }

    protected Map<String, AppserverConnectionSource>
    getNodeAgents() {
        final Map<?, ?> m = Map.class.cast(getEnvValue(PropertyKeys.NODE_AGENTS_KEY));
        return TypeCast.checkedMap(m,
                                   String.class, AppserverConnectionSource.class);
    }


    protected String
    getDASNodeAgentName() {
        return getEnvString(PropertyKeys.DAS_NODE_AGENT_NAME, null);
    }

    protected NodeAgentConfig
    getDASNodeAgentConfig() {
        final String name = getDASNodeAgentName();

        NodeAgentConfig config = null;
        if (name != null) {
            config = getDomainConfig().getNodeAgentsConfig().getNodeAgentConfigMap().get(name);
        }

        return config;
    }

    protected boolean
    getTestOffline() {
        return getEnvBoolean(PropertyKeys.TEST_OFFLINE_KEY, false);
    }

    /**
     Check if we're testing in Offline mode, which means that
     Config MBeans are loaded in-process. If so, issue a warning.

     @return true if test should be run, false if in offline mode
     */
    protected boolean
    checkNotOffline(final String testName) {
        boolean offline = getTestOffline();

        if (offline) {
            //warning( "amxtest.testOffline=true, skipping test " + testName + "()" );
        }

        return !offline;
    }


    public static Capabilities
    getDefaultCapabilities() {
        return getOfflineCapableCapabilities(true);
    }

    protected static Capabilities
    getOfflineCapableCapabilities(boolean offlineCapable) {
        final Capabilities c = new Capabilities();
        c.setOfflineCapable(offlineCapable);

        return c;
    }

    AMXDebugSupportMBean
    getAMXDebugSupportMBean() {
        final ObjectName objectName = Util.newObjectName(AMXDebugSupportMBean.OBJECT_NAME);

        try {
            return (AMXDebugSupportMBean) newProxy(objectName, AMXDebugSupportMBean.class);
        }
        catch (Exception e) {
            assert false : "Can't get proxy to " + objectName;
        }
        return null;
    }

    protected boolean
    supportsMultipleServers() {
        return supportsMultipleServers(getDomainRoot());
    }

    public static boolean
    supportsMultipleServers(final DomainRoot domainRoot) {
        return domainRoot.getSystemInfo().supportsFeature(SystemInfo.MULTIPLE_SERVERS_FEATURE);
    }


    protected boolean
    supportsClusters() {
        return getDomainRoot().getSystemInfo().supportsFeature(SystemInfo.CLUSTERS_FEATURE);
    }
}










Other Glassfish examples (source code examples)

Here is a short list of links related to this Glassfish AMXTestBase.java source code file:

... this post is sponsored by my books ...

#1 New Release!

FP Best Seller

 

new blog posts

 

Copyright 1998-2021 Alvin Alexander, alvinalexander.com
All Rights Reserved.

A percentage of advertising revenue from
pages under the /java/jwarehouse URI on this website is
paid back to open source projects.