1 /*
2 * Copyright (C) The Spice Group. All rights reserved.
3 *
4 * This software is published under the terms of the Spice
5 * Software License version 1.1, a copy of which has been included
6 * with this distribution in the LICENSE.txt file.
7 */
8 package org.realityforge.jndikit.rmi;
9
10 import java.io.BufferedInputStream;
11 import java.io.IOException;
12 import java.io.ObjectInputStream;
13 import java.net.Socket;
14 import java.rmi.MarshalledObject;
15 import java.util.Hashtable;
16 import javax.naming.ConfigurationException;
17 import javax.naming.Context;
18 import javax.naming.NamingException;
19 import javax.naming.ServiceUnavailableException;
20 import javax.naming.Name;
21 import javax.naming.spi.InitialContextFactory;
22 import org.realityforge.jndikit.DefaultNamespace;
23 import org.realityforge.jndikit.Namespace;
24 import org.realityforge.jndikit.NamingProvider;
25 import org.realityforge.jndikit.RemoteContext;
26
27 /***
28 * Initial context factory for memorycontext.
29 *
30 * @author <a href="mailto:peter at realityforge.org">Peter Donald</a>
31 * @version $Revision: 1.2 $
32 */
33 public class RMIInitialContextFactory
34 implements InitialContextFactory
35 {
36 public Context getInitialContext( final Hashtable environment )
37 throws NamingException
38 {
39 final NamingProvider provider = newNamingProvider( environment );
40 environment.put( RemoteContext.NAMING_PROVIDER, provider );
41
42 final Namespace namespace = newNamespace( environment );
43 environment.put( RemoteContext.NAMESPACE, namespace );
44
45 final Name baseName = namespace.getNameParser().parse( "" );
46 return new RemoteContext( environment, baseName );
47 }
48
49 protected NamingProvider newNamingProvider( final Hashtable environment )
50 throws NamingException
51 {
52 final String url = (String)environment.get( Context.PROVIDER_URL );
53 if( null == url )
54 {
55 return newNamingProvider( "localhost", 1977 );
56 }
57 else
58 {
59 if( !url.startsWith( "rmi://" ) )
60 {
61 throw new ConfigurationException( "Malformed url - " + url );
62 }
63
64 final int index = url.indexOf( ':', 6 );
65 int end = index;
66
67 int port = 1977;
68
69 if( -1 == index )
70 {
71 end = url.length();
72 }
73 else
74 {
75 port = Integer.parseInt( url.substring( index + 1 ) );
76 }
77
78 final String host = url.substring( 6, end );
79
80 return newNamingProvider( host, port );
81 }
82 }
83
84 protected NamingProvider newNamingProvider( final String host,
85 final int port )
86 throws NamingException
87 {
88 Socket socket = null;
89
90 try
91 {
92 socket = new Socket( host, port );
93
94 final BufferedInputStream buffered =
95 new BufferedInputStream( socket.getInputStream() );
96 final ObjectInputStream input = new ObjectInputStream( buffered );
97
98 final MarshalledObject object =
99 (MarshalledObject)input.readObject();
100 final NamingProvider provider =(NamingProvider)object.get();
101
102 socket.close();
103 socket = null;
104
105 return provider;
106 }
107 catch( final Exception e )
108 {
109 final ServiceUnavailableException sue =
110 new ServiceUnavailableException( e.getMessage() );
111 sue.setRootCause( e );
112 throw sue;
113 }
114 finally
115 {
116 if( null != socket )
117 {
118 try
119 {
120 socket.close();
121 }
122 catch( final IOException ioe )
123 {
124 //Ignored.
125 }
126 }
127 }
128 }
129
130 protected Namespace newNamespace( final Hashtable environment )
131 throws NamingException
132 {
133 try
134 {
135 final NamingProvider provider =
136 (NamingProvider)environment.get( RemoteContext.NAMING_PROVIDER );
137
138 return new DefaultNamespace( provider.getNameParser() );
139 }
140 catch( final Exception e )
141 {
142 if( e instanceof NamingException )
143 {
144 throw (NamingException)e;
145 }
146 else
147 {
148 final ServiceUnavailableException sue =
149 new ServiceUnavailableException( e.getMessage() );
150 sue.setRootCause( e );
151 throw sue;
152 }
153 }
154 }
155 }
156
This page was automatically generated by Maven