/[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 2845 - (show annotations) (download)
Tue Jan 26 08:21:22 2016 UTC (8 years, 3 months ago) by torben
File size: 14825 byte(s)
Correct bug so we only update those that really was changed

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

  ViewVC Help
Powered by ViewVC 1.1.20