source: josm/trunk/src/org/openstreetmap/josm/actions/upload/RelationUploadOrderHook.java@ 8851

Last change on this file since 8851 was 8851, checked in by Don-vip, 9 years ago

sonar - squid:S1149 - Synchronized classes Vector, Hashtable, Stack and StringBuffer should not be used

  • Property svn:eol-style set to native
File size: 3.7 KB
Line 
1// License: GPL. For details, see LICENSE file.
2package org.openstreetmap.josm.actions.upload;
3
4import static org.openstreetmap.josm.tools.I18n.tr;
5
6import java.awt.BorderLayout;
7import java.awt.Dimension;
8import java.util.ArrayList;
9import java.util.Deque;
10import java.util.Iterator;
11import java.util.List;
12
13import javax.swing.JLabel;
14import javax.swing.JPanel;
15import javax.swing.JScrollPane;
16import javax.swing.JTable;
17import javax.swing.table.DefaultTableModel;
18
19import org.openstreetmap.josm.Main;
20import org.openstreetmap.josm.data.APIDataSet;
21import org.openstreetmap.josm.data.osm.Relation;
22import org.openstreetmap.josm.gui.ExtendedDialog;
23import org.openstreetmap.josm.gui.OsmPrimitivRenderer;
24import org.openstreetmap.josm.tools.WindowGeometry;
25
26/**
27 * This upload hook reorders the list of new relations to upload such that child
28 * relations are uploaded before parent relations. It also checks for cyclic
29 * dependencies in the list of new relations.
30 *
31 *
32 */
33public class RelationUploadOrderHook implements UploadHook {
34
35 /**
36 * builds the panel which warns users about a cyclic dependency
37 *
38 * @param dep the list of relations with a cyclic dependency
39 * @return the panel
40 */
41 protected JPanel buildWarningPanel(List<Relation> dep) {
42 JPanel pnl = new JPanel();
43 pnl.setLayout(new BorderLayout());
44 String msg = tr("<html>{0} relations build a cycle because they refer to each other.<br>"
45 + "JOSM cannot upload them. Please edit the relations and remove the "
46 + "cyclic dependency.</html>", dep.size()-1);
47 pnl.add(new JLabel(msg), BorderLayout.NORTH);
48
49 DefaultTableModel model = new DefaultTableModel();
50 model.addColumn(tr("Relation ..."));
51 model.addColumn(tr("... refers to relation"));
52 for (int i = 0; i < dep.size()-1; i++) {
53 Relation r1 = dep.get(i);
54 Relation r2 = dep.get(i+1);
55 model.addRow(new Relation[] {r1, r2});
56 }
57 JTable tbl = new JTable(model);
58 OsmPrimitivRenderer renderer = new OsmPrimitivRenderer();
59 tbl.getColumnModel().getColumn(0).setCellRenderer(renderer);
60 tbl.getColumnModel().getColumn(1).setCellRenderer(renderer);
61 pnl.add(new JScrollPane(tbl), BorderLayout.CENTER);
62 return pnl;
63 }
64
65 /**
66 * Warns the user if a cyclic dependency is detected
67 *
68 * @param e the cyclic dependency exception
69 */
70 protected void warnCyclicUploadDependency(CyclicUploadDependencyException e) {
71 Deque<Relation> dep = e.getCyclicUploadDependency();
72 Relation last = dep.getLast();
73 Iterator<Relation> it = dep.iterator();
74 while (it.hasNext()) {
75 if (it.next() != last) {
76 it.remove();
77 } else {
78 break;
79 }
80 }
81 JPanel pnl = buildWarningPanel(new ArrayList<>(dep));
82 ExtendedDialog dialog = new ExtendedDialog(
83 Main.parent,
84 tr("Cycling dependencies"),
85 new String[] {tr("OK")}
86 );
87 dialog.setContent(pnl, false /* don't embed in scroll pane */);
88 dialog.setButtonIcons(new String[] {"ok"});
89 dialog.setRememberWindowGeometry(
90 getClass().getName() + ".geometry",
91 WindowGeometry.centerInWindow(Main.parent, new Dimension(300, 300))
92 );
93 dialog.showDialog();
94 }
95
96 @Override
97 public boolean checkUpload(APIDataSet apiDataSet) {
98 try {
99 apiDataSet.adjustRelationUploadOrder();
100 return true;
101 } catch (CyclicUploadDependencyException e) {
102 warnCyclicUploadDependency(e);
103 return false;
104 }
105 }
106}
Note: See TracBrowser for help on using the repository browser.