package com.mobilesorcery.sdk.capabilities.core; import java.util.ArrayList; import java.util.Arrays; import java.util.HashSet; import java.util.List; import com.mobilesorcery.sdk.core.MoSyncProject; public class CompoundChangeRequest extends AbstractChangeRequest { private List<IChangeRequest> changeRequests; private HashSet<IChangeRequest> changeRequestsToApply; private String message; public CompoundChangeRequest(MoSyncProject project, List<IChangeRequest> changeRequests) { super(project); this.changeRequests = changeRequests; changeRequestsToApply = new HashSet<IChangeRequest>(); changeRequestsToApply.addAll(changeRequests); for (IChangeRequest changeRequest : changeRequests) { setThisAsParent(changeRequest); } } private void setThisAsParent(IChangeRequest changeRequest) { if (changeRequest instanceof AbstractChangeRequest) { ((AbstractChangeRequest) changeRequest).setParent(this); setShouldApply(changeRequest, ((AbstractChangeRequest) changeRequest).getPreferredApplyState()); } } public CompoundChangeRequest(String message, MoSyncProject project, List<IChangeRequest> changeRequests) { this(project, changeRequests); setMessage(message); } public CompoundChangeRequest(String message, MoSyncProject project) { this(message, project, new ArrayList<IChangeRequest>()); } public void addChangeRequest(IChangeRequest changeRequest) { changeRequests.add(changeRequest); setThisAsParent(changeRequest); } public void setMessage(String message) { this.message = message; } public String getMessage() { return message; } public void apply() { for (IChangeRequest changeRequest : changeRequests) { if (shouldApply(changeRequest)) { changeRequest.apply(); } } } public void setShouldApply(IChangeRequest changeRequest, boolean shouldApply) { if (shouldApply) { changeRequestsToApply.add(changeRequest); } else { changeRequestsToApply.remove(changeRequest); } } public void setAllShouldApply(boolean shouldApply, boolean recursive) { for (IChangeRequest changeRequest : changeRequests) { setShouldApply(changeRequest, shouldApply); if (recursive && changeRequest instanceof CompoundChangeRequest) { ((CompoundChangeRequest) changeRequest).setAllShouldApply(shouldApply, recursive); } } } public boolean shouldApply(IChangeRequest changeRequest) { return changeRequestsToApply.contains(changeRequest); } public IChangeRequest[] getChangeRequests() { return changeRequests.toArray(new IChangeRequest[0]); } public String toString() { return getMessage(); } }