KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > sapia > ubik > rmi > server > invocation > RMICommandProcessor


1 package org.sapia.ubik.rmi.server.invocation;
2
3 import org.sapia.ubik.rmi.server.*;
4 import org.sapia.ubik.rmi.server.command.CommandProcessor;
5 import org.sapia.ubik.rmi.server.command.Destination;
6 import org.sapia.ubik.rmi.server.command.ResponseQueue;
7 import org.sapia.ubik.rmi.server.command.ResponseSender;
8 import org.sapia.ubik.rmi.server.transport.RmiConnection;
9 import org.sapia.ubik.rmi.server.transport.TransportManager;
10
11 import java.io.IOException JavaDoc;
12 import java.io.ObjectInput JavaDoc;
13 import java.io.ObjectOutput JavaDoc;
14
15 import java.util.List JavaDoc;
16
17
18 /**
19  * A Ubik RMI-specific <code>CommandProcessor</code>.
20  *
21  * @author Yanick Duchesne
22  * <dl>
23  * <dt><b>Copyright:</b><dd>Copyright &#169; 2002-2003 <a HREF="http://www.sapia-oss.org">Sapia Open Source Software</a>. All Rights Reserved.</dd></dt>
24  * <dt><b>License:</b><dd>Read the license.txt file of the jar or visit the
25  * <a HREF="http://www.sapia-oss.org/license.html">license page</a> at the Sapia OSS web site</dd></dt>
26  * </dl>
27  */

28 public class RMICommandProcessor extends CommandProcessor {
29   private ResponseQueue _responses = ResponseQueue.getInstance();
30
31   /**
32    * Constructor for RMICommandProcessor.
33    */

34   public RMICommandProcessor(int maxThreads) {
35     super(maxThreads);
36     super.setResponseSender(new RMIResponseSender());
37   }
38
39   /**
40    * @see org.sapia.ubik.rmi.server.command.CommandProcessor#shutdown(long)
41    */

42   public void shutdown(long timeout) throws InterruptedException JavaDoc {
43     super.shutdown(timeout);
44     Log.warning(getClass(), "Shutting down incoming response queue");
45     ResponseQueue.getInstance().shutdown(timeout);
46     _responses.shutdown(timeout);
47   }
48
49   /*////////////////////////////////////////////////////////////////////
50                               INNER CLASSES
51   ////////////////////////////////////////////////////////////////////*/

52   static final class RMIResponseSender implements ResponseSender {
53     /**
54     * @see org.sapia.ubik.rmi.command.ResponseSender#sendResponses(Destination, List)
55     */

56     public void sendResponses(Destination dest, List JavaDoc responses) {
57       if (Log.isDebug()) {
58         Log.debug(getClass(), "Sending callback responses to " + dest);
59       }
60
61       if (responses.size() > 0) {
62         RmiConnection conn = null;
63
64         try {
65           conn = TransportManager.getConnectionsFor(dest.getServerAddress())
66                                  .acquire();
67
68           //VmId.register(dest.getVmId());
69
conn.send(new ResponseListCommand(responses), dest.getVmId(),
70             dest.getServerAddress().getTransportType());
71           conn.receive();
72         } catch (Exception JavaDoc e) {
73           Log.error(RMICommandProcessor.class, e);
74
75           if (conn != null) {
76             conn.close();
77           }
78
79           return;
80         }
81
82         if (conn != null) {
83           try {
84             TransportManager.getConnectionsFor(dest.getServerAddress()).release(conn);
85           } catch (Exception JavaDoc e) {
86             Log.error(RMICommandProcessor.class, e);
87           }
88         }
89       }
90     }
91   }
92
93   public static final class ResponseListCommand extends RMICommand {
94     private List JavaDoc _responses;
95
96     public ResponseListCommand() {
97     }
98
99     ResponseListCommand(List JavaDoc responses) {
100       _responses = responses;
101     }
102
103     /**
104      * @see org.sapia.ubik.rmi.server.command.Executable#execute()
105      */

106     public Object JavaDoc execute() throws Throwable JavaDoc {
107       if (Log.isDebug()) {
108         Log.debug(getClass(), "Receiving callbacks");
109       }
110
111       ResponseQueue.getInstance().onResponses(_responses);
112
113       return new Integer JavaDoc(0);
114     }
115
116     /**
117      * @see org.sapia.ubik.rmi.server.RMICommand#writeExternal(ObjectOutput)
118      */

119     public void writeExternal(ObjectOutput JavaDoc out) throws IOException JavaDoc {
120       super.writeExternal(out);
121       out.writeObject(_responses);
122     }
123
124     /**
125      * @see org.sapia.ubik.rmi.server.RMICommand#readExternal(ObjectInput)
126      */

127     public void readExternal(ObjectInput JavaDoc in)
128       throws IOException JavaDoc, ClassNotFoundException JavaDoc {
129       super.readExternal(in);
130       _responses = (List JavaDoc) in.readObject();
131     }
132   }
133 }
134
Popular Tags