cziegeler 2002/11/15 09:07:56
Modified: src/java/org/apache/cocoon/components
CocoonComponentManager.java
Log:
Hopefully fixing bug 12293
Revision Changes Path
1.32 +84 -112
xml-cocoon2/src/java/org/apache/cocoon/components/CocoonComponentManager.java
Index: CocoonComponentManager.java
===================================================================
RCS file:
/home/cvs/xml-cocoon2/src/java/org/apache/cocoon/components/CocoonComponentManager.java,v
retrieving revision 1.31
retrieving revision 1.32
diff -u -r1.31 -r1.32
--- CocoonComponentManager.java 15 Nov 2002 15:12:35 -0000 1.31
+++ CocoonComponentManager.java 15 Nov 2002 17:07:56 -0000 1.32
@@ -72,6 +72,7 @@
import org.apache.excalibur.source.Source;
import org.apache.excalibur.source.SourceException;
import org.apache.excalibur.source.SourceResolver;
+import sun.tools.tree.ThisExpression;
/**
* Cocoon Component Manager.
@@ -126,27 +127,22 @@
super(manager);
}
- private static final Integer ONE = new Integer(1);
- private static final Integer TWO = new Integer(2);
-
/**
* This hook must be called by the sitemap each time a sitemap is entered
*/
public static void enterEnvironment(Environment env,
- Map objectModel,
- Processor processor) {
+ Map objectModel,
+ Processor processor) {
if (environmentStack.get() == null) {
environmentStack.set(new Stack());
}
final Stack stack = (Stack)environmentStack.get();
- if (!stack.empty()) {
- final Object[] objects = (Object[])stack.peek();
- if ( objects[1] == objectModel ) {
- stack.push(new Object[] {env, objectModel, objects[2], TWO,
processor, processor.getComponentConfigurations()});
- return;
- }
+ stack.push(new Object[] {env, processor});
+
+ EnvironmentDescription desc = getDescription(objectModel);
+ if ( null != desc ) {
+ desc.addSitemapConfiguration(processor.getComponentConfigurations());
}
- stack.push(new Object[] {env, objectModel, new HashMap(5), ONE, processor,
processor.getComponentConfigurations(), new ArrayList(2)});
}
/**
@@ -156,30 +152,6 @@
final Stack stack = (Stack)environmentStack.get();
if (null != stack && !stack.empty()) {
final Object[] objects = (Object[])stack.pop();
- if (objects[3] == ONE) {
- final Map components = (Map)objects[2];
- final Iterator iter = components.values().iterator();
- while (iter.hasNext()) {
- final Object[] o = (Object[])iter.next();
- final Component component = (Component)o[0];
- ((ComponentManager)o[1]).release( component );
- }
- if (objects.length > 6) {
- final List automaticReleasedComponents = (List)objects[6];
- for(int i = 0; i < automaticReleasedComponents.size(); i++) {
- final Object[] o =
(Object[])automaticReleasedComponents.get(i);
- final Component component = (Component)o[0];
- if (o[1] instanceof ComponentManager) {
- ((ComponentManager)o[1]).release( component );
- } else {
- ((ComponentSelector)o[1]).release( component );
- if (o[2] != null) {
- ((ComponentManager)o[2]).release( (Component)o[1] );
- }
- }
- }
- }
- }
}
}
@@ -196,9 +168,9 @@
processes = new HashMap(4);
processList.set(processes);
}
- Map values = new HashMap(5);
+ EnvironmentDescription desc = new EnvironmentDescription(env);
Long key = new Long(System.currentTimeMillis());
- processes.put(key, values);
+ processes.put(key, desc);
env.getObjectModel().put(PROCESS_KEY, key);
return key;
}
@@ -213,7 +185,6 @@
public static void endProcessing(Object key) {
Map processes = (Map)processList.get();
if ( null != processes ) {
-
processes.remove(key);
}
}
@@ -235,7 +206,7 @@
public static Processor getCurrentProcessor() {
final Stack stack = (Stack)environmentStack.get();
if (null != stack && !stack.empty()) {
- return (Processor) ((Object[])stack.peek())[4];
+ return (Processor) ((Object[])stack.peek())[1];
}
return null;
}
@@ -265,26 +236,10 @@
final Stack stack = (Stack)environmentStack.get();
if ( null != stack && !stack.empty()) {
final Object[] objects = (Object[])stack.peek();
- /* new version that will fix the RequestLifecycleComponent bug
- Map objectModel = (Map)objects[1];
- Object processKey = objectModel.get(PROCESS_KEY);
- if ( null != processKey) {
- Map processes = (Map)processList.get();
- if ( null != processes) {
- EnvironmentDescription envDesc =
(EnvironmentDescription)processes.get(processKey);
- if (envDesc != null) {
- final Component component =
envDesc.getRequestLifecycleComponent(role);
- if (null != component) {
- return component;
- }
- }
- }
- }
- */
- final Map components = (Map)objects[2];
- final Object[] o = (Object[])components.get(role);
- if ( null != o ) {
- final Component component = (Component) o[0];
+ final Map objectModel = ((Environment)objects[0]).getObjectModel();
+ EnvironmentDescription desc = getDescription(objectModel);
+ if ( null != desc ) {
+ final Component component = desc.getRequestLifecycleComponent(role);
if (null != component) {
return component;
}
@@ -297,20 +252,22 @@
throw new ComponentException("ComponentManager has no Environment
Stack.");
}
final Object[] objects = (Object[]) stack.peek();
- final Map components = (Map)objects[2];
- // first test if the parent CM has already initialized this component
- if (components.containsKey( role ) == false) {
- try {
- if (component instanceof Recomposable) {
- ((Recomposable) component).recompose(this);
- }
- ((RequestLifecycleComponent)
component).setup((org.apache.cocoon.environment.SourceResolver)objects[0],
- (Map)objects[1]);
- if (component instanceof SitemapConfigurable) {
- for(int i=0; i < stack.size(); i++) {
- Object[] o = (Object[])stack.get(i);
- Configuration parent = (Configuration)o[5];
- if ( null != parent ) {
+ final Map objectModel = ((Environment)objects[0]).getObjectModel();
+ EnvironmentDescription desc = getDescription(objectModel);
+ if ( null != desc ) {
+
+ // first test if the parent CM has already initialized this
component
+ if ( !desc.containsRequestLifecycleComponent( role ) ) {
+ try {
+ if (component instanceof Recomposable) {
+ ((Recomposable) component).recompose(this);
+ }
+ ((RequestLifecycleComponent)
component).setup((org.apache.cocoon.environment.SourceResolver)objects[0],
+
(Map)objects[1]);
+ if (component instanceof SitemapConfigurable) {
+ List configs = desc.getSitemapConfigurations();
+ for(int i=0; i < configs.size(); i++) {
+ Configuration parent =
(Configuration)configs.get(i);
Configuration cc = parent.getChild( role, false );
if ( null != cc ) {
((SitemapConfigurable)
component).setSitemapConfiguration(cc);
@@ -330,11 +287,11 @@
}
}
}
+ } catch (Exception local) {
+ throw new ComponentException("Exception during setup of
RequestLifecycleComponent with role '"+role+"'", local);
}
- } catch (Exception local) {
- throw new ComponentException("Exception during setup of
RequestLifecycleComponent with role '"+role+"'", local);
+ desc.addRequestLifecycleComponent(role, component, this);
}
- components.put(role, new Object[] {component, this});
}
}
return component;
@@ -368,8 +325,11 @@
final Stack stack = (Stack)environmentStack.get();
if ( null != stack && !stack.empty()) {
final Object[] objects = (Object[])stack.firstElement();
- final List automaticReleasedComponents = (List)objects[6];
- automaticReleasedComponents.add(new Object[] {component, selector,
manager});
+ final Map objectModel = ((Environment)objects[0]).getObjectModel();
+ EnvironmentDescription desc = getDescription(objectModel);
+ if ( null != desc ) {
+ desc.addToAutoRelease(selector, component, manager);
+ }
} else {
throw new ProcessingException("Unable to add component for automatic
release: no environment available.");
}
@@ -384,8 +344,11 @@
final Stack stack = (Stack)environmentStack.get();
if ( null != stack && !stack.empty()) {
final Object[] objects = (Object[])stack.firstElement();
- final List automaticReleasedComponents = (List)objects[6];
- automaticReleasedComponents.add(new Object[] {component, manager});
+ final Map objectModel = ((Environment)objects[0]).getObjectModel();
+ EnvironmentDescription desc = getDescription(objectModel);
+ if ( null != desc ) {
+ desc.addToAutoRelease(manager, component);
+ }
} else {
throw new ProcessingException("Unable to add component for automatic
release: no environment available.");
}
@@ -399,28 +362,10 @@
final Stack stack = (Stack)environmentStack.get();
if ( null != stack && !stack.empty()) {
final Object[] objects = (Object[])stack.firstElement();
- final List automaticReleasedComponents = (List)objects[6];
- int i = 0;
- boolean found = false;
- while (i < automaticReleasedComponents.size() && !found) {
- final Object[] o = (Object[])automaticReleasedComponents.get(i);
- if (o[0] == component) {
- found = true;
- if (o[1] instanceof ComponentManager) {
- ((ComponentManager)o[1]).release( component );
- } else {
- ((ComponentSelector)o[1]).release( component );
- if (o[2] != null) {
- ((ComponentManager)o[2]).release( (Component)o[1] );
- }
- }
- automaticReleasedComponents.remove(i);
- } else {
- i++;
- }
- }
- if (!found) {
- throw new ProcessingException("Unable to remove component from
automatic release: component not found.");
+ final Map objectModel = ((Environment)objects[0]).getObjectModel();
+ EnvironmentDescription desc = getDescription(objectModel);
+ if ( null != desc ) {
+ desc.removeFromAutoRelease(component);
}
} else {
throw new ProcessingException("Unable to remove component from
automatic release: no environment available.");
@@ -469,6 +414,18 @@
public void release( final Source source ) {
this.sourceResolver.release( source );
}
+
+ private static EnvironmentDescription getDescription(Map objectModel) {
+ Object processKey = objectModel.get(PROCESS_KEY);
+ if ( null != processKey) {
+ Map processes = (Map)CocoonComponentManager.processList.get();
+ if ( null != processes) {
+ return (EnvironmentDescription)processes.get(processKey);
+ }
+ }
+ return null;
+ }
+
}
final class EnvironmentDescription {
@@ -477,13 +434,14 @@
Map objectModel;
Map requestLifecycleComponents = new HashMap(5);
List autoreleaseComponents = new ArrayList(2);
+ List sitemapConfigurations = new ArrayList(4);
/**
* Constructor
*/
- EnvironmentDescription(Environment env, Map objectModel) {
+ EnvironmentDescription(Environment env) {
this.environment = env;
- this.objectModel = objectModel;
+ this.objectModel = env.getObjectModel();
}
/**
@@ -522,6 +480,10 @@
this.requestLifecycleComponents.put(role, new Object[] {co, manager});
}
+ boolean containsRequestLifecycleComponent(final String role) {
+ return this.requestLifecycleComponents.containsKey( role );
+ }
+
/**
* Search a RequestLifecycleComponent
*/
@@ -536,24 +498,24 @@
/**
* Add an automatically released component
*/
- public void addToAutoRelease(final ComponentSelector selector,
- final Component component,
- final ComponentManager manager) {
+ void addToAutoRelease(final ComponentSelector selector,
+ final Component component,
+ final ComponentManager manager) {
this.autoreleaseComponents.add(new Object[] {component, selector, manager});
}
/**
* Add an automatically released component
*/
- public void addToAutoRelease(final ComponentManager manager,
- final Component component) {
+ void addToAutoRelease(final ComponentManager manager,
+ final Component component) {
this.autoreleaseComponents.add(new Object[] {component, manager});
}
/**
* Remove from automatically released components
*/
- public void removeFromAutoRelease(final Component component)
+ void removeFromAutoRelease(final Component component)
throws ProcessingException {
int i = 0;
boolean found = false;
@@ -579,4 +541,14 @@
}
}
+ void addSitemapConfiguration(Configuration conf) {
+ if (conf != null) {
+ this.sitemapConfigurations.add(conf);
+ }
+ }
+
+ List getSitemapConfigurations() {
+ return this.sitemapConfigurations;
+ }
+
}
----------------------------------------------------------------------
In case of troubles, e-mail: [EMAIL PROTECTED]
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]