1 /***
2 * Redistribution and use of this software and associated documentation
3 * ("Software"), with or without modification, are permitted provided
4 * that the following conditions are met:
5 *
6 * 1. Redistributions of source code must retain copyright
7 * statements and notices. Redistributions must also contain a
8 * copy of this document.
9 *
10 * 2. Redistributions in binary form must reproduce the
11 * above copyright notice, this list of conditions and the
12 * following disclaimer in the documentation and/or other
13 * materials provided with the distribution.
14 *
15 * 3. The name "Exolab" must not be used to endorse or promote
16 * products derived from this Software without prior written
17 * permission of Exoffice Technologies. For written permission,
18 * please contact info@exolab.org.
19 *
20 * 4. Products derived from this Software may not be called "Exolab"
21 * nor may "Exolab" appear in their names without prior written
22 * permission of Exoffice Technologies. Exolab is a registered
23 * trademark of Exoffice Technologies.
24 *
25 * 5. Due credit should be given to the Exolab Project
26 * (http://www.exolab.org/).
27 *
28 * THIS SOFTWARE IS PROVIDED BY EXOFFICE TECHNOLOGIES AND CONTRIBUTORS
29 * ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT
30 * NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
31 * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
32 * EXOFFICE TECHNOLOGIES OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
33 * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
34 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
35 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
36 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
37 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
38 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
39 * OF THE POSSIBILITY OF SUCH DAMAGE.
40 *
41 * Copyright 2003 (C) Exoffice Technologies Inc. All Rights Reserved.
42 *
43 * $Id: NameServiceProxy.java,v 1.2 2003/08/07 13:32:58 tanderson Exp $
44 */
45 package org.exolab.jms.jndi.http;
46
47 import java.util.Vector;
48
49 import javax.naming.Binding;
50 import javax.naming.Context;
51 import javax.naming.Name;
52 import javax.naming.NameClassPair;
53 import javax.naming.NameParser;
54 import javax.naming.NamingException;
55
56 import org.apache.avalon.excalibur.naming.NamingProvider;
57
58 import org.exolab.core.http.HttpClient;
59
60
61 /***
62 * The underlying communication interface for remote contexts over the http
63 * connector.
64 *
65 * @author <a href="mailto:tima@intalio.com">Tim Anderson</a>
66 * @version $Revision: 1.2 $
67 */
68 public class NameServiceProxy implements NamingProvider {
69
70 /***
71 * The server connection
72 */
73 private HttpClient _connection;
74
75
76 public NameServiceProxy(HttpClient connection) {
77 _connection = connection;
78 }
79
80 public NameParser getNameParser() throws NamingException {
81 NameParser parser;
82 Vector request = pack("getNameParser", 0);
83 synchronized (_connection) {
84 send(request);
85 parser = (NameParser) checkReply("getNameParser");
86 }
87 return parser;
88 }
89
90 public void bind(Name name, String className, Object object)
91 throws NamingException {
92 Vector request = pack("bind", 3);
93 request.add(name);
94 request.add(className);
95 request.add(object);
96 synchronized (_connection) {
97 send(request);
98 checkReply("bind");
99 }
100 }
101
102 public void rebind(Name name, String className, Object object)
103 throws NamingException {
104 Vector request = pack("rebind", 3);
105 request.add(name);
106 request.add(className);
107 request.add(object);
108 synchronized (_connection) {
109 send(request);
110 checkReply("rebind");
111 }
112 }
113
114 public Context createSubcontext(Name name) throws NamingException {
115 Context subcontext;
116 Vector request = pack("createSubContext", 1);
117 request.add(name);
118 synchronized (_connection) {
119 send(request);
120 subcontext = (Context) checkReply("createSubContext");
121 }
122 return subcontext;
123 }
124
125 public void destroySubcontext(Name name) throws NamingException {
126 Vector request = pack("destroySubContext", 1);
127 request.add(name);
128 synchronized (_connection) {
129 send(request);
130 checkReply("destroySubContext");
131 }
132 }
133
134 public NameClassPair[] list(Name name) throws NamingException {
135 NameClassPair[] pairs;
136 Vector request = pack("list", 1);
137 request.add(name);
138 synchronized (_connection) {
139 send(request);
140 pairs = (NameClassPair[]) checkReply("list");
141 }
142 return pairs;
143 }
144
145 public Binding[] listBindings(Name name) throws NamingException {
146 Binding[] bindings;
147 Vector request = pack("listBindings", 1);
148 request.add(name);
149 synchronized (_connection) {
150 send(request);
151 bindings = (Binding[]) checkReply("listBindings");
152 }
153 return bindings;
154 }
155
156 public Object lookup(Name name) throws NamingException {
157 Object object;
158 Vector request = pack("lookup", 1);
159 request.add(name);
160 synchronized (_connection) {
161 send(request);
162 object = checkReply("lookup");
163 }
164 return object;
165 }
166
167 public void unbind(Name name) throws NamingException {
168 Vector request = pack("unbind", 1);
169 request.add(name);
170 synchronized (_connection) {
171 send(request);
172 checkReply("unbind");
173 }
174 }
175
176 /***
177 * Pack all the data that is required by the server in a vector.
178 * Set the size of the vector to be exactly the right size for efficiency.
179 *
180 * @param method The function to activate on the server.
181 * @param numParams The number of paramaters this method will require.
182 * @return Vector The vector containing all the data.
183 */
184 protected Vector pack(String method, int numParams) {
185 Vector request = new Vector(3 + numParams);
186 request.add(getClassName());
187 request.add(method);
188 request.add("fooey");
189 return request;
190 }
191
192 /***
193 * Return the Server class name that will handle this request.
194 *
195 * @return The class name.
196 */
197 protected String getClassName() {
198 return "org.exolab.jms.jndi.mipc.IpcJmsJndiServer";
199 }
200
201 /***
202 * A convenience method to check the success of operations which return
203 * a true on sucess.
204 *
205 * @param method The requested server function.
206 * @throws NamingException on any failure.
207 */
208 protected Object checkReply(String method) throws NamingException {
209 Object result = null;
210
211 try {
212 Vector v = (Vector) _connection.receive();
213 if (v != null) {
214 Boolean b = (Boolean) v.get(0);
215 if (!b.booleanValue()) {
216 NamingException error = (NamingException) v.get(1);
217 throw error;
218 } else {
219 result = v.get(1);
220 }
221 } else {
222 throw new NamingException("Unknown connection error for "
223 + method);
224 }
225 } catch (NamingException error) {
226 throw error;
227 } catch (Exception error) {
228 // rethrow as a NamingException
229 throw new NamingException("Operation " + method + " failed: "
230 + error);
231 }
232 return result;
233 }
234
235 /***
236 * A convenience method to send a packed command to the server.
237 *
238 * @throws NamingException on any failure.
239 */
240 protected void send(Vector v) throws NamingException {
241 try {
242 _connection.send(v);
243 } catch (Exception error) {
244 // rethrow as a NamingException
245 throw new NamingException("Operation failed: " + error);
246 }
247 }
248
249 } //-- NameServiceProxy
This page was automatically generated by Maven