KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > apache > bsf > debug > serverImpl > ObjectServer


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

55
56 package org.apache.bsf.debug.serverImpl;
57
58 import java.io.*;
59 import org.apache.bsf.util.BSFDebugManagerImpl;
60 import org.apache.bsf.debug.*;
61 import org.apache.bsf.debug.util.*;
62 import org.apache.bsf.debug.jsdi.*;
63 import org.apache.bsf.debug.meta.*;
64
65 public class ObjectServer extends SocketConnection implements Runnable JavaDoc {
66     public Dispatcher fDispatchers[];
67
68     private BSFDebugManagerImpl fDebugManager;
69     private Thread JavaDoc m_thread;
70     private boolean m_outStreamLocked = false, m_ready = false;
71     private Object JavaDoc m_outStreamLock = new Object JavaDoc(), m_readyLock = new Object JavaDoc();
72     private static GatedListener m_listener;
73
74     public ObjectServer(BSFDebugManagerImpl debugManager, int port) {
75         fDebugManager = debugManager;
76         exportSkeleton(debugManager);
77
78         if (port <= 0) port = DebugConstants.BSF_DEBUG_SERVER_PORT;
79
80         m_thread = new Thread JavaDoc(this, "JSDI Server Thread");
81         m_thread.start();
82
83         if (m_listener != null) {
84             DebugLog.stdoutPrintln("BSF Debug Listener instantiated already.",
85                                    DebugLog.BSF_LOG_L1);
86         }
87         else m_listener = new GatedListener (this, port);
88     }
89
90     public BSFDebugManagerImpl getDebugManager() {
91         return fDebugManager;
92     }
93
94     public void run() {
95         fDispatchers = new Dispatcher[4];
96         fDispatchers[0] = new DebugManagerDispatcher(this);
97         fDispatchers[1] = new JsEngineDispatcher(this);
98         fDispatchers[2] = new JsContextDispatcher(this);
99         fDispatchers[3] = new JsObjectDispatcher(this);
100
101         fStubs = new ServerStubTable(this);
102
103         // automatically export the debug manager
104
// as a skeleton.
105
this.exportSkeleton(fDebugManager);
106                 
107         while (true) {
108             synchronized(m_readyLock) {
109                 try {
110                     if (!m_ready) m_readyLock.wait();
111                 }
112                 catch (Exception JavaDoc ex) {
113                     // Hmm. Someone interrupted us, likely.
114
// We are probably not ready to listen.
115
// Go back to sleep.
116
continue;
117                 }
118                 m_ready = false;
119             }
120             listen();
121             m_listener.awake();
122         }
123     }
124
125     protected void setIOStreams(InputStream istream, OutputStream ostream,
126                                 DataInputStream distream,
127                                 DataOutputStream dostream) {
128         fInputStream = istream;
129         fOutputStream = ostream;
130         fDataInputStream = distream;
131         fDataOutputStream = dostream;
132     }
133
134     protected void awake() {
135         synchronized(m_readyLock) {
136             m_ready = true;
137             m_readyLock.notify();
138         }
139     }
140
141     protected void dispatchInvocation(ResultCell rcell)
142     throws Exception JavaDoc {
143         int selfTid,selfUid;
144         Skeleton self;
145
146         switch(rcell.classId) {
147         case DebugConstants.BSF_DEBUG_MANAGER_TID:
148             fDispatchers[0].dispatch(rcell);
149             break;
150         case DebugConstants.JS_ENGINE_TID:
151             fDispatchers[1].dispatch(rcell);
152             break;
153         case DebugConstants.JS_CONTEXT_TID:
154             fDispatchers[2].dispatch(rcell);
155             break;
156         case DebugConstants.JS_OBJECT_TID:
157             fDispatchers[3].dispatch(rcell);
158             break;
159         default:
160             throw new Error JavaDoc("Wire Protocol Format Error");
161         }
162     }
163 }
164
Popular Tags