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

svn commit: r157155 - in cocoon/trunk/src/java/org/apache/cocoon/components: source/impl/SitemapSource.java treeprocessor/sitemap/ErrorHandlerHelper.java treeprocessor/sitemap/PipelineNode.java treeprocessor/sitemap/PipelinesNode.java treeprocessor/sitemap/PipelinesNodeBuilder.java

Author: vgritsenko
Date: Fri Mar 11 12:59:21 2005
New Revision: 157155

URL: http://svn.apache.org/viewcvs?view=rev&rev=157155
Log:
Refactor sitemap error handling:
 * Encapsulate error handling details into ErrorHandlerHelper
 * Always log exception into handled-erorrs log, both in map:pipeline and map:pipelines
 * Error handling in map:pipelines gets same logic as in map:pipeline

Modified:
    cocoon/trunk/src/java/org/apache/cocoon/components/source/impl/SitemapSource.java
    cocoon/trunk/src/java/org/apache/cocoon/components/treeprocessor/sitemap/ErrorHandlerHelper.java
    cocoon/trunk/src/java/org/apache/cocoon/components/treeprocessor/sitemap/PipelineNode.java
    cocoon/trunk/src/java/org/apache/cocoon/components/treeprocessor/sitemap/PipelinesNode.java
    cocoon/trunk/src/java/org/apache/cocoon/components/treeprocessor/sitemap/PipelinesNodeBuilder.java

Modified: cocoon/trunk/src/java/org/apache/cocoon/components/source/impl/SitemapSource.java
URL: http://svn.apache.org/viewcvs/cocoon/trunk/src/java/org/apache/cocoon/components/source/impl/SitemapSource.java?view=diff&r1=157154&r2=157155
==============================================================================
--- cocoon/trunk/src/java/org/apache/cocoon/components/source/impl/SitemapSource.java (original)
+++ cocoon/trunk/src/java/org/apache/cocoon/components/source/impl/SitemapSource.java Fri Mar 11 12:59:21 2005
@@ -299,7 +299,7 @@
                 if (redirectURL.indexOf(":") == -1) {
                     redirectURL = this.protocol + ":/" + redirectURL;
                 }
-                if ( this.sourceResolver == null ) {
+                if (this.sourceResolver == null) {
                     this.sourceResolver = (SourceResolver) this.manager.lookup(SourceResolver.ROLE);
                 }
                 this.redirectSource = this.sourceResolver.resolveURI(redirectURL);
@@ -311,8 +311,7 @@
             this.exception = e;
         } catch (Exception e) {
             reset();
-            this.exception = new SAXException("Could not get sitemap source "
-                                                     + this.systemId, e);
+            this.exception = new SAXException("Could not get sitemap source " + this.systemId, e);
         }
         this.needsRefresh = false;
     }
@@ -347,7 +346,7 @@
                                                  this.environment);
                 try {
                     this.pipelineDescription.processingPipeline.process(this.environment,
-                                 EnvironmentHelper.createEnvironmentAwareConsumer(consumer));
+                                                                        EnvironmentHelper.createEnvironmentAwareConsumer(consumer));
                 } finally {
                     EnvironmentHelper.leaveProcessor();
                 }
@@ -356,8 +355,7 @@
             // Preserve original exception
             throw e;
         } catch (Exception e) {
-            throw new SAXException("Exception during processing of "
-                                          + this.systemId, e);
+            throw new SAXException("Exception during processing of " + this.systemId, e);
         } finally {
             this.needsRefresh = true;
         }

Modified: cocoon/trunk/src/java/org/apache/cocoon/components/treeprocessor/sitemap/ErrorHandlerHelper.java
URL: http://svn.apache.org/viewcvs/cocoon/trunk/src/java/org/apache/cocoon/components/treeprocessor/sitemap/ErrorHandlerHelper.java?view=diff&r1=157154&r2=157155
==============================================================================
--- cocoon/trunk/src/java/org/apache/cocoon/components/treeprocessor/sitemap/ErrorHandlerHelper.java (original)
+++ cocoon/trunk/src/java/org/apache/cocoon/components/treeprocessor/sitemap/ErrorHandlerHelper.java Fri Mar 11 12:59:21 2005
@@ -1,12 +1,12 @@
 /*
- * Copyright 1999-2004 The Apache Software Foundation.
- * 
+ * Copyright 1999-2005 The Apache Software Foundation.
+ *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
  * You may obtain a copy of the License at
- * 
+ *
  *      http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS,
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@@ -15,12 +15,14 @@
  */
 package org.apache.cocoon.components.treeprocessor.sitemap;
 
-import java.util.Map;
-
 import org.apache.avalon.framework.logger.AbstractLogEnabled;
+import org.apache.avalon.framework.logger.Logger;
+import org.apache.avalon.framework.service.ServiceException;
 import org.apache.avalon.framework.service.ServiceManager;
 import org.apache.avalon.framework.service.Serviceable;
+
 import org.apache.cocoon.Constants;
+import org.apache.cocoon.ResourceNotFoundException;
 import org.apache.cocoon.components.notification.Notifying;
 import org.apache.cocoon.components.notification.NotifyingBuilder;
 import org.apache.cocoon.components.treeprocessor.InvokeContext;
@@ -28,6 +30,9 @@
 import org.apache.cocoon.environment.Environment;
 import org.apache.cocoon.environment.ObjectModelHelper;
 
+import java.io.IOException;
+import java.util.Map;
+
 /**
  * Helps to call error handlers from PipelineNode and PipelinesNode.
  *
@@ -35,69 +40,128 @@
  * @author <a href="mailto:bluetkemeier@s-und-n.de">Bj&ouml;rn L&uuml;tkemeier</a>
  * @version CVS $Id$
  */
-public class ErrorHandlerHelper extends AbstractLogEnabled implements Serviceable {
+public class ErrorHandlerHelper extends AbstractLogEnabled
+                                implements Serviceable {
 
     private ServiceManager manager;
 
     /**
+     * Logger for handled errors
+     */
+    protected Logger handledErrorsLogger;
+
+    /**
+     * Error handling node for the ResourceNotFoundException
+     */
+    private ProcessingNode error404;
+
+    /**
+     * Error handling node for all other exceptions
+     */
+    private ProcessingNode error500;
+
+
+    public void enableLogging(Logger logger) {
+        super.enableLogging(logger);
+        this.handledErrorsLogger = logger.getChildLogger("handled-errors");
+    }
+
+    /**
      * The component manager is used to create notifying builders.
      */
     public void service(ServiceManager manager) {
         this.manager = manager;
     }
 
-    public boolean invokeErrorHandler(ProcessingNode node, Exception ex, Environment env, InvokeContext originalContext)
+    void setHandledErrorsLogger(Logger logger) {
+        this.handledErrorsLogger = logger;
+    }
+
+    void set404Handler(ProcessingNode node) {
+        this.error404 = node;
+    }
+
+    void set500Handler(ProcessingNode node) {
+        this.error500 = node;
+    }
+
+    public boolean invokeErrorHandler(Exception ex,
+                                      Environment env,
+                                      InvokeContext context)
     throws Exception {
-		Map objectModel = env.getObjectModel();
-  	
-        InvokeContext errorContext = null;
-		boolean nodeSuccessful = false;
-		
+        if (!env.isExternal() && !env.isInternalRedirect()) {
+            // Propagate exception on internal requests
+            throw ex;
+        } else if (error404 != null && ex instanceof ResourceNotFoundException) {
+            // Invoke 404-specific handler
+            return invokeErrorHandler(error404, ex, env, context);
+        } else if (error500 != null) {
+            // Invoke global handler
+            return invokeErrorHandler(error500, ex, env, context);
+        }
+
+        // No handler : propagate
+        throw ex;
+    }
+
+    public boolean invokeErrorHandler(ProcessingNode node,
+                                      Exception ex,
+                                      Environment env,
+                                      InvokeContext context)
+    throws Exception {
+        this.handledErrorsLogger.error(ex.getMessage(), ex);
+
         try {
-        	if (objectModel.get(Constants.NOTIFYING_OBJECT) == null) {
-				// error has not been processed by another handler before
-				
-	            // Try to reset the response to avoid mixing already produced output
-	            // and error page.
-	            env.tryResetResponse();
-	
-	            // Create a Notifying
-	            NotifyingBuilder notifyingBuilder= (NotifyingBuilder)this.manager.lookup(NotifyingBuilder.ROLE);
-	            Notifying currentNotifying = null;
-	            try {
-	                currentNotifying = notifyingBuilder.build(this, ex);
-	            } finally {
-	                this.manager.release(notifyingBuilder);
-	            }
-	
-	            // Add it to the object model
-	            objectModel.put(Constants.NOTIFYING_OBJECT, currentNotifying);
-	            
-	            // Also add the exception
-	            objectModel.put(ObjectModelHelper.THROWABLE_OBJECT, ex);
-        	}
-
-			// Build a new context
-			errorContext = new InvokeContext();
-			errorContext.enableLogging(getLogger());
-			errorContext.service(this.manager);
-            errorContext.setRedirector(originalContext.getRedirector());
-			
-			nodeSuccessful = node.invoke(env, errorContext);
-        } catch (Exception subEx) {
-            getLogger().error("An exception occured while handling errors at " + node.getLocation(), subEx);
-            // Rethrow it : it will either be handled by the parent sitemap or by the environment (e.g. Cocoon servlet)
-            throw subEx;
-        } finally {
-            if (errorContext != null) {
+            prepare(env, ex);
+
+            // Create error context
+            InvokeContext errorContext = new InvokeContext(context.isBuildingPipelineOnly());
+            errorContext.enableLogging(getLogger());
+            errorContext.setRedirector(context.getRedirector());
+            errorContext.service(this.manager);
+            try {
+                // Process error handling node
+                if (node.invoke(env, errorContext)) {
+                    // Exception was handled.
+                    return true;
+                }
+            } finally {
                 errorContext.dispose();
             }
+        } catch (Exception e) {
+            getLogger().error("An exception occured while handling errors at " + node.getLocation(), e);
+            // Rethrow it: It will either be handled by the parent sitemap or by the environment (e.g. Cocoon servlet)
+            throw e;
         }
-        
-        if (nodeSuccessful) {
-            return true;
-        }
+
+        // Exception was not handled in this error handler, propagate.
         throw ex;
     }
-}
 
+    private void prepare(Environment env, Exception ex)
+    throws IOException, ServiceException {
+        Map objectModel = env.getObjectModel();
+        if (objectModel.get(Constants.NOTIFYING_OBJECT) == null) {
+            // error has not been processed by another handler before
+
+            // Try to reset the response to avoid mixing already produced output
+            // and error page.
+            env.tryResetResponse();
+
+            // Create a Notifying
+            NotifyingBuilder notifyingBuilder = (NotifyingBuilder) this.manager.lookup(NotifyingBuilder.ROLE);
+            Notifying currentNotifying = null;
+            try {
+                currentNotifying = notifyingBuilder.build(this, ex);
+            } finally {
+                this.manager.release(notifyingBuilder);
+            }
+
+            // Add it to the object model
+            objectModel.put(Constants.NOTIFYING_OBJECT, currentNotifying);
+
+            // Also add the exception
+            objectModel.put(ObjectModelHelper.THROWABLE_OBJECT, ex);
+        }
+    }
+}

Modified: cocoon/trunk/src/java/org/apache/cocoon/components/treeprocessor/sitemap/PipelineNode.java
URL: http://svn.apache.org/viewcvs/cocoon/trunk/src/java/org/apache/cocoon/components/treeprocessor/sitemap/PipelineNode.java?view=diff&r1=157154&r2=157155
==============================================================================
--- cocoon/trunk/src/java/org/apache/cocoon/components/treeprocessor/sitemap/PipelineNode.java (original)
+++ cocoon/trunk/src/java/org/apache/cocoon/components/treeprocessor/sitemap/PipelineNode.java Fri Mar 11 12:59:21 2005
@@ -1,5 +1,5 @@
 /*
- * Copyright 1999-2004 The Apache Software Foundation.
+ * Copyright 1999-2005 The Apache Software Foundation.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -15,20 +15,20 @@
  */
 package org.apache.cocoon.components.treeprocessor.sitemap;
 
-import java.util.Map;
-
 import org.apache.avalon.framework.logger.Logger;
 import org.apache.avalon.framework.service.ServiceManager;
 import org.apache.avalon.framework.service.Serviceable;
+
 import org.apache.cocoon.ConnectionResetException;
 import org.apache.cocoon.ResourceNotFoundException;
 import org.apache.cocoon.components.treeprocessor.AbstractParentProcessingNode;
 import org.apache.cocoon.components.treeprocessor.InvokeContext;
 import org.apache.cocoon.components.treeprocessor.ParameterizableProcessingNode;
 import org.apache.cocoon.components.treeprocessor.ProcessingNode;
-import org.apache.cocoon.components.treeprocessor.sitemap.MountNode;
 import org.apache.cocoon.environment.Environment;
 
+import java.util.Map;
+
 /**
  * Handles &lt;map:pipeline&gt;
  *
@@ -37,34 +37,27 @@
  * @author <a href="mailto:sylvain@apache.org">Sylvain Wallez</a>
  * @author <a href="mailto:gianugo@apache.org">Gianugo Rabellino</a>
  * @author <a href="mailto:cziegeler@apache.org">Carsten Ziegeler</a>
- * @version CVS $Id$
+ * @version $Id$
  */
-public class PipelineNode
-        extends AbstractParentProcessingNode
-        implements Serviceable, ParameterizableProcessingNode {
+public class PipelineNode extends AbstractParentProcessingNode
+                          implements Serviceable, ParameterizableProcessingNode {
 
-    // TODO : handle a 'fail-hard' environment attribute
-    // can be useful to stop off-line generation when there's an error
+    // TODO: handle a 'fail-hard' environment attribute
+    //       can be useful to stop off-line generation when there's an error
 
     private ProcessingNode[] children;
 
-    private ProcessingNode error404;
-
-    private ProcessingNode error500;
-
-    private ErrorHandlerHelper errorHandlerHelper = new ErrorHandlerHelper();
+    private ErrorHandlerHelper errorHandlerHelper;
 
-    protected Logger handledErrorsLogger;
-
-    private boolean internalOnly = false;
+    private boolean internalOnly;
 
     /** Is it the last <pipeline> in the enclosing <pipelines> ? */
-    private boolean isLast = false;
+    private boolean isLast;
 
     /** The component name of the processing pipeline */
     protected String processingPipeline;
 
-    /** Optional Sitemap parameters */
+    /** Optional sitemap parameters */
     protected Map parameters;
 
     /**
@@ -73,6 +66,7 @@
      */
     public PipelineNode(String name) {
         this.processingPipeline = name;
+        this.errorHandlerHelper = new ErrorHandlerHelper();
     }
 
     /**
@@ -85,7 +79,6 @@
     public void enableLogging(Logger logger) {
         super.enableLogging(logger);
         this.errorHandlerHelper.enableLogging(logger);
-        handledErrorsLogger = logger.getChildLogger("handled-errors");
     }
 
     public void setChildren(ProcessingNode[] nodes) {
@@ -101,11 +94,11 @@
     }
 
     public void set404Handler(ProcessingNode node) {
-        this.error404 = node;
+        this.errorHandlerHelper.set404Handler(node);
     }
 
     public void set500Handler(ProcessingNode node) {
-        this.error500 = node;
+        this.errorHandlerHelper.set500Handler(node);
     }
 
     public void setInternalOnly(boolean internalOnly) {
@@ -114,54 +107,37 @@
 
     public final boolean invoke(Environment env, InvokeContext context)
     throws Exception {
-
         boolean passThrough;
-
         Object passThroughRaw = env.getAttribute(MountNode.COCOON_PASS_THROUGH);
-       
-        if(passThroughRaw == null){
-            //use legacy default value
+        if (passThroughRaw == null) {
+            // Use default value
             passThrough = false;
-        }else{
-            passThrough = ((Boolean)passThroughRaw).booleanValue() ;
+        } else {
+            passThrough = ((Boolean) passThroughRaw).booleanValue();
         }
-        
-        boolean externalRequest = env.isExternal();
 
         // Always fail on external request if pipeline is internal only.
-        if (this.internalOnly && externalRequest) {
+        if (this.internalOnly && env.isExternal()) {
             return false;
         }
-        context.inform(this.processingPipeline, this.parameters,
-                       env.getObjectModel());
+
+        context.inform(this.processingPipeline, this.parameters, env.getObjectModel());
         try {
             if (invokeNodes(children, env, context)) {
                 return true;
             } else if (!this.isLast || passThrough) {
                 return false;
-            } else {
-                throw new ResourceNotFoundException("No pipeline matched request: " +
-                                                    env.getURIPrefix() + env.getURI());
             }
-        } catch (ConnectionResetException cre) {
+
+            throw new ResourceNotFoundException("No pipeline matched request: " +
+                                                env.getURIPrefix() + env.getURI());
+
+        } catch (ConnectionResetException e) {
             // Will be reported by CocoonServlet, rethrowing
-            throw cre;
-        } catch (Exception ex) {
-            if (!externalRequest && !env.isInternalRedirect()) {
-                // Propagate exception on internal requests
-                throw ex;
-            } else if (error404 != null && ex instanceof ResourceNotFoundException) {
-                // Invoke 404-specific handler
-                handledErrorsLogger.error(ex.getMessage(), ex);
-                return errorHandlerHelper.invokeErrorHandler(error404, ex, env, context);
-            } else if (error500 != null) {
-                // Invoke global handler
-                handledErrorsLogger.error(ex.getMessage(), ex);
-                return errorHandlerHelper.invokeErrorHandler(error500, ex, env, context);
-            } else {
-                // No handler : propagate
-                throw ex;
-            }
+            throw e;
+        } catch (Exception e) {
+            // Invoke error handler
+            return this.errorHandlerHelper.invokeErrorHandler(e, env, context);
         }
     }
 }

Modified: cocoon/trunk/src/java/org/apache/cocoon/components/treeprocessor/sitemap/PipelinesNode.java
URL: http://svn.apache.org/viewcvs/cocoon/trunk/src/java/org/apache/cocoon/components/treeprocessor/sitemap/PipelinesNode.java?view=diff&r1=157154&r2=157155
==============================================================================
--- cocoon/trunk/src/java/org/apache/cocoon/components/treeprocessor/sitemap/PipelinesNode.java (original)
+++ cocoon/trunk/src/java/org/apache/cocoon/components/treeprocessor/sitemap/PipelinesNode.java Fri Mar 11 12:59:21 2005
@@ -19,6 +19,8 @@
 import org.apache.avalon.framework.logger.Logger;
 import org.apache.avalon.framework.service.ServiceManager;
 import org.apache.avalon.framework.service.Serviceable;
+
+import org.apache.cocoon.ConnectionResetException;
 import org.apache.cocoon.components.treeprocessor.InvokeContext;
 import org.apache.cocoon.components.treeprocessor.ProcessingNode;
 import org.apache.cocoon.components.treeprocessor.SimpleParentProcessingNode;
@@ -31,22 +33,21 @@
  * @author <a href="mailto:bluetkemeier@s-und-n.de">Bj&ouml;rn L&uuml;tkemeier</a>
  * @author <a href="mailto:sylvain@apache.org">Sylvain Wallez</a>
  * @author <a href="mailto:cziegeler@apache.org">Carsten Ziegeler</a>
- * @version CVS $Id$
+ * @version $Id$
  */
 public final class PipelinesNode extends SimpleParentProcessingNode
                                  implements Serviceable, Disposable {
 
     private ServiceManager manager;
 
-    private ErrorHandlerHelper errorHandlerHelper = new ErrorHandlerHelper();
-
-    private ProcessingNode errorHandler;
+    private ErrorHandlerHelper errorHandlerHelper;
 
     /**
      * Constructor
      */
     public PipelinesNode() {
         super(null);
+        this.errorHandlerHelper = new ErrorHandlerHelper();
     }
 
     /**
@@ -64,13 +65,12 @@
     }
 
     public void setErrorHandler(ProcessingNode node) {
-        this.errorHandler = node;
+        this.errorHandlerHelper.set500Handler(node);
     }
 
     public void setChildren(ProcessingNode[] nodes) {
         // Mark the last pipeline so that it can throw a ResourceNotFoundException
-        ((PipelineNode)nodes[nodes.length - 1]).setLast(true);
-
+        ((PipelineNode) nodes[nodes.length - 1]).setLast(true);
         super.setChildren(nodes);
     }
 
@@ -89,17 +89,17 @@
         context.service(this.manager);
 
         try {
-            // FIXME : is there any useful information that can be passed as top-level parameters,
-            //         such as the URI of the mount point ?
+            // FIXME: Is there any useful information that can be passed as top-level parameters,
+            //        such as the URI of the mount point ?
 
             return invokeNodes(this.children, env, context);
+
+        } catch (ConnectionResetException e) {
+            // Will be reported by CocoonServlet, rethrowing
+            throw e;
         } catch (Exception ex) {
-            if (this.errorHandler != null) {
-                // Invoke pipelines handler
-                return this.errorHandlerHelper.invokeErrorHandler(this.errorHandler, ex, env, context);
-            }
-            // No handler : propagate
-            throw ex;
+            // Invoke pipelines handler
+            return this.errorHandlerHelper.invokeErrorHandler(ex, env, context);
         }
     }
 
@@ -108,7 +108,7 @@
      */
     public void dispose() {
         if (this.manager instanceof Disposable) {
-            ((Disposable)this.manager).dispose();
+            ((Disposable) this.manager).dispose();
         }
         this.manager = null;
     }

Modified: cocoon/trunk/src/java/org/apache/cocoon/components/treeprocessor/sitemap/PipelinesNodeBuilder.java
URL: http://svn.apache.org/viewcvs/cocoon/trunk/src/java/org/apache/cocoon/components/treeprocessor/sitemap/PipelinesNodeBuilder.java?view=diff&r1=157154&r2=157155
==============================================================================
--- cocoon/trunk/src/java/org/apache/cocoon/components/treeprocessor/sitemap/PipelinesNodeBuilder.java (original)
+++ cocoon/trunk/src/java/org/apache/cocoon/components/treeprocessor/sitemap/PipelinesNodeBuilder.java Fri Mar 11 12:59:21 2005
@@ -1,12 +1,12 @@
 /*
- * Copyright 1999-2004 The Apache Software Foundation.
- * 
+ * Copyright 1999-2005 The Apache Software Foundation.
+ *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
  * You may obtain a copy of the License at
- * 
+ *
  *      http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS,
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@@ -15,16 +15,17 @@
  */
 package org.apache.cocoon.components.treeprocessor.sitemap;
 
-import java.util.ArrayList;
-import java.util.List;
-
 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.components.treeprocessor.ContainerNodeBuilder;
 import org.apache.cocoon.components.treeprocessor.ProcessingNode;
 import org.apache.cocoon.components.treeprocessor.ProcessingNodeBuilder;
 
+import java.util.ArrayList;
+import java.util.List;
+
 /**
  * Builds a &lt;map:pipelines&gt;
  *
@@ -32,47 +33,47 @@
  * @author <a href="mailto:bluetkemeier@s-und-n.de">Bj&ouml;rn L&uuml;tkemeier</a>
  * @author <a href="mailto:sylvain@apache.org">Sylvain Wallez</a>
  * @author <a href="mailto:cziegeler@apache.org">Carsten Ziegeler</a>
- * @version CVS $Id: PipelinesNodeBuilder.java,v 1.5 2004/03/05 13:02:52 bdelacretaz Exp $
+ * @version $Id$
  */
-
 public class PipelinesNodeBuilder extends ContainerNodeBuilder implements ThreadSafe {
 
     public ProcessingNode buildNode(Configuration config)
     throws Exception {
-        // check for component configurations
+        // Check for component configurations
         Configuration child = config.getChild("component-configurations", false);
         if (child != null) {
-            this.checkNamespace(child);
+            checkNamespace(child);
             this.treeBuilder.getProcessor().setComponentConfigurations(child);
         }
+
         PipelinesNode node = new PipelinesNode();
         this.treeBuilder.setupNode(node, config);
 
-		Configuration[] childConfigs = config.getChildren();
-		List children = new ArrayList();
-		HandleErrorsNode handler = null;
-		
-		for (int i = 0; i < childConfigs.length; i++) {
-
-			Configuration childConfig = childConfigs[i];
-			if (isChild(childConfig)) {
-
-				ProcessingNodeBuilder builder = this.treeBuilder.createNodeBuilder(childConfig);
-				if (builder instanceof HandleErrorsNodeBuilder) {
-					handler = (HandleErrorsNode)builder.buildNode(childConfig);
-				} else {
-					// Regular builder
-					children.add(builder.buildNode(childConfig));
-				}
-			}
-		}
+        Configuration[] childConfigs = config.getChildren();
+        List children = new ArrayList();
+        HandleErrorsNode handler = null;
+
+        for (int i = 0; i < childConfigs.length; i++) {
+            Configuration childConfig = childConfigs[i];
+            if (isChild(childConfig)) {
+
+                ProcessingNodeBuilder builder = this.treeBuilder.createNodeBuilder(childConfig);
+                if (builder instanceof HandleErrorsNodeBuilder) {
+                    handler = (HandleErrorsNode)builder.buildNode(childConfig);
+                } else {
+                    // Regular builder
+                    children.add(builder.buildNode(childConfig));
+                }
+            }
+        }
+
         if (children.size() == 0) {
             String msg = "There must be at least one pipeline at " + config.getLocation();
             throw new ConfigurationException(msg);
         }
 
-		node.setChildren(toNodeArray(children));
-		node.setErrorHandler(handler);
+        node.setChildren(toNodeArray(children));
+        node.setErrorHandler(handler);
 
         return node;
     }