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;
}
}