diff flys-artifacts/src/main/java/de/intevation/flys/artifacts/services/DistanceInfoService.java @ 644:02c0cce0e469

Introduce a cache for the distance-info service flys-artifacts/trunk@2028 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author Sascha L. Teichmann <sascha.teichmann@intevation.de>
date Mon, 30 May 2011 11:34:06 +0000
parents 4aa078e28cfd
children bcd62609c936 3dc61e00385e
line wrap: on
line diff
--- a/flys-artifacts/src/main/java/de/intevation/flys/artifacts/services/DistanceInfoService.java	Mon May 30 09:19:57 2011 +0000
+++ b/flys-artifacts/src/main/java/de/intevation/flys/artifacts/services/DistanceInfoService.java	Mon May 30 11:34:06 2011 +0000
@@ -1,7 +1,7 @@
 package de.intevation.flys.artifacts.services;
 
 import java.math.BigDecimal;
-import java.util.List;
+import java.util.Iterator;
 
 import org.apache.log4j.Logger;
 
@@ -26,6 +26,10 @@
 
 import org.hibernate.Session;
 
+import de.intevation.flys.artifacts.cache.CacheFactory;
+
+import net.sf.ehcache.Cache;
+
 /**
  * This service provides information about distances of a specified river.
  *
@@ -36,6 +40,10 @@
     /** The logger used in this service.*/
     private static Logger logger = Logger.getLogger(DistanceInfoService.class);
 
+    public static final String CACHE_NAME = "service-distanceinfo";
+
+    public static final String RIVER_XPATH = "/art:river/text()";
+
 
     /**
      * The default constructor.
@@ -51,40 +59,62 @@
     {
         logger.debug("DistanceInfoService.process");
 
-        Document result = XMLUtils.newDocument();
-
         String river = XMLUtils.xpathString(
-            data, "/art:river/text()", ArtifactNamespaceContext.INSTANCE);
+            data, RIVER_XPATH, ArtifactNamespaceContext.INSTANCE);
 
-        if (river == null || river.trim().length() == 0) {
+        if (river == null || (river = river.trim()).length() == 0) {
             logger.warn("No river specified. Cannot return distance info!");
-            return result;
+            return XMLUtils.newDocument();
         }
 
         logger.debug("Search distances for river: " + river);
 
+        Cache cache = CacheFactory.getCache(CACHE_NAME);
+
+        if (cache == null) {
+            logger.debug("no cache configured for distance info");
+            return getUncached(river);
+        }
+
+        net.sf.ehcache.Element element = cache.get(river);
+
+        if (element != null) {
+            logger.debug("distance info found in cache");
+            return (Document)element.getValue();
+        }
+
+        Document result = getUncached(river);
+
+        element = new net.sf.ehcache.Element(river, result);
+
+        logger.debug("store distance info found into cache");
+
+        cache.put(element);
+
+        return result;
+    }
+
+    protected Document getUncached(String river) {
+
+        Document result = XMLUtils.newDocument();
+
         ElementCreator ec = new ElementCreator(
             result,
             ArtifactNamespaceContext.NAMESPACE_URI,
             ArtifactNamespaceContext.NAMESPACE_PREFIX);
 
         Session session = SessionHolder.acquire();
-        try {
-            List<Annotation> annotations = AnnotationsFactory.getAnnotations(river);
 
-            if (annotations == null || annotations.size() == 0) {
-                logger.warn("No information found for the specified river!");
-                return result;
-            }
+        try {
+            Iterator<Annotation> iter =
+                AnnotationsFactory.getAnnotationsIterator(river);
 
             Element all = ec.create("distances");
 
-            for (Annotation a: annotations) {
+            while (iter.hasNext()) {
+                Annotation a = iter.next();
                 Element distance = buildDistanceNode(ec, a);
-
-                if (distance != null) {
-                    all.appendChild(distance);
-                }
+                all.appendChild(distance);
             }
 
             result.appendChild(all);
@@ -106,7 +136,7 @@
      *
      * @return an Element that contains information about a distance.
      */
-    protected Element buildDistanceNode(ElementCreator ec, Annotation anno) {
+    protected static Element buildDistanceNode(ElementCreator ec, Annotation anno) {
         Position  pos   = anno.getPosition();
         Range     range = anno.getRange();
         Attribute attr  = anno.getAttribute();

http://dive4elements.wald.intevation.org