package com.jivesoftware.os.amza.sync.api; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; import com.google.common.base.Preconditions; import com.google.common.base.Splitter; import com.jivesoftware.os.amza.api.AmzaInterner; import com.jivesoftware.os.amza.api.partition.PartitionName; import java.nio.charset.StandardCharsets; import java.util.Iterator; /** * Created by jonathan.colt on 1/13/17. */ public class AmzaSyncPartitionTuple { public final PartitionName from; public final PartitionName to; @JsonCreator public AmzaSyncPartitionTuple(@JsonProperty("from") PartitionName from, @JsonProperty("to") PartitionName to) { Preconditions.checkNotNull(from); Preconditions.checkNotNull(to); this.from = from; this.to = to; } @Override public boolean equals(Object o) { if (this == o) { return true; } if (!(o instanceof AmzaSyncPartitionTuple)) { return false; } AmzaSyncPartitionTuple that = (AmzaSyncPartitionTuple) o; if (!from.equals(that.from)) { return false; } return to.equals(that.to); } @Override public int hashCode() { int result = from.hashCode(); result = 31 * result + to.hashCode(); return result; } public static byte[] toBytes(AmzaSyncPartitionTuple tuple) { return toKeyString(tuple).getBytes(StandardCharsets.UTF_8); } public static String toKeyString(AmzaSyncPartitionTuple tuple) { return tuple.from.toBase64() + " " + tuple.to.toBase64(); } public static AmzaSyncPartitionTuple fromBytes(byte[] bytes, int offset, AmzaInterner interner) throws InterruptedException { return fromKeyString(new String(bytes, offset, bytes.length - offset, StandardCharsets.UTF_8), interner); } public static AmzaSyncPartitionTuple fromKeyString(String key, AmzaInterner interner) throws InterruptedException { Iterable<String> fromTo = Splitter.on(' ').split(key); Iterator<String> iterator = fromTo.iterator(); PartitionName from = iterator.hasNext() ? interner.internPartitionNameBase64(iterator.next()) : null; PartitionName to = iterator.hasNext() ? interner.internPartitionNameBase64(iterator.next()) : null; return new AmzaSyncPartitionTuple(from, to); } }