/* 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.Point; import java.awt.event.ActionEvent; import java.util.ArrayList; import java.util.Iterator; import javax.swing.JOptionPane; import org.openstreetmap.josm.Main; import org.openstreetmap.josm.data.coor.LatLon; import org.openstreetmap.josm.plugins.mapdust.gui.MapdustGUI; import org.openstreetmap.josm.plugins.mapdust.gui.component.dialog.CreateBugDialog; 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.Status; import org.openstreetmap.josm.plugins.mapdust.service.value.BugType; /** * Creates a new <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 'addBug' method with * the given input parameters. If the plugin is in the "OFFLINE" state then adds * the given action to the actions list. * * @author Bea * */ public class ExecuteAddBug extends MapdustExecuteAction implements MapdustBugObservable, MapdustActionObservable { /** The serial version UID */ private static final long serialVersionUID = 8023875766573474513L; /** 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>ExecuteAddBug</code> object */ public ExecuteAddBug() {} /** * Builds a <code>ExecuteAddBug</code> object based on the given arguments. * * @param dialog The <code>CreateIssueDialog</code> object * @param mapdustGUI The <code>MapdustGUI</code> object */ public ExecuteAddBug(CreateBugDialog dialog, MapdustGUI mapdustGUI) { setDialog(dialog); setMapdustGUI(mapdustGUI); } /** * Creates a new <code>MapdustBug</code> object if the entered informations * are valid. Otherwise a corresponding warning message will be shown to the * user. * * @param event The action event which fires this action */ @Override public void actionPerformed(ActionEvent event) { if (event != null) { CreateBugDialog createDialog = (CreateBugDialog) getDialog(); BugType type = (BugType) (createDialog).getCbbType().getSelectedItem(); String nickname = createDialog.getTxtNickname().getText(); String commentText = createDialog.getTxtDescription().getText(); /* validates the input */ String errorMessage = validate(nickname, commentText); if (errorMessage != null) { /* invalid data */ JOptionPane.showMessageDialog(Main.parent, tr(errorMessage), tr("Missing input data"), JOptionPane.WARNING_MESSAGE); return; } /* valid data */ Main.pref.put("mapdust.nickname", nickname); Point p = createDialog.getPoint(); LatLon latlon = null; if (p != null) { latlon = Main.map.mapView.getLatLon(p.x, p.y); } MapdustBug bug = new MapdustBug(latlon, type, commentText, nickname); String pluginState = Main.pref.get("mapdust.pluginState"); if (pluginState.equals(MapdustPluginState.OFFLINE.getValue())) { /* offline state */ bug.setStatus(Status.OPEN); String iconPath = getIconPath(bug); MapdustAction mapdustAction = new MapdustAction( MapdustServiceCommand.ADD_BUG, iconPath, bug); /* destroy dialog */ getDialog().dispose(); mapdustGUI.enableBtnPanel(false); if (getMapdustGUI().getActionPanel() != null) { notifyObservers(mapdustAction); } } else { /* online state */ MapdustServiceHandler handler = new MapdustServiceHandler(); Long id = null; try { id = handler.addBug(bug); } 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(id, null); } catch (MapdustServiceHandlerException e) { errorMessage = "There was a Mapdust service error."; JOptionPane.showMessageDialog(Main.parent, tr(errorMessage), tr("Error"), JOptionPane.ERROR_MESSAGE); } /* destroy dialog */ getDialog().dispose(); mapdustGUI.enableBtnPanel(false); 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); } } /** * 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); } /** * Notifies the observers observing this action. * * @param mapdustBug The <code>MapdustBug</code> object */ @Override public void notifyObservers(MapdustBug mapdustBug) { Iterator<MapdustBugObserver> elements = this.bugObservers.iterator(); while (elements.hasNext()) { (elements.next()).changedData(mapdustBug); } } /** * 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 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. * * @param mapdustAction The <code>MapdustAction</code> object */ @Override public void notifyObservers(MapdustAction mapdustAction) { Iterator<MapdustActionObserver> elements = this.actionObservers.iterator(); while (elements.hasNext()) { (elements.next()).addAction(mapdustAction); } } }