// License: GPL. For details, see LICENSE file.
package org.openstreetmap.josm.plugins.fixAddresses;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import org.openstreetmap.josm.data.osm.OsmPrimitive;
import org.openstreetmap.josm.data.osm.Relation;
/**
* This class is the container for all street segments with the same name. Every street
* consists at least of one segment.
*
* @author Oliver Wieland <oliver.wieland@online.de>
*/
public class OSMStreet extends OSMEntityBase {
private List<IOSMEntity> children;
private List<OSMAddress> addresses;
public OSMStreet(OsmPrimitive osmPrimitive) {
super(osmPrimitive);
}
@Override
public List<IOSMEntity> getChildren() {
return children;
}
/**
* Adds a street segment to the street node.
* @param segment street segment
*/
public void addStreetSegment(OSMStreetSegment segment) {
lazyCreateChildren();
children.add(segment);
Collections.sort(children);
}
/**
* Lazy creation of children list.
*/
private void lazyCreateChildren() {
if (children == null) {
children = new ArrayList<>();
}
}
/**
* Adds an associated address to the street.
*
* @param aNode the address node to add
*/
public void addAddress(OSMAddress aNode) {
lazyCreateAddresses();
addresses.add(aNode);
}
/**
* Lazy creation of address list.
*/
private void lazyCreateAddresses() {
if (addresses == null) {
addresses = new ArrayList<>();
}
}
/**
* Checks for addresses.
*
* @return true, if street has one or more associated addresses.
*/
public boolean hasAddresses() {
return addresses != null && addresses.size() > 0;
}
public List<OSMAddress> getAddresses() {
return addresses;
}
public void setAddresses(List<OSMAddress> addresses) {
this.addresses = addresses;
}
/**
* Gets the number of addresses associated with this street.
* @return number of addresses associated with this street
*/
public int getNumberOfAddresses() {
if (addresses == null) return 0;
return addresses.size();
}
/**
* Gets the number of street segments of this street.
* @return number of street segments of this street
*/
public int getNumberOfSegments() {
if (children == null) return 0;
int sc = 0;
for (IOSMEntity node : children) {
if (node instanceof OSMStreetSegment) {
sc++;
}
}
return sc;
}
/**
* Gets the road type(s) of this street. If the street has different types,
* they are separated by comma.
* @return road type(s) of this street
*/
public String getType() {
List<String> types = new ArrayList<>();
for (IOSMEntity seg : getChildren()) {
OsmPrimitive osmPrim = seg.getOsmObject();
if (TagUtils.hasHighwayTag(osmPrim)) {
String val = osmPrim.get(TagConstants.HIGHWAY_TAG);
if (!types.contains(val)) {
types.add(val);
}
}
}
StringBuffer sb = new StringBuffer(20);
for (String string : types) {
if (sb.length() > 0) {
sb.append(", ");
}
sb.append(string);
}
return sb.toString();
}
/**
* Checks if the attached way has an associated street relation.
*
* @return true, if this street has an "associatedStreet" relation.
*/
public boolean hasAssociatedStreetRelation() {
OsmPrimitive osm = getOsmObject();
for (OsmPrimitive refs : osm.getReferrers()) {
if (refs instanceof Relation) {
Relation rel = (Relation) refs;
if (TagUtils.isAssociatedStreetRelation(rel)) {
return true;
}
}
}
return false;
}
@Override
public String toString() {
StringBuffer sb = new StringBuffer(getName());
if (children != null) {
sb.append(String.format(", %d segments", children.size()));
}
if (addresses != null) {
sb.append(String.format(", %d address entries", addresses.size()));
}
return sb.toString();
}
}