//$Id$
package org.exist.cluster.journal;
import java.util.HashMap;
import org.exist.cluster.ClusterEvent;
/**
* Manage the generation of the unique journal Id
* Created by Nicola Breda.
*
* @author Nicola Breda aka maiale
* @author David Frontini aka spider
* Date: 05-aug-2005
* Time: 18.09.08
* Revision $Revision$
*/
public class JournalIdGenerator {
public static int MAX_STORED_INDEX = 65000;
private int lastId = ClusterEvent.NO_EVENT;
private int counter = 0;
private HashMap idInUse = new HashMap();
public JournalIdGenerator(JournalManager journal, int maxItem) {
System.out.println("MAX STORE IN ID GENERATOR = " + maxItem);
lastId = journal.getMaxIdSaved();
counter = journal.getCounter();
MAX_STORED_INDEX = maxItem;
}
public synchronized int[] getNextData(String address) {
lastId = lastId + 1;
if (lastId > MAX_STORED_INDEX) {
lastId = 0;
counter++;
}
idInUse.put("" + lastId, address);
return new int[]{lastId, counter};
}
public void setLastId(int lastId) {
this.lastId = lastId;
}
public void setCounter(int counter) {
this.counter = counter;
}
public void releaseId(int id) {
idInUse.remove("" + id);
}
public synchronized void increaseId(int id, int counter) { //TODO pensare meglio questa parte -- rimane il problema della rotazione
if ((id > lastId) || (this.counter!=counter)){
lastId = id;
this.counter = counter;
}
}
public int[] getData() {
return new int[]{lastId,counter};
}
public synchronized void shiftId(int shift) {
lastId += shift;
if(lastId>MAX_STORED_INDEX){
lastId -= MAX_STORED_INDEX;
counter++;
}
}
}