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/04/25 19:11:46 UTC
svn commit: r164604 -
/cocoon/branches/BRANCH_2_1_X/src/java/org/apache/cocoon/components/ExtendedComponentSelector.java
Author: vgritsenko
Date: Mon Apr 25 10:11:44 2005
New Revision: 164604
URL: http://svn.apache.org/viewcvs?rev=164604&view=rev
Log:
throw exception which has a cause (so that
nested configuration exception is not lost)
Modified:
cocoon/branches/BRANCH_2_1_X/src/java/org/apache/cocoon/components/ExtendedComponentSelector.java
Modified: cocoon/branches/BRANCH_2_1_X/src/java/org/apache/cocoon/components/ExtendedComponentSelector.java
URL: http://svn.apache.org/viewcvs/cocoon/branches/BRANCH_2_1_X/src/java/org/apache/cocoon/components/ExtendedComponentSelector.java?rev=164604&r1=164603&r2=164604&view=diff
==============================================================================
--- cocoon/branches/BRANCH_2_1_X/src/java/org/apache/cocoon/components/ExtendedComponentSelector.java (original)
+++ cocoon/branches/BRANCH_2_1_X/src/java/org/apache/cocoon/components/ExtendedComponentSelector.java Mon Apr 25 10:11:44 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.
@@ -30,10 +30,8 @@
* @author <a href="mailto:sylvain@apache.org">Sylvain Wallez</a>
* @version CVS $Id$
*/
-
-public class ExtendedComponentSelector
- extends ExcaliburComponentSelector
- implements ParentAware {
+public class ExtendedComponentSelector extends ExcaliburComponentSelector
+ implements ParentAware {
/** The role manager */
protected RoleManager roles;
@@ -56,17 +54,18 @@
/** This selector's location (used for debugging purposes) */
private String location;
+
+ /** Create the ComponentSelector with the Thread context ClassLoader */
public ExtendedComponentSelector() {
this.classLoader = Thread.currentThread().getContextClassLoader();
}
- /** Create the ComponentSelector with a Classloader */
+ /** Create the ComponentSelector with a ClassLoader */
public ExtendedComponentSelector(ClassLoader loader) {
super(loader);
if (loader == null) {
this.classLoader = Thread.currentThread().getContextClassLoader();
-
} else {
this.classLoader = loader;
}
@@ -132,6 +131,7 @@
this.parentComponents = new HashSet();
}
*/
+
/**
* Get the role name for this selector. This is called by <code>configure()</code>
* to set the value of <code>this.roleName</code>.
@@ -191,7 +191,6 @@
Configuration[] instances = config.getChildren();
for (int i = 0; i < instances.length; i++) {
-
Configuration instance = instances[i];
Object hint = instance.getAttribute("name").trim();
@@ -228,10 +227,9 @@
Class clazz = this.classLoader.loadClass(className);
addComponent(hint, clazz, instance);
- } catch(Exception e) {
-
+ } catch (Exception e) {
String message = "Could not load class " + className + " for component named '" +
- hint + "' at " + instance.getLocation();
+ hint + "' at " + instance.getLocation();
getLogger().error(message, e);
throw new ConfigurationException(message, e);
@@ -250,25 +248,36 @@
* @see org.apache.avalon.framework.component.ComponentSelector#select(java.lang.Object)
*/
public Component select(Object hint) throws ComponentException {
-
if (hint == null) {
hint = this.defaultHint;
}
if (parentSelector == null) {
- // No parent : default behaviour
+ // No parent: default behaviour
return super.select(hint);
+ }
- } else {
+ try {
+ // Try in this selector first
+ final Component component = super.select(hint);
+ return component;
- // Try here first
+ } catch (ComponentException original) {
try {
- return super.select(hint);
-
- } catch(ComponentException ce) {
- // Doesn't exist here : try in parent selector
+ // Doesn't exist here: try in parent selector
final Component component = this.parentSelector.select(hint);
return component;
+
+ } catch (ComponentException nested) {
+ // Doesn't exist in parent too: throw exception.
+
+ if (nested.getCause() != null) {
+ // Nested exception has a cause; let's throw it instead of original.
+ throw nested;
+ }
+
+ // Throw original exception
+ throw original;
}
}
}
@@ -278,11 +287,11 @@
*/
public void release(Component component) {
// Was it selected on the parent ?
- if ( this.parentSelector != null &&
- this.parentSelector.canRelease(component) ) {
+ if (this.parentSelector != null && this.parentSelector.canRelease(component)) {
+ // Yes
this.parentSelector.release(component);
-
} else {
+ // No
super.release(component);
}
}
@@ -291,17 +300,17 @@
* Does this selector or its parent have the given hint ?
*/
public boolean hasComponent(Object hint) {
- boolean exists = super.hasComponent( hint );
- if ( !exists && this.parentSelector != null ) {
- exists = this.parentSelector.hasComponent( hint );
+ boolean exists = super.hasComponent(hint);
+ if (!exists && this.parentSelector != null) {
+ exists = this.parentSelector.hasComponent(hint);
}
return exists;
}
-
+
/**
* Does this selector declare a given hint? Check is performed on the components declared for this
* selector only, and <strong>not</strong> those potentially inherited from the parent selector.
- *
+ *
* @param hint the hint to check for
* @return <code>true</code> if this selector has the specified hint
*/
@@ -326,8 +335,8 @@
*/
public void dispose() {
super.dispose();
- if ( this.parentLocator != null ) {
- this.parentLocator.release( this.parentSelector );
+ if (this.parentLocator != null) {
+ this.parentLocator.release(this.parentSelector);
this.parentLocator = null;
this.parentSelector = null;
}
@@ -337,11 +346,10 @@
* @see org.apache.avalon.excalibur.component.ExcaliburComponentSelector#canRelease(org.apache.avalon.framework.component.Component)
*/
protected boolean canRelease(Component component) {
- if ( this.parentSelector != null &&
- this.parentSelector.canRelease(component) ) {
+ if (this.parentSelector != null && this.parentSelector.canRelease(component)) {
return true;
}
+
return super.canRelease(component);
}
-
}