/* * Copyright (c) JForum Team. All rights reserved. * * The software in this package is published under the terms of the LGPL * license a copy of which has been included with this distribution in the * license.txt file. * * The JForum Project * http://www.jforum.net */ package net.jforum.services; import java.util.ArrayList; import java.util.Date; import java.util.Iterator; import java.util.List; import net.jforum.entities.Poll; import net.jforum.entities.PollOption; import net.jforum.entities.Topic; import org.apache.commons.lang.StringUtils; import br.com.caelum.vraptor.ioc.Component; /** * @author Rafael Steil */ @Component public class PollService { public void processChanges(Poll originalPoll, List<PollOption> options) { PollChanges changes = new PollChanges(originalPoll); changes.processChanges(options); } public void associatePoll(Topic topic, List<PollOption> pollOptions) { if (topic.getPoll() == null) { return; } if (StringUtils.isEmpty(topic.getPoll().getLabel()) || pollOptions == null) { topic.setPoll(null); return; } topic.getPoll().setStartDate(new Date()); for (Iterator<PollOption> iterator = pollOptions.iterator(); iterator.hasNext();) { PollOption option = iterator.next(); if (StringUtils.isEmpty(option.getText())) { iterator.remove(); } else { option.setPoll(topic.getPoll()); } } if (pollOptions.size() == 0) { topic.setPoll(null); } else { topic.getPoll().setOptions(pollOptions); } } private class PollChanges { private Poll originalPoll; private List<PollOption> newOptions = new ArrayList<PollOption>(); public PollChanges(Poll originalPoll) { this.originalPoll = originalPoll; } public void processChanges(List<PollOption> allOptions) { this.processNewAndChangedOptions(allOptions); this.processDeletedOptions(allOptions); } private void processDeletedOptions(List<PollOption> allOptions) { for (Iterator<PollOption> iterator = this.originalPoll.getOptions().iterator(); iterator.hasNext(); ) { PollOption currentOption = iterator.next(); if (this.findOption(currentOption.getId(), allOptions) == null) { iterator.remove(); } } } private void processNewAndChangedOptions(List<PollOption> allOptions) { for (PollOption option : allOptions) { if (option.getId() == 0) { this.newOptions.add(option); option.setPoll(this.originalPoll); } else { PollOption originalOption = this.findOption(option.getId(), this.originalPoll.getOptions()); if (originalOption != null && !StringUtils.isEmpty(option.getText()) && !originalOption.getText().equals(option.getText())) { originalOption.setText(option.getText()); } } } this.originalPoll.getOptions().addAll(this.newOptions); } private PollOption findOption(int optionId, List<PollOption> options) { for (PollOption option : options) { if (option.getId() == optionId) { return option; } } return null; } } }