/[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 2854 - (show annotations) (download)
Wed Jan 27 20:45:49 2016 UTC (8 years, 3 months ago) by torben
File size: 17387 byte(s)
Vi auto opretter kun adresser hvor gadeid starter med adressens postnr
1 package dk.daoas.adressevedligehold;
2
3 import java.sql.SQLException;
4 import java.util.ArrayList;
5 import java.util.Arrays;
6 import java.util.Collections;
7 import java.util.List;
8 import java.util.Map;
9 import java.util.Map.Entry;
10 import java.util.TreeMap;
11
12 import org.apache.commons.lang3.StringUtils;
13
14 import dk.daoas.adressevedligehold.AddressSourceEntry.EntryType;
15 import dk.daoas.adressevedligehold.beans.Address;
16 import dk.daoas.adressevedligehold.beans.Address.AddressState;
17 import dk.daoas.adressevedligehold.db.DatabaseLayerImplementation;
18 import dk.daoas.adressevedligehold.util.DeduplicateHelper;
19 import dk.daoas.adressevedligehold.util.MiscUtils;
20 import dk.daoas.adressevedligehold.util.TimingHelper;
21
22 /*
23 * TODO: håndtering af entry dupletter ! (+ rapportering af dem)
24
25
26
27 */
28
29 public class AddressManager {
30
31
32 List<Address> addressList;
33
34 Map<Integer, TreeMap<Short, ArrayList<Address>> > searchStructure;
35
36 ArrayList<AddressSourceEntry> afvisteEntries = new ArrayList<AddressSourceEntry>();
37
38 Map<Short,Short> dbkBaneMap = new TreeMap<Short,Short>();
39
40 public AddressManager() throws SQLException {
41 DatabaseLayerImplementation db = new DatabaseLayerImplementation();
42
43 searchStructure = new TreeMap<Integer, TreeMap<Short, ArrayList<Address>> >();
44
45 addressList = db.getAllAdresses();
46
47 DeduplicateHelper<Integer> intHelper = new DeduplicateHelper<Integer>();
48 DeduplicateHelper<Short> shortHelper = new DeduplicateHelper<Short>();
49
50 List<ArrayList<Address>> arraylistCache = new ArrayList<ArrayList<Address>>();
51
52 TimingHelper timer = new TimingHelper();
53
54 for (Address a : addressList) {
55 Integer gadeid = intHelper.getInstance( a.gadeid );
56 Short husnr = shortHelper.getInstance( a.husnr );
57 TreeMap<Short, ArrayList<Address>> gade = searchStructure.get( gadeid );
58
59 if (a.dbkBane > 0 && a.postnr<=4999) {
60 Short bane = dbkBaneMap.get(a.postnr);
61 if (bane == null) {
62 dbkBaneMap.put(a.postnr, a.dbkBane);
63 }
64 }
65
66 if (gade == null) {
67 gade = new TreeMap<Short,ArrayList<Address>>();
68 searchStructure.put(gadeid, gade);
69 }
70
71 ArrayList<Address> litraList = gade.get(husnr);
72 if (litraList == null) {
73 litraList = new ArrayList<Address>();
74 gade.put(husnr, litraList);
75 arraylistCache.add(litraList);
76 }
77
78 litraList.add(a);
79 }
80
81 for (ArrayList<Address> list : arraylistCache) {
82 list.trimToSize();
83 }
84
85 System.out.println("AddressManager ready, elapsed " + timer.getElapsed() + "ms");
86
87
88 }
89
90 public void closeUnvisitedAddresses(String distributor, EntryUgedage ugedage) {
91 for (Address addr : addressList) {
92 if (addr.distributor == null)
93 continue;
94
95 if (addr.distributor.equals(distributor) == false)//irrelevant for denne indlæsning
96 continue;
97
98 int closedCount = 0;
99
100 if (addr.visitedMan == false && ugedage.mandag) {
101 if (addr.ruteMandag != null) {
102 addr.ruteMandag = null;
103 addr.korelisteMandag = null;
104 addr.stateMan = AddressState.CLOSED;
105 closedCount++;
106 }
107 }
108 if (addr.visitedTir == false && ugedage.tirsdag) {
109 if (addr.ruteTirsdag != null) {
110 addr.ruteTirsdag = null;
111 addr.korelisteTirsdag = null;
112 addr.stateTir = AddressState.CLOSED;
113 closedCount++;
114 }
115 }
116
117 if (addr.visitedOns == false && ugedage.onsdag) {
118 if (addr.ruteOnsdag != null) {
119 addr.ruteOnsdag = null;
120 addr.korelisteOnsdag = null;
121 addr.stateOns = AddressState.CLOSED;
122 closedCount++;
123 }
124 }
125
126 if (addr.visitedTor == false && ugedage.torsdag) {
127 if (addr.ruteTorsdag != null) {
128 addr.ruteTorsdag = null;
129 addr.korelisteTorsdag = null;
130 addr.stateTor = AddressState.CLOSED;
131 closedCount++;
132 }
133 }
134
135 if (addr.visitedFre == false && ugedage.fredag) {
136 if (addr.ruteFredag != null) {
137 addr.ruteFredag = null;
138 addr.korelisteFredag = null;
139 addr.stateFre = AddressState.CLOSED;
140 closedCount++;
141 }
142 }
143
144 if (addr.visitedLor == false && ugedage.lordag) {
145 if (addr.ruteLordag != null) {
146 addr.ruteLordag = null;
147 addr.korelisteLordag = null;
148 addr.stateLor = AddressState.CLOSED;
149 closedCount++;
150 }
151 }
152
153 if (addr.visitedSon == false && ugedage.sondag) {
154 if (addr.ruteSondag != null) {
155 addr.ruteSondag = null;
156 addr.korelisteSondag = null;
157 addr.stateSon = AddressState.CLOSED;
158 closedCount++;
159 }
160 }
161
162 if (addr.state == AddressState.NOT_CHANGED && closedCount>0) {
163 addr.state = AddressState.CLOSED;
164 }
165
166 }
167 }
168 public void dumpChanged() {
169 int count = 0;
170 for (Address addr : addressList) {
171 if (addr.state == AddressState.NOT_CHANGED) {
172 continue;
173 }
174 /*if (addr.stateMan == AddressState.NOT_CHANGED || addr.stateMan == AddressState.CREATED) {
175 continue;
176 }*/
177
178 if (addr.stateMan != AddressState.MODIFIED ) {
179 continue;
180 }
181
182 System.out.println(addr.state + ": " + addr.toStringExtended() );
183 System.out.println(addr.getRuteString() );
184
185 if (count++ > 50)
186 return;
187 }
188 }
189
190 public void writeBackChanges() {
191 System.out.println("Writing back changes");
192 TimingHelper timer = new TimingHelper();
193
194 List<Address> updates = new ArrayList<Address>(1024*1024);
195 List<Address> inserts = new ArrayList<Address>(16*1024);
196
197 for (Address addr : addressList) {
198 if (addr.state == AddressState.CREATED) {
199 inserts.add(addr);
200 }
201 if (addr.state == AddressState.MODIFIED || addr.state == AddressState.OPENED || addr.state == AddressState.CLOSED) {
202 updates.add(addr);
203 }
204 }
205
206 DatabaseLayerImplementation db = new DatabaseLayerImplementation();
207
208 db.updateAddresses(updates);
209
210
211
212 System.out.println("Writeback done: elapsed " + timer.getElapsed() + "ms.");
213 }
214
215
216 public void visit(AddressSourceEntry entry) {
217 if (entry.type == EntryType.TypeSingleAddress) {
218 visitSingle(entry);
219 } else {
220 visitRange(entry);
221 }
222 }
223
224 private void visitSingle(AddressSourceEntry entry) {
225 TreeMap<Short, ArrayList<Address>> gade = searchStructure.get( entry.gadeid );
226 if (gade == null) {
227 createFromEntry(entry); // if we get here there was no match - so we need to create it
228 return;
229 }
230
231 ArrayList<Address> litraList = gade.get(entry.husnr);
232 if (litraList == null) {
233 createFromEntry(entry); // if we get here there was no match - so we need to create it
234 return;
235 }
236
237 for (Address addr : litraList) {
238 if (addr.husnrbogstav.equals(entry.litra) ) {
239 updateAddress(addr, entry);
240 return; //Done for now - no need to look at the rest of the list
241 }
242 }
243
244 createFromEntry(entry); // if we get here there was no match - so we need to create it
245 }
246
247 private void visitRange(AddressSourceEntry entry) {
248
249 TreeMap<Short, ArrayList<Address>> gade = searchStructure.get( entry.gadeid );
250 if (gade == null) {
251 System.out.println("[Range] Ukendt gadeID " + entry);
252 return;
253 }
254
255 for (Entry<Short, ArrayList<Address>> husnrEntry: gade.entrySet()) {
256
257 short husnummer = husnrEntry.getKey();
258
259 if ( (entry.husnr % 2) != (husnummer%2) ){ //lige/ulige skal passe sammen
260 continue;
261 }
262
263 if ( husnummer < entry.husnr || husnummer > entry.tilHusnr) {
264 continue;
265 }
266
267 ArrayList<Address> litraList = husnrEntry.getValue();
268
269 /* a=adressetabel u=input
270 * and (a.husnr>u.FraHusNr OR (a.husnr=u.FraHusNr AND a.HusnrBogstav >= u.FraBog))
271 * AND (a.husnr<u.TilHusNr OR (a.husnr=u.TilHusNr AND a.HusnrBogstav <= u.TilBog))
272 */
273
274
275 for (Address addr: litraList) {
276 if (addr.husnr > entry.husnr || (addr.husnr == entry.husnr && addr.husnrbogstav.compareTo(entry.litra) >= 0 )) {
277 //Using nested IF instead of &&
278 if (addr.husnr < entry.tilHusnr || (addr.husnr == entry.tilHusnr && addr.husnrbogstav.compareTo(entry.tilLitra) <= 0 )) {
279 updateAddress(addr, entry);
280 }
281 }
282 }
283 }
284 }
285
286
287
288 private void updateAddress(Address addr, AddressSourceEntry entry) {
289 if ( addr.distributor != null && addr.distributor.equals(entry.distributor) == false) {
290 afvisteEntries.add(entry);
291 System.out.println("Afviser " + entry);
292 return;
293 }
294
295
296
297 if (entry.ugedage.mandag) {
298 if (addr.visitedMan == false) {
299 addr.visitedMan = true;
300 if (addr.ruteMandag == null) {
301 addr.stateMan = AddressState.OPENED;
302 addr.ruteMandag = entry.rute;
303 addr.korelisteMandag = entry.koreliste;
304 } else {
305
306 if (StringUtils.equals(addr.ruteMandag, entry.rute) == false || StringUtils.equals(addr.korelisteMandag, entry.koreliste) == false) {
307 addr.stateMan = AddressState.MODIFIED;
308 addr.ruteMandag = entry.rute;
309 addr.korelisteMandag = entry.koreliste;
310 }
311 }
312 } else {
313 System.out.println( "Double visit monday " + addr);
314 }
315
316 }
317
318
319 if (entry.ugedage.tirsdag) {
320 if (addr.visitedTir == false) {
321 addr.visitedTir = true;
322 if (addr.ruteTirsdag == null) {
323 addr.stateTir = AddressState.OPENED;
324 addr.ruteTirsdag = entry.rute;
325 addr.korelisteTirsdag = entry.koreliste;
326 } else {
327
328 if (StringUtils.equals(addr.ruteTirsdag, entry.rute) == false || StringUtils.equals(addr.korelisteTirsdag, entry.koreliste) == false) {
329 addr.stateTir = AddressState.MODIFIED;
330 addr.ruteTirsdag = entry.rute;
331 addr.korelisteTirsdag = entry.koreliste;
332 }
333 }
334 } else {
335 System.out.println( "Double visit tuesday " + addr);
336 }
337 }
338
339 if (entry.ugedage.onsdag) {
340 if (addr.visitedOns == false) {
341 addr.visitedOns = true;
342 if (addr.ruteOnsdag == null) {
343 addr.stateOns = AddressState.OPENED;
344 addr.ruteOnsdag = entry.rute;
345 addr.korelisteOnsdag = entry.koreliste;
346 } else {
347
348 if (StringUtils.equals(addr.ruteOnsdag, entry.rute) == false || StringUtils.equals(addr.korelisteOnsdag, entry.koreliste) == false) {
349 addr.stateOns = AddressState.MODIFIED;
350 addr.ruteOnsdag = entry.rute;
351 addr.korelisteOnsdag = entry.koreliste;
352 }
353 }
354 } else {
355 System.out.println( "Double visit wednesday " + addr);
356 }
357 }
358
359
360 if (entry.ugedage.torsdag) {
361 if (addr.visitedTor == false) {
362 addr.visitedTor = true;
363 if (addr.ruteTorsdag == null) {
364 addr.stateTor = AddressState.OPENED;
365 addr.ruteTorsdag = entry.rute;
366 addr.korelisteTorsdag = entry.koreliste;
367 } else {
368
369
370 if (StringUtils.equals(addr.ruteTorsdag, entry.rute) == false || StringUtils.equals(addr.korelisteTorsdag, entry.koreliste) == false) {
371 addr.stateTor = AddressState.MODIFIED;
372 addr.ruteTorsdag = entry.rute;
373 addr.korelisteTorsdag = entry.koreliste;
374 }
375 }
376 } else {
377 System.out.println( "Double visit thursday " + addr);
378 }
379 }
380
381
382 if (entry.ugedage.fredag) {
383 if (addr.visitedFre == false) {
384 addr.visitedFre = true;
385 if (addr.ruteFredag == null) {
386 addr.stateFre = AddressState.OPENED;
387 addr.ruteFredag = entry.rute;
388 addr.korelisteFredag = entry.koreliste;
389 } else {
390
391 if (StringUtils.equals(addr.ruteFredag, entry.rute) == false || StringUtils.equals(addr.korelisteFredag, entry.koreliste) == false) {
392 addr.stateFre = AddressState.MODIFIED;
393 addr.ruteFredag = entry.rute;
394 addr.korelisteFredag = entry.koreliste;
395 }
396 }
397 } else {
398 System.out.println( "Double visit friday " + addr);
399 }
400 }
401
402
403 if (entry.ugedage.lordag) {
404 if (addr.visitedLor == false) {
405 addr.visitedLor = true;
406 if (addr.ruteLordag == null) {
407 addr.stateLor = AddressState.OPENED;
408 addr.ruteLordag = entry.rute;
409 addr.korelisteLordag = entry.koreliste;
410 } else {
411
412
413 if (StringUtils.equals(addr.ruteLordag, entry.rute) == false || StringUtils.equals(addr.korelisteLordag, entry.koreliste) == false) {
414 addr.stateLor = AddressState.MODIFIED;
415 addr.ruteLordag = entry.rute;
416 addr.korelisteLordag = entry.koreliste;
417 }
418 }
419 } else {
420 System.out.println( "Double visit saturday " + addr);
421 }
422 }
423
424
425 if (entry.ugedage.sondag) {
426 if (addr.visitedSon == false) {
427 addr.visitedSon = true;
428 if (addr.ruteSondag == null) {
429 addr.stateSon = AddressState.OPENED;
430 addr.ruteSondag = entry.rute;
431 addr.korelisteSondag = entry.koreliste;
432 } else {
433
434 if (StringUtils.equals(addr.ruteSondag, entry.rute) == false || StringUtils.equals(addr.korelisteSondag, entry.koreliste) == false) {
435 addr.stateSon = AddressState.MODIFIED;
436 addr.ruteSondag = entry.rute;
437 addr.korelisteSondag = entry.koreliste;
438 }
439 }
440 } else {
441 System.out.println( "Double visit sunday " + addr);
442 }
443 }
444
445
446
447 addr.visited = true;
448 if (addr.state == AddressState.NOT_CHANGED) {
449 if (addr.distributor == null) {
450 addr.state = AddressState.OPENED;
451 addr.distributor = entry.distributor;
452 } else {
453 if (addr.stateMan != AddressState.NOT_CHANGED || addr.stateTir != AddressState.NOT_CHANGED
454 || addr.stateOns != AddressState.NOT_CHANGED || addr.stateTor != AddressState.NOT_CHANGED
455 || addr.stateFre != AddressState.NOT_CHANGED || addr.stateLor != AddressState.NOT_CHANGED || addr.stateSon != AddressState.NOT_CHANGED ){
456
457 addr.state = AddressState.MODIFIED;
458 }
459 }
460 }
461
462 updateDbkBane(addr);
463
464 }
465
466
467
468 private void createFromEntry(AddressSourceEntry entry) {
469 if (entry.husnr == 999) {
470 return;
471 }
472 if (entry.kommunekode == 0 || entry.vejkode == 0) {
473 return;
474 }
475 if (Short.parseShort(Integer.toString(entry.gadeid).substring(0, 4)) != entry.postnr) {
476 return; //gadeid / postnr mismatch
477 }
478
479
480
481 System.out.println("Opretter adresse ud fra " + entry);
482
483 Address a = new Address();
484 a.state = AddressState.CREATED;
485
486 a.distributor = entry.distributor;
487 a.gadeid = entry.gadeid;
488 a.kommunekode = entry.kommunekode;
489 a.vejkode = entry.vejkode;
490 a.vejnavn = entry.vejnavn;
491 a.husnr = entry.husnr;
492 a.husnrbogstav = entry.litra;
493 a.postnr = entry.postnr;
494 a.visited = true;
495
496 if (entry.ugedage.mandag) {
497 a.ruteMandag = entry.rute;
498 a.korelisteMandag = entry.koreliste;
499 }
500 if (entry.ugedage.tirsdag) {
501 a.ruteTirsdag = entry.rute;
502 a.korelisteTirsdag = entry.koreliste;
503 }
504 if (entry.ugedage.onsdag) {
505 a.ruteOnsdag = entry.rute;
506 a.korelisteOnsdag = entry.koreliste;
507 }
508 if (entry.ugedage.torsdag) {
509 a.ruteTorsdag = entry.rute;
510 a.korelisteTorsdag = entry.koreliste;
511 }
512 if (entry.ugedage.fredag) {
513 a.ruteFredag = entry.rute;
514 a.korelisteFredag = entry.koreliste;
515 }
516 if (entry.ugedage.lordag) {
517 a.ruteLordag = entry.rute;
518 a.korelisteLordag = entry.koreliste;
519 }
520 if (entry.ugedage.sondag) {
521 a.ruteSondag = entry.rute;
522 a.korelisteLordag = entry.koreliste;
523 }
524
525 updateDbkBane(a);
526
527 // Nu er det nye adresse object oprettet - nu skal det gemmes i søge strukturen og totallisten
528
529
530 TreeMap<Short, ArrayList<Address>> gade = searchStructure.get( a.gadeid );
531
532 if (gade == null) {
533 gade = new TreeMap<Short,ArrayList<Address>>();
534 searchStructure.put(a.gadeid, gade);
535 }
536
537 ArrayList<Address> litraList = gade.get(a.husnr);
538 if (litraList == null) {
539 litraList = new ArrayList<Address>();
540 gade.put(a.husnr, litraList);
541 }
542
543 litraList.add(a);
544 addressList.add(a);
545
546 }
547
548
549
550 /*
551 DAO:
552 UPDATE fulddaekning.adressetabel
553 SET dbkbane = case
554 when substr(korelisteMa,1,2) IN ('07','10','11','12','14','15','16','18','19','20') then 205 #DAO-BRA
555 when substr(korelisteMa,1,2) BETWEEN 24 and 30 then 201 #DAO-Ovrige
556 else 202 #dao syd (52-99=
557 END
558 WHERE distributor='DAO'
559 AND ruteMa is not null;
560
561 FD: Altid 200
562 NS: Altid 204
563 BK: 195,196,197,198
564 */
565
566 private void updateDbkBane(Address a) {
567 List<Short> daoBane205 = Arrays.asList( new Short[] {7,10,11,12,12,14,15,16,18,19,20} );
568
569
570 Short bane = null;
571
572 switch (a.distributor) {
573 case "BK":
574 bane = dbkBaneMap.get(a.postnr);
575 break;
576 case "DAO":
577 String koreliste = MiscUtils.firstNonNull(a.korelisteMandag,a.korelisteLordag, a.korelisteSondag); //DAO har kun 3 dækningstyper
578 short first2 = Short.parseShort( koreliste.substring(0,2) );
579 if ( daoBane205.contains(first2) ) {
580 bane = 205;
581 } else if (first2 >= 24 && first2<=30) {
582 bane = 201;
583 } else {
584 bane = 202;
585 }
586
587 break;
588 case "FD":
589 bane = 200;
590 break;
591 case "NS":
592 bane = 204;
593 break;
594 }
595
596 if (bane == null) {
597 throw new RuntimeException("Ukendt bane for postnr" + a.postnr);
598 }
599
600 if (a.dbkBane != bane) {
601 a.dbkBane = bane;
602 if (a.state ==AddressState.NOT_CHANGED) {
603 a.state = AddressState.MODIFIED;
604 }
605 }
606 }
607
608 public List<Address> getAddressList() {
609 return Collections.unmodifiableList(addressList);
610 }
611
612
613
614 public int getAfvistAntal() {
615 return afvisteEntries.size();
616 }
617
618 }

  ViewVC Help
Powered by ViewVC 1.1.20