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;
}
}