source: osm/applications/editors/josm/plugins/reverter/src/reverter/OsmServerMultiObjectReader.java@ 35084

Last change on this file since 35084 was 35084, checked in by upliner, 5 years ago

Reverter: fix deleted/redacted relation members

File size: 4.2 KB
Line 
1// License: GPL. For details, see LICENSE file.
2package reverter;
3
4import static org.openstreetmap.josm.tools.I18n.tr;
5
6import java.io.IOException;
7import java.io.InputStream;
8import java.util.ArrayList;
9import java.util.List;
10import java.util.Map;
11import java.util.Map.Entry;
12
13import org.openstreetmap.josm.data.osm.DataSet;
14import org.openstreetmap.josm.data.osm.OsmPrimitiveType;
15import org.openstreetmap.josm.data.osm.PrimitiveId;
16import org.openstreetmap.josm.gui.progress.NullProgressMonitor;
17import org.openstreetmap.josm.gui.progress.ProgressMonitor;
18import org.openstreetmap.josm.io.IllegalDataException;
19import org.openstreetmap.josm.io.OsmServerReader;
20import org.openstreetmap.josm.io.OsmTransferException;
21import org.openstreetmap.josm.tools.Logging;
22
23public class OsmServerMultiObjectReader extends OsmServerReader {
24 private final MultiOsmReader rdr = new MultiOsmReader();
25
26 public void readObject(PrimitiveId id, int version, ProgressMonitor progressMonitor) throws OsmTransferException {
27 readObject(id.getUniqueId(), version, id.getType(), progressMonitor);
28 }
29
30 public void readObject(long id, int version, OsmPrimitiveType type, ProgressMonitor progressMonitor) throws OsmTransferException {
31 StringBuilder sb = new StringBuilder();
32 sb.append(type.getAPIName());
33 sb.append("/");
34 sb.append(id);
35 sb.append("/");
36 sb.append(version);
37 progressMonitor.beginTask("", 1);
38 try (InputStream in = getInputStream(sb.toString(), progressMonitor.createSubTaskMonitor(1, true))) {
39 rdr.addData(in);
40 } catch (IOException | IllegalDataException e) {
41 throw new OsmTransferException(e);
42 } finally {
43 progressMonitor.finishTask();
44 }
45 }
46 private List<String> makeQueryStrings(OsmPrimitiveType type, Map<Long,Integer> list) {
47 List<String> result = new ArrayList<>((list.size()+maxQueryIds-1)/maxQueryIds);
48 StringBuilder sb = new StringBuilder();
49 int cnt=0;
50 for (Entry<Long,Integer> entry : list.entrySet()) {
51 if (cnt == 0) {
52 sb.append(type.getAPIName());
53 sb.append("s?");
54 sb.append(type.getAPIName());
55 sb.append("s=");
56 } else {
57 sb.append(",");
58 }
59 sb.append(entry.getKey());
60 sb.append("v");
61 sb.append(entry.getValue());
62 cnt++;
63 if (cnt >=maxQueryIds) {
64 result.add(sb.toString());
65 sb.setLength(0);
66 cnt = 0;
67 }
68 }
69 if (cnt>0) {
70 result.add(sb.toString());
71 }
72 return result;
73 }
74
75 protected static final int maxQueryIds = 128;
76 public void readMultiObjects(OsmPrimitiveType type, Map<Long,Integer> list, ProgressMonitor progressMonitor) {
77 for (String query : makeQueryStrings(type,list)) {
78 if (progressMonitor.isCanceled()) {
79 return;
80 }
81 rdr.callback = new ParseCallback() {
82 @Override
83 public void primitiveParsed(PrimitiveId id) {
84 if (id.getType() == type && list.remove(id.getUniqueId()) != null) {
85 progressMonitor.worked(1);
86 }
87 }
88 };
89 try (InputStream in = getInputStream(query, NullProgressMonitor.INSTANCE)) {
90 rdr.addData(in);
91 } catch (IOException | IllegalDataException | OsmTransferException e) {
92 Logging.warn(e);
93 } finally {
94 rdr.callback = null;
95 }
96 }
97 }
98
99
100 /**
101 * Method to parse downloaded objects
102 * @return the data requested
103 * @throws OsmTransferException in case of error
104 */
105 @Override
106 public DataSet parseOsm(ProgressMonitor progressMonitor) throws OsmTransferException {
107 progressMonitor.beginTask("", 1);
108 progressMonitor.subTask(tr("Preparing history data..."));
109 try {
110 rdr.processData();
111 return rdr.getDataSet();
112 } catch (Exception e) {
113 throw new OsmTransferException(e);
114 } finally {
115 progressMonitor.finishTask();
116 activeConnection = null;
117 }
118 }
119}
Note: See TracBrowser for help on using the repository browser.