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.rmi; 20 21 import jgroup.core.IID; 22 import jgroup.core.VMID; 23 import jgroup.relacs.types.IIDImpl; 24 import jgroup.relacs.types.VMIDImpl; 25 import jgroup.util.IntList; 26 27 28 /* 29 * FIXME: Not sure that having acknowledgement info piggybacked int 30 * IID is a good idea. Probably we should study some alternative 31 * design. 32 */ 33 34 /** 35 * This class is a factory for invocation identifiers. It uses a 36 * sequence number to generate unique identifiers, and keeps track of 37 * invocation identifiers for which a response has been received. This 38 * information is used to generate acknowledgement information sent to 39 * servers in order that they can remove replies from their tables. 40 * 41 * @author Alberto Montresor 42 * @since Jgroup 0.8 43 */ 44 public class IIDFactory 45 { 46 47 //////////////////////////////////////////////////////////////////////////////////////////// 48 // Fields 49 //////////////////////////////////////////////////////////////////////////////////////////// 50 51 /** Unique id generated for this factory */ 52 private VMID vmid; 53 54 /** Counter used to create unique identifiers */ 55 private int counter; 56 57 /** 58 * Set containing the identifiers of the invocations for which a 59 * reply has been received. Because all identifiers are created 60 * through this class, we may safely maintain only the sequence 61 * number of those identifiers, instead of complete <code>IID</code> 62 * objects. 63 */ 64 private IntList replies; 65 66 /** 67 * Contains the final value of the first sequence of consecutive 68 * identifiers for which a reply has been received. 69 */ 70 private int ack; 71 72 73 //////////////////////////////////////////////////////////////////////////////////////////// 74 // Constructor 75 //////////////////////////////////////////////////////////////////////////////////////////// 76 77 /** 78 * Initializes a new <code>IIDFactory</code> object by setting the 79 * sequence number to 0 and creating an empty replies list. Ack 80 * information is also set to 0. 81 */ 82 public IIDFactory() 83 { 84 vmid = VMIDImpl.getLocalVMID(); 85 counter = 0; 86 replies = new IntList(); 87 ack = 0; 88 } 89 90 91 //////////////////////////////////////////////////////////////////////////////////////////// 92 // Methods 93 //////////////////////////////////////////////////////////////////////////////////////////// 94 95 /** 96 * Creates a new invocation identifier. It increases the sequence 97 * number and constructs a new <code>IIDImpl</code> object with the 98 * new sequence number; acknowledgement information is piggybacked in 99 * the identifier. 100 */ 101 public synchronized IID getId() 102 { 103 return new IIDImpl(vmid, ++counter, ack); 104 } 105 106 /** 107 * Adds the given invocation identifier to the set of identifiers for 108 * which a reply has been received. 109 */ 110 public synchronized void addReply(IID id) 111 { 112 replies.insert(id.getCounter()); 113 ack = replies.getMaxConsecutive(); 114 if (ack < 0) 115 ack = 0; 116 } 117 118 } // END IIDFactory