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
015package org.apache.hivemind.management.mbeans;
016
017import java.rmi.NoSuchObjectException;
018import java.rmi.Remote;
019import java.rmi.RemoteException;
020import java.rmi.registry.LocateRegistry;
021import java.rmi.registry.Registry;
022import java.rmi.server.UnicastRemoteObject;
023
024import javax.management.MBeanRegistration;
025import javax.management.MBeanServer;
026import 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 */
037public 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}