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

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

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

dao/DaoAdresseVedligehold/src/main/java/dk/daoas/adressevedligehold/AddressManager.java revision 2855 by torben, Wed Jan 27 20:48:22 2016 UTC dao/DaoAdresseVedligehold/src/main/java/dk/daoas/adressevedligehold/coveragefileupload/AddressManager.java revision 3112 by torben, Mon Sep 19 13:41:02 2016 UTC
# Line 1  Line 1 
1  package dk.daoas.adressevedligehold;  package dk.daoas.adressevedligehold.coveragefileupload;
2    
3  import java.sql.SQLException;  import java.sql.SQLException;
4  import java.util.ArrayList;  import java.util.ArrayList;
# Line 11  import java.util.TreeMap; Line 11  import java.util.TreeMap;
11    
12  import org.apache.commons.lang3.StringUtils;  import org.apache.commons.lang3.StringUtils;
13    
 import dk.daoas.adressevedligehold.AddressSourceEntry.EntryType;  
14  import dk.daoas.adressevedligehold.beans.Address;  import dk.daoas.adressevedligehold.beans.Address;
15  import dk.daoas.adressevedligehold.beans.Address.AddressState;  import dk.daoas.adressevedligehold.beans.Address.AddressState;
16  import dk.daoas.adressevedligehold.db.DatabaseLayerImplementation;  import dk.daoas.adressevedligehold.coveragefileupload.AddressSourceEntry.EntryType;
17    import dk.daoas.adressevedligehold.db.DatabaseCoverageUpdate;
18    import dk.daoas.adressevedligehold.tasks.TaskLogger;
19  import dk.daoas.adressevedligehold.util.DeduplicateHelper;  import dk.daoas.adressevedligehold.util.DeduplicateHelper;
20  import dk.daoas.adressevedligehold.util.MiscUtils;  import dk.daoas.adressevedligehold.util.MiscUtils;
21  import dk.daoas.adressevedligehold.util.TimingHelper;  import dk.daoas.adressevedligehold.util.TimingHelper;
22    
23  /*  /*
24   * TODO: håndtering af entry dupletter ! (+ rapportering af dem)   *  
   
   
   
25   */   */
26    
27  public class AddressManager {  public class AddressManager {
28                    
29            private TaskLogger logger = TaskLogger.getInstance();
30            
31            private int duplicateCount;
32                    
33          List<Address> addressList;          List<Address> addressList;
34                    
35          Map<Integer, TreeMap<Short, ArrayList<Address>> > searchStructure;          Map<Integer, TreeMap<Short, ArrayList<Address>> > searchStructure;
36                    
37          ArrayList<AddressSourceEntry> afvisteEntries = new ArrayList<AddressSourceEntry>();          ArrayList<AddressSourceEntry> rejectedEntries = new ArrayList<AddressSourceEntry>();
38                    
39          Map<Short,Short> dbkBaneMap = new TreeMap<Short,Short>();          Map<Integer,String> unknownStreets = new TreeMap<Integer, String>();
40            
41            Map<Short,String> dbkBaneMap = new TreeMap<Short,String>();
42                    
43          public AddressManager() throws SQLException {          public AddressManager() throws SQLException {
44                  DatabaseLayerImplementation db = new DatabaseLayerImplementation();                  DatabaseCoverageUpdate db = new DatabaseCoverageUpdate();
45                                    
46                  searchStructure = new TreeMap<Integer, TreeMap<Short, ArrayList<Address>> >();                  searchStructure = new TreeMap<Integer, TreeMap<Short, ArrayList<Address>> >();
47                                    
# Line 56  public class AddressManager { Line 59  public class AddressManager {
59                          Short husnr = shortHelper.getInstance( a.husnr );                          Short husnr = shortHelper.getInstance( a.husnr );
60                          TreeMap<Short, ArrayList<Address>> gade = searchStructure.get( gadeid );                          TreeMap<Short, ArrayList<Address>> gade = searchStructure.get( gadeid );
61                                                    
62                          if (a.dbkBane > 0 && a.postnr<=4999) {                          if (a.dbkBane != null && a.dbkBane.length() > 0 && a.postnr<=4999) {
63                                  Short bane = dbkBaneMap.get(a.postnr);                                  String bane = dbkBaneMap.get(a.postnr);
64                                  if (bane == null) {                                  if (bane == null) {
65                                          dbkBaneMap.put(a.postnr, a.dbkBane);                                          dbkBaneMap.put(a.postnr, a.dbkBane);
66                                  }                                  }
# Line 82  public class AddressManager { Line 85  public class AddressManager {
85                          list.trimToSize();                          list.trimToSize();
86                  }                  }
87                                    
88                  System.out.println("AddressManager ready, elapsed " + timer.getElapsed() + "ms");                  logger.info("AddressManager ready, elapsed " + timer.getElapsed() + "ms");
89                                    
90                                    
91          }          }
92            
93          public void closeUnvisitedAddresses(String distributor, EntryUgedage ugedage) {          @SuppressWarnings("PMD.CollapsibleIfStatements")        
94            public int closeUnvisitedAddresses(String distributor, EntryUgedage ugedage) {
95                    
96                    int totalClosed = 0;
97                    
98                  for (Address addr : addressList) {                  for (Address addr : addressList) {
99                          if (addr.distributor == null)                          if (addr.distributor == null)
100                                  continue;                                  continue;
# Line 162  public class AddressManager { Line 169  public class AddressManager {
169                          if (addr.state == AddressState.NOT_CHANGED && closedCount>0) {                          if (addr.state == AddressState.NOT_CHANGED && closedCount>0) {
170                                  addr.state = AddressState.CLOSED;                                  addr.state = AddressState.CLOSED;
171                          }                          }
172                            
173                            if (closedCount>0) {
174                                    totalClosed++;
175                            }
176                                    
177                  }                  }
178                    
179                    return totalClosed;
180          }          }
181            
182            
183          public void dumpChanged() {          public void dumpChanged() {
184                  int count = 0;                  int count = 0;
185                  for (Address addr : addressList) {                  for (Address addr : addressList) {
# Line 179  public class AddressManager { Line 194  public class AddressManager {
194                                  continue;                                  continue;
195                          }                          }
196                                                    
197                          System.out.println(addr.state + ": " + addr.toStringExtended() );                          logger.info(addr.state + ": " + addr.toStringExtended() );
198                          System.out.println(addr.getRuteString() );                          logger.info(addr.getRuteString() );
199                                                    
200                          if (count++ > 50)                          if (count++ > 50)
201                                  return;                                  return;
202                  }                  }
203          }          }
204                    
205          public void writeBackChanges() {          public void writeBackChanges() throws Exception{
206                  System.out.println("Writing back changes");                  logger.info("Writing back changes");
207                  TimingHelper timer = new TimingHelper();                  TimingHelper timer = new TimingHelper();
208                                    
209                  List<Address> updates = new ArrayList<Address>(1024*1024);                  List<Address> updates = new ArrayList<Address>(1024*1024);
# Line 203  public class AddressManager { Line 218  public class AddressManager {
218                          }                          }
219                  }                  }
220                                    
221                  DatabaseLayerImplementation db = new DatabaseLayerImplementation();                  DatabaseCoverageUpdate db = new DatabaseCoverageUpdate();
222                                    
223                  db.updateAddresses(updates);                  db.updateAddresses(updates);
224                    db.saveNewAddresses(inserts);
225    
226                                    
227                                    
228                  System.out.println("Writeback done: elapsed " + timer.getElapsed() + "ms.");                  logger.info("Writeback done: elapsed " + timer.getElapsed() + "ms.");
229          }          }
230                    
231                    
# Line 224  public class AddressManager { Line 240  public class AddressManager {
240          private void visitSingle(AddressSourceEntry entry) {          private void visitSingle(AddressSourceEntry entry) {
241                  TreeMap<Short, ArrayList<Address>> gade = searchStructure.get( entry.gadeid );                  TreeMap<Short, ArrayList<Address>> gade = searchStructure.get( entry.gadeid );
242                  if (gade == null) {                  if (gade == null) {
243                            /* No need to register unknown streets, since we create all entries that we can
244                            if (! unknownStreets.containsKey(entry.gadeid)) {
245                                    unknownStreets.put(entry.gadeid, entry.vejnavn);                                
246                            }*/
247                            
248                          createFromEntry(entry); // if we get here there was no match - so we need to create it                          createFromEntry(entry); // if we get here there was no match - so we need to create it
249                          return;                          return;
250                  }                  }
# Line 233  public class AddressManager { Line 254  public class AddressManager {
254                          createFromEntry(entry); // if we get here there was no match - so we need to create it                          createFromEntry(entry); // if we get here there was no match - so we need to create it
255                          return;                          return;
256                  }                  }
257                                    boolean found = false;
258                  for (Address addr : litraList) {                  for (Address addr : litraList) {
259                          if (addr.husnrbogstav.equals(entry.litra) ) {                          if (addr.husnrbogstav.equals(entry.litra) ) {
260                                  updateAddress(addr, entry);                                  updateAddress(addr, entry);
261                                  return; //Done for now - no need to look at the rest of the list                                  found = true; // 1 visit should be enough but as long as there's duplicates on gadeid+husnr+litra we will visit them all
262                                    //when the issue with duplicates is resolved this should be reverted to a return or break
263                          }                          }
264                  }                  }
265                                    if (found == false) {
266                  createFromEntry(entry); // if we get here there was no match - so we need to create it                          createFromEntry(entry); // if we get here there was no match - so we need to create it
267                    }
268          }          }
269                    
270            @SuppressWarnings("PMD.CollapsibleIfStatements")        
271          private void visitRange(AddressSourceEntry entry) {          private void visitRange(AddressSourceEntry entry) {
272                                    
273                  TreeMap<Short, ArrayList<Address>> gade = searchStructure.get( entry.gadeid );                  TreeMap<Short, ArrayList<Address>> gade = searchStructure.get( entry.gadeid );
274                  if (gade == null) {                  if (gade == null) {
275                          System.out.println("[Range] Ukendt gadeID " + entry);                          if (! unknownStreets.containsKey(entry.gadeid)) {
276                                    unknownStreets.put(entry.gadeid, entry.vejnavn);                                
277                            }
278                            
279                            logger.info("[Range] Ukendt gadeID " + entry);
280                          return;                          return;
281                  }                  }
282                                    
# Line 287  public class AddressManager { Line 315  public class AddressManager {
315                    
316          private void updateAddress(Address addr, AddressSourceEntry entry) {          private void updateAddress(Address addr, AddressSourceEntry entry) {
317                  if ( addr.distributor != null && addr.distributor.equals(entry.distributor) == false) {                  if ( addr.distributor != null && addr.distributor.equals(entry.distributor) == false) {
318                          afvisteEntries.add(entry);                          rejectedEntries.add(entry);
319                          System.out.println("Afviser " + entry);                          logger.info("Afviser " + entry);
320                          return;                          return;
321                  }                  }
322                                    
# Line 310  public class AddressManager { Line 338  public class AddressManager {
338                                          }                                          }
339                                  }                                                                }                              
340                          } else {                          } else {
341                                  System.out.println( "Double visit monday " + addr);                                  duplicateCount++;
342                                    logger.info( "Double visit monday " + addr);
343                                    return; // if the entry is duplicate on one day that it covers - then it will be as well on all the othters
344                          }                          }
345    
346                  }                  }
# Line 332  public class AddressManager { Line 362  public class AddressManager {
362                                          }                                          }
363                                  }                                  }
364                          } else {                          } else {
365                                  System.out.println( "Double visit tuesday " + addr);                                  duplicateCount++;
366                                    logger.info( "Double visit tuesday " + addr);
367                                    return; // if the entry is duplicate on one day that it covers - then it will be as well on all the othters
368                          }                                                        }                              
369                  }                  }
370    
# Line 352  public class AddressManager { Line 384  public class AddressManager {
384                                          }                                          }
385                                  }                                  }
386                          } else {                          } else {
387                                  System.out.println( "Double visit wednesday " + addr);                                  duplicateCount++;
388                                    logger.info( "Double visit wednesday " + addr);
389                                    return; // if the entry is duplicate on one day that it covers - then it will be as well on all the othters
390                          }                                        }              
391                  }                  }
392    
# Line 374  public class AddressManager { Line 408  public class AddressManager {
408                                          }                                          }
409                                  }                                  }
410                          } else {                          } else {
411                                  System.out.println( "Double visit thursday " + addr);                                  duplicateCount++;
412                                    logger.info( "Double visit thursday " + addr);
413                                    return; // if the entry is duplicate on one day that it covers - then it will be as well on all the othters
414                          }                                                                }                                      
415                  }                  }
416    
# Line 395  public class AddressManager { Line 431  public class AddressManager {
431                                          }                                          }
432                                  }                                  }
433                          } else {                          } else {
434                                  System.out.println( "Double visit friday " + addr);                                  duplicateCount++;
435                                    logger.info( "Double visit friday " + addr);
436                                    return; // if the entry is duplicate on one day that it covers - then it will be as well on all the othters
437                          }                                }      
438                  }                  }
439    
# Line 417  public class AddressManager { Line 455  public class AddressManager {
455                                          }                                          }
456                                  }                                  }
457                          } else {                          } else {
458                                  System.out.println( "Double visit saturday " + addr);                                  duplicateCount++;
459                                    logger.info( "Double visit saturday " + addr);
460                                    return; // if the entry is duplicate on one day that it covers - then it will be as well on all the othters
461                          }                                                                }                                      
462                  }                  }
463    
# Line 438  public class AddressManager { Line 478  public class AddressManager {
478                                          }                                          }
479                                  }                                  }
480                          } else {                          } else {
481                                  System.out.println( "Double visit sunday " + addr);                                  duplicateCount++;
482                                    logger.info( "Double visit sunday " + addr);
483                                    return; // if the entry is duplicate on one day that it covers - then it will be as well on all the othters
484                          }                                                                }                                      
485                  }                  }
486                                    
487                                    
488                                    
489                  addr.visited = true;                  //addr.visited = true;
490                  if (addr.state == AddressState.NOT_CHANGED) {                  if (addr.state == AddressState.NOT_CHANGED) {
491                          if (addr.distributor == null) {                          if (addr.distributor == null) {
492                                  addr.state = AddressState.OPENED;                                  addr.state = AddressState.OPENED;
# Line 466  public class AddressManager { Line 508  public class AddressManager {
508                    
509                    
510          private void createFromEntry(AddressSourceEntry entry) {          private void createFromEntry(AddressSourceEntry entry) {
511                  if (entry.husnr == 999) {                  if (entry.husnr >= 1000) { //husnumre i DK må kun være på 3 cifre
512                          return;                          return;
513                  }                  }
514                    
515                    if (entry.husnr == 999 || entry.husnr == 998) { //frasorter de to højest gyldige husnr - det er typisk special adresser
516                            return;
517                    }
518                    
519                    if (entry.litra.length() > 1) { //litra må kun være på 1 tegn
520                            return;
521                    }
522                    if (entry.litra.length() == 1) {
523                            char litra = entry.litra.charAt(0);
524                            if ( Character.isLetter(litra) == false ) {
525                                    return;
526                            }
527                            
528                    }
529                    
530                  if (entry.kommunekode == 0 || entry.vejkode == 0) {                  if (entry.kommunekode == 0 || entry.vejkode == 0) {
531                          return;                          return;
532                  }                  }
533                  if (entry.kommunekode < 100) {                  if (entry.kommunekode < 100) {
534                          return;                          return;
535                  }                  }
                 if (Short.parseShort(Integer.toString(entry.gadeid).substring(0, 4)) != entry.postnr) {  
                         return; //gadeid / postnr mismatch  
                 }  
536                                    
537                    if (entry.vejkode > 9999) {
538                            return;
539                    }
540                                    
541                    if (entry.gadeid == 0) {
542                            return;
543                    }
544                                    
545                    String gadeidStr = Integer.toString(entry.gadeid);
546                    if (gadeidStr.length() != 9) {
547                            return;
548                    }
549                    if (Short.parseShort(gadeidStr.substring(0, 4)) != entry.postnr) {
550                            return; //gadeid / postnr mismatch
551                    }
552                                    
                 System.out.println("Opretter adresse ud fra " + entry);  
553                                    
                 Address a = new Address();  
                 a.state = AddressState.CREATED;  
554                                    
555                  a.distributor = entry.distributor;                  logger.info("Opretter adresse ud fra " + entry);
                 a.gadeid = entry.gadeid;  
                 a.kommunekode = entry.kommunekode;  
                 a.vejkode = entry.vejkode;  
                 a.vejnavn = entry.vejnavn;  
                 a.husnr = entry.husnr;  
                 a.husnrbogstav = entry.litra;  
                 a.postnr = entry.postnr;  
                 a.visited = true;  
556                                    
557                  if (entry.ugedage.mandag) {                  Address addr = new Address();
558                          a.ruteMandag = entry.rute;                  addr.state = AddressState.CREATED;
                         a.korelisteMandag = entry.koreliste;  
                 }  
                 if (entry.ugedage.tirsdag) {  
                         a.ruteTirsdag = entry.rute;  
                         a.korelisteTirsdag = entry.koreliste;  
                 }  
                 if (entry.ugedage.onsdag) {  
                         a.ruteOnsdag = entry.rute;  
                         a.korelisteOnsdag = entry.koreliste;  
                 }                
                 if (entry.ugedage.torsdag) {  
                         a.ruteTorsdag = entry.rute;  
                         a.korelisteTorsdag = entry.koreliste;  
                 }                
                 if (entry.ugedage.fredag) {  
                         a.ruteFredag = entry.rute;  
                         a.korelisteFredag = entry.koreliste;  
                 }                
                 if (entry.ugedage.lordag) {  
                         a.ruteLordag = entry.rute;  
                         a.korelisteLordag = entry.koreliste;  
                 }                
                 if (entry.ugedage.sondag) {  
                         a.ruteSondag = entry.rute;  
                         a.korelisteLordag = entry.koreliste;  
                 }                
559                                    
560                  updateDbkBane(a);                  addr.distributor = entry.distributor;
561                    addr.gadeid = entry.gadeid;
562                    addr.kommunekode = entry.kommunekode;
563                    addr.vejkode = entry.vejkode;
564                    addr.vejnavn = entry.vejnavn;
565                    addr.husnr = entry.husnr;
566                    addr.husnrbogstav = entry.litra;
567                    addr.postnr = entry.postnr;
568                                    
                 // Nu er det nye adresse object oprettet - nu skal det gemmes i søge strukturen og totallisten  
569                                    
570                    updateAddress(addr, entry);
571    
572                  TreeMap<Short, ArrayList<Address>> gade = searchStructure.get( a.gadeid );                  
573                    // Nu er det nye adresse object oprettet - nu skal det gemmes i søge strukturen og totallisten        
574                    TreeMap<Short, ArrayList<Address>> gade = searchStructure.get( addr.gadeid );
575                                    
576                  if (gade == null) {                  if (gade == null) {
577                          gade = new TreeMap<Short,ArrayList<Address>>();                          gade = new TreeMap<Short,ArrayList<Address>>();
578                          searchStructure.put(a.gadeid, gade);                          searchStructure.put(addr.gadeid, gade);
579                  }                  }
580                                    
581                  ArrayList<Address> litraList = gade.get(a.husnr);                  ArrayList<Address> litraList = gade.get(addr.husnr);
582                  if (litraList == null) {                  if (litraList == null) {
583                          litraList = new ArrayList<Address>();                          litraList = new ArrayList<Address>();
584                          gade.put(a.husnr, litraList);                          gade.put(addr.husnr, litraList);
585                  }                  }
586                                    
587                  litraList.add(a);                  litraList.add(addr);
588                  addressList.add(a);                  addressList.add(addr);
589                                                                    
590          }          }
591                    
# Line 568  public class AddressManager { Line 609  public class AddressManager {
609                    
610          private void updateDbkBane(Address a) {          private void updateDbkBane(Address a) {
611                  List<Short> daoBane205 = Arrays.asList( new Short[] {7,10,11,12,12,14,15,16,18,19,20} );                  List<Short> daoBane205 = Arrays.asList( new Short[] {7,10,11,12,12,14,15,16,18,19,20} );
612                    
613                    
614                  Short bane = null;                  String bane = null;
615                                    
616                  switch (a.distributor) {                  switch (a.distributor) {
617                  case "BK":                                        case "BK":                      
# Line 578  public class AddressManager { Line 619  public class AddressManager {
619                          break;                          break;
620                  case "DAO":                  case "DAO":
621                          String koreliste = MiscUtils.firstNonNull(a.korelisteMandag,a.korelisteLordag, a.korelisteSondag); //DAO har kun 3 dækningstyper                          String koreliste = MiscUtils.firstNonNull(a.korelisteMandag,a.korelisteLordag, a.korelisteSondag); //DAO har kun 3 dækningstyper
622                          short first2 = Short.parseShort( koreliste.substring(0,2) );                          try {
623                          if ( daoBane205.contains(first2) ) {                                  short first2 = Short.parseShort( koreliste.substring(0,2) );                            
624                                  bane = 205;                                  if ( daoBane205.contains(first2) ) { //Brabrand == 205 == W2
625                          } else if (first2 >= 24 && first2<=30) {                                          bane = "W2";
626                                  bane = 201;                                  } else if (first2 >= 24 && first2<=30) { // DAO-Øvrig = 201 = W4
627                          } else {                                          bane = "W4";
628                                  bane = 202;                                  } else { // DAO-Syd= 202
629                                            bane = "W3";
630                                    }
631                            } catch (NumberFormatException e) {
632                                    throw new RuntimeException("Error parsing koreliste '" + koreliste + "' for " + a);
633                          }                          }
634                                                                    
635                          break;                                            break;                  
636                  case "FD":                  case "FD": // FD == Bane 200 = W5
637                          bane = 200;                          bane = "W5";
638                          break;                          break;
639                  case "NS":                  case "NS": // NS == Bane 204 == W1
640                          bane = 204;                          bane = "204";
641                          break;                                            break;
642                    default:
643                            throw new RuntimeException("Ukendt distributor: " + a.distributor); //Silence findBugs
644                  }                  }
645                                    
646                  if (bane == null) {                  if (bane == null) {
647                          throw new RuntimeException("Ukendt bane for postnr" + a.postnr);                          throw new RuntimeException("Ukendt bane for postnr: " + a.postnr);
648                  }                  }
649                                    
650                  if (a.dbkBane != bane) {                  if (a.dbkBane != bane) {
# Line 612  public class AddressManager { Line 659  public class AddressManager {
659                  return Collections.unmodifiableList(addressList);                  return Collections.unmodifiableList(addressList);
660          }          }
661                    
662            public Map<Integer,String> getUnknownStreets() {
663                    return Collections.unmodifiableMap( unknownStreets );
664            }
665                    
666            public int getDuplicateCount() {
667                    return duplicateCount;
668            }
669                    
670          public int getAfvistAntal() {          public int getRejectedCount() {
671                  return afvisteEntries.size();                  return rejectedEntries.size();
672          }          }
673                    
674  }  }

Legend:
Removed from v.2855  
changed lines
  Added in v.3112

  ViewVC Help
Powered by ViewVC 1.1.20