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

Last change on this file since 12346 was 12279, checked in by Don-vip, 7 years ago

sonar - squid:S3878 - Arrays should not be created for varargs parameters

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