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.messages;
30  
31  import uk.ac.rdg.resc.jstyx.StyxUtils;
32  import uk.ac.rdg.resc.jstyx.types.Qid;
33  
34  import java.util.Vector;
35  
36  /***
37   * Message returned by the server in response to a TwalkMessage
38   *
39   * @author Jon Blower
40   * $Revision: 263 $
41   * $Date: 2005-05-25 16:39:02 +0100 (Wed, 25 May 2005) $
42   * $Log$
43   * Revision 1.5  2005/05/25 15:39:02  jonblower
44   * Bug fixes
45   *
46   * Revision 1.4  2005/03/15 09:01:48  jonblower
47   * Message type now stored as short, not int
48   *
49   * Revision 1.3  2005/03/11 14:02:15  jonblower
50   * Merged MINA-Test_20059309 into main line of development
51   *
52   * Revision 1.2.2.1  2005/03/10 11:50:59  jonblower
53   * Changed to fit with MINA framework
54   *
55   * Revision 1.2  2005/02/24 07:44:43  jonblower
56   * Added getFriendlyString()
57   *
58   * Revision 1.1.1.1  2005/02/16 18:58:28  jonblower
59   * Initial import
60   *
61   */
62  public class RwalkMessage extends StyxMessage
63  {
64   
65      private Vector qids; // Vector of Qids, one for each successful walk of a path element
66      
67      /*** 
68       * Creates a new RwalkMessage 
69       * @param length The total length of the message (including all header info)
70       * @param type The type of the message (a number between 100 and 127)
71       * @param tag The tag that identifies this message
72       */
73      public RwalkMessage(int length, short type, int tag)
74      {
75          super(length, type, tag);
76          this.name = "Rwalk";
77          this.qids = new Vector(5, 2);
78      }
79      
80      public RwalkMessage(Qid[] qids)
81      {
82          this(0, (short)111, 0);
83          for (int i = 0; i < qids.length; i++)
84          {
85              this.putQid(qids[i]);
86          }
87          this.setLength();
88      }
89      
90      protected final void decodeBody(StyxBuffer buf)
91      {
92          // Read the number of successful walks
93          int numQids = buf.getUShort();
94          for (int i = 0; i < numQids; i++)
95          {
96              this.putQid(buf.getQid());
97          }
98      }
99      
100     protected final void encodeBody(StyxBuffer buf)
101     {
102         // Write the number of qids (successful walks)
103         buf.putUShort(this.qids.size());
104         // Write the qids
105         for (int i = 0; i < this.qids.size(); i++)
106         {
107             buf.putQid((Qid)this.qids.get(i));
108         }
109     }
110     
111     public void putQid(Qid qid)
112     {
113         this.qids.add(qid);
114         this.setLength();
115     }
116     
117     public Qid getQid(int index)
118     {
119         return (Qid)this.qids.get(index);
120     }
121     
122     /***
123      * Sets the correct length of this message
124      */
125     private void setLength()
126     {
127         this.length = StyxUtils.HEADER_LENGTH + 2 + (13 * this.qids.size());        
128     }
129     
130     /***
131      * @return The number of successful walks made in the file traversal
132      */
133     public int getNumSuccessfulWalks()
134     {
135         return this.qids.size();
136     }
137     
138     protected String getElements()
139     {
140         String s = ", " + this.qids.size();
141         for (int i = 0; i < this.qids.size(); i++)
142         {
143             s += ", " + this.qids.get(i);
144         }
145         return s;
146     }
147     
148     public String toFriendlyString()
149     {
150         if (this.qids.size() == 0)
151         {
152             // An Rwalk with no qids represents a successful walk of zero
153             // length; a walk which results in an error will either return
154             // Rerror or at least one qid
155             return "(fid cloned)";
156         }
157         StringBuffer s = new StringBuffer();
158         for (int i = 0; i < this.qids.size(); i++)
159         {
160             Qid qid = (Qid)this.qids.get(i);
161             s.append("(" + qid.toFriendlyString() + ") ");
162         }
163         return s.toString();
164     }
165     
166 }