001    /*
002     * Copyright 2005 Stephen J. McConnell.
003     *
004     * Licensed  under the  Apache License,  Version 2.0  (the "License");
005     * you may not use  this file  except in  compliance with the License.
006     * You may obtain a copy of the License at
007     *
008     *   http://www.apache.org/licenses/LICENSE-2.0
009     *
010     * Unless required by applicable law or agreed to in writing, software
011     * distributed  under the  License is distributed on an "AS IS" BASIS,
012     * WITHOUT  WARRANTIES OR CONDITIONS  OF ANY KIND, either  express  or
013     * implied.
014     *
015     * See the License for the specific language governing permissions and
016     * limitations under the License.
017     */
018    
019    package net.dpml.transit.registry;
020    
021    import java.io.IOException;
022    import java.io.InputStream;
023    import java.io.OutputStream;
024    import java.net.URL;
025    import java.net.URLConnection;
026    import java.security.AccessController;
027    import java.security.PrivilegedExceptionAction;
028    import java.security.PrivilegedActionException;
029    import java.rmi.registry.Registry;
030    import java.rmi.registry.LocateRegistry;
031    
032    /**
033     * The registry URL protocol connection implementation.
034     *
035     * @author <a href="http://www.dpml.net">Digital Product Meta Library</a>
036     * @version 1.0.3
037     */
038    public class RegistryURLConnection extends URLConnection
039    {
040        private boolean m_connected = false;
041    
042        private Registry m_registry;
043    
044        /**
045         * Creation of a new registry handler.
046         * @param url the url to establish a connection with
047         * @exception NullPointerException if the url argument is null
048         */
049        RegistryURLConnection( URL url )
050            throws NullPointerException
051        {
052            super( url );
053        }
054    
055       /**
056        * Establish a connection.
057        *
058        * @exception IOException is an error occurs while attempting to establish
059        *  the connection.
060        */
061        public void connect()
062            throws IOException
063        {
064            if( m_connected )
065            {
066                return;
067            }
068    
069            m_connected = true;
070            
071            try
072            {
073                AccessController.doPrivileged( 
074                  new PrivilegedExceptionAction()
075                  {
076                    public Object run()
077                        throws IOException
078                    {
079                        String spec = url.toExternalForm();
080                        String host = url.getHost();
081                        int port = url.getPort();
082    
083                        try
084                        {
085                            m_registry = LocateRegistry.getRegistry( host, port );
086                        }
087                        catch( Throwable e )
088                        {
089                            String message = e.getMessage();
090                            IOException exception = new IOException( message );
091                            exception.initCause( e.getCause() );
092                            throw exception;
093                        }
094                        return null; // nothing to return
095                    }
096                  }
097                );
098            }
099            catch( PrivilegedActionException e )
100            {
101                throw (IOException) e.getException();
102            } 
103        }
104    
105       /**
106        * Return an input stream to the resource.
107        * @return current implementation returns null
108        * @exception IOException is an error occurs
109        */
110        public InputStream getInputStream()
111            throws IOException
112        {
113            return null;
114        }
115    
116       /**
117        * Return an output stream to the resource.
118        * @return current implementation returns null
119        * @exception IOException if any I/O problems occur.
120        */
121        public OutputStream getOutputStream()
122            throws IOException
123        {
124            return null;
125        }
126    
127       /**
128        * Return the content for this registry connection.
129        * @return the registry object
130        * @exception IOException is an error occurs
131        */
132        public Object getContent() throws IOException
133        {
134            return getContent( new Class[0] );
135        }
136    
137       /**
138        * Return the content for this registry connection.
139        * @param classes a sequence of classes against which the
140        *   implementation will attempt to establish a known match
141        * @return the registry object
142        * @exception IOException is an error occurs
143        */
144        public Object getContent( final Class[] classes ) throws IOException
145        {
146            connect();
147    
148            try
149            {
150                return AccessController.doPrivileged( 
151                  new PrivilegedExceptionAction()
152                  {
153                    public Object run()
154                        throws IOException
155                    {
156                        if( null == m_registry )
157                        {
158                            throw new NullPointerException( "registry" );
159                        }
160                        try
161                        {
162                            String path = getURL().getPath();
163                            if( ( null == path ) || "".equals( path ) )
164                            {
165                                return m_registry;
166                            }
167                            else
168                            {
169                                return m_registry.lookup( path );
170                            }
171                        }
172                        catch( Exception e )
173                        {
174                            final String error = 
175                              "Unable to resolve url: " + getURL();
176                            IOException exception = new IOException( error );
177                            exception.initCause( e );
178                            throw exception;
179                        }
180                    }
181                  }
182                );
183            }
184            catch( PrivilegedActionException e )
185            {
186                throw (IOException) e.getException();
187            } 
188        }
189    }