001 /*
002 * Copyright (c) 2001-2004 Caucho Technology, Inc. All rights reserved.
003 *
004 * The Apache Software License, Version 1.1
005 *
006 * Redistribution and use in source and binary forms, with or without
007 * modification, are permitted provided that the following conditions
008 * are met:
009 *
010 * 1. Redistributions of source code must retain the above copyright
011 * notice, this list of conditions and the following disclaimer.
012 *
013 * 2. Redistributions in binary form must reproduce the above copyright
014 * notice, this list of conditions and the following disclaimer in
015 * the documentation and/or other materials provided with the
016 * distribution.
017 *
018 * 3. The end-user documentation included with the redistribution, if
019 * any, must include the following acknowlegement:
020 * "This product includes software developed by the
021 * Caucho Technology (http://www.caucho.com/)."
022 * Alternately, this acknowlegement may appear in the software itself,
023 * if and wherever such third-party acknowlegements normally appear.
024 *
025 * 4. The names "Burlap", "Resin", and "Caucho" must not be used to
026 * endorse or promote products derived from this software without prior
027 * written permission. For written permission, please contact
028 * info@caucho.com.
029 *
030 * 5. Products derived from this software may not be called "Resin"
031 * nor may "Resin" appear in their names without prior written
032 * permission of Caucho Technology.
033 *
034 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
035 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
036 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
037 * DISCLAIMED. IN NO EVENT SHALL CAUCHO TECHNOLOGY OR ITS CONTRIBUTORS
038 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
039 * OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
040 * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
041 * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
042 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
043 * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
044 * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
045 *
046 * @author Scott Ferguson
047 */
048
049 package com.caucho.burlap.server;
050
051 import com.caucho.burlap.io.BurlapInput;
052 import com.caucho.burlap.io.BurlapOutput;
053 import com.caucho.services.server.AbstractSkeleton;
054 import com.caucho.services.server.ServiceContext;
055
056 import java.lang.reflect.InvocationTargetException;
057 import java.lang.reflect.Method;
058 import java.util.logging.*;
059
060 /**
061 * Proxy class for Burlap services.
062 */
063 public class BurlapSkeleton extends AbstractSkeleton {
064 private static final Logger log
065 = Logger.getLogger(BurlapSkeleton.class.getName());
066
067 private Object _service;
068
069 /**
070 * Create a new burlap skeleton.
071 *
072 * @param service the underlying service object.
073 * @param apiClass the API interface
074 */
075 public BurlapSkeleton(Object service, Class apiClass)
076 {
077 super(apiClass);
078
079 _service = service;
080 }
081
082 /**
083 * Create a new burlap skeleton.
084 *
085 * @param service the underlying service object.
086 * @param apiClass the API interface
087 */
088 public BurlapSkeleton(Class apiClass)
089 {
090 super(apiClass);
091 }
092
093 /**
094 * Invoke the object with the request from the input stream.
095 *
096 * @param in the Burlap input stream
097 * @param out the Burlap output stream
098 */
099 public void invoke(BurlapInput in, BurlapOutput out)
100 throws Exception
101 {
102 invoke(_service, in, out);
103 }
104
105 /**
106 * Invoke the object with the request from the input stream.
107 *
108 * @param in the Burlap input stream
109 * @param out the Burlap output stream
110 */
111 public void invoke(Object service, BurlapInput in, BurlapOutput out)
112 throws Exception
113 {
114 in.readCall();
115
116 ServiceContext context = ServiceContext.getContext();
117
118 String header;
119 while ((header = in.readHeader()) != null) {
120 Object value = in.readObject();
121
122 context.addHeader(header, value);
123 }
124
125 String methodName = in.readMethod();
126 Method method = getMethod(methodName);
127
128 if (log.isLoggable(Level.FINE))
129 log.fine(this + " invoking " + methodName + " (" + method + ")");
130
131 if (method != null) {
132 }
133 else if ("_burlap_getAttribute".equals(in.getMethod())) {
134 String attrName = in.readString();
135 in.completeCall();
136
137 String value = null;
138
139 if ("java.api.class".equals(attrName))
140 value = getAPIClassName();
141 else if ("java.home.class".equals(attrName))
142 value = getHomeClassName();
143 else if ("java.object.class".equals(attrName))
144 value = getObjectClassName();
145
146 out.startReply();
147
148 out.writeObject(value);
149
150 out.completeReply();
151 return;
152 }
153 else if (method == null) {
154 out.startReply();
155 out.writeFault("NoSuchMethodException",
156 "The service has no method named: " + in.getMethod(),
157 null);
158 out.completeReply();
159 return;
160 }
161
162 Class []args = method.getParameterTypes();
163 Object []values = new Object[args.length];
164
165 for (int i = 0; i < args.length; i++)
166 values[i] = in.readObject(args[i]);
167
168 in.completeCall();
169
170 Object result = null;
171
172 try {
173 result = method.invoke(service, values);
174 } catch (Throwable e) {
175 log.log(Level.FINE,
176 service + "." + method.getName() + "() failed with exception:\n"
177 + e.toString(),
178 e);
179
180 if (e instanceof InvocationTargetException
181 && e.getCause() instanceof Exception)
182 e = ((InvocationTargetException) e).getTargetException();
183 out.startReply();
184 out.writeFault("ServiceException", e.getMessage(), e);
185 out.completeReply();
186 return;
187 }
188
189 out.startReply();
190
191 out.writeObject(result);
192
193 out.completeReply();
194 }
195 }