View Javadoc

1   /*
2    * Copyright (c) 1998-2002 The Jgroup Team.
3    *
4    * This program is free software; you can redistribute it and/or modify
5    * it under the terms of the GNU Lesser General Public License version 2 as
6    * published by the Free Software Foundation.
7    *
8    * This program is distributed in the hope that it will be useful,
9    * but WITHOUT ANY WARRANTY; without even the implied warranty of
10   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11   * GNU Lesser General Public License for more details.
12   *
13   * You should have received a copy of the GNU Lesser General Public License
14   * along with this program; if not, write to the Free Software
15   * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
16   *
17   */
18  
19  package jgroup.relacs.registry;
20  
21  import java.io.Externalizable;
22  import java.io.IOException;
23  import java.io.ObjectInput;
24  import java.io.ObjectOutput;
25  
26  import jgroup.core.IID;
27  import jgroup.core.registry.DependableRegistry.RegistryEntry;
28  import jgroup.relacs.types.IIDImpl;
29  import jgroup.util.OrderedList;
30  
31  /**
32   *  Objects of this class are used to maintain a set of bindings
33   *  associated to one service name. <p>
34   *
35   *  FIXME HEIN Oct 5, 2002: Currently it extends the OrderedList
36   *  class; we should avoid to use OrderedList and use hash tables
37   *  instead; no need for ordering.  In this sense, the correct name
38   *  for the class should be just Binding.
39   *
40   *  @author Alberto Montresor
41   *  @since  Jgroup 0.4
42   */
43  public final class BindingList
44    extends OrderedList
45    implements Externalizable
46  {
47  
48    ////////////////////////////////////////////////////////////////////////////////////////////
49    // Fields
50    ////////////////////////////////////////////////////////////////////////////////////////////
51  
52    private static final long serialVersionUID = -8269573883688508547L;
53  
54    /** The name of the service of this binding */
55    String servicename;
56    
57    /** The remote reference entry of the replica of this binding */
58    RegistryEntry entry;
59    
60    /** The implementation class associated to this binding */
61    Class serverClass;
62    
63    /** Timestamp for this node */
64    long timestamp;
65    
66    /** Leasetime for this node */
67    long leasetime;
68    
69    /** IID for this node */
70    IID iid;
71  
72  
73    ////////////////////////////////////////////////////////////////////////////////////////////
74    // Constructors
75    ////////////////////////////////////////////////////////////////////////////////////////////
76  
77    /**
78     *  Empty constructor needed for construction of an empty
79     *  <code>OrderedList</code> list.  Also needed for externalization.
80     */
81    public BindingList() { }
82  
83  
84    /**
85     *  Construct a new binding between a service name and a remote
86     *  object. Additional information are a unique numeric identifier
87     *  for the binding, created progressively by the server to which
88     *  this binding is associated.
89     * 
90     *  @param servicename 
91     *    the string identifier of the service
92     *  @param entry 
93     *    the remote reference entry of the replica of this binding
94     *  @param serverClass
95     *    the implementation class associated to this binding
96     *  @param iid
97     *    the binding identifier for this replica
98     */
99    BindingList(String servicename, RegistryEntry entry,
100               Class serverClass, IID iid)
101   {
102     this(servicename, entry, serverClass, iid, -1);
103   }
104 
105 
106   /**
107    *  Construct a new binding between a service name and a remote
108    *  object. Additional information are a unique numeric identifier
109    *  for the binding, created progressively by the server to which
110    *  this binding is associated.
111    * 
112    *  This constructor is used in conjunction with the LeaseLayer.
113    * 
114    *  @param servicename 
115    *    the string identifier of the service
116    *  @param entry
117    *    the remote reference entry of the replica of this binding
118    *  @param serverClass
119    *    the implementation class associated to this binding
120    *  @param iid
121    *    the binding identifier for this replica       
122    *  @param leasetime
123    *    the leasetime associated with this BindingList
124    */ 
125   BindingList(String servicename, RegistryEntry entry,
126               Class serverClass, IID iid, long leasetime)
127   {
128     // The key is a numeric progressive identifier of the binding.
129     this.key          = iid.getCounter();
130     this.servicename  = servicename;
131     this.entry        = entry;
132     this.serverClass  = serverClass;
133     this.timestamp    = System.currentTimeMillis();
134     this.leasetime    = leasetime;
135     this.iid          = iid;
136   }
137 
138 
139   ////////////////////////////////////////////////////////////////////////////////////////////
140   // Object methods
141   ////////////////////////////////////////////////////////////////////////////////////////////
142 
143   /**
144    *  Returns a string representation of this object
145    */
146   public String toString()
147   {
148     StringBuilder buf = new StringBuilder();
149     buf.append("key: ");
150     buf.append(key);
151     buf.append(", service: ");
152     buf.append(servicename);
153 //    buf.append(", entry: ");
154 //    buf.append(entry);
155 //    buf.append(", class: ");
156 //    buf.append(serverClass.getName());
157     return buf.toString();
158   }
159 
160 
161   ////////////////////////////////////////////////////////////////////////////////////////////
162   // Externalization
163   ////////////////////////////////////////////////////////////////////////////////////////////
164 
165   /**
166    *  Marshals the content of this object to the specified output stream.
167    * 
168    *  @param out the stream to be written
169    */
170   public void writeExternal(ObjectOutput out)
171     throws IOException
172   {
173     out.writeInt(key);
174     out.writeUTF(servicename);
175     out.writeObject(entry);
176     out.writeObject(serverClass);
177     out.writeLong(leasetime);
178     /*
179      * Compute the remaining time of the lease for this server
180      * (i.e. the delta time) and send this to the other registry
181      * replicas.
182      */
183     out.writeLong(System.currentTimeMillis() - timestamp);
184     iid.writeExternal(out);
185   }
186 
187   /**
188    *  Restores the content of this object from the marshalled data contained
189    *  in the specified input stream.
190    * 
191    *  @param in the stream to be read
192    */
193   public void readExternal(ObjectInput in)
194     throws IOException, ClassNotFoundException
195   {
196     key         = in.readInt();
197     servicename = in.readUTF();
198     entry       = (RegistryEntry) in.readObject();
199     serverClass = (Class) in.readObject();
200     leasetime   = in.readLong();
201     /*
202      * Compute a new timestamp for this server as the delta time plus
203      * the current time.  That is, we will give the server a little
204      * extra time (the communicatio delay) to perform the refresh.
205      */
206     timestamp   = in.readLong() + System.currentTimeMillis();
207     iid = new IIDImpl();
208     iid.readExternal(in);
209   }
210 
211 } // END BindingList