KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > com > caucho > hessian > server > HessianSkeleton


1 /*
2  * Copyright (c) 2001-2004 Caucho Technology, Inc. All rights reserved.
3  *
4  * The Apache Software License, Version 1.1
5  *
6  * Redistribution and use in source and binary forms, with or without
7  * modification, are permitted provided that the following conditions
8  * are met:
9  *
10  * 1. Redistributions of source code must retain the above copyright
11  * notice, this list of conditions and the following disclaimer.
12  *
13  * 2. Redistributions in binary form must reproduce the above copyright
14  * notice, this list of conditions and the following disclaimer in
15  * the documentation and/or other materials provided with the
16  * distribution.
17  *
18  * 3. The end-user documentation included with the redistribution, if
19  * any, must include the following acknowlegement:
20  * "This product includes software developed by the
21  * Caucho Technology (http://www.caucho.com/)."
22  * Alternately, this acknowlegement may appear in the software itself,
23  * if and wherever such third-party acknowlegements normally appear.
24  *
25  * 4. The names "Hessian", "Resin", and "Caucho" must not be used to
26  * endorse or promote products derived from this software without prior
27  * written permission. For written permission, please contact
28  * info@caucho.com.
29  *
30  * 5. Products derived from this software may not be called "Resin"
31  * nor may "Resin" appear in their names without prior written
32  * permission of Caucho Technology.
33  *
34  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
35  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
36  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
37  * DISCLAIMED. IN NO EVENT SHALL CAUCHO TECHNOLOGY OR ITS CONTRIBUTORS
38  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
39  * OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
40  * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
41  * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
42  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
43  * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
44  * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
45  *
46  * @author Scott Ferguson
47  */

48
49 package com.caucho.hessian.server;
50
51 import com.caucho.hessian.io.AbstractHessianInput;
52 import com.caucho.hessian.io.AbstractHessianOutput;
53 import com.caucho.services.server.AbstractSkeleton;
54 import com.caucho.services.server.ServiceContext;
55
56 import java.lang.reflect.InvocationTargetException JavaDoc;
57 import java.lang.reflect.Method JavaDoc;
58 import java.util.logging.Level JavaDoc;
59 import java.util.logging.Logger JavaDoc;
60
61 /**
62  * Proxy class for Hessian services.
63  */

64 public class HessianSkeleton extends AbstractSkeleton {
65   private static final Logger JavaDoc log = Logger.getLogger(HessianSkeleton.class.getName());
66   
67   private Object JavaDoc _service;
68   
69   /**
70    * Create a new hessian skeleton.
71    *
72    * @param service the underlying service object.
73    * @param apiClass the API interface
74    */

75   public HessianSkeleton(Object JavaDoc service, Class JavaDoc apiClass)
76   {
77     super(apiClass);
78
79     _service = service;
80
81     if (! apiClass.isAssignableFrom(service.getClass()))
82       throw new IllegalArgumentException JavaDoc("Service " + service + " must be an instance of " + apiClass.getName());
83   }
84
85   /**
86    * Invoke the object with the request from the input stream.
87    *
88    * @param in the Hessian input stream
89    * @param out the Hessian output stream
90    */

91   public void invoke(AbstractHessianInput in, AbstractHessianOutput out)
92     throws Throwable JavaDoc
93   {
94     ServiceContext context = ServiceContext.getContext();
95     
96     String JavaDoc header;
97     while ((header = in.readHeader()) != null) {
98       Object JavaDoc value = in.readObject();
99
100       context.addHeader(header, value);
101     }
102
103     String JavaDoc methodName = in.readMethod();
104     Method JavaDoc method = getMethod(methodName);
105
106     if (method != null) {
107     }
108     else if ("_hessian_getAttribute".equals(methodName)) {
109       String JavaDoc attrName = in.readString();
110       in.completeCall();
111
112       String JavaDoc value = null;
113
114       if ("java.api.class".equals(attrName))
115     value = getAPIClassName();
116       else if ("java.home.class".equals(attrName))
117     value = getHomeClassName();
118       else if ("java.object.class".equals(attrName))
119     value = getObjectClassName();
120
121       out.startReply();
122
123       out.writeObject(value);
124
125       out.completeReply();
126       return;
127     }
128     else if (method == null) {
129       out.startReply();
130       out.writeFault("NoSuchMethodException",
131              "The service has no method named: " + in.getMethod(),
132              null);
133       out.completeReply();
134       return;
135     }
136
137     Class JavaDoc []args = method.getParameterTypes();
138     Object JavaDoc []values = new Object JavaDoc[args.length];
139
140     for (int i = 0; i < args.length; i++)
141       values[i] = in.readObject(args[i]);
142
143     in.completeCall();
144
145     Object JavaDoc result = null;
146     
147     try {
148       result = method.invoke(_service, values);
149     } catch (Throwable JavaDoc e) {
150       if (e instanceof InvocationTargetException JavaDoc)
151         e = ((InvocationTargetException JavaDoc) e).getTargetException();
152
153       log.log(Level.WARNING, e.toString(), e);
154       
155       out.startReply();
156       out.writeFault("ServiceException", e.getMessage(), e);
157       out.completeReply();
158       return;
159     }
160
161     out.startReply();
162
163     out.writeObject(result);
164     
165     out.completeReply();
166   }
167 }
168
Popular Tags