KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > objectstyle > cayenne > distribution > HessianConnector


1 /* ====================================================================
2  *
3  * The ObjectStyle Group Software License, version 1.1
4  * ObjectStyle Group - http://objectstyle.org/
5  *
6  * Copyright (c) 2002-2005, Andrei (Andrus) Adamchik and individual authors
7  * of the software. All rights reserved.
8  *
9  * Redistribution and use in source and binary forms, with or without
10  * modification, are permitted provided that the following conditions
11  * are met:
12  *
13  * 1. Redistributions of source code must retain the above copyright
14  * notice, this list of conditions and the following disclaimer.
15  *
16  * 2. Redistributions in binary form must reproduce the above copyright
17  * notice, this list of conditions and the following disclaimer in
18  * the documentation and/or other materials provided with the
19  * distribution.
20  *
21  * 3. The end-user documentation included with the redistribution, if any,
22  * must include the following acknowlegement:
23  * "This product includes software developed by independent contributors
24  * and hosted on ObjectStyle Group web site (http://objectstyle.org/)."
25  * Alternately, this acknowlegement may appear in the software itself,
26  * if and wherever such third-party acknowlegements normally appear.
27  *
28  * 4. The names "ObjectStyle Group" and "Cayenne" must not be used to endorse
29  * or promote products derived from this software without prior written
30  * permission. For written permission, email
31  * "andrus at objectstyle dot org".
32  *
33  * 5. Products derived from this software may not be called "ObjectStyle"
34  * or "Cayenne", nor may "ObjectStyle" or "Cayenne" appear in their
35  * names without prior written permission.
36  *
37  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
38  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
39  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
40  * DISCLAIMED. IN NO EVENT SHALL THE OBJECTSTYLE GROUP OR
41  * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
42  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
43  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
44  * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
45  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
46  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
47  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
48  * SUCH DAMAGE.
49  * ====================================================================
50  *
51  * This software consists of voluntary contributions made by many
52  * individuals and hosted on ObjectStyle Group web site. For more
53  * information on the ObjectStyle Group, please see
54  * <http://objectstyle.org/>.
55  */

56 package org.objectstyle.cayenne.distribution;
57
58 import org.objectstyle.cayenne.client.CayenneClientException;
59 import org.objectstyle.cayenne.util.Util;
60
61 import com.caucho.hessian.client.HessianProxyFactory;
62 import com.caucho.hessian.client.HessianRuntimeException;
63 import com.caucho.hessian.io.HessianProtocolException;
64
65 /**
66  * A CayenneConnector that establishes connection to a remotely deployed HessianService.
67  * It uses Hessian binary web service protocol working over HTTP. For more info on Hessian
68  * see http://www.caucho.com/resin-3.0/protocols/hessian.xtp
69  *
70  * @since 1.2
71  * @author Andrus Adamchik
72  */

73 public class HessianConnector implements CayenneConnector {
74
75     protected String JavaDoc url;
76     protected String JavaDoc userName;
77     protected String JavaDoc password;
78     protected String JavaDoc sessionId;
79
80     protected HessianService service;
81
82     public HessianConnector(String JavaDoc url, String JavaDoc userName, String JavaDoc password) {
83         this.url = url;
84         this.userName = userName;
85         this.password = password;
86     }
87
88     /**
89      * Establishes a session with remote service.
90      */

91     public void connect() throws CayenneClientException {
92         // get proxy...
93
try {
94             this.service = (HessianService) new HessianProxyFactory()
95                     .create(HessianService.class, url);
96         }
97         catch (Throwable JavaDoc th) {
98             th = unwindThrowable(th);
99             String JavaDoc message = buildExceptionMessage("URL error", th);
100             throw new CayenneClientException(message, th);
101         }
102
103         // create server session...
104
try {
105             this.sessionId = service.establishSession(userName, password);
106         }
107         catch (Throwable JavaDoc th) {
108             th = unwindThrowable(th);
109             String JavaDoc message = buildExceptionMessage("Error establishing remote session",
110                     th);
111             throw new CayenneClientException(message, th);
112         }
113     }
114
115     public Object JavaDoc sendMessage(ClientMessage message) throws CayenneClientException {
116         // for now only support session-based communications...
117
if (sessionId == null) {
118             throw new CayenneClientException("Not connected, can't call 'invokeRemote'.");
119         }
120
121         try {
122             return service.processMessage(sessionId, message);
123         }
124         catch (Throwable JavaDoc th) {
125             th = unwindThrowable(th);
126             String JavaDoc errorMessage = buildExceptionMessage("Remote error", th);
127             throw new CayenneClientException(errorMessage, th);
128         }
129     }
130
131     protected String JavaDoc buildExceptionMessage(String JavaDoc message, Throwable JavaDoc th) {
132
133         StringBuffer JavaDoc buffer = new StringBuffer JavaDoc(message);
134         buffer.append(". URL - ").append(url);
135
136         String JavaDoc thMessage = th.getMessage();
137         if (!Util.isEmptyString(thMessage)) {
138             buffer.append("; CAUSE - ").append(thMessage);
139         }
140
141         return buffer.toString();
142     }
143
144     /**
145      * Utility method to get exception cause. Implements special handling of Hessian
146      * exceptions.
147      */

148     protected Throwable JavaDoc unwindThrowable(Throwable JavaDoc th) {
149         if (th instanceof HessianProtocolException) {
150             Throwable JavaDoc cause = ((HessianProtocolException) th).getRootCause();
151
152             if (cause != null) {
153                 return unwindThrowable(cause);
154             }
155         }
156         else if (th instanceof HessianRuntimeException) {
157             Throwable JavaDoc cause = ((HessianRuntimeException) th).getRootCause();
158
159             if (cause != null) {
160                 return unwindThrowable(cause);
161             }
162         }
163
164         return Util.unwindException(th);
165     }
166 }
Popular Tags