package net.tomp2p.message;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import net.tomp2p.peers.Number160;
import net.tomp2p.peers.Number480;
import net.tomp2p.storage.Data;
import net.tomp2p.utils.Utils;
public class DataMap {
private final Map<Number480, Data> dataMap;
private final Map<Number160, Data> dataMapConvert;
private final Number160 locationKey;
private final Number160 domainKey;
public DataMap(final Map<Number480, Data> dataMap) {
this.dataMap = dataMap;
this.dataMapConvert = null;
this.locationKey = null;
this.domainKey = null;
}
public DataMap(final Number160 locationKey, final Number160 domainKey,
final Map<Number160, Data> dataMapConvert) {
this.dataMap = null;
this.dataMapConvert = dataMapConvert;
this.locationKey = locationKey;
this.domainKey = domainKey;
}
public Map<Number480, Data> dataMap() {
return dataMap;
}
public Map<Number160, Data> dataMapConvert() {
return dataMapConvert;
}
public Number160 locationKey() {
return locationKey;
}
public Number160 domainKey() {
return domainKey;
}
/**
* @return The size of either the datamap with the number480 as key, or datamap with the number160 as key
*/
public int size() {
if (dataMap != null) {
return dataMap.size();
} else if (dataMapConvert != null) {
return dataMapConvert.size();
}
return 0;
}
/**
* @return True if we have number160 stored and we need to add the location and domain key
*/
public boolean isConvert() {
return dataMapConvert != null;
}
@Override
public boolean equals(final Object obj) {
if (!(obj instanceof DataMap)) {
return false;
}
if (obj == this) {
return true;
}
DataMap d = (DataMap) obj;
final Map<Number480, Data> dataMap2 = convert(this);
final Map<Number480, Data> dataMap3 = convert(d);
boolean test1 = Utils.isSameSets(dataMap2.keySet(), dataMap3.keySet());
boolean test2 = Utils.isSameSets(dataMap2.values(), dataMap3.values());
return test1 && test2;
}
public Map<Number480, Data> convertToMap480() {
return convert(this);
}
private static Map<Number480, Data> convert(final DataMap d) {
final Map<Number480, Data> dataMap3;
if (d.dataMapConvert != null) {
dataMap3 = new HashMap<Number480, Data>(d.dataMapConvert.size());
for (Map.Entry<Number160, Data> entry : d.dataMapConvert.entrySet()) {
dataMap3.put(new Number480(d.locationKey, d.domainKey, entry.getKey()), entry.getValue());
}
} else {
dataMap3 = d.dataMap;
}
return dataMap3;
}
}