TollwaysGraphStorageBuilder.java

/*  This file is part of Openrouteservice.
 *
 *  Openrouteservice is free software; you can redistribute it and/or modify it under the terms of the
 *  GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1
 *  of the License, or (at your option) any later version.

 *  This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
 *  without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 *  See the GNU Lesser General Public License for more details.

 *  You should have received a copy of the GNU Lesser General Public License along with this library;
 *  if not, see <https://www.gnu.org/licenses/>.
 */
package org.heigit.ors.routing.graphhopper.extensions.storages.builders;

import com.graphhopper.GraphHopper;
import com.graphhopper.reader.ReaderWay;
import com.graphhopper.storage.GraphExtension;
import com.graphhopper.util.EdgeIteratorState;
import org.heigit.ors.routing.graphhopper.extensions.TollwayType;
import org.heigit.ors.routing.graphhopper.extensions.storages.TollwaysGraphStorage;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class TollwaysGraphStorageBuilder extends AbstractGraphStorageBuilder {
    private TollwaysGraphStorage storage;
    private int tollways;
    private final List<String> tollTags = new ArrayList<>(6);

    public TollwaysGraphStorageBuilder() {
        // Currently consider only toll tags relevant to cars or hgvs:
        tollTags.addAll(Arrays.asList("toll", "toll:hgv", "toll:N1", "toll:N2", "toll:N3", "toll:motorcar"));
    }

    public GraphExtension init(GraphHopper graphhopper) throws Exception {
        if (storage != null)
            throw new Exception("GraphStorageBuilder has been already initialized.");

        storage = new TollwaysGraphStorage();

        return storage;
    }

    public void processWay(ReaderWay way) {
        tollways = TollwayType.NONE;

        for (String key : tollTags) {
            if (way.hasTag(key)) {
                String value = way.getTag(key);

                if (value != null) {
                    switch (key) {
                        case "toll" -> setFlag(TollwayType.GENERAL, value);
                        case "toll:hgv" -> setFlag(TollwayType.HGV, value);
                        case "toll:N1" -> //currently not used in OSM
                                setFlag(TollwayType.N1, value);
                        case "toll:N2" -> setFlag(TollwayType.N2, value);
                        case "toll:N3" -> setFlag(TollwayType.N3, value);
                        case "toll:motorcar" -> setFlag(TollwayType.MOTORCAR, value);
                        default -> {
                        }
                    }
                }
            }
        }

    }

    private void setFlag(int flag, String value) {
        switch (value) {
            case "yes" -> tollways |= flag;
            case "no" -> tollways &= ~flag;
            default -> {
            }
        }
    }

    public void processEdge(ReaderWay way, EdgeIteratorState edge) {
        storage.setEdgeValue(edge.getEdge(), tollways);
    }

    @Override
    public String getName() {
        return "Tollways";
    }
}