package org.osm2world.core.world.modules.common;
import org.osm2world.core.map_data.data.MapArea;
import org.osm2world.core.map_data.data.MapData;
import org.osm2world.core.map_data.data.MapElement;
import org.osm2world.core.map_data.data.MapNode;
import org.osm2world.core.map_data.data.MapWaySegment;
import org.osm2world.core.world.creation.WorldModule;
import org.osm2world.core.world.data.WorldObject;
/**
* skeleton implementation for {@link WorldModule}s.
*
* Subclasses need to be able to create {@link WorldObject}s
* for each {@link MapElement} in isolation.
* This can make parallel application of the module possible.
*/
public abstract class AbstractModule extends ConfigurableWorldModule {
@Override
public final void applyTo(MapData grid) {
for (MapNode node : grid.getMapNodes()) {
applyToNode(node);
}
for (MapWaySegment segment : grid.getMapWaySegments()) {
applyToWaySegment(segment);
}
for (MapArea area : grid.getMapAreas()) {
applyToArea(area);
}
}
/**
* create {@link WorldObject}s for a {@link MapElement}.
* Can be overwritten by subclasses.
* The default implementation does not create any objects.
*/
protected void applyToElement(MapElement element) {}
/**
* create {@link WorldObject}s for a {@link MapNode}.
* Can be overwritten by subclasses.
* The default implementation calls {@link #applyToElement(MapElement)}.
*/
protected void applyToNode(MapNode node) {
applyToElement(node);
}
/**
* create {@link WorldObject}s for a {@link MapWaySegment}.
* Can be overwritten by subclasses.
* The default implementation calls {@link #applyToElement(MapElement)}.
*/
protected void applyToWaySegment(MapWaySegment segment) {
applyToElement(segment);
}
/**
* create {@link WorldObject}s for a {@link MapArea}.
* Can be overwritten by subclasses.
* The default implementation calls {@link #applyToElement(MapElement)}.
*/
protected void applyToArea(MapArea area) {
applyToElement(area);
}
}