Author: ard
Date: Mon Sep 10 11:47:04 2012
New Revision: 1382771

URL: http://svn.apache.org/viewvc?rev=1382771&view=rev
Log:
RAVE-695 move reloading responsibility to the config managers instead of in the 
RoutedRequestMappingHandlerMapping

Modified:
    
rave/sandbox/content-services/demo-portal/src/main/webapp/WEB-INF/dispatcher-servlet.xml
    
rave/sandbox/content-services/rave-web-hmvc/src/main/java/org/apache/rave/portal/web/mvc/RoutedRequestMappingHandlerMapping.java
    
rave/sandbox/content-services/rave-web-hmvc/src/main/java/org/apache/rave/portal/web/mvc/config/ConfigManager.java
    
rave/sandbox/content-services/rave-web-hmvc/src/main/java/org/apache/rave/portal/web/mvc/config/file/FileConfigManager.java
    
rave/sandbox/content-services/rave-web-hmvc/src/test/java/org/apache/rave/portal/web/mvc/config/file/FileConfigManagerTest.java
    
rave/sandbox/content-services/rave-web-jcr/src/main/java/org/apache/rave/portal/web/mvc/config/jcr/JcrConfigManager.java
    
rave/sandbox/content-services/rave-web-jcr/src/test/java/org/apache/rave/portal/web/mvc/config/jcr/JcrConfigManagerTest.java

Modified: 
rave/sandbox/content-services/demo-portal/src/main/webapp/WEB-INF/dispatcher-servlet.xml
URL: 
http://svn.apache.org/viewvc/rave/sandbox/content-services/demo-portal/src/main/webapp/WEB-INF/dispatcher-servlet.xml?rev=1382771&r1=1382770&r2=1382771&view=diff
==============================================================================
--- 
rave/sandbox/content-services/demo-portal/src/main/webapp/WEB-INF/dispatcher-servlet.xml
 (original)
+++ 
rave/sandbox/content-services/demo-portal/src/main/webapp/WEB-INF/dispatcher-servlet.xml
 Mon Sep 10 11:47:04 2012
@@ -157,12 +157,12 @@
     <property name="credentials" ref="jcrCredentials"/>
     <property name="lazyRepositoryFactory" ref="lazyRepositoryFactory"/>
 -->
-    <property name="refreshDelay" value="10000"/>
   </bean>
 
   <bean id="fileConfigurationManager" 
class="org.apache.rave.portal.web.mvc.config.file.FileConfigManager">
     <property name="configurationPath" 
value="/WEB-INF/page-configuration.xml"/>
     <property name="urlMappingsPath" value="/WEB-INF/url-mapping.xml"/>
+    <property name="refreshDelay" value="10000"/>
   </bean>
 
   <bean name="unroutedHandlerMapping" 
class="org.apache.rave.portal.web.mvc.UnRoutedRequestMappingHandlerMapping">

Modified: 
rave/sandbox/content-services/rave-web-hmvc/src/main/java/org/apache/rave/portal/web/mvc/RoutedRequestMappingHandlerMapping.java
URL: 
http://svn.apache.org/viewvc/rave/sandbox/content-services/rave-web-hmvc/src/main/java/org/apache/rave/portal/web/mvc/RoutedRequestMappingHandlerMapping.java?rev=1382771&r1=1382770&r2=1382771&view=diff
==============================================================================
--- 
rave/sandbox/content-services/rave-web-hmvc/src/main/java/org/apache/rave/portal/web/mvc/RoutedRequestMappingHandlerMapping.java
 (original)
+++ 
rave/sandbox/content-services/rave-web-hmvc/src/main/java/org/apache/rave/portal/web/mvc/RoutedRequestMappingHandlerMapping.java
 Mon Sep 10 11:47:04 2012
@@ -29,7 +29,6 @@ import java.util.Set;
 import javax.servlet.http.HttpServletRequest;
 
 import org.apache.rave.portal.web.mvc.config.ConfigManager;
-import org.apache.rave.portal.web.mvc.config.PageConfiguration;
 import org.apache.rave.portal.web.mvc.config.PageDefinition;
 import org.apache.rave.portal.web.mvc.config.PageFragment;
 import org.apache.rave.portal.web.mvc.config.UrlConfiguration;
@@ -66,12 +65,7 @@ public class RoutedRequestMappingHandler
 
     private ConfigManager configManager;
 
-    // delay refresh in milliseconds
-    private long refreshDelay;
-
-    private long configsLastChecked;
-
-    private boolean configured;
+    private volatile UrlConfiguration urlConfiguration;
 
     // temporary hacked open *references* to the real but private 
handlerMethods and urlMap maps in AbstractHandlerMethodMapping.java
     private Map<RequestMappingInfo, HandlerMethod> handlerMethods;
@@ -133,28 +127,21 @@ public class RoutedRequestMappingHandler
             }
         } else {
 */
-            configured = true;
-            configsLastChecked = System.currentTimeMillis();
-            final UrlConfiguration urlConfig = configManager.loadUrlConfig();
-            processConfiguration(urlConfig);
- //       }
+        urlConfiguration = configManager.getUrlConfig();
+        processConfiguration(urlConfiguration);
+        //       }
     }
 
     protected void reloadConfigIfNeeded() {
-        long currentTime = System.currentTimeMillis();
-        // TODO : move refreshdelay logic to FileConfigManager
-        // here just fetch the RoutedRequestMappingModel (urlMapping) and if
-        // the object instance changed, start processConfiguration the new 
configuration
 
-        if (configured && (refreshDelay == 0 || configsLastChecked + 
refreshDelay < currentTime)) {
+        UrlConfiguration latestConfiguration = configManager.getUrlConfig();
+        if (urlConfiguration != latestConfiguration) {
             synchronized (configManager) {
-                if ( configManager.lastModified() > configsLastChecked ) {
-                    final UrlConfiguration urlConfig = 
configManager.loadUrlConfig();
-                    processConfiguration(urlConfig);
-                }
+               urlConfiguration = latestConfiguration;
+               processConfiguration(urlConfiguration);
             }
-            configsLastChecked = currentTime;
         }
+
     }
 
 /* TODO: externalize configManager specific logic
@@ -169,7 +156,7 @@ public class RoutedRequestMappingHandler
             final PageConfiguration configuration = 
configManager.loadConfiguration(configurationName);
             log.info("configuration {}", configuration);
             // TODO use urlConfig
-            final UrlConfiguration urlConfig = 
configManager.loadUrlConfig(urlMappingsPath, configuration);
+            final UrlConfiguration urlConfig = 
configManager.getUrlConfig(urlMappingsPath, configuration);
             processConfiguration(urlConfig);
         } catch (RepositoryException e) {
             log.error("Error obtaining session", e);
@@ -377,9 +364,6 @@ public class RoutedRequestMappingHandler
         this.repositoryFactory = repositoryFactory;
     }
 */
-    public void setRefreshDelay(long refreshDelay) {
-        this.refreshDelay = refreshDelay;
-    }
 
     @Override
     protected void handleMatch(RequestMappingInfo info, String lookupPath, 
HttpServletRequest request) {

Modified: 
rave/sandbox/content-services/rave-web-hmvc/src/main/java/org/apache/rave/portal/web/mvc/config/ConfigManager.java
URL: 
http://svn.apache.org/viewvc/rave/sandbox/content-services/rave-web-hmvc/src/main/java/org/apache/rave/portal/web/mvc/config/ConfigManager.java?rev=1382771&r1=1382770&r2=1382771&view=diff
==============================================================================
--- 
rave/sandbox/content-services/rave-web-hmvc/src/main/java/org/apache/rave/portal/web/mvc/config/ConfigManager.java
 (original)
+++ 
rave/sandbox/content-services/rave-web-hmvc/src/main/java/org/apache/rave/portal/web/mvc/config/ConfigManager.java
 Mon Sep 10 11:47:04 2012
@@ -25,13 +25,15 @@ package org.apache.rave.portal.web.mvc.c
 public interface ConfigManager {
 
     /**
-     * Loads url mappings configuration
+     * Gets url mappings configuration. The manager implementation is in 
control of whether it 
+     * returns a new {@link UrlConfiguration} or one that it created before 
already. This method
+     * must be implemented thread-safe and can be called concurrently.
      *
      * @return UrlConfig instance containing url and render mappings
      * @throws InvalidConfigurationException
      *          thrown when config cannot be loaded or parsed or configuration 
parameter was null
      */
-    UrlConfiguration loadUrlConfig() throws InvalidConfigurationException;
+    UrlConfiguration getUrlConfig() throws InvalidConfigurationException;
 
     /**
      * @return configuration or null if none found

Modified: 
rave/sandbox/content-services/rave-web-hmvc/src/main/java/org/apache/rave/portal/web/mvc/config/file/FileConfigManager.java
URL: 
http://svn.apache.org/viewvc/rave/sandbox/content-services/rave-web-hmvc/src/main/java/org/apache/rave/portal/web/mvc/config/file/FileConfigManager.java?rev=1382771&r1=1382770&r2=1382771&view=diff
==============================================================================
--- 
rave/sandbox/content-services/rave-web-hmvc/src/main/java/org/apache/rave/portal/web/mvc/config/file/FileConfigManager.java
 (original)
+++ 
rave/sandbox/content-services/rave-web-hmvc/src/main/java/org/apache/rave/portal/web/mvc/config/file/FileConfigManager.java
 Mon Sep 10 11:47:04 2012
@@ -50,7 +50,14 @@ public class FileConfigManager implement
     private String urlMappingsPath;
 
     private String configurationPath;
-    
+
+    // delay refresh in milliseconds
+    private long refreshDelay;
+
+
+    private volatile UrlConfiguration urlConfiguration;
+    private volatile long lastBuildTime;
+
     public void setUrlMappingsPath(final String urlMappingsPath) {
         this.urlMappingsPath = urlMappingsPath;
     }
@@ -59,39 +66,67 @@ public class FileConfigManager implement
         this.configurationPath = configurationPath;
     }
 
-    @Override
-    public UrlConfiguration loadUrlConfig() throws 
InvalidConfigurationException {
-        if (StringUtils.isBlank(configurationPath) || 
StringUtils.isBlank(urlMappingsPath)) {
-            throw new InvalidConfigurationException("Both configurationPath 
and urlMappingsPath should be set " +
-                    "to point to file location");
+    public void setRefreshDelay(long refreshDelay) {
+        this.refreshDelay = refreshDelay;
+    }
+
+    private boolean checkBuildTime() {
+        if ((lastBuildTime + refreshDelay) >  System.currentTimeMillis()) {
+            if (lastModified() > lastBuildTime) {
+                return true;
+            }
         }
-        PageConfiguration pageConfiguration = loadConfiguration();
-        if (pageConfiguration == null) {
-            throw new InvalidConfigurationException("Provided 
PageConfiguration was null");
+        return false;
+    }
+    
+    @Override
+    public UrlConfiguration getUrlConfig() throws 
InvalidConfigurationException {
+        UrlConfiguration existing = urlConfiguration;
+
+        if (existing != null && !checkBuildTime()) {
+            return existing;
         }
-        log.info("Loading configuration: {}", urlMappingsPath);
-        InputStream is = null;
-        try {
-            try {
-                Resource resource = 
resourceLoader.getResource(urlMappingsPath);
-                is = resource.getInputStream();
-            } catch (Exception ex) {
-            }
-            if (is == null) {
-                throw new InvalidConfigurationException("Configuration file 
not found for path: " + urlMappingsPath);
+
+        synchronized (this) {
+            // the urlConfiguration can have been rebuild already. Check this 
by existing != urlConfiguration
+            if (existing != urlConfiguration) {
+                // another thread already rebuilt the model. Return model
+                return urlConfiguration;
+            }
+            if (StringUtils.isBlank(configurationPath) || 
StringUtils.isBlank(urlMappingsPath)) {
+                throw new InvalidConfigurationException("Both 
configurationPath and urlMappingsPath should be set " +
+                        "to point to file location");
+            }
+            PageConfiguration pageConfiguration = loadConfiguration();
+            if (pageConfiguration == null) {
+                throw new InvalidConfigurationException("Provided 
PageConfiguration was null");
             }
-            JAXBContext context = 
JAXBContext.newInstance(FileUrlConfiguration.class);
-            Unmarshaller unmarshaller = context.createUnmarshaller();
-            final FileUrlConfiguration config = (FileUrlConfiguration) 
unmarshaller.unmarshal(is);
-            if (config != null) {
-                config.initialize(pageConfiguration);
+            log.info("Loading configuration: {}", urlMappingsPath);
+            InputStream is = null;
+            try {
+                try {
+                    Resource resource = 
resourceLoader.getResource(urlMappingsPath);
+                    is = resource.getInputStream();
+                } catch (Exception ex) {
+                }
+                if (is == null) {
+                    throw new InvalidConfigurationException("Configuration 
file not found for path: " + urlMappingsPath);
+                }
+                JAXBContext context = 
JAXBContext.newInstance(FileUrlConfiguration.class);
+                Unmarshaller unmarshaller = context.createUnmarshaller();
+                final FileUrlConfiguration config = (FileUrlConfiguration) 
unmarshaller.unmarshal(is);
+                if (config != null) {
+                    config.initialize(pageConfiguration);
+                }
+    
+                urlConfiguration = config;
+                lastBuildTime = System.currentTimeMillis();
+                return urlConfiguration;
+            } catch (JAXBException e) {
+                throw new InvalidConfigurationException("Error parsing 
configuration file: " + urlMappingsPath, e);
+            } finally {
+                IOUtils.closeQuietly(is);
             }
-
-            return config;
-        } catch (JAXBException e) {
-            throw new InvalidConfigurationException("Error parsing 
configuration file: " + urlMappingsPath, e);
-        } finally {
-            IOUtils.closeQuietly(is);
         }
     }
 

Modified: 
rave/sandbox/content-services/rave-web-hmvc/src/test/java/org/apache/rave/portal/web/mvc/config/file/FileConfigManagerTest.java
URL: 
http://svn.apache.org/viewvc/rave/sandbox/content-services/rave-web-hmvc/src/test/java/org/apache/rave/portal/web/mvc/config/file/FileConfigManagerTest.java?rev=1382771&r1=1382770&r2=1382771&view=diff
==============================================================================
--- 
rave/sandbox/content-services/rave-web-hmvc/src/test/java/org/apache/rave/portal/web/mvc/config/file/FileConfigManagerTest.java
 (original)
+++ 
rave/sandbox/content-services/rave-web-hmvc/src/test/java/org/apache/rave/portal/web/mvc/config/file/FileConfigManagerTest.java
 Mon Sep 10 11:47:04 2012
@@ -146,7 +146,7 @@ public class FileConfigManagerTest {
         dao.setConfigurationPath(PAGE_CONFIG_PATH);
         dao.setUrlMappingsPath(URL_CONFIG_PATH);
 
-        final UrlConfiguration config = dao.loadUrlConfig();
+        final UrlConfiguration config = dao.getUrlConfig();
         log.info("config {}", config);
         assertTrue(config != null);
         assertEquals("default", config.getName());

Modified: 
rave/sandbox/content-services/rave-web-jcr/src/main/java/org/apache/rave/portal/web/mvc/config/jcr/JcrConfigManager.java
URL: 
http://svn.apache.org/viewvc/rave/sandbox/content-services/rave-web-jcr/src/main/java/org/apache/rave/portal/web/mvc/config/jcr/JcrConfigManager.java?rev=1382771&r1=1382770&r2=1382771&view=diff
==============================================================================
--- 
rave/sandbox/content-services/rave-web-jcr/src/main/java/org/apache/rave/portal/web/mvc/config/jcr/JcrConfigManager.java
 (original)
+++ 
rave/sandbox/content-services/rave-web-jcr/src/main/java/org/apache/rave/portal/web/mvc/config/jcr/JcrConfigManager.java
 Mon Sep 10 11:47:04 2012
@@ -68,7 +68,7 @@ public class JcrConfigManager implements
     }
 
 
-    public UrlConfiguration loadUrlConfig() throws 
InvalidConfigurationException {
+    public UrlConfiguration getUrlConfig() throws 
InvalidConfigurationException {
         final UrlConfiguration urlConfiguration = (UrlConfiguration) 
manager.getObject(JcrUrlConfiguration.class, configPath + '/' + 
urlMappingsPath);
         log.info("Loaded URL configuration {}", urlConfiguration);
         urlConfiguration.initialize(loadConfiguration());
@@ -154,6 +154,7 @@ public class JcrConfigManager implements
     }
 
     public long lastModified() {
+        // just make sure the model gets invalidated on the right jcr event
         return 0;
     }
 }

Modified: 
rave/sandbox/content-services/rave-web-jcr/src/test/java/org/apache/rave/portal/web/mvc/config/jcr/JcrConfigManagerTest.java
URL: 
http://svn.apache.org/viewvc/rave/sandbox/content-services/rave-web-jcr/src/test/java/org/apache/rave/portal/web/mvc/config/jcr/JcrConfigManagerTest.java?rev=1382771&r1=1382770&r2=1382771&view=diff
==============================================================================
--- 
rave/sandbox/content-services/rave-web-jcr/src/test/java/org/apache/rave/portal/web/mvc/config/jcr/JcrConfigManagerTest.java
 (original)
+++ 
rave/sandbox/content-services/rave-web-jcr/src/test/java/org/apache/rave/portal/web/mvc/config/jcr/JcrConfigManagerTest.java
 Mon Sep 10 11:47:04 2012
@@ -53,7 +53,7 @@ public class JcrConfigManagerTest extend
 //        final String urlConfigName = "urlConfig";
 //        UrlConfiguration urlConfiguration = new 
JcrUrlConfiguration(urlConfigName);
 //        manager.saveUrlConfiguration(urlConfiguration);
-//        urlConfiguration = manager.loadUrlConfig(urlConfigName, 
configuration);
+//        urlConfiguration = manager.getUrlConfig(urlConfigName, 
configuration);
 //        assertTrue(urlConfiguration != null);
 //
 //    }


Reply via email to