// This software is released into the Public Domain. See copying.txt for details.
package org.openstreetmap.osmosis.apidb.v0_6.impl;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.StringTokenizer;
/**
* Contains the state to be remembered between replication invocations. This state ensures that no
* data is missed during replication, and none is repeated.
*/
public class ReplicationState extends org.openstreetmap.osmosis.replication.common.ReplicationState {
private long txnMax;
private long txnMaxQueried;
private List<Long> txnActive;
private List<Long> txnReady;
/**
* Creates a new instance with all values set to defaults.
*/
public ReplicationState() {
super();
this.txnMax = 0;
this.txnMaxQueried = 0;
this.txnActive = new ArrayList<Long>();
this.txnReady = new ArrayList<Long>();
}
/**
* Creates a new instance.
*
* @param txnMax
* The maximum transaction id in the database.
* @param txnMaxQueried
* The maximum transaction id currently replicated from the database.
* @param txnActive
* The currently active transaction ids.
* @param txnReady
* The previously active transaction ids that can now be queried.
* @param timestamp
* The maximum timestamp of data currently read from the database.
* @param sequenceNumber
* The replication sequence number.
*/
public ReplicationState(long txnMax, long txnMaxQueried, List<Long> txnActive, List<Long> txnReady,
Date timestamp, long sequenceNumber) {
super(timestamp, sequenceNumber);
this.txnMax = txnMax;
this.txnMaxQueried = txnMaxQueried;
this.txnActive = new ArrayList<Long>(txnActive);
this.txnReady = new ArrayList<Long>(txnReady);
}
/**
* Creates a new instance.
*
* @param properties
* The properties to load state from.
*/
public ReplicationState(Map<String, String> properties) {
load(properties);
}
/**
* Loads all state from the provided properties object.
*
* @param properties
* The properties to be read.
*/
public void load(Map<String, String> properties) {
super.load(properties);
txnMax = Long.parseLong(properties.get("txnMax"));
txnMaxQueried = Long.parseLong(properties.get("txnMaxQueried"));
txnActive = fromString(properties.get("txnActiveList"));
txnReady = fromString(properties.get("txnReadyList"));
}
@Override
public void store(Map<String, String> properties) {
super.store(properties);
properties.put("txnMax", Long.toString(txnMax));
properties.put("txnMaxQueried", Long.toString(txnMaxQueried));
properties.put("txnActiveList", toString(txnActive));
properties.put("txnReadyList", toString(txnReady));
}
@Override
public Map<String, String> store() {
Map<String, String> properties = new HashMap<String, String>();
store(properties);
return properties;
}
private String toString(List<Long> values) {
StringBuilder buffer;
buffer = new StringBuilder();
for (long value : values) {
if (buffer.length() > 0) {
buffer.append(',');
}
buffer.append(value);
}
return buffer.toString();
}
private List<Long> fromString(String values) {
StringTokenizer tokens;
List<Long> result;
tokens = new StringTokenizer(values, ",");
result = new ArrayList<Long>();
while (tokens.hasMoreTokens()) {
result.add(Long.parseLong(tokens.nextToken()));
}
return result;
}
/**
* Gets the maximum transaction id in the database.
*
* @return The transaction id.
*/
public long getTxnMax() {
return txnMax;
}
/**
* Sets the maximum transaction id in the database.
*
* @param txnMax
* The transaction id.
*/
public void setTxnMax(long txnMax) {
this.txnMax = txnMax;
}
/**
* Gets the maximum transaction id currently replicated from the database.
*
* @return The transaction id.
*/
public long getTxnMaxQueried() {
return txnMaxQueried;
}
/**
* Sets the maximum transaction id currently replicated from the database.
*
* @param txnMaxQueried
* The transaction id.
*/
public void setTxnMaxQueried(long txnMaxQueried) {
this.txnMaxQueried = txnMaxQueried;
}
/**
* Gets the currently active transaction ids. These cannot be replicated until they have
* committed.
*
* @return The list of transaction ids.
*/
public List<Long> getTxnActive() {
return txnActive;
}
/**
* Gets the previously active transaction ids that can now be queried.
*
* @return The list of transaction ids.
*/
public List<Long> getTxnReady() {
return txnReady;
}
/**
* {@inheritDoc}
*/
@Override
public boolean equals(Object obj) {
boolean result;
if (obj instanceof ReplicationState) {
ReplicationState compareState = (ReplicationState) obj;
if (super.equals(obj)
&& txnMax == compareState.txnMax
&& txnMaxQueried == compareState.txnMaxQueried
&& txnActive.equals(compareState.txnActive)
&& txnReady.equals(compareState.txnReady)) {
result = true;
} else {
result = false;
}
} else {
result = false;
}
return result;
}
@Override
public int hashCode() {
return super.hashCode() + (int) txnMax + (int) txnMaxQueried;
}
@Override
public String toString() {
return "ReplicationState(txnMax=" + txnMax + ", txnMaxQueried=" + txnMaxQueried + ", txnActive=" + txnActive
+ ", txnReady=" + txnReady + ", timestamp=" + getTimestamp() + ", sequenceNumber="
+ getSequenceNumber() + ")";
}
}