View Javadoc

1   /*
2    * Copyright (c) 2005 The University of Reading
3    * All rights reserved.
4    *
5    * Redistribution and use in source and binary forms, with or without
6    * modification, are permitted provided that the following conditions
7    * are met:
8    * 1. Redistributions of source code must retain the above copyright
9    *    notice, this list of conditions and the following disclaimer.
10   * 2. Redistributions in binary form must reproduce the above copyright
11   *    notice, this list of conditions and the following disclaimer in the
12   *    documentation and/or other materials provided with the distribution.
13   * 3. Neither the name of the University of Reading, nor the names of the
14   *    authors or contributors may be used to endorse or promote products
15   *    derived from this software without specific prior written permission.
16   * 
17   * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18   * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20   * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21   * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22   * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23   * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24   * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25   * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26   * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27   */
28  
29  package uk.ac.rdg.resc.jstyx.client;
30  
31  import uk.ac.rdg.resc.jstyx.messages.StyxMessage;
32  import uk.ac.rdg.resc.jstyx.messages.RerrorMessage;
33  import uk.ac.rdg.resc.jstyx.StyxException;
34  
35  /***
36   * Class that implements a method that waits until a reply arrives, then
37   * returns the reply.
38   *
39   * @author Jon Blower
40   * $Revision: 302 $
41   * $Date: 2005-06-27 18:17:16 +0100 (Mon, 27 Jun 2005) $
42   * $Log$
43   * Revision 1.3  2005/06/27 17:17:16  jonblower
44   * Changed MessageCallback to pass Tmessage as parameter, rather than storing in the instance
45   *
46   * Revision 1.2  2005/02/21 18:09:43  jonblower
47   * *** empty log message ***
48   *
49   * Revision 1.1.1.1  2005/02/16 18:58:20  jonblower
50   * Initial import
51   *
52   */
53  class StyxReplyCallback extends MessageCallback
54  {
55      private StyxMessage reply; // The reply from a Styx server (i.e. an RMessage)
56      private String errorMsg;   // Non-null if an error has occurred
57      
58      /***
59       * Creates a new instance of StyxReplyCallback
60       */
61      public StyxReplyCallback()
62      {
63          this.reply = null;
64          this.errorMsg = null;
65      }
66      
67      /***
68       * Waits for the reply to arrive, then returns it
69       * @return the RMessage corresponding to the TMessage that was sent
70       * @throws StyxException if an error is returned from the server
71       */
72      public synchronized StyxMessage getReply() throws StyxException
73      {
74          while (reply == null && errorMsg == null)
75          {
76              try
77              {
78                  // wait for Producer to put value
79                  wait();
80              }
81              catch (InterruptedException e)
82              {
83              }
84          }
85          if (errorMsg != null)
86          {
87              throw new StyxException(errorMsg);
88          }
89          return reply;
90      }
91      
92      /***
93       * Called when a valid reply (i.e. not an Rerror message) arrives from
94       * the server.
95       */
96      public synchronized void replyArrived(StyxMessage rMessage, StyxMessage tMessage)
97      {
98          reply = rMessage;
99          notifyAll();
100     }
101     
102     /***
103      * Called when an error occurs (either an Rerror message was returned by
104      * the server, the reply was of an unexpected type, or something else - 
105      * see MessageCallback).
106      */
107     public synchronized void error(String message, StyxMessage tMessage)
108     {
109         errorMsg = message;
110         notifyAll();
111     }
112     
113 }