KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > com > caucho > burlap > server > BurlapSkeleton


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 "Burlap", "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.burlap.server;
50
51 import com.caucho.burlap.io.BurlapInput;
52 import com.caucho.burlap.io.BurlapOutput;
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
59 /**
60  * Proxy class for Burlap services.
61  */

62 public class BurlapSkeleton extends AbstractSkeleton {
63   private Object JavaDoc _service;
64   
65   /**
66    * Create a new burlap skeleton.
67    *
68    * @param service the underlying service object.
69    * @param apiClass the API interface
70    */

71   public BurlapSkeleton(Object JavaDoc service, Class JavaDoc apiClass)
72   {
73     super(apiClass);
74
75     _service = service;
76   }
77
78   /**
79    * Invoke the object with the request from the input stream.
80    *
81    * @param in the Burlap input stream
82    * @param out the Burlap output stream
83    */

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