jdk/test/javax/management/namespace/NamespaceController.java
changeset 4156 acaa49a2768a
parent 4155 460e37d40f12
child 4159 9e3aae7675f1
--- a/jdk/test/javax/management/namespace/NamespaceController.java	Wed Oct 21 16:28:57 2009 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,405 +0,0 @@
-/*
- * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.  Sun designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Sun in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
- * CA 95054 USA or visit www.sun.com if you need additional information or
- * have any questions.
- */
-
-import com.sun.jmx.namespace.ObjectNameRouter;
-import static javax.management.namespace.JMXNamespaces.NAMESPACE_SEPARATOR;
-
-import java.io.IOException;
-import java.util.Arrays;
-import java.util.Map;
-import java.util.Set;
-import java.util.TreeSet;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
-import javax.management.InstanceAlreadyExistsException;
-import javax.management.InstanceNotFoundException;
-import javax.management.JMX;
-import javax.management.ListenerNotFoundException;
-import javax.management.MBeanException;
-import javax.management.MBeanNotificationInfo;
-import javax.management.MBeanRegistration;
-import javax.management.MBeanRegistrationException;
-import javax.management.MBeanServer;
-import javax.management.MBeanServerConnection;
-import javax.management.MalformedObjectNameException;
-import javax.management.NotCompliantMBeanException;
-import javax.management.Notification;
-import javax.management.NotificationBroadcasterSupport;
-import javax.management.NotificationEmitter;
-import javax.management.NotificationFilter;
-import javax.management.NotificationListener;
-import javax.management.ObjectInstance;
-import javax.management.ObjectName;
-import javax.management.ReflectionException;
-import javax.management.namespace.JMXNamespace;
-import javax.management.namespace.JMXNamespaces;
-import javax.management.namespace.JMXRemoteNamespaceMBean;
-import javax.management.remote.JMXServiceURL;
-
-/**
- * The {@code NamespaceController} MBean makes it possible to easily
- * create mount points ({@linkplain JMXNamespace JMXNamespaces}) in an
- * {@code MBeanServer}.
- * There is at most one instance of NamespaceController in an
- * MBeanServer - which can be created using the {@link #createInstance
- * createInstance} method. The {@code NamespaceController} MBean will
- * make it possible to remotely create name spaces by mounting remote
- * MBeanServers into the MBeanServer in which it was registered.
- */
-// This API was originally in the draft of javax/management/namespaces
-// but we decided to retire it. Rather than removing all the associated
-// tests I have moved the API to the test hierarchy - so it is now used as
-// an additional (though somewhat complex) test case...
-//
-public class NamespaceController implements NamespaceControllerMBean,
-        NotificationEmitter, MBeanRegistration {
-
-    /**
-     * A logger for this class.
-     **/
-    private static final Logger LOG =
-            Logger.getLogger(NamespaceController.class.getName());
-
-    private static long seqNumber=0;
-
-    private final NotificationBroadcasterSupport broadcaster =
-            new NotificationBroadcasterSupport();
-
-    private volatile MBeanServer mbeanServer = null;
-
-    private volatile ObjectName objectName = null;
-
-    //was: NamespaceController.class.getPackage().getName()
-    public static final String NAMESPACE_CONTROLLER_DOMAIN = "jmx.ns";
-
-    /**
-     * Creates a new NamespaceController.
-     * Using {@link #createInstance} should be preferred.
-     **/
-    public NamespaceController() {
-        this(null);
-    }
-
-    public NamespaceController(MBeanServer mbeanServer) {
-        this.mbeanServer = mbeanServer;
-    }
-
-    /*
-     * MBeanNotification support
-     * You shouldn't update these methods
-     */
-    public final void addNotificationListener(NotificationListener listener,
-            NotificationFilter filter, Object handback) {
-        broadcaster.addNotificationListener(listener, filter, handback);
-    }
-
-    public MBeanNotificationInfo[] getNotificationInfo() {
-        return new MBeanNotificationInfo[] {
-        };
-    }
-
-    public final void removeNotificationListener(NotificationListener listener)
-        throws ListenerNotFoundException {
-        broadcaster.removeNotificationListener(listener);
-    }
-
-    public final void removeNotificationListener(NotificationListener listener,
-            NotificationFilter filter, Object handback)
-            throws ListenerNotFoundException {
-        broadcaster.removeNotificationListener(listener, filter, handback);
-    }
-
-    public static synchronized long getNextSeqNumber() {
-        return seqNumber++;
-    }
-
-    protected final void sendNotification(Notification n) {
-        if (n.getSequenceNumber()<=0)
-            n.setSequenceNumber(getNextSeqNumber());
-        if (n.getSource()==null)
-            n.setSource(objectName);
-        broadcaster.sendNotification(n);
-    }
-
-    /**
-     * The ObjectName with which this MBean was registered.
-     * <p>Unless changed by subclasses, this is
-     * {@code
-     *  "javax.management.namespace:type="+this.getClass().getSimpleName()}.
-     * @return this MBean's ObjectName, or null if this MBean was never
-     *         registered.
-     **/
-    public final ObjectName getObjectName() {
-        return objectName;
-    }
-
-    /**
-     * The MBeanServer  served by this NamespaceController.
-     * @return the MBeanServer  served by this NamespaceController.
-     **/
-    public final MBeanServer getMBeanServer() {
-        return mbeanServer;
-    }
-
-    /**
-     * Allows the MBean to perform any operations it needs before being
-     * registered in the MBean server. If the name of the MBean is not
-     * specified, the MBean can provide a name for its registration. If
-     * any exception is raised, the MBean will not be registered in the
-     * MBean server. Subclasses which override {@code preRegister}
-     * must call {@code super.preRegister(name,server)};
-     * @param server The MBean server in which the MBean will be registered.
-     * @param name The object name of the MBean.
-     *        The name must be either {@code null} - or equal to that
-     *        described by {@link #getObjectName}.
-     * @return The name under which the MBean is to be registered.
-     *         This will be the name described by {@link #getObjectName}.
-     * @throws MalformedObjectNameException if the supplied name does not
-     *        meet expected requirements.
-     */
-    public ObjectName preRegister(MBeanServer server, ObjectName name)
-        throws MalformedObjectNameException {
-        objectName = name;
-        final ObjectName single =
-                ObjectName.getInstance(NAMESPACE_CONTROLLER_DOMAIN+
-                ":type="+this.getClass().getSimpleName());
-        if (name!=null && !single.equals(name))
-            throw new MalformedObjectNameException(name.toString());
-        if (mbeanServer == null) mbeanServer = server;
-        return single;
-    }
-
-    /**
-     * Allows the MBean to perform any operations needed after having
-     * been registered in the MBean server or after the registration has
-     * failed.
-     * @param registrationDone Indicates whether or not the MBean has been
-     * successfully registered in the MBean server. The value false means
-     * that the registration has failed.
-     */
-    public void postRegister(Boolean registrationDone) {
-        //TODO postRegister implementation;
-    }
-
-    /**
-     * Allows the MBean to perform any operations it needs before being
-     * unregistered by the MBean server.
-     * @throws Exception This exception will be caught by the MBean server and
-     * re-thrown as an MBeanRegistrationException.
-     */
-    public void preDeregister() throws Exception {
-        //TODO preDeregister implementation;
-    }
-
-    /**
-     * Allows the MBean to perform any operations needed after having been
-     * unregistered in the MBean server.
-     */
-    public void postDeregister() {
-        //TODO postDeregister implementation;
-    }
-
-    public String mount(JMXServiceURL url,
-            String targetPath,
-            Map<String,Object> optionsMap)
-            throws IOException {
-        return mount(url, targetPath, "", optionsMap);
-    }
-
-    // see NamespaceControllerMBean
-    public String mount(JMXServiceURL url,
-            String targetPath,
-            String sourcePath,
-            Map<String,Object> optionsMap)
-            throws IOException {
-
-        // TODO: handle description.
-        final String dirName =
-                JMXNamespaces.normalizeNamespaceName(targetPath);
-
-         try {
-            final ObjectInstance moi =
-                    JMXRemoteTargetNamespace.createNamespace(mbeanServer,
-                    dirName,url,optionsMap,
-                    JMXNamespaces.normalizeNamespaceName(sourcePath)
-                    );
-            final ObjectName nsMBean = moi.getObjectName();
-            try {
-                mbeanServer.invoke(nsMBean, "connect", null,null);
-            } catch (Throwable t) {
-                mbeanServer.unregisterMBean(nsMBean);
-                throw t;
-            }
-            return getMountPointID(nsMBean);
-        } catch (InstanceAlreadyExistsException x) {
-            throw new IllegalArgumentException(targetPath,x);
-         } catch (IOException x) {
-            throw x;
-        } catch (Throwable x) {
-            if (x instanceof Error) throw (Error)x;
-            Throwable cause = x.getCause();
-            if (cause instanceof IOException)
-                throw ((IOException)cause);
-            if (cause == null) cause = x;
-
-            final IOException io =
-                    new IOException("connect failed: "+cause);
-            io.initCause(cause);
-            throw io;
-        }
-    }
-
-    private String getMountPointID(ObjectName dirName) {
-            return dirName.toString();
-    }
-
-    private ObjectName getHandlerName(String mountPointID) {
-        try {
-            final ObjectName tryit = ObjectName.getInstance(mountPointID);
-            final ObjectName formatted =
-                    JMXNamespaces.getNamespaceObjectName(tryit.getDomain());
-            if (!formatted.equals(tryit))
-                throw new IllegalArgumentException(mountPointID+
-                        ": invalid mountPointID");
-            return formatted;
-        } catch (MalformedObjectNameException x) {
-            throw new IllegalArgumentException(mountPointID,x);
-        }
-    }
-
-    public boolean unmount(String mountPointID)
-        throws IOException {
-        final ObjectName dirName = getHandlerName(mountPointID);
-        if (!mbeanServer.isRegistered(dirName))
-            throw new IllegalArgumentException(mountPointID+
-                    ": no such name space");
-        final JMXRemoteNamespaceMBean mbean =
-                JMX.newMBeanProxy(mbeanServer,dirName,
-                    JMXRemoteNamespaceMBean.class);
-        try {
-            mbean.close();
-        } catch (IOException io) {
-            LOG.fine("Failed to close properly - ignoring exception: "+io);
-            LOG.log(Level.FINEST,
-                    "Failed to close properly - ignoring exception",io);
-        } finally {
-            try {
-                mbeanServer.unregisterMBean(dirName);
-            } catch (InstanceNotFoundException x) {
-                throw new IllegalArgumentException(mountPointID+
-                        ": no such name space", x);
-            } catch (MBeanRegistrationException x) {
-                final IOException io =
-                        new IOException(mountPointID +": failed to unmount");
-                io.initCause(x);
-                throw io;
-            }
-        }
-        return true;
-    }
-
-    public boolean ismounted(String targetPath) {
-        return mbeanServer.isRegistered(JMXNamespaces.getNamespaceObjectName(targetPath));
-    }
-
-    public ObjectName getHandlerNameFor(String targetPath) {
-        return JMXNamespaces.getNamespaceObjectName(targetPath);
-    }
-
-    public String[] findNamespaces() {
-        return findNamespaces(null,null,0);
-    }
-
-
-    private ObjectName getDirPattern(String from) {
-        try {
-            if (from == null)
-                return ObjectName.getInstance(ALL_NAMESPACES);
-            final String namespace =
-                  ObjectNameRouter.normalizeNamespacePath(from,false,true,false);
-            if (namespace.equals(""))
-                return ObjectName.getInstance(ALL_NAMESPACES);
-            if (JMXNamespaces.getNamespaceObjectName(namespace).isDomainPattern())
-                throw new IllegalArgumentException(from);
-            return ObjectName.getInstance(namespace+NAMESPACE_SEPARATOR+ALL_NAMESPACES);
-        } catch (MalformedObjectNameException x) {
-            throw new IllegalArgumentException(from,x);
-        }
-    }
-
-    public String[] findNamespaces(String from, String regex, int depth) {
-        if (depth < 0) return new String[0];
-        final Set<String> res = new TreeSet<String>();
-        final ObjectName all = getDirPattern(from);
-        Set<ObjectName> names = mbeanServer.queryNames(all,null);
-        for (ObjectName dirName : names) {
-            final String dir = dirName.getDomain();
-            if (regex == null || dir.matches(regex))
-                res.add(dir);
-            if (depth > 0)
-                res.addAll(Arrays.asList(findNamespaces(dir,regex,depth-1)));
-        }
-        return res.toArray(new String[res.size()]);
-    }
-
-    /**
-     * Creates a {@link NamespaceController} MBean in the provided
-     * {@link MBeanServerConnection}.
-     * <p>The name of the MBean is that returned by {@link #preRegister}
-     * as described by {@link #getObjectName}.
-     * @throws IOException if an {@code IOException} is raised when invoking
-     *         the provided connection.
-     * @throws InstanceAlreadyExistsException if an MBean was already
-     *         registered with the NamespaceController's name.
-     * @throws MBeanRegistrationException if thrown by {@link
-     * MBeanServerConnection#createMBean(java.lang.String,javax.management.ObjectName)
-     * server.createMBean}
-     * @throws MBeanException if thrown by {@link
-     * MBeanServerConnection#createMBean(java.lang.String,javax.management.ObjectName)
-     * server.createMBean}
-     * @return the {@link ObjectInstance}, as returned by {@link
-     * MBeanServerConnection#createMBean(java.lang.String,javax.management.ObjectName)
-     * server.createMBean}
-     **/
-    public static ObjectInstance createInstance(MBeanServerConnection server)
-        throws IOException, InstanceAlreadyExistsException,
-            MBeanRegistrationException, MBeanException {
-        try {
-            final ObjectInstance instance =
-                server.createMBean(NamespaceController.class.getName(), null);
-            return instance;
-        } catch (NotCompliantMBeanException ex) {
-            throw new RuntimeException("unexpected exception: " + ex, ex);
-        } catch (ReflectionException ex) {
-            throw new RuntimeException("unexpected exception: " + ex, ex);
-        }
-    }
-
-    private final static String ALL_NAMESPACES=
-            "*"+NAMESPACE_SEPARATOR+":"+
-            JMXNamespace.TYPE_ASSIGNMENT;
-
-}