Changeset 2407 in josm for trunk/src/org/openstreetmap/josm/data/osm/OsmPrimitive.java
- Timestamp:
- 2009-11-08T13:38:44+01:00 (14 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/org/openstreetmap/josm/data/osm/OsmPrimitive.java
r2405 r2407 147 147 * 148 148 * @return DataSet this primitive is part of. 149 * @throws DataIntegrityProblemException when primitive is not part of any dataset150 149 */ 151 150 public DataSet getDataSet() { 151 return dataSet; 152 } 153 154 /** 155 * Throws exception if primitive is not part of the dataset 156 */ 157 public void checkDataset() { 152 158 if (dataSet == null) 153 throw new DataIntegrityProblemException("Primitive must be part of the dataset"); 154 return dataSet; 159 throw new DataIntegrityProblemException("Primitive must be part of the dataset: " + toString()); 155 160 } 156 161 … … 648 653 return keys.keySet(); 649 654 } 655 656 657 /*------------ 658 * Referrers 659 ------------*/ 660 661 private Object referrers; 662 663 664 /** 665 * Add new referrer. If referrer is already included then no action is taken 666 * @param referrer 667 */ 668 protected void addReferrer(OsmPrimitive referrer) { 669 // Based on methods from josm-ng 670 if (referrers == null) { 671 referrers = referrer; 672 } else if (referrers instanceof OsmPrimitive) { 673 if (referrers != referrer) { 674 referrers = new OsmPrimitive[] { (OsmPrimitive)referrers, referrer }; 675 } 676 } else { 677 for (OsmPrimitive primitive:(OsmPrimitive[])referrers) { 678 if (primitive == referrer) 679 return; 680 } 681 OsmPrimitive[] orig = (OsmPrimitive[])referrers; 682 OsmPrimitive[] bigger = new OsmPrimitive[orig.length+1]; 683 System.arraycopy(orig, 0, bigger, 0, orig.length); 684 bigger[orig.length] = referrer; 685 referrers = bigger; 686 } 687 } 688 689 /** 690 * Remove referrer. No action is taken if referrer is not registered 691 * @param referrer 692 */ 693 protected void removeReferrer(OsmPrimitive referrer) { 694 // Based on methods from josm-ng 695 if (referrers instanceof OsmPrimitive) { 696 if (referrers == referrer) { 697 referrers = null; 698 } 699 } else if (referrers instanceof OsmPrimitive[]) { 700 OsmPrimitive[] orig = (OsmPrimitive[])referrers; 701 int idx = -1; 702 for (int i=0; i<orig.length; i++) { 703 if (orig[i] == referrer) { 704 idx = i; 705 break; 706 } 707 } 708 if (idx == -1) 709 return; 710 711 if (orig.length == 2) { 712 referrers = orig[1-idx]; // idx is either 0 or 1, take the other 713 } else { // downsize the array 714 OsmPrimitive[] smaller = new OsmPrimitive[orig.length-1]; 715 System.arraycopy(orig, 0, smaller, 0, idx); 716 System.arraycopy(orig, idx+1, smaller, idx, smaller.length-idx); 717 referrers = smaller; 718 } 719 } 720 } 721 /** 722 * Find primitives that reference this primitive. Returns only primitives that are included in the same 723 * dataset as this primitive. <br> 724 * 725 * For example following code will add wnew as referer to all nodes of existingWay, but this method will 726 * not return wnew because it's not part of the dataset <br> 727 * 728 * <code>Way wnew = new Way(existingWay)</code> 729 * 730 * @return a collection of all primitives that reference this primitive. 731 */ 732 733 public final List<OsmPrimitive> getReferrers() { 734 checkDataset(); 735 // Method copied from OsmPrimitive in josm-ng 736 // Returns only referrers that are members of the same dataset (primitive can have some fake references, for example 737 // when way is cloned 738 if (referrers == null) 739 return Collections.emptyList(); 740 741 if (referrers instanceof OsmPrimitive) { 742 if (((OsmPrimitive)referrers).dataSet == dataSet) 743 return Collections.singletonList((OsmPrimitive)referrers); 744 else 745 return Collections.emptyList(); 746 } 747 748 List<OsmPrimitive> result = new ArrayList<OsmPrimitive>(); 749 for (OsmPrimitive o:(OsmPrimitive[])referrers) { 750 if (dataSet == o.dataSet) { 751 result.add(o); 752 } 753 } 754 755 return result; 756 } 757 650 758 651 759 /**
Note:
See TracChangeset
for help on using the changeset viewer.