KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > objectstyle > cayenne > service > HessianServiceHandler


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.service;
57
58 import java.util.Collections JavaDoc;
59 import java.util.HashMap JavaDoc;
60 import java.util.Map JavaDoc;
61
62 import javax.servlet.ServletConfig JavaDoc;
63 import javax.servlet.ServletException JavaDoc;
64
65 import org.apache.log4j.Logger;
66 import org.objectstyle.cayenne.CayenneRuntimeException;
67 import org.objectstyle.cayenne.access.DataDomain;
68 import org.objectstyle.cayenne.conf.Configuration;
69 import org.objectstyle.cayenne.conf.DefaultConfiguration;
70 import org.objectstyle.cayenne.distribution.ClientMessage;
71 import org.objectstyle.cayenne.distribution.ClientMessageHandler;
72 import org.objectstyle.cayenne.distribution.HessianService;
73 import org.objectstyle.cayenne.util.IDUtil;
74 import org.objectstyle.cayenne.util.Util;
75
76 import com.caucho.services.server.Service;
77
78 /**
79  * A default implementation of HessianService service protocol. Supports client sessions.
80  * For more info on Hessian see http://www.caucho.com/resin-3.0/protocols/hessian.xtp. See
81  * {@link org.objectstyle.cayenne.distribution.HessianService}for deployment
82  * configuration examples.
83  *
84  * @since 1.2
85  * @author Andrus Adamchik
86  */

87 public class HessianServiceHandler implements HessianService, Service {
88
89     private static final Logger logObj = Logger.getLogger(HessianServiceHandler.class);
90
91     protected Map JavaDoc commandHandlers;
92     protected DataDomain domain;
93
94     /**
95      * Hessian service lifecycle method that performs Cayenne initialization.
96      */

97     public void init(ServletConfig JavaDoc config) throws ServletException JavaDoc {
98
99         // start Cayenne service
100
logObj.debug("CayenneHessianService is starting");
101
102         Configuration cayenneConfig = new DefaultConfiguration(
103                 Configuration.DEFAULT_DOMAIN_FILE);
104
105         try {
106             cayenneConfig.initialize();
107             cayenneConfig.didInitialize();
108         }
109         catch (Exception JavaDoc ex) {
110             throw new ServletException JavaDoc("Error starting Cayenne", ex);
111         }
112
113         // TODO: handle multiple domains..
114
this.domain = cayenneConfig.getDomain();
115         this.commandHandlers = Collections.synchronizedMap(new HashMap JavaDoc());
116         logObj.debug("CayenneHessianService started");
117     }
118
119     /**
120      * Hessian Service lifecycle method.
121      */

122     public void destroy() {
123         logObj.debug("CayenneHessianService destroyed");
124         this.commandHandlers = null;
125     }
126
127     public String JavaDoc establishSession(String JavaDoc userName, String JavaDoc password) {
128         logObj.debug("CayenneHessianService - session requested by client");
129
130         // TODO: for now ignore user name/password...
131

132         String JavaDoc id = makeId();
133
134         synchronized (commandHandlers) {
135             commandHandlers.put(id, new ServerObjectContext(domain));
136         }
137
138         logObj.debug("CayenneHessianService - established client session: " + id);
139         return id;
140     }
141
142     public Object JavaDoc processMessage(String JavaDoc sessionId, ClientMessage command)
143             throws Throwable JavaDoc {
144
145         logObj.debug("processMessage, sessionId: " + sessionId);
146
147         ClientMessageHandler handler;
148         synchronized (commandHandlers) {
149             handler = (ClientMessageHandler) commandHandlers.get(sessionId);
150         }
151
152         // TODO: expire sessions...
153
if (handler == null) {
154             throw new CayenneRuntimeException("Invalid sessionId: " + sessionId);
155         }
156
157         // intercept and log exceptions
158
try {
159             return command.onReceive(handler);
160         }
161         catch (Throwable JavaDoc th) {
162             logObj.debug("error processing message", Util.unwindException(th));
163             throw th;
164         }
165     }
166
167     private String JavaDoc makeId() {
168         byte[] bytes = IDUtil.pseudoUniqueByteSequence(32);
169
170         // use safe encoding... not that it matters to Hessian, but it is more readable
171
// this way..
172
final String JavaDoc digits = "0123456789ABCDEF";
173
174         StringBuffer JavaDoc buffer = new StringBuffer JavaDoc(bytes.length * 2);
175
176         for (int i = 0; i < bytes.length; i++) {
177             byte b = bytes[i];
178             buffer.append(digits.charAt((b >>> 4) & 0xF));
179             buffer.append(digits.charAt(b & 0xF));
180         }
181
182         return buffer.toString();
183     }
184 }
Popular Tags