/* Copyright (c) 2010, skobbler GmbH * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * 3. Neither the name of the project nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ package org.openstreetmap.josm.plugins.mapdust.gui.action.execute; import static org.openstreetmap.josm.tools.I18n.tr; import java.awt.event.ActionEvent; import java.util.ArrayList; import java.util.Iterator; import javax.swing.JButton; import javax.swing.JOptionPane; import org.openstreetmap.josm.Main; import org.openstreetmap.josm.plugins.mapdust.gui.MapdustGUI; import org.openstreetmap.josm.plugins.mapdust.gui.component.dialog.CommentBugDialog; import org.openstreetmap.josm.plugins.mapdust.gui.observer.MapdustActionObservable; import org.openstreetmap.josm.plugins.mapdust.gui.observer.MapdustActionObserver; import org.openstreetmap.josm.plugins.mapdust.gui.observer.MapdustBugObservable; import org.openstreetmap.josm.plugins.mapdust.gui.observer.MapdustBugObserver; import org.openstreetmap.josm.plugins.mapdust.gui.value.MapdustAction; import org.openstreetmap.josm.plugins.mapdust.gui.value.MapdustPluginState; import org.openstreetmap.josm.plugins.mapdust.gui.value.MapdustServiceCommand; import org.openstreetmap.josm.plugins.mapdust.service.MapdustServiceHandler; import org.openstreetmap.josm.plugins.mapdust.service.MapdustServiceHandlerException; import org.openstreetmap.josm.plugins.mapdust.service.value.MapdustBug; import org.openstreetmap.josm.plugins.mapdust.service.value.MapdustComment; /** * Comments the given <code>MapdustBug</code> object. Validates the input data, * and based on the plugin state executes the corresponding action. If the * plugin is in the "ONLINE" state then executes the MapDust Service * 'commentBug' method with the given input parameters. If the plugin is in the * "OFFLINE" state then the given action is added to the actions list. * * @author Bea * */ public class ExecuteCommentBug extends MapdustExecuteAction implements MapdustBugObservable, MapdustActionObservable { /** The serial version UID */ private static final long serialVersionUID = 4391634740784919337L; /** The list of MapDust bug observers */ private final ArrayList<MapdustBugObserver> bugObservers = new ArrayList<>(); /** The list of mapdust action observers */ private final ArrayList<MapdustActionObserver> actionObservers = new ArrayList<>(); /** * Builds a <code>ExecuteCommentBug</code> object */ public ExecuteCommentBug() {} /** * Builds a <code>ExecuteCommentBug</code> object with the given arguments. * * @param dialog The <code>CommentIssueDialog</code> object * @param mapdustGUI The <code>MapdustGUI</code> object */ public ExecuteCommentBug(CommentBugDialog dialog, MapdustGUI mapdustGUI) { setDialog(dialog); setMapdustGUI(mapdustGUI); } /** * Creates a comment for the given MapDust bug. If the entered informations * are invalid a corresponding warning message will be displayed. * * @param event The action event which fires this action */ @Override public void actionPerformed(ActionEvent event) { if (event.getSource() instanceof JButton) { JButton btn = (JButton) event.getSource(); if (btn.getText().equals("OK")) { /* ok button was pressed */ CommentBugDialog issueDialog = (CommentBugDialog) getDialog(); String nickname = issueDialog.getTxtNickname().getText(); String commentText = issueDialog.getTxtComment().getText(); /* validate */ String errorMessage = validate(nickname, commentText); if (errorMessage != null) { /* invalid input data */ JOptionPane.showMessageDialog(Main.parent, tr(errorMessage), tr("Missing input data"), JOptionPane.WARNING_MESSAGE); return; } /* valid */ Main.pref.put("mapdust.nickname", nickname); MapdustBug selectedBug = mapdustGUI.getSelectedBug(); MapdustComment comment = new MapdustComment(selectedBug.getId(), commentText, nickname); String pluginState = Main.pref.get("mapdust.pluginState"); if (pluginState.equals(MapdustPluginState.OFFLINE.getValue())) { /* offline, save to actions list */ String iconPath = getIconPath(selectedBug); MapdustAction mapdustAction = new MapdustAction( MapdustServiceCommand.COMMENT_BUG, iconPath, selectedBug, comment); /* destroy dialog */ enableFiredButton(issueDialog.getFiredButton()); mapdustGUI.enableBtnPanel(true); mapdustGUI.getPanel().resetSelectedBug(0); issueDialog.dispose(); if (getMapdustGUI().getActionPanel() != null) { issueDialog.dispose(); notifyObservers(mapdustAction); } } else { /* online, execute Mapdust service method */ MapdustServiceHandler handler = new MapdustServiceHandler(); Long id = null; try { id = handler.commentBug(comment); } catch (MapdustServiceHandlerException e) { errorMessage = "There was a Mapdust service error."; JOptionPane.showMessageDialog(Main.parent, tr(errorMessage), tr("Error"), JOptionPane.ERROR_MESSAGE); } if (id != null) { // success MapdustBug newMapdustBug = null; try { newMapdustBug = handler.getBug(selectedBug.getId(), null); } catch (MapdustServiceHandlerException e) { errorMessage = "There was a Mapdust service error."; JOptionPane.showMessageDialog(Main.parent, tr(errorMessage), tr("Error"), JOptionPane.ERROR_MESSAGE); } /* enable buttons */ enableFiredButton(issueDialog.getFiredButton()); mapdustGUI.enableBtnPanel(false); mapdustGUI.getPanel().resetSelectedBug(0); /* destroy dialog */ issueDialog.dispose(); if (newMapdustBug != null) { notifyObservers(newMapdustBug); } } } } } } /** * Adds a new MapDust bug observer to the list of observers. * * @param observer The <code>MapdustBugObserver</code> object */ @Override public void addObserver(MapdustBugObserver observer) { if (!this.bugObservers.contains(observer)) { this.bugObservers.add(observer); } } /** * Adds a new MapDust action list observer to the list of observers. * * @param observer The <code>MapdustActionListObserver</code> object */ @Override public void addObserver(MapdustActionObserver observer) { if (!this.actionObservers.contains(observer)) { this.actionObservers.add(observer); } } /** * Removes the MapDust bug observer object from the list of observers. * * @param observer The <code>MapdustBugObserver</code> object */ @Override public void removeObserver(MapdustBugObserver observer) { this.bugObservers.remove(observer); } /** * Removes the MapDust action list observer object from the list of * observers. * * @param observer The <code>MapdustActionListObserver</code> object */ @Override public void removeObserver(MapdustActionObserver observer) { this.actionObservers.remove(observer); } /** * Notifies the observers observing this action. */ @Override public void notifyObservers(MapdustBug mapdustBug) { Iterator<MapdustBugObserver> elements = this.bugObservers.iterator(); while (elements.hasNext()) { (elements.next()).changedData(mapdustBug); } } /** * Notifies the observers observing this action. */ @Override public void notifyObservers(MapdustAction mapdustAction) { Iterator<MapdustActionObserver> elements = this.actionObservers.iterator(); while (elements.hasNext()) { (elements.next()).addAction(mapdustAction); } } }