/** * 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 crdt; import crdt.simulator.TraceOperation; import java.io.Serializable; import java.util.LinkedList; /** * * * @author urso, Stephane Martin * * A message that contains several other one messages. * @see OperationBasedOneMessage */ public final class OperationBasedMessagesBag implements OperationBasedMessage,Cloneable, Serializable { private LinkedList<OperationBasedOneMessage> ops = new LinkedList<OperationBasedOneMessage>(); /*TraceOperation traceOperation;*/ OperationBasedMessagesBag(OperationBasedMessage aThis, OperationBasedMessage msg) { addMessage(aThis); addMessage(msg); } public OperationBasedMessagesBag() { } public void addMessage(OperationBasedMessage mess){ if (mess==null) return; if (mess instanceof OperationBasedMessagesBag){ ops.addAll(((OperationBasedMessagesBag)mess).getOps()); }else{ ops.add((OperationBasedOneMessage )mess); } } /** * return all messages operations * @return */ public LinkedList<OperationBasedOneMessage> getOps() { return ops; } /** * Concatenation of message. * @param msg * @return */ @Override public CRDTMessage concat(CRDTMessage msg) { OperationBasedMessagesBag ret=new OperationBasedMessagesBag(); ret.addMessage(this); ret.addMessage((OperationBasedMessage)msg); return ret; } /** * * @return cloned operationBased message */ @Override public OperationBasedMessagesBag clone() { OperationBasedMessagesBag clone = new OperationBasedMessagesBag(); for (OperationBasedOneMessage o : ops) { clone.ops.add((OperationBasedOneMessage)o.clone()); } return clone; } /** * * @return a representation of message */ @Override public String toString() { StringBuilder s = new StringBuilder(); s.append("BAG:"); for (OperationBasedOneMessage m : ops) { s.append(" + ").append(m.toString()); } return s.toString(); } //abstract protected String toString(); //abstract protected OperationBasedOneMessage clone(); /** * * @return number of messages. */ @Override public int size() { return ops.size(); } @Override public void execute(CRDT cmrdt){ for (OperationBasedOneMessage o : ops) { cmrdt.applyOneRemote(o); } } /* @Override public void setTraceOperation(TraceOperation traceOperation) { this.traceOperation=traceOperation; } @Override public TraceOperation getTraceOperation() { return traceOperation; }*/ @Override public boolean equals(Object obj) { if (obj == null) { return false; } if (getClass() != obj.getClass()) { return false; } final OperationBasedMessagesBag other = (OperationBasedMessagesBag) obj; if (this.ops != other.ops && (this.ops == null || !this.ops.equals(other.ops))) { return false; } return true; } @Override public int hashCode() { int hash = 5; hash = 37 * hash + (this.ops != null ? this.ops.hashCode() : 0); return hash; } }