001    // Copyright 2005 The Apache Software Foundation
002    //
003    // Licensed under the Apache License, Version 2.0 (the "License");
004    // you may not use this file except in compliance with the License.
005    // You may obtain a copy of the License at
006    //
007    //     http://www.apache.org/licenses/LICENSE-2.0
008    //
009    // Unless required by applicable law or agreed to in writing, software
010    // distributed under the License is distributed on an "AS IS" BASIS,
011    // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
012    // See the License for the specific language governing permissions and
013    // limitations under the License.
014    
015    package org.apache.hivemind.management.mbeans;
016    
017    import java.rmi.NoSuchObjectException;
018    import java.rmi.Remote;
019    import java.rmi.RemoteException;
020    import java.rmi.registry.LocateRegistry;
021    import java.rmi.registry.Registry;
022    import java.rmi.server.UnicastRemoteObject;
023    
024    import javax.management.MBeanRegistration;
025    import javax.management.MBeanServer;
026    import javax.management.ObjectName;
027    
028    /**
029     * MBean that starts an rmiregistry.
030     * <p>
031     * Calling {@link #start} will launch rmiregistry in the same JVM; this way rmiregistry will have in
032     * its classpath the same classes the JVM has.
033     * 
034     * @author Achim Huegen
035     * @since 1.1
036     */
037    public class NamingService implements NamingServiceMBean, MBeanRegistration
038    {
039        private int _port;
040    
041        private Remote _registry;
042    
043        private boolean _running;
044    
045        /**
046         * Creates a new instance of NamingService with the default rmiregistry port (1099).
047         */
048        public NamingService()
049        {
050            this(Registry.REGISTRY_PORT);
051        }
052    
053        /**
054         * Creates a new instance of NamingService with the specified port.
055         */
056        public NamingService(int port)
057        {
058            _port = port;
059        }
060    
061        public void setPort(int port)
062        {
063            _port = port;
064        }
065    
066        public int getPort()
067        {
068            return _port;
069        }
070    
071        public boolean isRunning()
072        {
073            return _running;
074        }
075    
076        public void start() throws RemoteException
077        {
078            if (!isRunning())
079            {
080                _registry = LocateRegistry.createRegistry(getPort());
081                _running = true;
082            }
083        }
084    
085        public void stop() throws NoSuchObjectException
086        {
087            if (isRunning())
088            {
089                _running = !UnicastRemoteObject.unexportObject(_registry, true);
090            }
091        }
092    
093        /**
094         * @see javax.management.MBeanRegistration#preRegister(javax.management.MBeanServer,
095         *      javax.management.ObjectName)
096         */
097        public ObjectName preRegister(MBeanServer server, ObjectName name) throws Exception
098        {
099            return name;
100        }
101    
102        /**
103         * @see javax.management.MBeanRegistration#postRegister(java.lang.Boolean)
104         */
105        public void postRegister(Boolean arg0)
106        {
107        }
108    
109        /**
110         * @see javax.management.MBeanRegistration#preDeregister()
111         */
112        public void preDeregister() throws Exception
113        {
114        }
115    
116        /**
117         * @see javax.management.MBeanRegistration#postDeregister()
118         */
119        public void postDeregister()
120        {
121            try
122            {
123                stop();
124            }
125            catch (NoSuchObjectException ignore)
126            {
127            }
128        }
129    }