Ignore:
Timestamp:
2023-09-07T16:52:05+02:00 (16 months ago)
Author:
taylor.smock
Message:

Fix some potential DataIntegrityProblemException sources

This also fixes some lint issues.

merge-overlap: See #19627
reltoolbox: See #23074, #23077, #23123

File:
1 edited

Legend:

Unmodified
Added
Removed
  • applications/editors/josm/plugins/addrinterpolation/src/org/openstreetmap/josm/plugins/AddrInterpolation/AddrInterpolationDialog.java

    r35978 r36132  
    5555import org.openstreetmap.josm.data.osm.Relation;
    5656import org.openstreetmap.josm.data.osm.RelationMember;
     57import org.openstreetmap.josm.data.osm.Tagged;
    5758import org.openstreetmap.josm.data.osm.Way;
    5859import org.openstreetmap.josm.gui.MainApplication;
    5960import org.openstreetmap.josm.gui.widgets.UrlLabel;
    6061import org.openstreetmap.josm.tools.ImageProvider;
     62import org.openstreetmap.josm.tools.Logging;
    6163
    6264/**
     
    6567public class AddrInterpolationDialog extends JDialog implements ActionListener {
    6668
    67     private Way selectedStreet = null;
    68     private Way addrInterpolationWay = null;
    69     private Relation associatedStreetRelation = null;
    70     private ArrayList<Node> houseNumberNodes = null;  // Additional nodes with addr:housenumber
     69    private Way selectedStreet;
     70    private Way addrInterpolationWay;
     71    private Relation associatedStreetRelation;
     72    private ArrayList<Node> houseNumberNodes;  // Additional nodes with addr:housenumber
    7173
    7274    private static String lastIncrement = "";
    73     private static int lastAccuracyIndex = 0;
     75    private static int lastAccuracyIndex;
    7476    private static String lastCity = "";
    7577    private static String lastState = "";
     
    7779    private static String lastCountry = "";
    7880    private static String lastFullAddress = "";
    79     private static boolean lastConvertToHousenumber = false;
     81    private static boolean lastConvertToHousenumber;
    8082
    8183    // Edit controls
    82     private EscapeDialog dialog = null;
    83     private JRadioButton streetNameButton = null;
    84     private JRadioButton streetRelationButton = null;
    85     private JTextField startTextField = null;
    86     private JTextField endTextField = null;
    87     private JTextField incrementTextField = null;
    88     private JTextField cityTextField = null;
    89     private JTextField stateTextField = null;
    90     private JTextField postCodeTextField = null;
    91     private JTextField countryTextField = null;
    92     private JTextField fullTextField = null;
    93     private Checkbox cbConvertToHouseNumbers = null;
    94 
    95     private boolean relationChanged = false; // Whether to re-trigger data changed for relation
     84    private EscapeDialog dialog;
     85    private JRadioButton streetNameButton;
     86    private JRadioButton streetRelationButton;
     87    private JTextField startTextField;
     88    private JTextField endTextField;
     89    private JTextField incrementTextField;
     90    private JTextField cityTextField;
     91    private JTextField stateTextField;
     92    private JTextField postCodeTextField;
     93    private JTextField countryTextField;
     94    private JTextField fullTextField;
     95    private Checkbox cbConvertToHouseNumbers;
     96
     97    private boolean relationChanged; // Whether to re-trigger data changed for relation
    9698    // Track whether interpolation method is known so that auto detect doesn't override a previous choice.
    97     private boolean interpolationMethodSet = false;
     99    private boolean interpolationMethodSet;
    98100
    99101    // NOTE: The following 2 arrays must match in number of elements and position
     
    101103    String[] addrInterpolationTags = {"odd", "even", "all", "alphabetic", "Numeric"};
    102104    String[] addrInterpolationStrings = {tr("Odd"), tr("Even"), tr("All"), tr("Alphabetic"), tr("Numeric") }; // Translatable names for display
    103     private final int NumericIndex = 4;
    104     private JComboBox<String> addrInterpolationList = null;
     105    private static final int NUMERIC_INDEX = 4;
     106    private JComboBox<String> addrInterpolationList;
    105107
    106108    // NOTE: The following 2 arrays must match in number of elements and position
    107109    String[] addrInclusionTags = {"actual", "estimate", "potential" }; // Tag values for map
    108110    String[] addrInclusionStrings = {tr("Actual"), tr("Estimate"), tr("Potential") }; // Translatable names for display
    109     private JComboBox<String> addrInclusionList = null;
     111    private JComboBox<String> addrInclusionList;
    110112
    111113    // For tracking edit changes as group for undo
    112     private Collection<Command> commandGroup = null;
    113     private Relation editedRelation = null;
    114 
     114    private Collection<Command> commandGroup;
     115    private Relation editedRelation;
     116
     117    /**
     118     * Create a new address interpolation dialog with a specified name
     119     * @param name The name to show in the title bar
     120     */
    115121    public AddrInterpolationDialog(String name) {
    116122
    117         if (!FindAndSaveSelections()) {
     123        if (!findAndSaveSelections()) {
    118124            return;
    119125        }
    120126
    121         JPanel editControlsPane = CreateEditControls();
    122 
    123         ShowDialog(editControlsPane, name);
    124     }
    125 
    126     private void ShowDialog(JPanel editControlsPane, String name) {
     127        JPanel editControlsPane = createEditControls();
     128
     129        showDialog(editControlsPane, name);
     130    }
     131
     132    /**
     133     * Show the dialog
     134     * @param editControlsPane The controls to show
     135     * @param name The name of the dialog
     136     */
     137    private void showDialog(JPanel editControlsPane, String name) {
    127138        dialog = new EscapeDialog(MainApplication.getMainFrame(), name, true);
    128139
     
    144155
    145156        dialog.setVisible(true);
    146 
    147         lastIncrement = incrementTextField.getText();
    148         lastCity = cityTextField.getText();
    149         lastState = stateTextField.getText();
    150         lastPostCode = postCodeTextField.getText();
    151         lastCountry = countryTextField.getText();
    152         lastFullAddress = fullTextField.getText();
    153         lastConvertToHousenumber = cbConvertToHouseNumbers.getState();
    154 
    155     }
    156 
    157     // Create edit control items and return JPanel on which they reside
    158     private JPanel CreateEditControls() {
     157        updateFields(this);
     158    }
     159
     160    private static void updateFields(AddrInterpolationDialog dialog) {
     161        lastIncrement = dialog.incrementTextField.getText();
     162        lastCity = dialog.cityTextField.getText();
     163        lastState = dialog.stateTextField.getText();
     164        lastPostCode = dialog.postCodeTextField.getText();
     165        lastCountry = dialog.countryTextField.getText();
     166        lastFullAddress = dialog.fullTextField.getText();
     167        lastConvertToHousenumber = dialog.cbConvertToHouseNumbers.getState();
     168    }
     169
     170    /**
     171     * Create edit control items and return JPanel on which they reside
     172     * @return the edit controls
     173     */
     174    private JPanel createEditControls() {
    159175
    160176        JPanel editControlsPane = new JPanel();
     
    167183
    168184        String streetName = selectedStreet.get("name");
    169         String streetRelation = FindRelation();
    170         if (streetRelation.equals("")) {
     185        String streetRelation = findRelation();
     186        if ("".equals(streetRelation)) {
    171187            streetRelation = " (Create new)";
    172188        }
     
    213229
    214230        // Preload any values already set in map
    215         GetExistingMapKeys();
     231        getExistingMapKeys();
    216232
    217233
    218234        JLabel[] textLabels = {startLabel, endLabel, numberingLabel, incrementLabel, inclusionLabel};
    219235        Component[] editFields = {startTextField, endTextField, addrInterpolationList, incrementTextField, addrInclusionList};
    220         AddEditControlRows(textLabels, editFields, editControlsPane);
     236        addEditControlRows(textLabels, editFields, editControlsPane);
    221237
    222238        cbConvertToHouseNumbers = new Checkbox(tr("Convert way to individual house numbers."), null, lastConvertToHousenumber);
     
    231247        }
    232248
    233         JPanel optionPanel = CreateOptionalFields();
     249        JPanel optionPanel = createOptionalFields();
    234250        c.gridx = 0;
    235251        c.gridwidth = 2; // # of columns to span
     
    242258            @Override
    243259            public void keyPressed(KeyEvent e) {
    244                 if (e.getKeyCode() == KeyEvent.VK_ENTER) {
    245                     if (ValidateAndSave()) {
    246                         dialog.dispose();
    247                     }
     260                if (e.getKeyCode() == KeyEvent.VK_ENTER && validateAndSave()) {
     261                    dialog.dispose();
    248262                }
    249263            }
     
    261275            @Override
    262276            public void focusGained(FocusEvent fe) {
    263                 if (!interpolationMethodSet) {
    264                     if (AutoDetectInterpolationMethod()) {
    265                         interpolationMethodSet = true;  // Don't auto detect over a previous choice
    266                     }
     277                if (!interpolationMethodSet && autoDetectInterpolationMethod()) {
     278                    interpolationMethodSet = true;  // Don't auto detect over a previous choice
    267279                }
    268280            }
     
    271283        // Watch when Interpolation Method combo box is changed so that
    272284        // Numeric increment box can be enabled or disabled.
    273         addrInterpolationList.addActionListener(new ActionListener() {
    274             @Override
    275             public void actionPerformed(ActionEvent e) {
    276                 int selectedIndex = addrInterpolationList.getSelectedIndex();
    277                 incrementTextField.setEnabled(selectedIndex == NumericIndex); // Enable or disable numeric field
    278             }
     285        addrInterpolationList.addActionListener(e -> {
     286            int selectedIndex = addrInterpolationList.getSelectedIndex();
     287            incrementTextField.setEnabled(selectedIndex == NUMERIC_INDEX); // Enable or disable numeric field
    279288        });
    280289
    281290        editControlsPane.add(cbConvertToHouseNumbers, c);
    282291
    283         if (houseNumberNodes.size() > 0) {
     292        if (!houseNumberNodes.isEmpty()) {
    284293            JLabel houseNumberNodeNote = new JLabel(tr("Will associate {0} additional house number nodes",
    285294                    houseNumberNodes.size()));
     
    318327    // combo box gets focus.
    319328    // Return true if a method was detected
    320     private boolean AutoDetectInterpolationMethod() {
    321 
    322         String startValueString = ReadTextField(startTextField);
    323         String endValueString = ReadTextField(endTextField);
     329    private boolean autoDetectInterpolationMethod() {
     330        String startValueString = readTextField(startTextField);
     331        String endValueString = readTextField(endTextField);
    324332        if ((startValueString == null) || (endValueString == null)) {
    325333            // Not all values entered yet
     
    336344            if (isEven(startValue)) {
    337345                if (isEven(endValue)) {
    338                     SelectInterpolationMethod("even");
     346                    selectInterpolationMethod("even");
    339347                } else {
    340                     SelectInterpolationMethod("all");
     348                    selectInterpolationMethod("all");
    341349                }
    342350            } else {
    343351                if (!isEven(endValue)) {
    344                     SelectInterpolationMethod("odd");
     352                    selectInterpolationMethod("odd");
    345353                } else {
    346                     SelectInterpolationMethod("all");
     354                    selectInterpolationMethod("all");
    347355                }
    348356            }
     
    352360            char endingChar = endValueString.charAt(endValueString.length()-1);
    353361
    354             if (!IsNumeric("" + startingChar) && !IsNumeric("" + endingChar)) {
     362            if (!isNumeric("" + startingChar) && !isNumeric("" + endingChar)) {
    355363                // Both end with alpha
    356                 SelectInterpolationMethod("alphabetic");
     364                selectInterpolationMethod("alphabetic");
    357365                return true;
    358366            }
    359367
    360             if (IsNumeric("" + startingChar) && !IsNumeric("" + endingChar)) {
     368            if (isNumeric("" + startingChar) && !isNumeric("" + endingChar)) {
    361369                endingChar = Character.toUpperCase(endingChar);
    362370                if ((endingChar >= 'A') && (endingChar <= 'Z')) {
    363371                    // First is a number, last is Latin alpha
    364                     SelectInterpolationMethod("alphabetic");
     372                    selectInterpolationMethod("alphabetic");
    365373                    return true;
    366374                }
     
    373381    }
    374382
    375     // Set Interpolation Method combo box to method specified by 'currentMethod' (an OSM key value)
    376     private void SelectInterpolationMethod(String currentMethod) {
     383    /**
     384     * Set Interpolation Method combo box to method specified by 'currentMethod' (an OSM key value)
     385     * @param currentMethod The current interpolation method (number or key values)
     386     */
     387    private void selectInterpolationMethod(String currentMethod) {
    377388        int currentIndex = 0;
    378389        if (isLong(currentMethod)) {
     
    394405    }
    395406
    396     // Set Inclusion Method combo box to method specified by 'currentMethod' (an OSM key value)
    397     private void SelectInclusion(String currentMethod) {
     407    /**
     408     * Set Inclusion Method combo box to method specified by 'currentMethod' (an OSM key value)
     409     * @param currentMethod The key to use
     410     */
     411    private void selectInclusion(String currentMethod) {
    398412        int currentIndex = 0;
    399413        // Must scan OSM key values because combo box is already loaded with translated strings
     
    407421    }
    408422
    409     // Create optional control fields in a group box
    410     private JPanel CreateOptionalFields() {
     423    /**
     424     * Create optional control fields in a group box
     425     * @return a panel with optional fields
     426     */
     427    private JPanel createOptionalFields() {
    411428
    412429        JPanel editControlsPane = new JPanel();
     
    450467
    451468        Component[] optionalEditFields = {cityTextField, stateTextField, postCodeTextField, countryTextField, fullTextField};
    452         AddEditControlRows(optionalTextLabels, optionalEditFields, editControlsPane);
     469        addEditControlRows(optionalTextLabels, optionalEditFields, editControlsPane);
    453470
    454471        JPanel optionPanel = new JPanel(new BorderLayout());
     
    463480    }
    464481
    465     // Populate dialog for any possible existing settings if editing an existing Address interpolation way
    466     private void GetExistingMapKeys() {
     482    /**
     483     * Populate dialog for any possible existing settings if editing an existing Address interpolation way
     484     */
     485    private void getExistingMapKeys() {
    467486
    468487        // Check all nodes for optional addressing data
    469488        //    Address interpolation nodes will overwrite these value if they contain optional data
    470489        for (Node node : houseNumberNodes) {
    471             CheckNodeForAddressTags(node);
     490            checkNodeForAddressTags(node);
    472491        }
    473492
     
    476495            if (currentMethod != null) {
    477496
    478                 SelectInterpolationMethod(currentMethod);
     497                selectInterpolationMethod(currentMethod);
    479498                interpolationMethodSet = true;  // Don't auto detect over a previous choice
    480499            }
     
    482501            String currentInclusion = addrInterpolationWay.get("addr:inclusion");
    483502            if (currentInclusion != null) {
    484                 SelectInclusion(currentInclusion);
     503                selectInclusion(currentInclusion);
    485504            }
    486505
     
    498517                endTextField.setText(value);
    499518            }
    500             CheckNodeForAddressTags(firstNode);
    501             CheckNodeForAddressTags(lastNode);
    502         }
    503     }
    504 
    505     // Check for any existing address data.   If found,
    506     // overwrite any previous data
    507     private void CheckNodeForAddressTags(Node checkNode) {
    508 
     519            checkNodeForAddressTags(firstNode);
     520            checkNodeForAddressTags(lastNode);
     521        }
     522    }
     523
     524    /**
     525     * Check for any existing address data.
     526     * If found, overwrite any previous data
     527     * @param checkNode The node to look for possible existing values
     528     */
     529    private static void checkNodeForAddressTags(Tagged checkNode) {
    509530        // Interrogate possible existing optional values
    510531        String value = checkNode.get("addr:city");
     
    530551    }
    531552
    532     // Look for a possible 'associatedStreet' type of relation for selected street
    533     // Returns relation description, or an empty string
    534     private String FindRelation() {
    535         String relationDescription = null;
    536         DataSet currentDataSet = MainApplication.getLayerManager().getEditDataSet();
     553    /**
     554     * Look for a possible 'associatedStreet' type of relation for selected street
     555     * @return relation description, or an empty string
     556     */
     557    private String findRelation() {
     558        final DataSet currentDataSet = MainApplication.getLayerManager().getEditDataSet();
    537559        if (currentDataSet != null) {
    538560            for (Relation relation : currentDataSet.getRelations()) {
    539 
    540                 String relationType = relation.get("type");
    541                 if (relationType != null) {
    542                     if (relationType.equals("associatedStreet")) {
    543                         for (RelationMember relationMember : relation.getMembers()) {
    544                             if (relationMember.isWay()) {
    545                                 Way way = (Way) relationMember.getMember();
    546                                 // System.out.println("Name: " + way.get("name") );
    547                                 if (way == selectedStreet) {
    548                                     associatedStreetRelation = relation;
    549                                     relationDescription = Long.toString(way.getId());
    550 
    551                                     String streetName = "";
    552                                     if (relation.getKeys().containsKey("name")) {
    553                                         streetName = relation.get("name");
    554                                     } else {
    555                                         // Relation is unnamed - use street name
    556                                         streetName = selectedStreet.get("name");
    557                                     }
    558                                     relationDescription += " (" + streetName + ")";
    559                                     return relationDescription;
     561                if ("associatedStreet".equals(relation.get("type"))) {
     562                    for (RelationMember relationMember : relation.getMembers()) {
     563                        if (relationMember.isWay()) {
     564                            final StringBuilder relationDescription = new StringBuilder();
     565                            Way way = (Way) relationMember.getMember();
     566                            // System.out.println("Name: " + way.get("name") );
     567                            if (way == selectedStreet) {
     568                                associatedStreetRelation = relation;
     569                                relationDescription.append(way.getId()).append('(');
     570
     571                                if (relation.getKeys().containsKey("name")) {
     572                                    relationDescription.append(relation.get("name"));
     573                                } else {
     574                                    // Relation is unnamed - use street name
     575                                    relationDescription.append(selectedStreet.get("name"));
    560576                                }
     577                                relationDescription.append(')');
     578                                return relationDescription.toString();
    561579                            }
    562580                        }
     
    565583            }
    566584        }
    567 
    568585        return "";
    569586    }
    570587
    571     // We can proceed only if there is both a named way (the 'street') and
    572     // one un-named way (the address interpolation way ) selected.
    573     //    The plugin menu item is enabled after a single way is selected to display a more meaningful
    574     //    message (a new user may not realize that they need to select both the street and
    575     //    address interpolation way first).
    576     // Also, selected street and working address interpolation ways are saved.
    577     private boolean FindAndSaveSelections() {
     588    /** We can proceed only if there is both a named way (the 'street') and
     589     * one un-named way (the address interpolation way ) selected.
     590     *    The plugin menu item is enabled after a single way is selected to display a more meaningful
     591     *    message (a new user may not realize that they need to select both the street and
     592     *    address interpolation way first).
     593     * Also, selected street and working address interpolation ways are saved.
     594     * @return {@code true} if
     595     */
     596    private boolean findAndSaveSelections() {
    578597
    579598        boolean isValid = false;
     
    583602        DataSet currentDataSet = MainApplication.getLayerManager().getEditDataSet();
    584603        if (currentDataSet != null) {
    585             for (OsmPrimitive osm : currentDataSet.getSelectedWays()) {
    586                 Way way = (Way) osm;
     604            for (Way way : currentDataSet.getSelectedWays()) {
    587605                if (way.getKeys().containsKey("name")) {
    588606                    namedWayCount++;
     
    599617            houseNumberNodes = new ArrayList<>();
    600618            // Check selected nodes
    601             for (OsmPrimitive osm : currentDataSet.getSelectedNodes()) {
    602                 Node node = (Node) osm;
     619            for (Node node : currentDataSet.getSelectedNodes()) {
    603620                if (node.getKeys().containsKey("addr:housenumber")) {
    604621                    houseNumberNodes.add(node);
     
    606623            }
    607624
    608             if (addrInterpolationWay != null) {
    609                 // Check nodes in middle of address interpolation way
    610                 if (addrInterpolationWay.getNodesCount() > 2) {
    611                     for (int i = 1; i < (addrInterpolationWay.getNodesCount()-2); i++) {
    612                         Node testNode = addrInterpolationWay.getNode(i);
    613                         if (testNode.getKeys().containsKey("addr:housenumber")) {
    614                             houseNumberNodes.add(testNode);
    615                         }
     625            // Check nodes in middle of address interpolation way
     626            if (addrInterpolationWay != null && addrInterpolationWay.getNodesCount() > 2) {
     627                for (int i = 1; i < (addrInterpolationWay.getNodesCount()-2); i++) {
     628                    Node testNode = addrInterpolationWay.getNode(i);
     629                    if (testNode.getKeys().containsKey("addr:housenumber")) {
     630                        houseNumberNodes.add(testNode);
    616631                    }
    617632                }
     
    630645            if (unNamedWayCount != 1) {
    631646                // Allow for street + house number nodes only to be selected (no address interpolation way).
    632                 if (houseNumberNodes.size() > 0) {
     647                if (!houseNumberNodes.isEmpty()) {
    633648                    isValid = true;
    634649                } else {
     
    655670     * @param container container
    656671     */
    657     private void AddEditControlRows(JLabel[] labels,
    658             Component[] editFields,
    659             Container container) {
     672    private static void addEditControlRows(JLabel[] labels,
     673                                    Component[] editFields,
     674                                    Container container) {
    660675        GridBagConstraints c = new GridBagConstraints();
    661676        c.anchor = GridBagConstraints.EAST;
     
    680695    public void actionPerformed(ActionEvent e) {
    681696        if ("ok".equals(e.getActionCommand())) {
    682             if (ValidateAndSave()) {
     697            if (validateAndSave()) {
    683698                dialog.dispose();
    684699            }
     
    688703    }
    689704
    690     // For Alpha interpolation, return base string
    691     //   For example: "22A" -> "22"
    692     //   For example: "A" -> ""
    693     //    Input string must not be empty
    694     private String BaseAlpha(String strValue) {
     705    /**
     706     * For Alpha interpolation, return base string
     707     * For example: "22A" -> "22"
     708     * For example: "A" -> ""
     709     *  Input string must not be empty
     710     * @param strValue The value to get the base string of
     711     * @return the base string, or an empty string
     712     */
     713    private static String baseAlpha(String strValue) {
    695714        if (strValue.length() > 0) {
    696             return strValue.substring(0, strValue.length()-1);
     715            return strValue.substring(0, strValue.length() - 1);
    697716        } else {
    698717            return "";
     
    700719    }
    701720
    702     private char LastChar(String strValue) {
     721    /**
     722     * Get the last char of a string
     723     * @param strValue The string to get the last char of
     724     * @return The last char, or {@code 0}.
     725     */
     726    private static char lastChar(String strValue) {
    703727        if (strValue.length() > 0) {
    704             return strValue.charAt(strValue.length()-1);
     728            return strValue.charAt(strValue.length() - 1);
    705729        } else {
    706730            return 0;
     
    708732    }
    709733
    710     // Test for valid positive long int
    711     private boolean isLong(String input) {
     734    /**
     735     * Test for valid positive long int
     736     * @param input The input string
     737     * @return {@code true} if the input is a positive long
     738     */
     739    private static boolean isLong(String input) {
    712740        try {
    713             Long val = Long.parseLong(input);
     741            long val = Long.parseLong(input);
    714742            return (val > 0);
    715         } catch (Exception e) {
     743        } catch (NumberFormatException e) {
     744            Logging.trace(e);
    716745            return false;
    717746        }
    718747    }
    719748
    720     private boolean isEven(Long input) {
     749    /**
     750     * Check if a number is even
     751     * @param input The input number
     752     * @return {@code true} if the number is even
     753     */
     754    private static boolean isEven(long input) {
    721755        return ((input % 2) == 0);
    722756    }
    723757
    724     private static Pattern p = Pattern.compile("^[0-9]+$");
    725     private static boolean IsNumeric(String s) {
    726         return p.matcher(s).matches();
    727     }
    728 
    729     private void InterpolateAlphaSection(int startNodeIndex, int endNodeIndex, String endValueString,
    730             char startingChar, char endingChar) {
    731 
    732 
    733         String baseAlpha = BaseAlpha(endValueString);
     758    private static final Pattern PATTERN_NUMERIC = Pattern.compile("^[0-9]+$");
     759
     760    /**
     761     * Check if a string is numeric
     762     * @param s The string to check
     763     * @return {@code true} if it is a numeric string
     764     */
     765    private static boolean isNumeric(String s) {
     766        return PATTERN_NUMERIC.matcher(s).matches();
     767    }
     768
     769
     770    private void interpolateAlphaSection(int startNodeIndex, int endNodeIndex, String endValueString,
     771                                         char startingChar, char endingChar) {
     772
     773
     774        String baseAlpha = baseAlpha(endValueString);
    734775        int nSegments = endNodeIndex - startNodeIndex;
    735776
    736777        double[] segmentLengths = new double[nSegments];
    737778        // Total length of address interpolation way section
    738         double totalLength = CalculateSegmentLengths(startNodeIndex, endNodeIndex, segmentLengths);
     779        double totalLength = calculateSegmentLengths(startNodeIndex, endNodeIndex, segmentLengths);
    739780
    740781
     
    784825    }
    785826
    786     private void CreateAlphaInterpolation(String startValueString, String endValueString) {
    787         char startingChar = LastChar(startValueString);
    788         char endingChar = LastChar(endValueString);
     827    private void createAlphaInterpolation(String startValueString, String endValueString) {
     828        char startingChar = lastChar(startValueString);
     829        char endingChar = lastChar(endValueString);
    789830
    790831        if (isLong(startValueString)) {
     
    798839            Node testNode = addrInterpolationWay.getNode(i);
    799840            String endNodeNumber = testNode.get("addr:housenumber");
    800             if (endNodeNumber != null) {
    801                 // This is a potential anchor node
    802                 if (endNodeNumber != "") {
    803                     char anchorChar = LastChar(endNodeNumber);
    804                     if ((anchorChar > startingChar) && (anchorChar < endingChar)) {
    805                         // Lies within the expected range
    806                         InterpolateAlphaSection(startIndex, i, endNodeNumber, startingChar, anchorChar);
    807 
    808                         // For next interpolation section
    809                         startingChar = anchorChar;
    810                         startValueString = endNodeNumber;
    811                         startIndex = i;
    812                     }
    813                 }
    814 
     841            // This is a potential anchor node
     842            if (endNodeNumber != null && !"".equals(endNodeNumber)) {
     843                char anchorChar = lastChar(endNodeNumber);
     844                if ((anchorChar > startingChar) && (anchorChar < endingChar)) {
     845                    // Lies within the expected range
     846                    interpolateAlphaSection(startIndex, i, endNodeNumber, startingChar, anchorChar);
     847
     848                    // For next interpolation section
     849                    startingChar = anchorChar;
     850                    startValueString = endNodeNumber;
     851                    startIndex = i;
     852                }
    815853            }
    816854        }
    817855
    818856        // End nodes do not actually contain housenumber value yet (command has not executed), so use user-entered value
    819         InterpolateAlphaSection(startIndex, addrInterpolationWay.getNodesCount()-1, endValueString, startingChar, endingChar);
    820     }
    821 
    822     private double CalculateSegmentLengths(int startNodeIndex, int endNodeIndex, double[] segmentLengths) {
     857        interpolateAlphaSection(startIndex, addrInterpolationWay.getNodesCount()-1, endValueString, startingChar, endingChar);
     858    }
     859
     860    private double calculateSegmentLengths(int startNodeIndex, int endNodeIndex, double[] segmentLengths) {
    823861        Node fromNode = addrInterpolationWay.getNode(startNodeIndex);
    824862        double totalLength = 0.0;
     
    834872    }
    835873
    836     private void InterpolateNumericSection(int startNodeIndex, int endNodeIndex,
    837             long startingAddr, long endingAddr,
    838             long increment) {
     874    private void interpolateNumericSection(int startNodeIndex, int endNodeIndex,
     875                                           long startingAddr, long endingAddr,
     876                                           long increment) {
    839877
    840878        int nSegments = endNodeIndex - startNodeIndex;
     
    843881
    844882        // Total length of address interpolation way section
    845         double totalLength = CalculateSegmentLengths(startNodeIndex, endNodeIndex, segmentLengths);
     883        double totalLength = calculateSegmentLengths(startNodeIndex, endNodeIndex, segmentLengths);
    846884
    847885        int nHouses = (int) ((endingAddr - startingAddr) / increment) -1;
     
    885923    }
    886924
    887     private void CreateNumericInterpolation(String startValueString, String endValueString, long increment) {
     925    private void createNumericInterpolation(String startValueString, String endValueString, long increment) {
    888926
    889927        long startingAddr = Long.parseLong(startValueString);
     
    895933            Node testNode = addrInterpolationWay.getNode(i);
    896934            String strEndNodeNumber = testNode.get("addr:housenumber");
    897             if (strEndNodeNumber != null) {
    898                 // This is a potential anchor node
    899                 if (isLong(strEndNodeNumber)) {
    900 
    901                     long anchorAddrNumber = Long.parseLong(strEndNodeNumber);
    902                     if ((anchorAddrNumber > startingAddr) && (anchorAddrNumber < endingAddr)) {
    903                         // Lies within the expected range
    904                         InterpolateNumericSection(startIndex, i, startingAddr, anchorAddrNumber, increment);
    905 
    906                         // For next interpolation section
    907                         startingAddr = anchorAddrNumber;
    908                         startValueString = strEndNodeNumber;
    909                         startIndex = i;
    910                     }
    911                 }
    912 
     935            // This is a potential anchor node
     936            if (strEndNodeNumber != null && isLong(strEndNodeNumber)) {
     937                long anchorAddrNumber = Long.parseLong(strEndNodeNumber);
     938                if ((anchorAddrNumber > startingAddr) && (anchorAddrNumber < endingAddr)) {
     939                    // Lies within the expected range
     940                    interpolateNumericSection(startIndex, i, startingAddr, anchorAddrNumber, increment);
     941
     942                    // For next interpolation section
     943                    startingAddr = anchorAddrNumber;
     944                    startValueString = strEndNodeNumber;
     945                    startIndex = i;
     946                }
    913947            }
    914948        }
    915949
    916950        // End nodes do not actually contain housenumber value yet (command has not executed), so use user-entered value
    917         InterpolateNumericSection(startIndex, addrInterpolationWay.getNodesCount()-1, startingAddr, endingAddr, increment);
     951        interpolateNumericSection(startIndex, addrInterpolationWay.getNodesCount()-1, startingAddr, endingAddr, increment);
    918952    }
    919953
    920954    // Called if user has checked "Convert to House Numbers" checkbox.
    921     private void ConvertWayToHousenumbers(String selectedMethod, String startValueString, String endValueString,
    922             String incrementString) {
     955    private void convertWayToHousenumbers(String selectedMethod, String startValueString, String endValueString,
     956                                          String incrementString) {
    923957        // - Use nodes labeled with 'same type' as interim anchors in the middle of the way to identify unequal spacing.
    924958        // - Ignore nodes of different type; for example '25b' is ignored in sequence 5..15
    925959
    926960        // Calculate required number of house numbers to create
    927         if (selectedMethod.equals("alphabetic")) {
    928 
    929             CreateAlphaInterpolation(startValueString, endValueString);
     961        if ("alphabetic".equals(selectedMethod)) {
     962
     963            createAlphaInterpolation(startValueString, endValueString);
    930964
    931965        } else {
    932966            long increment = 1;
    933             if (selectedMethod.equals("odd") || selectedMethod.equals("even")) {
     967            if ("odd".equals(selectedMethod) || "even".equals(selectedMethod)) {
    934968                increment = 2;
    935             } else if (selectedMethod.equals("Numeric")) {
     969            } else if ("Numeric".equals(selectedMethod)) {
    936970                increment = Long.parseLong(incrementString);
    937971            }
    938             CreateNumericInterpolation(startValueString, endValueString, increment);
    939         }
    940 
    941         RemoveAddressInterpolationWay();
    942 
    943     }
    944 
    945     private void RemoveAddressInterpolationWay() {
     972            createNumericInterpolation(startValueString, endValueString, increment);
     973        }
     974
     975        removeAddressInterpolationWay();
     976
     977    }
     978
     979    private void removeAddressInterpolationWay() {
    946980
    947981        // Remove way - nodes of the way remain
    948         commandGroup.add(new DeleteCommand(addrInterpolationWay));
     982        commandGroup.add(DeleteCommand.delete(Collections.singleton(addrInterpolationWay)));
    949983
    950984        // Remove untagged nodes
     
    952986            Node testNode = addrInterpolationWay.getNode(i);
    953987            if (!testNode.hasKeys()) {
    954                 commandGroup.add(new DeleteCommand(testNode));
     988                commandGroup.add(DeleteCommand.delete(Collections.singleton(testNode)));
    955989            }
    956990        }
     
    959993    }
    960994
    961     private boolean ValidateAndSave() {
    962 
    963         String startValueString = ReadTextField(startTextField);
    964         String endValueString = ReadTextField(endTextField);
    965         String incrementString = ReadTextField(incrementTextField);
    966         String city = ReadTextField(cityTextField);
    967         String state = ReadTextField(stateTextField);
    968         String postCode = ReadTextField(postCodeTextField);
    969         String country = ReadTextField(countryTextField);
    970         String fullAddress = ReadTextField(fullTextField);
    971 
    972         String selectedMethod = GetInterpolationMethod();
     995    private boolean validateAndSave() {
     996
     997        String startValueString = readTextField(startTextField);
     998        String endValueString = readTextField(endTextField);
     999        String incrementString = readTextField(incrementTextField);
     1000        String city = readTextField(cityTextField);
     1001        String state = readTextField(stateTextField);
     1002        String postCode = readTextField(postCodeTextField);
     1003        String country = readTextField(countryTextField);
     1004        String fullAddress = readTextField(fullTextField);
     1005
     1006        String selectedMethod = getInterpolationMethod();
    9731007        if (addrInterpolationWay != null) {
    9741008            Long startAddr = 0L, endAddr = 0L;
    975             if (!selectedMethod.equals("alphabetic")) {
     1009            if (!"alphabetic".equals(selectedMethod)) {
    9761010                Long[] addrArray = {startAddr, endAddr};
    977                 if (!ValidAddressNumbers(startValueString, endValueString, addrArray)) {
     1011                if (!validAddressNumbers(startValueString, endValueString, addrArray)) {
    9781012                    return false;
    9791013                }
     
    9831017
    9841018            String errorMessage = "";
    985             if (selectedMethod.equals("odd")) {
    986                 if (isEven(startAddr) || isEven(endAddr)) {
    987                     errorMessage = tr("Expected odd numbers for addresses");
    988                 }
    989 
    990             } else if (selectedMethod.equals("even")) {
    991                 if (!isEven(startAddr) || !isEven(endAddr)) {
    992                     errorMessage = tr("Expected even numbers for addresses");
    993                 }
    994             } else if (selectedMethod.equals("all")) {
    995 
    996             } else if (selectedMethod.equals("alphabetic")) {
    997                 errorMessage = ValidateAlphaAddress(startValueString, endValueString);
    998 
    999             } else if (selectedMethod.equals("Numeric")) {
    1000 
    1001                 if (!ValidNumericIncrementString(incrementString, startAddr, endAddr)) {
    1002                     errorMessage = tr("Expected valid number for increment");
    1003                 }
    1004             }
    1005             if (!errorMessage.equals("")) {
     1019            switch (selectedMethod) {
     1020                case "odd":
     1021                    if (isEven(startAddr) || isEven(endAddr)) {
     1022                        errorMessage = tr("Expected odd numbers for addresses");
     1023                    }
     1024                    break;
     1025                case "even":
     1026                    if (!isEven(startAddr) || !isEven(endAddr)) {
     1027                        errorMessage = tr("Expected even numbers for addresses");
     1028                    }
     1029                    break;
     1030                case "alphabetic":
     1031                    errorMessage = validateAlphaAddress(startValueString, endValueString);
     1032                    break;
     1033                case "Numeric":
     1034                    if (!validNumericIncrementString(incrementString, startAddr, endAddr)) {
     1035                        errorMessage = tr("Expected valid number for increment");
     1036                    }
     1037                    break;
     1038                case "all":
     1039                default:
     1040                    // Fall through
     1041            }
     1042            if (!"".equals(errorMessage)) {
    10061043                JOptionPane.showMessageDialog(MainApplication.getMainFrame(), errorMessage, tr("Error"), JOptionPane.ERROR_MESSAGE);
    10071044                return false;
     
    10091046        }
    10101047
    1011         if (country != null) {
    1012             if (country.length() != 2) {
    1013                 JOptionPane.showMessageDialog(MainApplication.getMainFrame(),
    1014                         tr("Country code must be 2 letters"), tr("Error"), JOptionPane.ERROR_MESSAGE);
    1015                 return false;
    1016             }
     1048        if (country != null && country.length() != 2) {
     1049            JOptionPane.showMessageDialog(MainApplication.getMainFrame(),
     1050                    tr("Country code must be 2 letters"), tr("Error"), JOptionPane.ERROR_MESSAGE);
     1051            return false;
    10171052        }
    10181053
     
    10341069
    10351070            String interpolationTagValue = selectedMethod;
    1036             if (selectedMethod.equals("Numeric")) {
     1071            if ("Numeric".equals(selectedMethod)) {
    10371072                // The interpolation method is the number for 'Numeric' case
    10381073                interpolationTagValue = incrementString;
     
    10421077                // Convert way to house numbers is checked.
    10431078                //  Create individual nodes and delete interpolation way
    1044                 ConvertWayToHousenumbers(selectedMethod, startValueString, endValueString, incrementString);
     1079                convertWayToHousenumbers(selectedMethod, startValueString, endValueString, incrementString);
    10451080            } else {
    10461081                // Address interpolation way will remain
    10471082                commandGroup.add(new ChangePropertyCommand(addrInterpolationWay, "addr:interpolation", interpolationTagValue));
    1048                 commandGroup.add(new ChangePropertyCommand(addrInterpolationWay, "addr:inclusion", GetInclusionMethod()));
     1083                commandGroup.add(new ChangePropertyCommand(addrInterpolationWay, "addr:inclusion", getInclusionMethod()));
    10491084            }
    10501085
     
    10611096            // Relation button was selected
    10621097            if (associatedStreetRelation == null) {
    1063                 CreateRelation(currentDataSet, streetName);
     1098                createRelation(currentDataSet, streetName);
    10641099                // relationChanged = true;   (not changed since it was created)
    10651100            }
     
    10681103
    10691104            if (addrInterpolationWay != null) {
    1070                 AddToRelation(associatedStreetRelation, addrInterpolationWay, "house");
     1105                addToRelation(associatedStreetRelation, addrInterpolationWay, "house");
    10711106            }
    10721107        }
     
    10771112
    10781113            if (streetRelationButton.isSelected()) {
    1079                 AddToRelation(associatedStreetRelation, node, "house");
     1114                addToRelation(associatedStreetRelation, node, "house");
    10801115            }
    10811116            Map<String, String> tags = new HashMap<>();
     
    11051140    }
    11061141
    1107     private boolean ValidNumericIncrementString(String incrementString, long startingAddr, long endingAddr) {
     1142    private static boolean validNumericIncrementString(String incrementString, long startingAddr, long endingAddr) {
    11081143
    11091144        if (!isLong(incrementString)) {
     
    11151150        }
    11161151
    1117         if (((endingAddr - startingAddr) % testIncrement) != 0) {
    1118             return false;
    1119         }
    1120         return true;
     1152        return ((endingAddr - startingAddr) % testIncrement) == 0;
    11211153    }
    11221154
    11231155    // Create Associated Street relation, add street, and add to list of commands to perform
    1124     private void CreateRelation(DataSet currentDataSet, String streetName) {
     1156    private void createRelation(DataSet currentDataSet, String streetName) {
    11251157        associatedStreetRelation = new Relation();
    11261158        associatedStreetRelation.put("name", streetName);
     
    11331165    // Read from dialog text box, removing leading and trailing spaces
    11341166    // Return the string, or null for a zero length string
    1135     private String ReadTextField(JTextField field) {
     1167    private static String readTextField(JTextField field) {
    11361168        String value = field.getText();
    11371169        if (value != null) {
    11381170            value = value.trim();
    1139             if (value.equals("")) {
     1171            if ("".equals(value)) {
    11401172                value = null;
    11411173            }
     
    11461178    // Test if relation contains specified member
    11471179    //   If not already present, it is added
    1148     private void AddToRelation(Relation relation, OsmPrimitive testMember, String role) {
     1180    private void addToRelation(Relation relation, OsmPrimitive testMember, String role) {
    11491181        boolean isFound = false;
    11501182        for (RelationMember relationMember : relation.getMembers()) {
     
    11681200    //   Last character of ending must be greater than starting
    11691201    //   Return empty error message if OK
    1170     private String ValidateAlphaAddress(String startValueString,
    1171             String endValueString) {
     1202    private static String validateAlphaAddress(String startValueString,
     1203                                        String endValueString) {
    11721204        String errorMessage = "";
    11731205
    1174         if (startValueString.equals("") || endValueString.equals("")) {
     1206        if ("".equals(startValueString) || "".equals(endValueString)) {
    11751207            errorMessage = tr("Please enter valid number for starting and ending address");
    11761208        } else {
    1177             char startingChar = LastChar(startValueString);
    1178             char endingChar = LastChar(endValueString);
     1209            char startingChar = lastChar(startValueString);
     1210            char endingChar = lastChar(endValueString);
    11791211
    11801212
    11811213            boolean isOk = false;
    1182             if (IsNumeric("" + startingChar) && !IsNumeric("" + endingChar)) {
     1214            if (isNumeric("" + startingChar) && !isNumeric("" + endingChar)) {
    11831215                endingChar = Character.toUpperCase(endingChar);
    11841216                if ((endingChar >= 'A') && (endingChar <= 'Z')) {
     
    11861218                    isOk = true;
    11871219                }
    1188             } else if (!IsNumeric("" + startingChar) && !IsNumeric("" + endingChar)) {
     1220            } else if (!isNumeric("" + startingChar) && !isNumeric("" + endingChar)) {
    11891221                // Both are alpha
    11901222                isOk = true;
     
    11981230
    11991231                // Get number portion of first item: may or may not have letter suffix
    1200                 String numStart = BaseAlpha(startValueString);
    1201                 if (IsNumeric(startValueString)) {
     1232                String numStart = baseAlpha(startValueString);
     1233                if (isNumeric(startValueString)) {
    12021234                    numStart = startValueString;
    12031235                }
    12041236
    1205                 String numEnd = BaseAlpha(endValueString);
     1237                String numEnd = baseAlpha(endValueString);
    12061238                if (!numStart.equals(numEnd)) {
    12071239                    errorMessage = tr("Starting and ending numbers must be the same for alphabetic addresses");
     
    12191251
    12201252    // Convert string addresses to numeric, with error check
    1221     private boolean ValidAddressNumbers(String startValueString,
    1222             String endValueString, Long[] addrArray) {
     1253    private static boolean validAddressNumbers(String startValueString,
     1254                                        String endValueString, Long[] addrArray) {
    12231255        String errorMessage = "";
    12241256
     
    12291261            errorMessage = tr("Please enter valid number for ending address");
    12301262        }
    1231         if (errorMessage.equals("")) {
     1263        if ("".equals(errorMessage)) {
    12321264            addrArray[0] = Long.parseLong(startValueString);
    12331265            addrArray[1] = Long.parseLong(endValueString);
     
    12381270        }
    12391271
    1240         if (errorMessage.equals("")) {
     1272        if ("".equals(errorMessage)) {
    12411273            return true;
    12421274
     
    12471279    }
    12481280
    1249     private String GetInterpolationMethod() {
     1281    private String getInterpolationMethod() {
    12501282        int selectedIndex = addrInterpolationList.getSelectedIndex();
    12511283        return addrInterpolationTags[selectedIndex];
    12521284    }
    12531285
    1254     private String GetInclusionMethod() {
     1286    private String getInclusionMethod() {
    12551287        int selectedIndex = addrInclusionList.getSelectedIndex();
    12561288        lastAccuracyIndex = selectedIndex;
Note: See TracChangeset for help on using the changeset viewer.