You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@cocoon.apache.org by da...@apache.org on 2005/12/11 21:17:11 UTC

svn commit: r356005 - in /cocoon/trunk/src/java/org/apache/cocoon: blocks/ components/modules/input/ components/source/impl/ environment/internal/

Author: danielf
Date: Sun Dec 11 12:17:05 2005
New Revision: 356005

URL: http://svn.apache.org/viewcvs?rev=356005&view=rev
Log:
Refactored to make the block stack independent of the environment stack.

Added:
    cocoon/trunk/src/java/org/apache/cocoon/blocks/BlockEnvironmentHelper.java
      - copied, changed from r355184, cocoon/trunk/src/java/org/apache/cocoon/environment/internal/BlockEnvironmentHelper.java
Removed:
    cocoon/trunk/src/java/org/apache/cocoon/environment/internal/BlockEnvironmentHelper.java
Modified:
    cocoon/trunk/src/java/org/apache/cocoon/blocks/BlockDispatcherProcessor.java
    cocoon/trunk/src/java/org/apache/cocoon/blocks/BlockManager.java
    cocoon/trunk/src/java/org/apache/cocoon/blocks/Blocks.java
    cocoon/trunk/src/java/org/apache/cocoon/components/modules/input/BlockPathModule.java
    cocoon/trunk/src/java/org/apache/cocoon/components/modules/input/BlockPropertyModule.java
    cocoon/trunk/src/java/org/apache/cocoon/components/source/impl/BlockSource.java

Modified: cocoon/trunk/src/java/org/apache/cocoon/blocks/BlockDispatcherProcessor.java
URL: http://svn.apache.org/viewcvs/cocoon/trunk/src/java/org/apache/cocoon/blocks/BlockDispatcherProcessor.java?rev=356005&r1=356004&r2=356005&view=diff
==============================================================================
--- cocoon/trunk/src/java/org/apache/cocoon/blocks/BlockDispatcherProcessor.java (original)
+++ cocoon/trunk/src/java/org/apache/cocoon/blocks/BlockDispatcherProcessor.java Sun Dec 11 12:17:05 2005
@@ -24,7 +24,6 @@
 import org.apache.cocoon.Processor;
 import org.apache.cocoon.environment.Environment;
 import org.apache.cocoon.environment.SourceResolver;
-import org.apache.cocoon.environment.internal.EnvironmentHelper;
 
 /**
  * @version SVN $Id$
@@ -68,10 +67,10 @@
                 // It is important to set the current block each time
                 // a new block is entered, this is used for the block
                 // protocol
-                EnvironmentHelper.enterProcessor(block, null, environment);
+                BlockEnvironmentHelper.enterBlock(block);
                 return block.process(environment);
             } finally {
-                EnvironmentHelper.leaveProcessor();
+                BlockEnvironmentHelper.leaveBlock();
                 environment.setURI(oldPrefix, oldURI);
                 getLogger().debug("Leaving processing in block at " + mountPoint);
             }

Copied: cocoon/trunk/src/java/org/apache/cocoon/blocks/BlockEnvironmentHelper.java (from r355184, cocoon/trunk/src/java/org/apache/cocoon/environment/internal/BlockEnvironmentHelper.java)
URL: http://svn.apache.org/viewcvs/cocoon/trunk/src/java/org/apache/cocoon/blocks/BlockEnvironmentHelper.java?p2=cocoon/trunk/src/java/org/apache/cocoon/blocks/BlockEnvironmentHelper.java&p1=cocoon/trunk/src/java/org/apache/cocoon/environment/internal/BlockEnvironmentHelper.java&r1=355184&r2=356005&rev=356005&view=diff
==============================================================================
--- cocoon/trunk/src/java/org/apache/cocoon/environment/internal/BlockEnvironmentHelper.java (original)
+++ cocoon/trunk/src/java/org/apache/cocoon/blocks/BlockEnvironmentHelper.java Sun Dec 11 12:17:05 2005
@@ -13,36 +13,60 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.cocoon.environment.internal;
+package org.apache.cocoon.blocks;
 
-import java.net.URL;
+import java.util.Stack;
 
-import org.apache.cocoon.blocks.Block;
+import org.apache.cocoon.ProcessingException;
 
 /**
- * Hack used for geting hold on the current block manager without
- * making core code dependent of the experimental blocks code.
+ * Stack used for geting hold on the current block manager
  *
  * @version $Id$
  * @since 2.2 
  */
-public class BlockEnvironmentHelper
-    extends EnvironmentHelper {
+public class BlockEnvironmentHelper {
 
-    // Hack for getting it to compile
-    private BlockEnvironmentHelper(URL context) {
-        super(context);
+    /** The block stack */
+    static protected final ThreadLocal blockStack = new ThreadLocal();
+
+    /**
+     * This hook must be called each time a block is entered.
+     *
+     * <p>This method should never raise an exception, except when the
+     * parameters are not set!</p>
+     *
+     * @throws ProcessingException if block is null
+     */
+    public static void enterBlock(Block block)
+    throws ProcessingException {
+        if (null == block) {
+            throw new ProcessingException("Block is not set.");
+        }
+
+        Stack stack = (Stack)blockStack.get();
+        if (stack == null) {
+            stack = new Stack();
+            blockStack.set(stack);
+        }
+        stack.push(block);
+    }
+
+    /**
+     * This hook must be called each time a block is left.
+     *
+     * <p>It's the counterpart to the {@link #enterBlock(Block)}
+     * method.</p>
+     */
+    public static void leaveBlock() {
+        final Stack stack = (Stack)blockStack.get();
+        stack.pop();
     }
 
     public static Block getCurrentBlock() {
-        final EnvironmentStack stack = (EnvironmentStack)environmentStack.get();
+        final Stack stack = (Stack)blockStack.get();
         if ( stack != null && !stack.isEmpty()) {
-            for (int i = stack.getOffset(); i >= 0; i--) {
-                final EnvironmentInfo info = (EnvironmentInfo)stack.get(i);
-                if (info.processor instanceof Block) {
-                    return (Block)info.processor;
-                }
-            }
+        	return (Block)stack.peek();
         }
         return null;
     }

Modified: cocoon/trunk/src/java/org/apache/cocoon/blocks/BlockManager.java
URL: http://svn.apache.org/viewcvs/cocoon/trunk/src/java/org/apache/cocoon/blocks/BlockManager.java?rev=356005&r1=356004&r2=356005&view=diff
==============================================================================
--- cocoon/trunk/src/java/org/apache/cocoon/blocks/BlockManager.java (original)
+++ cocoon/trunk/src/java/org/apache/cocoon/blocks/BlockManager.java Sun Dec 11 12:17:05 2005
@@ -41,7 +41,6 @@
 import org.apache.cocoon.core.container.CoreServiceManager;
 import org.apache.cocoon.environment.Environment;
 import org.apache.cocoon.environment.SourceResolver;
-import org.apache.cocoon.environment.internal.EnvironmentHelper;
 
 /**
  * @version SVN $Id$
@@ -325,12 +324,12 @@
                 	// It is important to set the current block each time
                 	// a new block is entered, this is used for the block
                 	// protocol
-            		EnvironmentHelper.enterProcessor(block, null, environment);
+            		BlockEnvironmentHelper.enterBlock(block);
             	}
             	return block.process(environment);
             } finally {
             	if (!superCall) {
-            		EnvironmentHelper.leaveProcessor();
+            		BlockEnvironmentHelper.leaveBlock();
             	}
             	this.getLogger().debug("Leaving processing in block " + blockName);
 			}            	

Modified: cocoon/trunk/src/java/org/apache/cocoon/blocks/Blocks.java
URL: http://svn.apache.org/viewcvs/cocoon/trunk/src/java/org/apache/cocoon/blocks/Blocks.java?rev=356005&r1=356004&r2=356005&view=diff
==============================================================================
--- cocoon/trunk/src/java/org/apache/cocoon/blocks/Blocks.java (original)
+++ cocoon/trunk/src/java/org/apache/cocoon/blocks/Blocks.java Sun Dec 11 12:17:05 2005
@@ -15,12 +15,6 @@
  */
 package org.apache.cocoon.blocks;
 
-import java.net.URI;
-import java.net.URISyntaxException;
-
-import org.apache.avalon.framework.service.ServiceManager;
-import org.apache.cocoon.Processor;
-
 /**
  * @version SVN $Id$
  */

Modified: cocoon/trunk/src/java/org/apache/cocoon/components/modules/input/BlockPathModule.java
URL: http://svn.apache.org/viewcvs/cocoon/trunk/src/java/org/apache/cocoon/components/modules/input/BlockPathModule.java?rev=356005&r1=356004&r2=356005&view=diff
==============================================================================
--- cocoon/trunk/src/java/org/apache/cocoon/components/modules/input/BlockPathModule.java (original)
+++ cocoon/trunk/src/java/org/apache/cocoon/components/modules/input/BlockPathModule.java Sun Dec 11 12:17:05 2005
@@ -26,7 +26,7 @@
 import org.apache.avalon.framework.thread.ThreadSafe;
 import org.apache.cocoon.blocks.Block;
 import org.apache.cocoon.environment.Environment;
-import org.apache.cocoon.environment.internal.BlockEnvironmentHelper;
+import org.apache.cocoon.blocks.BlockEnvironmentHelper;
 import org.apache.cocoon.environment.internal.EnvironmentHelper;
 
 /**

Modified: cocoon/trunk/src/java/org/apache/cocoon/components/modules/input/BlockPropertyModule.java
URL: http://svn.apache.org/viewcvs/cocoon/trunk/src/java/org/apache/cocoon/components/modules/input/BlockPropertyModule.java?rev=356005&r1=356004&r2=356005&view=diff
==============================================================================
--- cocoon/trunk/src/java/org/apache/cocoon/components/modules/input/BlockPropertyModule.java (original)
+++ cocoon/trunk/src/java/org/apache/cocoon/components/modules/input/BlockPropertyModule.java Sun Dec 11 12:17:05 2005
@@ -22,7 +22,7 @@
 import org.apache.avalon.framework.configuration.Configuration;
 import org.apache.avalon.framework.configuration.ConfigurationException;
 import org.apache.avalon.framework.thread.ThreadSafe;
-import org.apache.cocoon.environment.internal.BlockEnvironmentHelper;
+import org.apache.cocoon.blocks.BlockEnvironmentHelper;
 
 /**
  * BlockPropertyModule provides access to the properties of the current block.

Modified: cocoon/trunk/src/java/org/apache/cocoon/components/source/impl/BlockSource.java
URL: http://svn.apache.org/viewcvs/cocoon/trunk/src/java/org/apache/cocoon/components/source/impl/BlockSource.java?rev=356005&r1=356004&r2=356005&view=diff
==============================================================================
--- cocoon/trunk/src/java/org/apache/cocoon/components/source/impl/BlockSource.java (original)
+++ cocoon/trunk/src/java/org/apache/cocoon/components/source/impl/BlockSource.java Sun Dec 11 12:17:05 2005
@@ -27,9 +27,9 @@
 import org.apache.avalon.framework.logger.Logger;
 import org.apache.avalon.framework.service.ServiceManager;
 import org.apache.cocoon.blocks.Block;
+import org.apache.cocoon.blocks.BlockEnvironmentHelper;
 import org.apache.cocoon.environment.Environment;
 import org.apache.cocoon.environment.ObjectModelHelper;
-import org.apache.cocoon.environment.internal.BlockEnvironmentHelper;
 import org.apache.cocoon.environment.internal.EnvironmentHelper;
 import org.apache.cocoon.environment.wrapper.EnvironmentWrapper;
 import org.apache.excalibur.source.SourceException;
@@ -43,9 +43,6 @@
 public final class BlockSource
     extends AbstractSource {
 
-    /** The current ServiceManager */
-    private final ServiceManager manager;
-
     /** The environment */
     private final EnvironmentWrapper environment;
 
@@ -68,8 +65,6 @@
         if ( env == null ) {
             throw new MalformedURLException("The block protocol can not be used outside an environment.");
         }
-        this.manager = manager;
-
         this.block = BlockEnvironmentHelper.getCurrentBlock();
         if (this.block == null)
             throw new MalformedURLException("Must be used in a block context " + this.getURI());