You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@cocoon.apache.org by sy...@apache.org on 2005/04/08 18:03:08 UTC

svn commit: r160557 - in cocoon/branches/BRANCH_2_1_X: ./ src/java/org/apache/cocoon/components/treeprocessor/ src/java/org/apache/cocoon/components/treeprocessor/sitemap/ src/java/org/apache/cocoon/environment/

Author: sylvain
Date: Fri Apr  8 09:03:06 2005
New Revision: 160557

URL: http://svn.apache.org/viewcvs?view=rev&rev=160557
Log:
fix environment context handling to allow the root sitemap to be at an arbitrary location

Modified:
    cocoon/branches/BRANCH_2_1_X/src/java/org/apache/cocoon/components/treeprocessor/ConcreteTreeProcessor.java
    cocoon/branches/BRANCH_2_1_X/src/java/org/apache/cocoon/components/treeprocessor/TreeProcessor.java
    cocoon/branches/BRANCH_2_1_X/src/java/org/apache/cocoon/components/treeprocessor/sitemap/MountNode.java
    cocoon/branches/BRANCH_2_1_X/src/java/org/apache/cocoon/environment/AbstractEnvironment.java
    cocoon/branches/BRANCH_2_1_X/status.xml

Modified: cocoon/branches/BRANCH_2_1_X/src/java/org/apache/cocoon/components/treeprocessor/ConcreteTreeProcessor.java
URL: http://svn.apache.org/viewcvs/cocoon/branches/BRANCH_2_1_X/src/java/org/apache/cocoon/components/treeprocessor/ConcreteTreeProcessor.java?view=diff&r1=160556&r2=160557
==============================================================================
--- cocoon/branches/BRANCH_2_1_X/src/java/org/apache/cocoon/components/treeprocessor/ConcreteTreeProcessor.java (original)
+++ cocoon/branches/BRANCH_2_1_X/src/java/org/apache/cocoon/components/treeprocessor/ConcreteTreeProcessor.java Fri Apr  8 09:03:06 2005
@@ -62,6 +62,8 @@
     private Map sitemapComponentConfigurations;
 
     private Configuration componentConfigurations;
+    
+    private String uriContext;
 
     /** Number of simultaneous uses of this processor (either by concurrent request or by internal requests) */
     private int requestCount;
@@ -72,14 +74,15 @@
 	}
 
 	/** Set the processor data, result of the treebuilder job */
-	public void setProcessorData(ComponentManager manager, ProcessingNode rootNode, List disposableNodes) {
-		if (this.sitemapComponentManager != null) {
-			throw new IllegalStateException("setProcessorData() can only be called once");
-		}
+	public void setProcessorData(ComponentManager manager, ProcessingNode rootNode, List disposableNodes, String uriContext) {
+        if (this.sitemapComponentManager != null) {
+            throw new IllegalStateException("setProcessorData() can only be called once");
+        }
 
-		this.sitemapComponentManager = manager;
-		this.rootNode = rootNode;
-		this.disposableNodes = disposableNodes;
+        this.sitemapComponentManager = manager;
+        this.rootNode = rootNode;
+        this.disposableNodes = disposableNodes;
+        this.uriContext = uriContext;
 	}
 
 	/** Set the sitemap component configurations (called as part of the tree building process) */
@@ -216,11 +219,13 @@
 
     		try {
     	        // and now process
-                CocoonComponentManager.enterEnvironment(environment, this.sitemapComponentManager, this);
+            CocoonComponentManager.enterEnvironment(environment, this.sitemapComponentManager, this);
+            String oldContext = environment.getContext();
+            environment.changeContext("", this.uriContext);
 
-                Map objectModel = environment.getObjectModel();
+            Map objectModel = environment.getObjectModel();
 
-                Object oldResolver = objectModel.get(ProcessingNode.OBJECT_SOURCE_RESOLVER);
+            Object oldResolver = objectModel.get(ProcessingNode.OBJECT_SOURCE_RESOLVER);
     	        final Redirector oldRedirector = context.getRedirector();
 
     	        // Build a redirector
@@ -236,6 +241,7 @@
     	            return success;
 
     	        } finally {
+                    environment.changeContext("", oldContext);
                     CocoonComponentManager.leaveEnvironment(success);
                     // Restore old redirector and resolver
      	            context.setRedirector(oldRedirector);

Modified: cocoon/branches/BRANCH_2_1_X/src/java/org/apache/cocoon/components/treeprocessor/TreeProcessor.java
URL: http://svn.apache.org/viewcvs/cocoon/branches/BRANCH_2_1_X/src/java/org/apache/cocoon/components/treeprocessor/TreeProcessor.java?view=diff&r1=160556&r2=160557
==============================================================================
--- cocoon/branches/BRANCH_2_1_X/src/java/org/apache/cocoon/components/treeprocessor/TreeProcessor.java (original)
+++ cocoon/branches/BRANCH_2_1_X/src/java/org/apache/cocoon/components/treeprocessor/TreeProcessor.java Fri Apr  8 09:03:06 2005
@@ -308,26 +308,40 @@
         this.setupLogger(newProcessor);
         //FIXME (SW): why do we need to enterProcessor here?
         CocoonComponentManager.enterEnvironment(env, this.manager, this);
+        String oldContext = env.getContext();
         try {
             if (builder instanceof Recomposable) {
                 ((Recomposable)builder).recompose(this.manager);
             }
             builder.setProcessor(newProcessor);
-            if (this.fileName == null) {
-                this.fileName = builder.getFileName();
-            }
 
             if (this.source == null) {
+                if (this.fileName == null) {
+                    // Case of the root sitemap if no explicit config was given
+                    this.fileName = builder.getFileName();
+                }
+
                 this.source = new DelayedRefreshSourceWrapper(this.resolver.resolveURI(this.fileName),
                                                               lastModifiedDelay);
+                
+                if (this.parent == null) {
+                    // Ensure the root processor has a filename to change its context
+                    this.fileName = this.source.getURI();
+                }
             }
+            
+            // Set the context to the sitemap location as components may lookup some resources
+            // during their initialization
+            env.changeContext("", this.source.getURI());
 
             newLastModified = this.source.getLastModified();
 
             ProcessingNode root = builder.build(this.source);
 
-            newProcessor.setProcessorData(builder.getSitemapComponentManager(), root, builder.getDisposableNodes());
+            newProcessor.setProcessorData(builder.getSitemapComponentManager(), root, builder.getDisposableNodes(), this.source.getURI());
         } finally {
+            // Restore the context (FIXME: need to separate this from URI prefix)
+            env.changeContext("", oldContext);
             CocoonComponentManager.leaveEnvironment();
             this.builderSelector.release(builder);
         }

Modified: cocoon/branches/BRANCH_2_1_X/src/java/org/apache/cocoon/components/treeprocessor/sitemap/MountNode.java
URL: http://svn.apache.org/viewcvs/cocoon/branches/BRANCH_2_1_X/src/java/org/apache/cocoon/components/treeprocessor/sitemap/MountNode.java?view=diff&r1=160556&r2=160557
==============================================================================
--- cocoon/branches/BRANCH_2_1_X/src/java/org/apache/cocoon/components/treeprocessor/sitemap/MountNode.java (original)
+++ cocoon/branches/BRANCH_2_1_X/src/java/org/apache/cocoon/components/treeprocessor/sitemap/MountNode.java Fri Apr  8 09:03:06 2005
@@ -103,7 +103,8 @@
         boolean pipelineWasBuilt = false;
 
         try {
-            env.changeContext(resolvedPrefix, resolvedSource);
+            // We only change the prefix here. Context will be changed by the processor itself.
+            env.changeContext(resolvedPrefix, "");
 
             if (context.isBuildingPipelineOnly()) {
                 // Propagate pipelines

Modified: cocoon/branches/BRANCH_2_1_X/src/java/org/apache/cocoon/environment/AbstractEnvironment.java
URL: http://svn.apache.org/viewcvs/cocoon/branches/BRANCH_2_1_X/src/java/org/apache/cocoon/environment/AbstractEnvironment.java?view=diff&r1=160556&r2=160557
==============================================================================
--- cocoon/branches/BRANCH_2_1_X/src/java/org/apache/cocoon/environment/AbstractEnvironment.java (original)
+++ cocoon/branches/BRANCH_2_1_X/src/java/org/apache/cocoon/environment/AbstractEnvironment.java Fri Apr  8 09:03:06 2005
@@ -243,7 +243,7 @@
     /**
      * Adds an prefix to the overall stripped off prefix from the request uri
      */
-    public void changeContext(String prefix, String newContext)
+    public void changeContext(String newPrefix, String newContext)
     throws IOException {
         if (!this.initializedComponents) {
             this.initComponents();
@@ -252,19 +252,19 @@
         if (getLogger().isDebugEnabled()) {
             getLogger().debug("Changing Cocoon context");
             getLogger().debug("  from context(" + this.context + ") and prefix(" + this.prefix + ")");
-            getLogger().debug("  to context(" + newContext + ") and prefix(" + prefix + ")");
+            getLogger().debug("  to context(" + newContext + ") and prefix(" + newPrefix + ")");
             getLogger().debug("  at URI " + this.uris);
         }
 
-        int l = prefix.length();
+        int l = newPrefix.length();
         if (l >= 1) {
-            if (!this.uris.startsWith(prefix)) {
+            if (!this.uris.startsWith(newPrefix)) {
                 String message = "The current URI (" + this.uris +
-                                 ") doesn't start with given prefix (" + prefix + ")";
+                                 ") doesn't start with given prefix (" + newPrefix + ")";
                 getLogger().error(message);
                 throw new RuntimeException(message);
             }
-            this.prefix.append(prefix);
+            this.prefix.append(newPrefix);
             this.uris = this.uris.substring(l);
 
             // check for a slash at the beginning to avoid problems with subsitemaps
@@ -274,7 +274,7 @@
             }
         }
 
-        if (SourceUtil.getScheme(this.context).equals("zip")) {
+        if (this.context.startsWith("zip:")) {
             // if the resource is zipped into a war file (e.g. Weblogic temp deployment)
             // FIXME (VG): Is this still required? Better to unify both cases.
             if (getLogger().isDebugEnabled()) {
@@ -288,7 +288,7 @@
             } finally {
                 this.sourceResolver.release(source);
             }
-        } else {
+        } else if (newContext.length() > 0){
             String sContext;
             // if we got a absolute context or one with a protocol resolve it
             if (newContext.charAt(0) == '/') {

Modified: cocoon/branches/BRANCH_2_1_X/status.xml
URL: http://svn.apache.org/viewcvs/cocoon/branches/BRANCH_2_1_X/status.xml?view=diff&r1=160556&r2=160557
==============================================================================
--- cocoon/branches/BRANCH_2_1_X/status.xml (original)
+++ cocoon/branches/BRANCH_2_1_X/status.xml Fri Apr  8 09:03:06 2005
@@ -196,6 +196,10 @@
 
   <changes>
   <release version="@version@" date="@date@">
+    <action dev="SW" type="fix">
+      Fix environment handling to allow the root sitemap to be at an abitrary location
+      and not only in the main webapp context directory.
+    </action>
     <action dev="VG" type="fix">
       Updated excalibur-pool to 2.0.0, excalibur-datasource to 1.2.0.
       Fixes problem of database connections pools not coming up after