Subversion Repositories mkgmap

Rev

Rev 3408 | View as "text/plain" | Blame | Compare with Previous | Last modification | View Log | RSS feed

/*
 * Copyright (C) 2012.
 *
 * 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.function;

import uk.me.parabola.mkgmap.reader.osm.Element;
import uk.me.parabola.mkgmap.reader.osm.Node;
import uk.me.parabola.mkgmap.reader.osm.Relation;
import uk.me.parabola.mkgmap.reader.osm.TagDict;
import uk.me.parabola.mkgmap.reader.osm.Way;

/**
 * Abstract implementation of a style function that is able
 * to cache the function values.
 * @author WanMil
 */

public abstract class CachedFunction extends StyleFunction {
        short cacheKey = TagDict.INVALID_TAG_VALUE;
        public CachedFunction(String value) {
                super(value);
        }

        public final String value(Element el) {
                // check if the element type is supported by this function
                if (el instanceof Node ) {
                        if (supportsNode() == false) {
                                return null;
                        }
                } else if (el instanceof Way) {
                        if (supportsWay() == false) {
                                return null;
                        }
                } else  if (el instanceof Relation) {
                        if (supportsRelation() == false) {
                                return null;
                        }
                }
               
                if (isCached()) {
                        if (cacheKey == TagDict.INVALID_TAG_VALUE)
                                cacheKey = TagDict.getInstance().xlate(getCacheTag());
                        // if caching is supported check if the value has already
                        // been calculated
                        String cachedValue = el.getTag(cacheKey);
                        if (cachedValue != null) {
                                return cachedValue;
                        }
                }

                // calculate the function value
                String functionResult = calcImpl(el);
               
                if (functionResult != null && isCached()) {
                        // if caching is supported save the value for later usage
                        el.addTag(cacheKey, functionResult);
                }

                return functionResult;
        }
       
        /**
         * This method contains the real calculation of the function value and must be
         * implemented by subclasses.
         * @param el the function parameter
         * @return the function value
         */

        protected abstract String calcImpl(Element el);

        /**
         * Retrieves the tag name that is used to cache the function value to
         * avoid multiple calculations for the same element.
         * @return tag name used for caching
         */

        protected String getCacheTag() {
                return "mkgmap:cache_"+getName();
        }
       
        public boolean isCached() {
                return true;
        }
       
}