Author: pete.muir(a)jboss.org
Date: 2008-09-22 14:45:26 -0400 (Mon, 22 Sep 2008)
New Revision: 9102
Added:
trunk/src/main/org/jboss/seam/deployment/WarRootDeploymentStrategy.java
Modified:
trunk/src/debug/org/jboss/seam/debug/hot/HotDeployFilter.java
trunk/src/main/org/jboss/seam/deployment/AbstractScanner.java
trunk/src/main/org/jboss/seam/deployment/DeploymentStrategy.java
trunk/src/main/org/jboss/seam/deployment/DotPageDotXmlDeploymentHandler.java
trunk/src/main/org/jboss/seam/deployment/HotDeploymentStrategy.java
trunk/src/main/org/jboss/seam/deployment/Scanner.java
trunk/src/main/org/jboss/seam/deployment/StandardDeploymentStrategy.java
trunk/src/main/org/jboss/seam/deployment/URLScanner.java
trunk/src/main/org/jboss/seam/init/Initialization.java
trunk/src/main/org/jboss/seam/navigation/Pages.java
Log:
JBSEAM-3435
Modified: trunk/src/debug/org/jboss/seam/debug/hot/HotDeployFilter.java
===================================================================
--- trunk/src/debug/org/jboss/seam/debug/hot/HotDeployFilter.java 2008-09-22 18:24:28 UTC
(rev 9101)
+++ trunk/src/debug/org/jboss/seam/debug/hot/HotDeployFilter.java 2008-09-22 18:45:26 UTC
(rev 9102)
@@ -3,7 +3,6 @@
import static org.jboss.seam.ScopeType.APPLICATION;
import static org.jboss.seam.annotations.Install.BUILT_IN;
-import java.io.File;
import java.io.IOException;
import javax.servlet.FilterChain;
@@ -19,11 +18,9 @@
import org.jboss.seam.annotations.intercept.BypassInterceptors;
import org.jboss.seam.annotations.web.Filter;
import org.jboss.seam.core.Init;
-import org.jboss.seam.exception.Exceptions;
import org.jboss.seam.init.Initialization;
import org.jboss.seam.log.LogProvider;
import org.jboss.seam.log.Logging;
-import org.jboss.seam.navigation.Pages;
import org.jboss.seam.web.AbstractFilter;
@Name("org.jboss.seam.debug.hotDeployFilter")
@@ -40,62 +37,13 @@
throws IOException, ServletException
{
Init init = (Init) getServletContext().getAttribute(
Seam.getComponentName(Init.class) );
- if ( init!=null && init.hasHotDeployableComponents() )
+ if ( init!=null)
{
- for ( File file: init.getHotDeployPaths() )
- {
- if ( scan(request, init, file) )
- {
- Seam.clearComponentNameCache();
- new Initialization( getServletContext() ).redeploy( (HttpServletRequest)
request );
- break;
- }
- }
+ new Initialization( getServletContext() ).redeploy( (HttpServletRequest) request
);
}
-
- //TODO: check the timestamp, for a minor optimization
- // instead
- Pages pages = (Pages)
getServletContext().getAttribute(Seam.getComponentName(Pages.class));
- if (pages!= null) {
- pages.initialize();
- }
-
- getServletContext().removeAttribute( Seam.getComponentName(Exceptions.class) );
-
- //TODO: is there anything we should remove from the session scope?
- /*HttpSession session = ( (HttpServletRequest) request ).getSession(false);
- if (session!=null)
- {
- session.removeAttribute( ... );
- }*/
-
chain.doFilter(request, response);
}
- private boolean scan(ServletRequest request, Init init, File file)
- {
- if ( file.isFile() )
- {
- if ( !file.exists() || ( file.lastModified() > init.getTimestamp() ) )
- {
- if ( log.isDebugEnabled() )
- {
- log.debug( "file updated: " + file.getName() );
- }
- return true;
- }
- }
- else if ( file.isDirectory() )
- {
- for ( File f: file.listFiles() )
- {
- if ( scan(request, init, f) )
- {
- return true;
- }
- }
- }
- return false;
- }
+
}
Modified: trunk/src/main/org/jboss/seam/deployment/AbstractScanner.java
===================================================================
--- trunk/src/main/org/jboss/seam/deployment/AbstractScanner.java 2008-09-22 18:24:28 UTC
(rev 9101)
+++ trunk/src/main/org/jboss/seam/deployment/AbstractScanner.java 2008-09-22 18:45:26 UTC
(rev 9102)
@@ -34,5 +34,10 @@
{
return deploymentStrategy;
}
+
+ public long getTimestamp()
+ {
+ return Long.MAX_VALUE;
+ }
}
Modified: trunk/src/main/org/jboss/seam/deployment/DeploymentStrategy.java
===================================================================
--- trunk/src/main/org/jboss/seam/deployment/DeploymentStrategy.java 2008-09-22 18:24:28
UTC (rev 9101)
+++ trunk/src/main/org/jboss/seam/deployment/DeploymentStrategy.java 2008-09-22 18:45:26
UTC (rev 9102)
@@ -11,12 +11,11 @@
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.HashMap;
-import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Properties;
-import java.util.Set;
+
import org.jboss.seam.log.LogProvider;
import org.jboss.seam.log.Logging;
@@ -36,9 +35,6 @@
private List<File> files = new ArrayList<File>();
- private Set<String> excludes = new HashSet<String>();
- private Set<String> wildCardExcludes = new HashSet<String>();
-
private Map<String, DeploymentHandler> deploymentHandlers;
/**
@@ -189,20 +185,6 @@
*/
public void handle(String name)
{
- for (String exclude: excludes)
- {
- if (name.equals(exclude))
- {
- return;
- }
- }
- for (String exclude: wildCardExcludes)
- {
- if (name.startsWith(exclude))
- {
- return;
- }
- }
for (String key: getDeploymentHandlers().keySet())
{
getDeploymentHandlers().get(key).handle(name, getClassLoader());
@@ -327,19 +309,9 @@
this.files = files;
}
- public void addExclude(String path)
+ public long getTimestamp()
{
- if (path == null)
- {
- throw new NullPointerException("Cannot exclude a null path");
- }
- if (path.endsWith("*"))
- {
- wildCardExcludes.add(path.substring(0, path.length() - 1));
- }
- else
- {
- excludes.add(path);
- }
+ return getScanner().getTimestamp();
}
+
}
Modified: trunk/src/main/org/jboss/seam/deployment/DotPageDotXmlDeploymentHandler.java
===================================================================
---
trunk/src/main/org/jboss/seam/deployment/DotPageDotXmlDeploymentHandler.java 2008-09-22
18:24:28 UTC (rev 9101)
+++
trunk/src/main/org/jboss/seam/deployment/DotPageDotXmlDeploymentHandler.java 2008-09-22
18:45:26 UTC (rev 9102)
@@ -54,9 +54,9 @@
{
if (Contexts.isEventContextActive())
{
- if (Contexts.getEventContext().isSet(HotDeploymentStrategy.NAME))
+ if (Contexts.getEventContext().isSet(WarRootDeploymentStrategy.NAME))
{
- DeploymentStrategy deploymentStrategy = (DeploymentStrategy)
Contexts.getEventContext().get(StandardDeploymentStrategy.NAME);
+ DeploymentStrategy deploymentStrategy = (DeploymentStrategy)
Contexts.getEventContext().get(WarRootDeploymentStrategy.NAME);
Object deploymentHandler =
deploymentStrategy.getDeploymentHandlers().get(NAME);
if (deploymentHandler != null)
{
@@ -71,25 +71,4 @@
}
}
- public static DotPageDotXmlDeploymentHandler hotInstance()
- {
- if (Contexts.isEventContextActive())
- {
- DeploymentStrategy deploymentStrategy = (DeploymentStrategy)
Contexts.getEventContext().get(HotDeploymentStrategy.NAME);
- if (deploymentStrategy != null)
- {
- Object deploymentHandler =
deploymentStrategy.getDeploymentHandlers().get(NAME);
- if (deploymentHandler != null)
- {
- return (DotPageDotXmlDeploymentHandler) deploymentHandler;
- }
- }
- return null;
- }
- else
- {
- throw new IllegalStateException("Event context not active");
- }
- }
-
}
Modified: trunk/src/main/org/jboss/seam/deployment/HotDeploymentStrategy.java
===================================================================
--- trunk/src/main/org/jboss/seam/deployment/HotDeploymentStrategy.java 2008-09-22
18:24:28 UTC (rev 9101)
+++ trunk/src/main/org/jboss/seam/deployment/HotDeploymentStrategy.java 2008-09-22
18:45:26 UTC (rev 9102)
@@ -50,6 +50,8 @@
private ComponentDeploymentHandler componentDeploymentHandler;
private AnnotationDeploymentHandler annotationDeploymentHandler;
+
+ private long timestamp = 0L;
private ClassLoader classLoader;
@@ -95,7 +97,7 @@
return classLoader != null;
}
- public boolean isHotDeployClasslLoaderEnabled()
+ public boolean isHotDeployClassLoaderEnabled()
{
return hotDeployClassLoader != null;
}
Modified: trunk/src/main/org/jboss/seam/deployment/Scanner.java
===================================================================
--- trunk/src/main/org/jboss/seam/deployment/Scanner.java 2008-09-22 18:24:28 UTC (rev
9101)
+++ trunk/src/main/org/jboss/seam/deployment/Scanner.java 2008-09-22 18:45:26 UTC (rev
9102)
@@ -31,4 +31,6 @@
*/
public DeploymentStrategy getDeploymentStrategy();
+ public long getTimestamp();
+
}
Modified: trunk/src/main/org/jboss/seam/deployment/StandardDeploymentStrategy.java
===================================================================
--- trunk/src/main/org/jboss/seam/deployment/StandardDeploymentStrategy.java 2008-09-22
18:24:28 UTC (rev 9101)
+++ trunk/src/main/org/jboss/seam/deployment/StandardDeploymentStrategy.java 2008-09-22
18:45:26 UTC (rev 9102)
@@ -56,7 +56,6 @@
getDeploymentHandlers().put(NamespaceDeploymentHandler.NAME,
namespaceDeploymentHandler);
annotationDeploymentHandler = new
AnnotationDeploymentHandler(getPropertyValues(AnnotationDeploymentHandler.ANNOTATIONS_KEY),
classLoader);
getDeploymentHandlers().put(AnnotationDeploymentHandler.NAME,
annotationDeploymentHandler);
- getDeploymentHandlers().put(DotPageDotXmlDeploymentHandler.NAME, new
DotPageDotXmlDeploymentHandler());
}
@Override
Modified: trunk/src/main/org/jboss/seam/deployment/URLScanner.java
===================================================================
--- trunk/src/main/org/jboss/seam/deployment/URLScanner.java 2008-09-22 18:24:28 UTC (rev
9101)
+++ trunk/src/main/org/jboss/seam/deployment/URLScanner.java 2008-09-22 18:45:26 UTC (rev
9102)
@@ -28,6 +28,8 @@
{
private static final LogProvider log = Logging.getLogProvider(URLScanner.class);
+ private long timestamp;
+
public URLScanner(DeploymentStrategy deploymentStrategy)
{
super(deploymentStrategy);
@@ -111,6 +113,7 @@
try
{
log.debug("archive: " + file);
+ touchTimestamp(file);
ZipFile zip = new ZipFile(file);
Enumeration<? extends ZipEntry> entries = zip.entries();
while ( entries.hasMoreElements() )
@@ -138,9 +141,24 @@
}
else
{
+ touchTimestamp(file);
handleItem(newPath);
}
}
}
+ private void touchTimestamp(File file)
+ {
+ if (file.lastModified() > timestamp)
+ {
+ timestamp = file.lastModified();
+ }
+ }
+
+ @Override
+ public long getTimestamp()
+ {
+ return timestamp;
+ }
+
}
Added: trunk/src/main/org/jboss/seam/deployment/WarRootDeploymentStrategy.java
===================================================================
--- trunk/src/main/org/jboss/seam/deployment/WarRootDeploymentStrategy.java
(rev 0)
+++ trunk/src/main/org/jboss/seam/deployment/WarRootDeploymentStrategy.java 2008-09-22
18:45:26 UTC (rev 9102)
@@ -0,0 +1,58 @@
+package org.jboss.seam.deployment;
+
+import java.io.File;
+
+/**
+ * A special deployment strategy that can be used to scan the war root. This
+ * is treated as a special case.
+ *
+ * @author pmuir
+ *
+ */
+public class WarRootDeploymentStrategy extends DeploymentStrategy
+{
+
+ private ClassLoader classLoader;
+
+ private File[] warRoot;
+
+ public static final String HANDLERS_KEY =
"org.jboss.seam.deployment.deploymentHandlers";
+
+ public static final String NAME = "warRootDeploymentStrategy";
+
+ public WarRootDeploymentStrategy(ClassLoader classLoader, File warRoot)
+ {
+ this.classLoader = classLoader;
+ this.warRoot = new File[1];
+ this.warRoot[0] = warRoot;
+ getDeploymentHandlers().put(DotPageDotXmlDeploymentHandler.NAME, new
DotPageDotXmlDeploymentHandler());
+ }
+
+ @Override
+ public ClassLoader getClassLoader()
+ {
+ return classLoader;
+ }
+
+ @Override
+ protected String getDeploymentHandlersKey()
+ {
+ return HANDLERS_KEY;
+ }
+
+ @Override
+ public void handle(String name)
+ {
+ if (!(name.startsWith("WEB-INF") ||
name.startsWith("/WEB-INF")))
+ {
+ super.handle(name);
+ }
+ }
+
+ @Override
+ public void scan()
+ {
+ getScanner().scanDirectories(warRoot);
+ }
+
+}
Property changes on:
trunk/src/main/org/jboss/seam/deployment/WarRootDeploymentStrategy.java
___________________________________________________________________
Name: svn:mime-type
+ text/plain
Modified: trunk/src/main/org/jboss/seam/init/Initialization.java
===================================================================
--- trunk/src/main/org/jboss/seam/init/Initialization.java 2008-09-22 18:24:28 UTC (rev
9101)
+++ trunk/src/main/org/jboss/seam/init/Initialization.java 2008-09-22 18:45:26 UTC (rev
9102)
@@ -5,7 +5,6 @@
*/
package org.jboss.seam.init;
-
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
@@ -42,10 +41,10 @@
import org.jboss.seam.contexts.ServletLifecycle;
import org.jboss.seam.core.Expressions;
import org.jboss.seam.core.Init;
-import org.jboss.seam.deployment.DeploymentStrategy;
-import org.jboss.seam.deployment.DotPageDotXmlDeploymentHandler;
import org.jboss.seam.deployment.HotDeploymentStrategy;
import org.jboss.seam.deployment.StandardDeploymentStrategy;
+import org.jboss.seam.deployment.WarRootDeploymentStrategy;
+import org.jboss.seam.exception.Exceptions;
import org.jboss.seam.log.LogProvider;
import org.jboss.seam.log.Logging;
import org.jboss.seam.navigation.Pages;
@@ -82,9 +81,10 @@
private StandardDeploymentStrategy standardDeploymentStrategy;
private HotDeploymentStrategy hotDeploymentStrategy;
+ private WarRootDeploymentStrategy warRootDeploymentStrategy;
- private File warRootDirectory;
private File hotDeployDirectory;
+ private File warRoot;
private Set<String> nonPropertyAttributes = new HashSet<String>();
@@ -103,14 +103,13 @@
public Initialization(ServletContext servletContext)
{
this.servletContext = servletContext;
- this.warRootDirectory = getRealFile(servletContext, "/");
+ this.warRoot = getRealFile(servletContext, "/");
this.hotDeployDirectory = getRealFile(servletContext,
HotDeploymentStrategy.DEFAULT_HOT_DEPLOYMENT_DIRECTORY_PATH);
}
public Initialization create()
{
standardDeploymentStrategy = new
StandardDeploymentStrategy(Thread.currentThread().getContextClassLoader());
- addWarRoot(standardDeploymentStrategy);
standardDeploymentStrategy.scan();
addNamespaces();
initComponentsFromXmlDocument("/WEB-INF/components.xml");
@@ -121,13 +120,6 @@
initJndiProperties();
return this;
}
-
- private void addWarRoot(DeploymentStrategy deploymentStrategy)
- {
- deploymentStrategy.getFiles().add(warRootDirectory);
- deploymentStrategy.addExclude("WEB-INF/classes/*");
- deploymentStrategy.addExclude("/WEB-INF/classes/*");
- }
private void initComponentsFromXmlDocuments()
{
@@ -619,7 +611,8 @@
hotDeploymentStrategy =
createHotDeployment(Thread.currentThread().getContextClassLoader());
scanForComponents();
addComponent( new ComponentDescriptor(Init.class),
Contexts.getApplicationContext());
- Init init = (Init) Component.getInstance(Init.class, ScopeType.APPLICATION);
+ Init init = (Init) Component.getInstance(Init.class, ScopeType.APPLICATION);
+ init.setHotDeployPaths( hotDeploymentStrategy.getHotDeploymentPaths() );
ComponentDescriptor desc = findDescriptor(Jbpm.class);
if (desc != null && desc.isInstalled())
{
@@ -629,22 +622,24 @@
init.setTimestamp( System.currentTimeMillis() );
addSpecialComponents(init);
+ // Add the war root deployment
+ warRootDeploymentStrategy = new
WarRootDeploymentStrategy(Thread.currentThread().getContextClassLoader(), warRoot);
+ warRootDeploymentStrategy.scan();
+
// Make the deployment strategies available in the contexts. This gives
// access to custom deployment handlers for processing custom annotations
// etc.
Contexts.getEventContext().set(StandardDeploymentStrategy.NAME,
standardDeploymentStrategy);
Contexts.getEventContext().set(HotDeploymentStrategy.NAME, hotDeploymentStrategy);
+ Contexts.getEventContext().set(WarRootDeploymentStrategy.NAME,
warRootDeploymentStrategy);
if (hotDeploymentStrategy.isEnabled())
{
hotDeploymentStrategy.scan();
- if (hotDeploymentStrategy.isHotDeployClasslLoaderEnabled())
+ if (hotDeploymentStrategy.isHotDeployClassLoaderEnabled())
{
installHotDeployableComponents();
}
- // TODO Hack
- hotDeploymentStrategy.getFiles().add(warRootDirectory);
- init.setHotDeployPaths( hotDeploymentStrategy.getHotDeploymentPaths() );
}
installComponents(init);
@@ -661,38 +656,53 @@
public Initialization redeploy(HttpServletRequest request)
{
- log.info("redeploying");
ServletLifecycle.beginReinitialization(request);
- Init init = Init.instance();
- for ( String name: init.getHotDeployableComponents() )
+ hotDeploymentStrategy =
createHotDeployment(Thread.currentThread().getContextClassLoader());
+ if (hotDeploymentStrategy.isEnabled())
{
- Component component = Component.forName(name);
- if (component!=null)
+ hotDeploymentStrategy.scan();
+ Init init = Init.instance();
+
+ if (init.getTimestamp() < hotDeploymentStrategy.getTimestamp())
{
- ScopeType scope = component.getScope();
- if ( scope!=ScopeType.STATELESS && scope.isContextActive() )
+ log.info("redeploying");
+ Seam.clearComponentNameCache();
+ for ( String name: init.getHotDeployableComponents() )
{
- scope.getContext().remove(name);
+ Component component = Component.forName(name);
+ if (component!=null)
+ {
+ ScopeType scope = component.getScope();
+ if ( scope!=ScopeType.STATELESS && scope.isContextActive() )
+ {
+ scope.getContext().remove(name);
+ }
+ init.removeObserverMethods(component);
+ }
+ Contexts.getApplicationContext().remove(name + COMPONENT_SUFFIX);
}
- init.removeObserverMethods(component);
+
+ if (hotDeploymentStrategy.isHotDeployClassLoaderEnabled())
+ {
+ installHotDeployableComponents();
+ }
+ Contexts.getEventContext().set(HotDeploymentStrategy.NAME,
hotDeploymentStrategy);
+ init.setTimestamp( System.currentTimeMillis() );
+ installComponents(init);
+ log.info("done redeploying");
}
- Contexts.getApplicationContext().remove(name + COMPONENT_SUFFIX);
+
+ WarRootDeploymentStrategy warRootDeploymentStrategy = new
WarRootDeploymentStrategy(Thread.currentThread().getContextClassLoader(), warRoot);
+ warRootDeploymentStrategy.scan();
+ Contexts.getEventContext().set(WarRootDeploymentStrategy.NAME,
warRootDeploymentStrategy);
+ Pages pages = Pages.instance();
+ if (pages!= null) {
+ pages.initialize();
+ }
+
+
Contexts.getApplicationContext().remove(Seam.getComponentName(Exceptions.class));
}
- //TODO open the ability to reuse the classloader by looking at the components class
classloaders
- hotDeploymentStrategy =
createHotDeployment(Thread.currentThread().getContextClassLoader());
- addWarRoot(hotDeploymentStrategy);
- hotDeploymentStrategy.scan();
- if (hotDeploymentStrategy.isHotDeployClasslLoaderEnabled())
- {
- installHotDeployableComponents();
- }
- Contexts.getEventContext().set(HotDeploymentStrategy.NAME, hotDeploymentStrategy);
-
Pages.instance().setHotDotPageDotXmlFileNames(DotPageDotXmlDeploymentHandler.hotInstance().getFiles());
- init.setTimestamp( System.currentTimeMillis() );
- init.setHotDeployPaths(hotDeploymentStrategy.getHotDeploymentPaths());
- installComponents(init);
ServletLifecycle.endInitialization();
- log.info("done redeploying");
return this;
}
Modified: trunk/src/main/org/jboss/seam/navigation/Pages.java
===================================================================
--- trunk/src/main/org/jboss/seam/navigation/Pages.java 2008-09-22 18:24:28 UTC (rev
9101)
+++ trunk/src/main/org/jboss/seam/navigation/Pages.java 2008-09-22 18:45:26 UTC (rev
9102)
@@ -84,11 +84,8 @@
private Map<String, Page> pagesByViewId;
private Map<String, List<Page>> pageStacksByViewId;
- private Map<String, ConversationIdParameter> conversations;
+ private Map<String, ConversationIdParameter> conversations;
- private Set<String> dotPageDotXmlFileNames;
- private Set<String> hotDotPageDotXmlFileNames;
-
private String[] resources = { "/WEB-INF/pages.xml" };
private SortedSet<String> wildcardViewIds = new TreeSet<String>(
@@ -106,12 +103,6 @@
@Create
public void create()
{
- dotPageDotXmlFileNames = new HashSet<String>();
- hotDotPageDotXmlFileNames = new HashSet<String>();
- if (DotPageDotXmlDeploymentHandler.instance() != null)
- {
- dotPageDotXmlFileNames = DotPageDotXmlDeploymentHandler.instance().getFiles();
- }
initialize();
}
@@ -132,8 +123,11 @@
parse(stream);
}
}
-
- parsePages(hotDotPageDotXmlFileNames, dotPageDotXmlFileNames);
+
+ if (DotPageDotXmlDeploymentHandler.instance() != null)
+ {
+ parsePages(DotPageDotXmlDeploymentHandler.instance().getFiles());
+ }
}
private void parsePages(Set<String> ...fileNames)
@@ -1691,19 +1685,8 @@
getCurrentViewId().startsWith("/debug.");
}
-
public Collection<String> getKnownViewIds() {
return pagesByViewId.keySet();
}
- public Set<String> getHotDotPageDotXmlFileNames()
- {
- return hotDotPageDotXmlFileNames;
- }
-
- public void setHotDotPageDotXmlFileNames(Set<String> hotDotPageDotXmlFileNames)
- {
- this.hotDotPageDotXmlFileNames = hotDotPageDotXmlFileNames;
- }
-
}