package net.jforum.entities; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import net.jforum.view.forum.common.PostCommon; /** * An helper class that holds changes made to the pool. * * @author Rafael Steil * @version $Id: PollChanges.java,v 1.4 2007/04/24 02:19:46 rafaelsteil Exp $ */ public class PollChanges { private List deletedOptions = new ArrayList(); private List newOptions = new ArrayList(); private List changedOptions = new ArrayList(); private boolean hasChanges; private Poll first; private Poll second; /** * @param first The "complete", most recent poll version. Usually the one * that's in the database. * @param second The poll to compare with. It usually will be a poll filled * by {@link PostCommon#fillPostFromRequest()}, so matches will be done againts the * existing poll and the data comming from the server. */ public PollChanges(Poll first, Poll second) { this.first = first; this.second = second; } public void addChangedOption(PollOption option) { this.changedOptions.add(option); this.hasChanges = true; } public List getChangedOptions() { return this.changedOptions; } public void addDeletedOption(PollOption option) { this.deletedOptions.add(option); this.hasChanges = true; } public List getDeletedOptions() { return this.deletedOptions; } public void addNewOption(PollOption option) { this.newOptions.add(option); this.hasChanges = true; } public List getNewOptions() { return this.newOptions; } public boolean hasChanges() { this.searchForChanges(); return this.hasChanges; } private void searchForChanges() { if (first == null || second == null) { return; } boolean isSame = first.getLabel().equals(second.getLabel()); isSame &= first.getLength() == second.getLength(); this.hasChanges = !isSame; List firstOptions = first.getOptions(); List secondOptions = second.getOptions(); // Search for changes in existing options for (Iterator iter = firstOptions.iterator(); iter.hasNext(); ) { PollOption option = (PollOption)iter.next(); PollOption changed = this.findOptionById(option.getId(), secondOptions); if (changed != null && !option.getText().equals(changed.getText())) { this.addChangedOption(changed); } else if (changed == null) { this.addDeletedOption(option); } } // Check if the incoming poll added options for (Iterator iter = secondOptions.iterator(); iter.hasNext(); ) { PollOption option = (PollOption)iter.next(); if (this.findOptionById(option.getId(), firstOptions) == null) { this.addNewOption(option); } } } private PollOption findOptionById(int id, List options) { for (Iterator iter = options.iterator(); iter.hasNext(); ) { PollOption o = (PollOption)iter.next(); if (o.getId() == id) { return o; } } return null; } }