Subversion Repositories mkgmap

Rev

Rev 3834 | Blame | Compare with Previous | Last modification | View Log | RSS feed

/*
 * Copyright (C) 2017.
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 3 or
 * version 2 as published by the Free Software Foundation.
 *
 * This program 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
 * General Public License for more details.
 */

package uk.me.parabola.mkgmap.osmstyle;

import java.util.Arrays;
import java.util.List;
import java.util.Properties;
import java.util.regex.Pattern;

import it.unimi.dsi.fastutil.shorts.ShortArrayList;
import uk.me.parabola.mkgmap.reader.osm.Element;
import uk.me.parabola.mkgmap.reader.osm.TagDict;
import uk.me.parabola.mkgmap.reader.osm.Tags;

/**
 * Class to handle the option name-tag-list
 * @author Gerd Petermann
 *
 */

public class NameFinder {
        private final ShortArrayList compiledNameTagList;
       
        private static final Pattern COMMA_OR_SPACE_PATTERN = Pattern.compile("[,\\s]+");
        private static final short nameTagKey = TagDict.getInstance().xlate("name");  
       
        public NameFinder(Properties props) {
                this.compiledNameTagList = computeCompiledNameTags(props);
        }

        public static List<String> getNameTags(Properties props) {
                String nameTagProp = props.getProperty("name-tag-list", "name");
                return Arrays.asList(COMMA_OR_SPACE_PATTERN.split(nameTagProp));
        }

        /**
         * Analyse name-tag-list option.
         * @param props program properties
         * @return list of compiled tag keys or null if only name should be used.
         */

        private static ShortArrayList computeCompiledNameTags(Properties props) {
                if (props == null)
                        return null;
                String nameTagProp = props.getProperty("name-tag-list", "name");
                if ("name".equals(nameTagProp))
                        return null;
                return TagDict.compileTags(COMMA_OR_SPACE_PATTERN.split(nameTagProp));
        }
       
       
        /**
         * Get name tag value according to name-tag-list.
         * @param el
         * @return the tag value or null if none of the name tags is set.
         */

        public String getName(Element el) {
                if (compiledNameTagList == null)
                        return el.getTag(nameTagKey);

                for (short tagKey : compiledNameTagList) {
                        String val = el.getTag(tagKey);
                        if (val != null) {
                                return val;
                        }
                }
                return null;
        }

        /**
         * Get name tag value according to name-tag-list.
         * @param tags the tags to check
         * @return the tag value or null if none of the name tags is set.
         */

        public String getName(Tags tags) {
                if (compiledNameTagList == null)
                        return tags.get(nameTagKey);

                for (short tagKey : compiledNameTagList) {
                        String val = tags.get(tagKey);
                        if (val != null) {
                                return val;
                        }
                }
                return null;
        }
       
        /**
         * Use name-tag-list to set the name tag for the element.
         * @param el the element
         */

        public void setNameWithNameTagList(Element el) {
                if (compiledNameTagList == null)
                        return;

                for (short tagKey : compiledNameTagList) {
                        String val = el.getTag(tagKey);
                        if (val != null) {
                                if (tagKey != nameTagKey) {
                                        // add or replace name
                                        el.addTag(nameTagKey, val);
                                }
                                break;
                        }
                }
               
        }
}