Changeset 10312 in josm


Ignore:
Timestamp:
2016-06-02T01:31:16+02:00 (8 years ago)
Author:
Don-vip
Message:

sonar - squid:S2384 - Mutable members should not be stored or returned directly: Multipolygon

Location:
trunk/src/org/openstreetmap/josm/data/osm/visitor/paint
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/org/openstreetmap/josm/data/osm/visitor/paint/StyledMapRenderer.java

    r10307 r10312  
    659659                }
    660660                drawArea(r, p,
    661                         pd.selected ? paintSettings.getRelationSelectedColor(color.getAlpha()) : color,
     661                        pd.isSelected() ? paintSettings.getRelationSelectedColor(color.getAlpha()) : color,
    662662                        fillImage, extent, pfClip, disabled, text);
    663663            }
  • trunk/src/org/openstreetmap/josm/data/osm/visitor/paint/relations/Multipolygon.java

    r10216 r10312  
    124124        }
    125125
    126         public boolean isOuterRole(String role) {
     126        boolean isOuterRole(String role) {
    127127            if (role == null) return false;
    128128            for (String candidate: outerExactRoles) {
     
    135135        }
    136136
    137         public boolean isInnerRole(String role) {
     137        boolean isInnerRole(String role) {
    138138            if (role == null) return false;
    139139            for (String candidate: innerExactRoles) {
     
    164164
    165165    public static class JoinedWay {
    166         private final List<Node> nodes;
    167         private final Collection<Long> wayIds;
    168         private final boolean selected;
    169 
     166        protected final List<Node> nodes;
     167        protected final Collection<Long> wayIds;
     168        protected boolean selected;
     169
     170        /**
     171         * Constructs a new {@code JoinedWay}.
     172         * @param nodes list of nodes
     173         * @param wayIds list of way IDs
     174         * @param selected whether joined way is selected or not
     175         */
    170176        public JoinedWay(List<Node> nodes, Collection<Long> wayIds, boolean selected) {
    171             this.nodes = nodes;
    172             this.wayIds = wayIds;
     177            this.nodes = new ArrayList<>(nodes);
     178            this.wayIds = new ArrayList<>(wayIds);
    173179            this.selected = selected;
    174180        }
    175181
     182        /**
     183         * Replies the list of nodes.
     184         * @return the list of nodes
     185         */
    176186        public List<Node> getNodes() {
    177             return nodes;
    178         }
    179 
     187            return Collections.unmodifiableList(nodes);
     188        }
     189
     190        /**
     191         * Replies the list of way IDs.
     192         * @return the list of way IDs
     193         */
    180194        public Collection<Long> getWayIds() {
    181             return wayIds;
    182         }
    183 
    184         public boolean isSelected() {
     195            return Collections.unmodifiableCollection(wayIds);
     196        }
     197
     198        /**
     199         * Determines if this is selected.
     200         * @return {@code true} if this is selected
     201         */
     202        public final boolean isSelected() {
    185203            return selected;
    186204        }
    187205
     206        /**
     207         * Sets whether this is selected
     208         * @param selected {@code true} if this is selected
     209         * @since 10312
     210         */
     211        public final void setSelected(boolean selected) {
     212            this.selected = selected;
     213        }
     214
     215        /**
     216         * Determines if this joined way is closed.
     217         * @return {@code true} if this joined way is closed
     218         */
    188219        public boolean isClosed() {
    189             return nodes.isEmpty() || nodes.get(nodes.size() - 1).equals(nodes.get(0));
    190         }
    191     }
    192 
    193     public static class PolyData {
     220            return nodes.isEmpty() || getLastNode().equals(getFirstNode());
     221        }
     222
     223        /**
     224         * Returns the first node.
     225         * @return the first node
     226         * @since 10312
     227         */
     228        public Node getFirstNode() {
     229            return nodes.get(0);
     230        }
     231
     232        /**
     233         * Returns the last node.
     234         * @return the last node
     235         * @since 10312
     236         */
     237        public Node getLastNode() {
     238            return nodes.get(nodes.size() - 1);
     239        }
     240    }
     241
     242    public static class PolyData extends JoinedWay {
    194243        public enum Intersection {
    195244            INSIDE,
     
    199248
    200249        private final Path2D.Double poly;
    201         public boolean selected;
    202250        private Rectangle2D bounds;
    203         private final Collection<Long> wayIds;
    204         private final List<Node> nodes;
    205251        private final List<PolyData> inners;
    206252
     253        /**
     254         * Constructs a new {@code PolyData} from a closed way.
     255         * @param closedWay closed way
     256         */
    207257        public PolyData(Way closedWay) {
    208258            this(closedWay.getNodes(), closedWay.isSelected(), Collections.singleton(closedWay.getUniqueId()));
    209259        }
    210260
     261        /**
     262         * Constructs a new {@code PolyData} from a {@link JoinedWay}.
     263         * @param joinedWay joined way
     264         */
    211265        public PolyData(JoinedWay joinedWay) {
    212             this(joinedWay.getNodes(), joinedWay.isSelected(), joinedWay.getWayIds());
     266            this(joinedWay.nodes, joinedWay.selected, joinedWay.wayIds);
    213267        }
    214268
    215269        private PolyData(List<Node> nodes, boolean selected, Collection<Long> wayIds) {
    216             this.wayIds = Collections.unmodifiableCollection(wayIds);
    217             this.nodes = new ArrayList<>(nodes);
    218             this.selected = selected;
     270            super(nodes, wayIds, selected);
    219271            this.inners = new ArrayList<>();
    220272            this.poly = new Path2D.Double();
    221273            this.poly.setWindingRule(Path2D.WIND_EVEN_ODD);
    222274            buildPoly();
     275        }
     276
     277        /**
     278         * Constructs a new {@code PolyData} from an existing {@code PolyData}.
     279         * @param copy existing instance
     280         */
     281        public PolyData(PolyData copy) {
     282            super(copy.nodes, copy.wayIds, copy.selected);
     283            this.poly = (Path2D.Double) copy.poly.clone();
     284            this.inners = new ArrayList<>(copy.inners);
    223285        }
    224286
     
    242304                appendInner(inner.poly);
    243305            }
    244         }
    245 
    246         public PolyData(PolyData copy) {
    247             this.selected = copy.selected;
    248             this.poly = (Path2D.Double) copy.poly.clone();
    249             this.wayIds = Collections.unmodifiableCollection(copy.wayIds);
    250             this.nodes = new ArrayList<>(copy.nodes);
    251             this.inners = new ArrayList<>(copy.inners);
    252306        }
    253307
     
    293347        }
    294348
    295         public Collection<Long> getWayIds() {
    296             return wayIds;
    297         }
    298 
    299         public List<Node> getNodes() {
    300             return nodes;
    301         }
    302 
    303349        public List<PolyData> getInners() {
    304             return inners;
     350            return Collections.unmodifiableList(inners);
    305351        }
    306352
     
    370416        }
    371417
     418        @Override
    372419        public boolean isClosed() {
    373             if (nodes.size() < 3 || nodes.get(0) != nodes.get(nodes.size() - 1)) return false;
     420            if (nodes.size() < 3 || !getFirstNode().equals(getLastNode()))
     421                return false;
    374422            for (PolyData inner : inners) {
    375                 if (!inner.isClosed()) return false;
     423                if (!inner.isClosed())
     424                    return false;
    376425            }
    377426            return true;
     
    404453    private boolean incomplete;
    405454
     455    /**
     456     * Constructs a new {@code Multipolygon} from a relation.
     457     * @param r relation
     458     */
    406459    public Multipolygon(Relation r) {
    407460        load(r);
     
    415468            if (m.getMember().isIncomplete()) {
    416469                this.incomplete = true;
    417             } else if (m.getMember().isDrawable()) {
    418                 if (m.isWay()) {
    419                     Way w = m.getWay();
    420 
    421                     if (w.getNodesCount() < 2) {
    422                         continue;
    423                     }
    424 
    425                     if (matcher.isInnerRole(m.getRole())) {
    426                         innerWays.add(w);
    427                     } else if (matcher.isOuterRole(m.getRole())) {
    428                         outerWays.add(w);
    429                     } else if (!m.hasRole()) {
    430                         outerWays.add(w);
    431                     } // Remaining roles ignored
    432                 } // Non ways ignored
    433             }
     470            } else if (m.getMember().isDrawable() && m.isWay()) {
     471                Way w = m.getWay();
     472
     473                if (w.getNodesCount() < 2) {
     474                    continue;
     475                }
     476
     477                if (matcher.isInnerRole(m.getRole())) {
     478                    innerWays.add(w);
     479                } else if (!m.hasRole() || matcher.isOuterRole(m.getRole())) {
     480                    outerWays.add(w);
     481                } // Remaining roles ignored
     482            } // Non ways ignored
    434483        }
    435484
     
    443492    }
    444493
     494    /**
     495     * Determines if this multipolygon is incomplete.
     496     * @return {@code true} if this multipolygon is incomplete
     497     */
    445498    public final boolean isIncomplete() {
    446499        return incomplete;
     
    460513            result.add(new PolyData(jw));
    461514            if (!jw.isClosed()) {
    462                 openEnds.add(jw.getNodes().get(0));
    463                 openEnds.add(jw.getNodes().get(jw.getNodes().size() - 1));
     515                openEnds.add(jw.getFirstNode());
     516                openEnds.add(jw.getLastNode());
    464517            }
    465518        }
     
    560613
    561614    public PolyData findOuterPolygon(PolyData inner, List<PolyData> outerPolygons) {
    562 
    563615        // First try to test only bbox, use precise testing only if we don't get unique result
    564616        Rectangle2D innerBox = inner.getBounds();
     
    595647
    596648    private void addInnerToOuters(List<PolyData> innerPolygons, List<PolyData> outerPolygons)  {
    597 
    598649        if (innerPolygons.isEmpty()) {
    599650            combinedPolygons.addAll(outerPolygons);
     
    624675     */
    625676    public List<Way> getOuterWays() {
    626         return outerWays;
     677        return Collections.unmodifiableList(outerWays);
    627678    }
    628679
     
    632683     */
    633684    public List<Way> getInnerWays() {
    634         return innerWays;
    635     }
    636 
     685        return Collections.unmodifiableList(innerWays);
     686    }
     687
     688    /**
     689     * Replies the list of combined polygons.
     690     * @return the list of combined polygons
     691     */
    637692    public List<PolyData> getCombinedPolygons() {
    638         return combinedPolygons;
    639     }
    640 
     693        return Collections.unmodifiableList(combinedPolygons);
     694    }
     695
     696    /**
     697     * Replies the list of inner polygons.
     698     * @return the list of inner polygons
     699     */
    641700    public List<PolyData> getInnerPolygons() {
    642701        final List<PolyData> innerPolygons = new ArrayList<>();
     
    645704    }
    646705
     706    /**
     707     * Replies the list of outer polygons.
     708     * @return the list of outer polygons
     709     */
    647710    public List<PolyData> getOuterPolygons() {
    648711        final List<PolyData> outerPolygons = new ArrayList<>();
     
    656719     */
    657720    public List<Node> getOpenEnds() {
    658         return openEnds;
     721        return Collections.unmodifiableList(openEnds);
    659722    }
    660723}
  • trunk/src/org/openstreetmap/josm/data/osm/visitor/paint/relations/MultipolygonCache.java

    r10247 r10312  
    9797                map2.put(r, multipolygon);
    9898                for (PolyData pd : multipolygon.getCombinedPolygons()) {
    99                     if (pd.selected) {
     99                    if (pd.isSelected()) {
    100100                        selectedPolyData.add(pd);
    101101                    }
     
    311311
    312312        for (Iterator<PolyData> it = selectedPolyData.iterator(); it.hasNext();) {
    313             it.next().selected = false;
     313            it.next().setSelected(false);
    314314            it.remove();
    315315        }
     
    332332                                for (PolyData pd : multipolygon.getCombinedPolygons()) {
    333333                                    if (pd.getWayIds().contains(p.getUniqueId())) {
    334                                         pd.selected = true;
     334                                        pd.setSelected(true);
    335335                                        selectedPolyData.add(pd);
    336336                                    }
Note: See TracChangeset for help on using the changeset viewer.