package ru.rodsoft.openstreetmap.josm.plugins.customizepublictransportstop;
import java.util.ArrayList;
import java.util.Collection;
import org.openstreetmap.josm.data.osm.DataSet;
import org.openstreetmap.josm.data.osm.Node;
import org.openstreetmap.josm.data.osm.OsmPrimitive;
import org.openstreetmap.josm.data.osm.Relation;
import org.openstreetmap.josm.data.osm.RelationMember;
/**
*
* @author Rodion Scherbakov
* Operation of constructing of stop area object from selected JOSM object
*/
public class CreateStopAreaFromSelectedObjectOperation extends
StopAreaOperationBase
{
/**
* Constructor of operation object
* @param currentDataSet Current Josm data set
*/
public CreateStopAreaFromSelectedObjectOperation(DataSet currentDataSet)
{
super(currentDataSet);
}
/**
* Parsing of josm object tags and customizing of stop area object
* @param member Josm object
*/
public void parseTags(StopArea stopArea, OsmPrimitive member)
{
if(stopArea.name == null)
stopArea.name = getTagValue(member, OSMTags.NAME_TAG);
if(stopArea.nameEn == null)
stopArea.nameEn = getTagValue(member, OSMTags.NAME_EN_TAG);
if(stopArea.operator == null)
stopArea.operator = getTagValue(member, OSMTags.OPERATOR_TAG);
if(stopArea.network == null)
stopArea.network = getTagValue(member, OSMTags.NETWORK_TAG);
if(stopArea.service == null)
stopArea.service = getTagValue(member, OSMTags.SERVICE_TAG);
if(OSMTags.LOCAL_NETWORK_TAG_VALUE.equals(stopArea.service))
stopArea.service = OSMTags.COMMUTER_NETWORK_TAG_VALUE;
if(compareTag(member, OSMTags.BUS_TAG, OSMTags.YES_TAG_VALUE))
stopArea.isBus = true;
if(compareTag(member, OSMTags.TROLLEYBUS_TAG, OSMTags.YES_TAG_VALUE))
stopArea.isTrolleybus = true;
if(compareTag(member, OSMTags.SHARE_TAXI_TAG, OSMTags.YES_TAG_VALUE))
stopArea.isShareTaxi = true;
if(!(stopArea.isBus || stopArea.isShareTaxi || stopArea.isTrolleybus) && compareTag(member, OSMTags.HIGHWAY_TAG, OSMTags.BUS_STOP_TAG_VALUE))
stopArea.isBus = true;
if(compareTag(member, OSMTags.TRAM_TAG, OSMTags.YES_TAG_VALUE) || compareTag(member, OSMTags.RAILWAY_TAG, OSMTags.TRAM_STOP_TAG_VALUE))
stopArea.isTram = true;
if(compareTag(member, OSMTags.RAILWAY_TAG, OSMTags.HALT_TAG_VALUE))
stopArea.isTrainStop = true;
if(compareTag(member, OSMTags.RAILWAY_TAG, OSMTags.STATION_TAG_VALUE))
stopArea.isTrainStation = true;
if(compareTag(member, OSMTags.AMENITY_TAG, OSMTags.BUS_STATION_TAG_VALUE))
{
stopArea.isBusStation = true;
}
if(member == stopArea.selectedObject)
{
if(compareTag(member, OSMTags.BENCH_TAG, OSMTags.YES_TAG_VALUE))
stopArea.isBench = true;
if(compareTag(member, OSMTags.SHELTER_TAG, OSMTags.YES_TAG_VALUE))
stopArea.isShelter = true;
if(compareTag(member, OSMTags.COVERED_TAG, OSMTags.YES_TAG_VALUE))
stopArea.isCovered = true;
if(compareTag(member, OSMTags.AREA_TAG, OSMTags.YES_TAG_VALUE))
stopArea.isArea = true;
}
}
/**
* Test, are transport types assigned to platforms
* @param platform Platform object
* @return true, if transport types assigned to this platforms
*/
public boolean testIsTransportTypeAssigned(OsmPrimitive platform)
{
String[] transportTypes = new String[] { OSMTags.BUS_TAG, OSMTags.TROLLEYBUS_TAG, OSMTags.SHARE_TAXI_TAG, OSMTags.TRAM_TAG, OSMTags.TRAIN_TAG };
for(String transportType : transportTypes)
{
if(compareTag(platform, transportType, OSMTags.YES_TAG_VALUE))
return true;
}
return false;
}
/**
* Setting of stop area from selected josm object
* @param selectedObject Selected josm object
*/
public void fromSelectedObject(StopArea stopArea)
{
Collection<OsmPrimitive> selectedObjects = new ArrayList<OsmPrimitive>();
selectedObjects.add(stopArea.selectedObject);
for(Relation rel : OsmPrimitive.getParentRelations(selectedObjects))
{
if(compareTag(rel, OSMTags.TYPE_TAG, OSMTags.PUBLIC_TRANSPORT_TAG) && compareTag(rel, OSMTags.PUBLIC_TRANSPORT_TAG, OSMTags.STOP_AREA_TAG_VALUE))
{
stopArea.stopAreaRelation = rel;
}
if(stopArea.stopAreaRelation != null)
break;
}
if(stopArea.stopAreaRelation != null)
{
parseTags(stopArea, stopArea.stopAreaRelation);
parseTags(stopArea, stopArea.selectedObject);
for(RelationMember member : stopArea.stopAreaRelation.getMembers())
{
if(member.getMember() instanceof Node && compareTag(member.getMember(), OSMTags.PUBLIC_TRANSPORT_TAG, OSMTags.STOP_POSITION_TAG_VALUE))
{
stopArea.isStopPointExists = true;
stopArea.stopPoints.add(member.getNode());
}
else
if(compareTag(member.getMember(), OSMTags.PUBLIC_TRANSPORT_TAG, OSMTags.PLATFORM_TAG_VALUE))
{
stopArea.platforms.add(member.getMember());
}
else
{
stopArea.otherMembers.add(member.getMember());
}
parseTags(stopArea, member.getMember());
}
if(!stopArea.platforms.contains(stopArea.selectedObject))
{
parseTags(stopArea, stopArea.selectedObject);
stopArea.platforms.add(stopArea.selectedObject);
}
}
else
{
parseTags(stopArea, stopArea.selectedObject);
stopArea.platforms.add(stopArea.selectedObject);
}
for(OsmPrimitive platform : stopArea.platforms)
{
if(testIsTransportTypeAssigned(platform))
{
stopArea.isAssignTransportType = true;
break;
}
}
if(!(stopArea.isBus || stopArea.isTrolleybus || stopArea.isShareTaxi) && stopArea.selectedObject != null && (compareTag(stopArea.selectedObject, OSMTags.HIGHWAY_TAG, OSMTags.BUS_STOP_TAG_VALUE) || stopArea.isBusStation))
{
stopArea.isBus = true;
}
}
/**
* Construct stop area object from selected JOSM object
* @param stopArea Original stop area object
* @return Stop area objects with settings of selected JOSM object and included it stop area relation
*/
@Override
public StopArea performCustomizing(StopArea stopArea)
{
if(getCurrentDataSet() == null)
return null;
OsmPrimitive selectedObject = getCurrentDataSet().getSelectedNodesAndWays().iterator().next();
if(selectedObject == null)
return null;
if(stopArea == null)
stopArea = new StopArea(selectedObject);
fromSelectedObject(stopArea);
return stopArea;
}
}