/** * Replication Benchmarker * https://github.com/score-team/replication-benchmarker/ Copyright (C) 2013 * LORIA / Inria / SCORE Team * * This program is free software: you can redistribute it and/or modify it under * the terms of the GNU General Public License as published by the Free Software * Foundation, either version 3 of the License, or (at your option) any later * version. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more * details. * * You should have received a copy of the GNU General Public License along with * this program. If not, see <http://www.gnu.org/licenses/>. */ package jbenchmarker.woot.wooth; import crdt.CRDT; import crdt.Operation; import crdt.simulator.IncorrectTraceException; import java.util.ArrayList; import java.util.List; import jbenchmarker.core.Document; import jbenchmarker.core.MergeAlgorithm; import jbenchmarker.core.SequenceOperation; import jbenchmarker.woot.WootIdentifier; import jbenchmarker.woot.WootOperation; /** * * @author urso */ public class WootHashMerge<T> extends MergeAlgorithm { // logical clock public WootHashMerge(Document doc, int r) { super(doc, r); } @Override protected void integrateRemote(crdt.Operation message) { getDoc().apply(message); } @Override protected List<Operation> localDelete(SequenceOperation opt) throws IncorrectTraceException { List<Operation> lop = new ArrayList<Operation>(); WootHashDocument wdoc = this.getDoc(); int p = opt.getPosition(); LinkedNode<T> w = wdoc.getVisible(p); for (int i = 0; i < opt.getLenghOfADel(); i++) { WootOperation wop = wdoc.delete(opt, w.getId()); lop.add(wop); wdoc.apply(wop); if (i + 1 < opt.getLenghOfADel()) { w = wdoc.nextVisible(w); } } return lop; } @Override protected List<Operation> localInsert(SequenceOperation opt) throws IncorrectTraceException { List<Operation> lop = new ArrayList<Operation>(); WootHashDocument wdoc = this.getDoc(); int p = opt.getPosition(); LinkedNode<T> ip = wdoc.getPrevious(p), in = wdoc.getNext(ip); WootIdentifier idp = ip.getId(), idn = in.getId(); for (int i = 0; i < opt.getContent().size(); i++) { WootOperation wop = wdoc.insert(opt, idp, idn, opt.getContent().get(i)); idp = wop.getId(); lop.add(wop); wdoc.apply(wop); } return lop; } @Override protected List<? extends Operation> localUpdate(SequenceOperation opt) throws IncorrectTraceException { return localReplace(opt); } @Override public WootHashDocument getDoc() { return (WootHashDocument) super.getDoc(); } @Override public void setReplicaNumber(int replicaNumber) { super.setReplicaNumber(replicaNumber); this.getDoc().setReplicaNumber(replicaNumber); } @Override public CRDT<String> create() { return new WootHashMerge(getDoc().create(), -1); } }