001: /*
002: * Licensed to the Apache Software Foundation (ASF) under one or more
003: * contributor license agreements. See the NOTICE file distributed with
004: * this work for additional information regarding copyright ownership.
005: * The ASF licenses this file to You under the Apache License, Version 2.0
006: * (the "License"); you may not use this file except in compliance with
007: * the License. You may obtain a copy of the License at
008: *
009: * http://www.apache.org/licenses/LICENSE-2.0
010: *
011: * Unless required by applicable law or agreed to in writing, software
012: * distributed under the License is distributed on an "AS IS" BASIS,
013: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014: * See the License for the specific language governing permissions and
015: * limitations under the License.
016: */
017: package org.apache.cocoon.samples.parentcm;
018:
019: import org.apache.avalon.excalibur.component.ExcaliburComponentManager;
020: import org.apache.avalon.excalibur.naming.memory.MemoryInitialContextFactory;
021: import org.apache.avalon.framework.activity.Initializable;
022: import org.apache.avalon.framework.component.Component;
023: import org.apache.avalon.framework.component.ComponentException;
024: import org.apache.avalon.framework.component.ComponentManager;
025: import org.apache.avalon.framework.configuration.Configuration;
026: import org.apache.avalon.framework.context.DefaultContext;
027: import org.apache.avalon.framework.logger.LogEnabled;
028: import org.apache.avalon.framework.logger.Logger;
029:
030: import javax.naming.Context;
031: import java.util.Hashtable;
032:
033: /**
034: * A sample parent component manager. This manager will lookup the configuration object
035: * given by the initialization parameter in JNDI, use it to configure an ExcaliburComponentManager
036: * and delegate any requests to it.
037: *
038: * @author <a href="mailto:leo.sutic@inspireinfrastructure.com">Leo Sutic</a>
039: * @version CVS $Id: ParentComponentManager.java 433543 2006-08-22 06:22:54Z crossley $
040: */
041: public class ParentComponentManager implements ComponentManager,
042: LogEnabled, Initializable {
043:
044: /**
045: * Our logger.
046: */
047: private Logger logger;
048:
049: /**
050: * The JNDI name where the component manager configuration can be found.
051: */
052: private final String jndiName;
053:
054: /**
055: * The delegate that will be configured and provide the
056: * functionality for this component manager.
057: */
058: private final ExcaliburComponentManager delegate;
059:
060: public ParentComponentManager(final String jndiName) {
061: this .jndiName = jndiName;
062:
063: // Initialize it here so we can let it be final.
064: this .delegate = new ExcaliburComponentManager();
065: }
066:
067: public boolean hasComponent(final String role) {
068: return delegate.hasComponent(role);
069: }
070:
071: /**
072: * Initializes the CM by looking up the configuration object and using it to
073: * configure the delegate.
074: */
075: public void initialize() throws Exception {
076: this .logger
077: .debug("Looking up component manager configuration at : "
078: + this .jndiName);
079:
080: Hashtable environment = new Hashtable();
081: environment.put(Context.INITIAL_CONTEXT_FACTORY,
082: MemoryInitialContextFactory.class.getName());
083:
084: //
085: // Yes, this is cheating, but the Excalibur in-memory naming provider
086: // is transient. That is, it doesn't store objects persistently and
087: // is more like a HashMap.
088: //
089: // Should be:
090: // Context initialContext = new InitialContext(environment);
091: //
092: Context initialContext = Configurator.initialContext;
093:
094: Configuration config = (Configuration) initialContext
095: .lookup(this .jndiName);
096:
097: // We ignore the setRoleManager call, as ExcaliburComponentManager handles that
098: // in configure().
099: this .delegate.enableLogging(logger);
100: this .delegate.contextualize(new DefaultContext());
101: this .delegate.configure(config);
102: this .delegate.initialize();
103:
104: this .logger
105: .debug("Component manager successfully initialized.");
106: }
107:
108: public Component lookup(final String role)
109: throws ComponentException {
110: return this .delegate.lookup(role);
111: }
112:
113: public void release(final Component component) {
114: this .delegate.release(component);
115: }
116:
117: /**
118: * Provide component with a logger.
119: *
120: * @param logger the logger
121: */
122: public void enableLogging(Logger logger) {
123: this.logger = logger;
124: }
125: }
|