/[projects]/dao/DaoAdresseVedligehold/src/main/java/dk/daoas/adressevedligehold/AddressManager.java
ViewVC logotype

Contents of /dao/DaoAdresseVedligehold/src/main/java/dk/daoas/adressevedligehold/AddressManager.java

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2839 - (show annotations) (download)
Mon Jan 25 06:18:21 2016 UTC (8 years, 4 months ago) by torben
File size: 12809 byte(s)
Write number of rejected in report
1 package dk.daoas.adressevedligehold;
2
3 import java.sql.SQLException;
4 import java.util.ArrayList;
5 import java.util.Collections;
6 import java.util.List;
7 import java.util.Map;
8 import java.util.TreeMap;
9
10 import org.apache.commons.lang3.StringUtils;
11
12 import dk.daoas.adressevedligehold.AddressSourceEntry.EntryType;
13 import dk.daoas.adressevedligehold.beans.Address;
14 import dk.daoas.adressevedligehold.beans.Address.AddressState;
15 import dk.daoas.adressevedligehold.db.DatabaseLayerImplementation;
16 import dk.daoas.adressevedligehold.util.DeduplicateHelper;
17 import dk.daoas.adressevedligehold.util.TimingHelper;
18
19 public class AddressManager {
20
21
22 List<Address> addressList;
23
24 Map<Integer, TreeMap<Short, ArrayList<Address>> > searchStructure;
25
26 ArrayList<AddressSourceEntry> afvisteEntries = new ArrayList<AddressSourceEntry>();
27
28 public AddressManager() throws SQLException {
29 DatabaseLayerImplementation db = new DatabaseLayerImplementation();
30
31 searchStructure = new TreeMap<Integer, TreeMap<Short, ArrayList<Address>> >();
32
33 addressList = db.getAllAdresses();
34
35 DeduplicateHelper<Integer> intHelper = new DeduplicateHelper<Integer>();
36 DeduplicateHelper<Short> shortHelper = new DeduplicateHelper<Short>();
37
38 List<ArrayList<Address>> arraylistCache = new ArrayList<ArrayList<Address>>();
39
40 TimingHelper timer = new TimingHelper();
41
42 for (Address a : addressList) {
43 Integer gadeid = intHelper.getInstance( a.gadeid );
44 Short husnr = shortHelper.getInstance( a.husnr );
45 TreeMap<Short, ArrayList<Address>> gade = searchStructure.get( gadeid );
46
47 if (gade == null) {
48 gade = new TreeMap<Short,ArrayList<Address>>();
49 searchStructure.put(gadeid, gade);
50 }
51
52 ArrayList<Address> litraList = gade.get(husnr);
53 if (litraList == null) {
54 litraList = new ArrayList<Address>();
55 gade.put(husnr, litraList);
56 arraylistCache.add(litraList);
57 }
58
59 litraList.add(a);
60 }
61
62 for (ArrayList<Address> list : arraylistCache) {
63 list.trimToSize();
64 }
65
66 System.out.println("AddressManager ready, elapsed " + timer.getElapsed() + "ms");
67
68
69 }
70
71 public void closeUnvisitedAddresses(String distributor, EntryUgedage ugedage) {
72 for (Address addr : addressList) {
73 if (addr.distributor == null)
74 continue;
75
76 if (addr.distributor.equals(distributor) == false)//irrelevant for denne indlæsning
77 continue;
78
79 int closedCount = 0;
80
81 if (addr.visitedMan == false && ugedage.mandag) {
82 if (addr.ruteMandag != null) {
83 addr.ruteMandag = null;
84 addr.korelisteMandag = null;
85 addr.stateMan = AddressState.CLOSED;
86 closedCount++;
87 }
88 }
89 if (addr.visitedTir == false && ugedage.tirsdag) {
90 if (addr.ruteTirsdag != null) {
91 addr.ruteTirsdag = null;
92 addr.korelisteTirsdag = null;
93 addr.stateTir = AddressState.CLOSED;
94 closedCount++;
95 }
96 }
97
98 if (addr.visitedOns == false && ugedage.onsdag) {
99 if (addr.ruteOnsdag != null) {
100 addr.ruteOnsdag = null;
101 addr.korelisteOnsdag = null;
102 addr.stateOns = AddressState.CLOSED;
103 closedCount++;
104 }
105 }
106
107 if (addr.visitedTor == false && ugedage.torsdag) {
108 if (addr.ruteTorsdag != null) {
109 addr.ruteTorsdag = null;
110 addr.korelisteTorsdag = null;
111 addr.stateTor = AddressState.CLOSED;
112 closedCount++;
113 }
114 }
115
116 if (addr.visitedFre == false && ugedage.fredag) {
117 if (addr.ruteFredag != null) {
118 addr.ruteFredag = null;
119 addr.korelisteFredag = null;
120 addr.stateFre = AddressState.CLOSED;
121 closedCount++;
122 }
123 }
124
125 if (addr.visitedLor == false && ugedage.lordag) {
126 if (addr.ruteLordag != null) {
127 addr.ruteLordag = null;
128 addr.korelisteLordag = null;
129 addr.stateLor = AddressState.CLOSED;
130 closedCount++;
131 }
132 }
133
134 if (addr.visitedSon == false && ugedage.sondag) {
135 if (addr.ruteSondag != null) {
136 addr.ruteSondag = null;
137 addr.korelisteSondag = null;
138 addr.stateSon = AddressState.CLOSED;
139 closedCount++;
140 }
141 }
142
143 if (addr.state == AddressState.NOT_CHANGED && closedCount>0) {
144 addr.state = AddressState.CLOSED;
145 }
146
147 }
148 }
149 public void dumpChanged() {
150 int count = 0;
151 for (Address addr : addressList) {
152 if (addr.state == AddressState.NOT_CHANGED) {
153 continue;
154 }
155 if (addr.stateMan == AddressState.NOT_CHANGED || addr.stateMan == AddressState.CREATED) {
156 continue;
157 }
158
159 if (addr.stateMan != AddressState.MODIFIED ) {
160 continue;
161 }
162
163 System.out.println(addr.state + ": " + addr.toStringExtended() );
164 System.out.println(addr.getRuteString() );
165
166 if (count++ > 15)
167 return;
168 }
169 }
170
171 public void writeBackChanges() {
172 System.out.println("Writing back changes");
173 TimingHelper timer = new TimingHelper();
174
175 List<Address> updates = new ArrayList<Address>(1024*1024);
176 List<Address> inserts = new ArrayList<Address>(16*1024);
177
178 for (Address addr : addressList) {
179 if (addr.state == AddressState.CREATED) {
180 inserts.add(addr);
181 }
182 if (addr.state == AddressState.MODIFIED || addr.state == AddressState.OPENED || addr.state == AddressState.CLOSED) {
183 updates.add(addr);
184 }
185 }
186
187 DatabaseLayerImplementation db = new DatabaseLayerImplementation();
188 db.updateAddresses(updates);
189
190 System.out.println("Writeback done: elapsed " + timer.getElapsed() + "ms.");
191 }
192
193
194 public void visit(AddressSourceEntry entry) {
195 if (entry.type == EntryType.TypeSingleAddress) {
196 visitSingle(entry);
197 } else {
198 visitRange(entry);
199 }
200 }
201
202 private void visitSingle(AddressSourceEntry entry) {
203 TreeMap<Short, ArrayList<Address>> gade = searchStructure.get( entry.gadeid );
204 if (gade == null) {
205 createFromEntry(entry); // if we get here there was no match - so we need to create it
206 return;
207 }
208
209 ArrayList<Address> litraList = gade.get(entry.husnr);
210 if (litraList == null) {
211 createFromEntry(entry); // if we get here there was no match - so we need to create it
212 return;
213 }
214
215 for (Address addr : litraList) {
216 if (addr.husnrbogstav.equals(entry.litra) ) {
217 updateAddress(addr, entry);
218 return; //Done for now - no need to look at the rest of the list
219 }
220 }
221
222 createFromEntry(entry); // if we get here there was no match - so we need to create it
223 }
224
225 private void visitRange(AddressSourceEntry entry) {
226
227 throw new UnsupportedOperationException("Not implemented yet");
228 }
229
230
231
232 private void updateAddress(Address addr, AddressSourceEntry entry) {
233 if ( addr.distributor != null && addr.distributor.equals(entry.distributor) == false) {
234 afvisteEntries.add(entry);
235 System.out.println("Afviser " + entry);
236 return;
237 }
238
239 addr.visited = true;
240 if (addr.state == AddressState.NOT_CHANGED) {
241 if (addr.distributor == null) {
242 addr.state = AddressState.OPENED;
243 addr.distributor = entry.distributor;
244 } else {
245 addr.state = AddressState.MODIFIED;
246 }
247 }
248
249 if (entry.ugedage.mandag) {
250 addr.visitedMan = true;
251 if (addr.ruteMandag == null) {
252 addr.stateMan = AddressState.OPENED;
253 addr.ruteMandag = entry.rute;
254 addr.korelisteMandag = entry.koreliste;
255 } else {
256
257 if (StringUtils.equals(addr.ruteMandag, entry.rute) == false || StringUtils.equals(addr.korelisteMandag, entry.koreliste) == false) {
258 addr.stateMan = AddressState.MODIFIED;
259 addr.ruteMandag = entry.rute;
260 addr.korelisteMandag = entry.koreliste;
261 }
262 }
263 }
264
265
266 if (entry.ugedage.tirsdag) {
267 addr.visitedTir = true;
268 if (addr.ruteTirsdag == null) {
269 addr.stateTir = AddressState.OPENED;
270 addr.ruteTirsdag = entry.rute;
271 addr.korelisteTirsdag = entry.koreliste;
272 } else {
273
274 if (StringUtils.equals(addr.ruteTirsdag, entry.rute) == false || StringUtils.equals(addr.korelisteTirsdag, entry.koreliste) == false) {
275 addr.stateTir = AddressState.MODIFIED;
276 addr.ruteTirsdag = entry.rute;
277 addr.korelisteTirsdag = entry.koreliste;
278 }
279 }
280 }
281
282 if (entry.ugedage.onsdag) {
283 addr.visitedOns = true;
284 if (addr.ruteOnsdag == null) {
285 addr.stateOns = AddressState.OPENED;
286 addr.ruteOnsdag = entry.rute;
287 addr.korelisteOnsdag = entry.koreliste;
288 } else {
289
290 if (StringUtils.equals(addr.ruteOnsdag, entry.rute) == false || StringUtils.equals(addr.korelisteOnsdag, entry.koreliste) == false) {
291 addr.stateOns = AddressState.MODIFIED;
292 addr.ruteOnsdag = entry.rute;
293 addr.korelisteOnsdag = entry.koreliste;
294 }
295 }
296 }
297
298
299 if (entry.ugedage.torsdag) {
300 addr.visitedTor = true;
301 if (addr.ruteTorsdag == null) {
302 addr.stateTor = AddressState.OPENED;
303 addr.ruteTorsdag = entry.rute;
304 addr.korelisteTorsdag = entry.koreliste;
305 } else {
306
307
308 if (StringUtils.equals(addr.ruteTorsdag, entry.rute) == false || StringUtils.equals(addr.korelisteTorsdag, entry.koreliste) == false) {
309 addr.stateTor = AddressState.MODIFIED;
310 addr.ruteTorsdag = entry.rute;
311 addr.korelisteTorsdag = entry.koreliste;
312 }
313 }
314 }
315
316
317 if (entry.ugedage.fredag) {
318 addr.visitedFre = true;
319 if (addr.ruteFredag == null) {
320 addr.stateFre = AddressState.OPENED;
321 addr.ruteFredag = entry.rute;
322 addr.korelisteFredag = entry.koreliste;
323 } else {
324
325 if (StringUtils.equals(addr.ruteFredag, entry.rute) == false || StringUtils.equals(addr.korelisteFredag, entry.koreliste) == false) {
326 addr.stateFre = AddressState.MODIFIED;
327 addr.ruteFredag = entry.rute;
328 addr.korelisteFredag = entry.koreliste;
329 }
330 }
331 }
332
333
334 if (entry.ugedage.lordag) {
335 addr.visitedLor = true;
336 if (addr.ruteLordag == null) {
337 addr.stateLor = AddressState.OPENED;
338 addr.ruteLordag = entry.rute;
339 addr.korelisteLordag = entry.koreliste;
340 } else {
341
342
343 if (StringUtils.equals(addr.ruteLordag, entry.rute) == false || StringUtils.equals(addr.korelisteLordag, entry.koreliste) == false) {
344 addr.stateLor = AddressState.MODIFIED;
345 addr.ruteLordag = entry.rute;
346 addr.korelisteLordag = entry.koreliste;
347 }
348 }
349 }
350
351
352 if (entry.ugedage.sondag) {
353 addr.visitedSon = true;
354 if (addr.ruteSondag == null) {
355 addr.stateSon = AddressState.OPENED;
356 addr.ruteSondag = entry.rute;
357 addr.korelisteSondag = entry.koreliste;
358 } else {
359
360 if (StringUtils.equals(addr.ruteSondag, entry.rute) == false || StringUtils.equals(addr.korelisteSondag, entry.koreliste) == false) {
361 addr.stateSon = AddressState.MODIFIED;
362 addr.ruteSondag = entry.rute;
363 addr.korelisteSondag = entry.koreliste;
364 }
365 }
366 }
367
368
369
370 }
371
372
373
374 private void createFromEntry(AddressSourceEntry entry) {
375 System.out.println("Opretter adresse ud fra " + entry);
376
377 Address a = new Address();
378 a.state = AddressState.CREATED;
379
380 a.distributor = entry.distributor;
381 a.gadeid = entry.gadeid;
382 a.kommunekode = entry.kommunekode;
383 a.vejkode = entry.vejkode;
384 a.vejnavn = entry.vejnavn;
385 a.husnr = entry.husnr;
386 a.husnrbogstav = entry.litra;
387 a.postnr = entry.postnr;
388 a.visited = true;
389
390 if (entry.ugedage.mandag) {
391 a.ruteMandag = entry.rute;
392 a.korelisteMandag = entry.koreliste;
393 }
394 if (entry.ugedage.tirsdag) {
395 a.ruteTirsdag = entry.rute;
396 a.korelisteTirsdag = entry.koreliste;
397 }
398 if (entry.ugedage.onsdag) {
399 a.ruteOnsdag = entry.rute;
400 a.korelisteOnsdag = entry.koreliste;
401 }
402 if (entry.ugedage.torsdag) {
403 a.ruteTorsdag = entry.rute;
404 a.korelisteTorsdag = entry.koreliste;
405 }
406 if (entry.ugedage.fredag) {
407 a.ruteFredag = entry.rute;
408 a.korelisteFredag = entry.koreliste;
409 }
410 if (entry.ugedage.lordag) {
411 a.ruteLordag = entry.rute;
412 a.korelisteLordag = entry.koreliste;
413 }
414 if (entry.ugedage.sondag) {
415 a.ruteSondag = entry.rute;
416 a.korelisteLordag = entry.koreliste;
417 }
418
419 // Nu er det nye adresse object oprettet - nu skal det gemmes i søge strukturen og totallisten
420
421
422 TreeMap<Short, ArrayList<Address>> gade = searchStructure.get( a.gadeid );
423
424 if (gade == null) {
425 gade = new TreeMap<Short,ArrayList<Address>>();
426 searchStructure.put(a.gadeid, gade);
427 }
428
429 ArrayList<Address> litraList = gade.get(a.husnr);
430 if (litraList == null) {
431 litraList = new ArrayList<Address>();
432 gade.put(a.husnr, litraList);
433 }
434
435 litraList.add(a);
436 addressList.add(a);
437
438 }
439
440 public List<Address> getAddressList() {
441 return Collections.unmodifiableList(addressList);
442 }
443
444 public int getAfvistAntal() {
445 return afvisteEntries.size();
446 }
447
448 }

  ViewVC Help
Powered by ViewVC 1.1.20