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