001: /* ====================================================================
002: * The Jcorporate Apache Style Software License, Version 1.2 05-07-2002
003: *
004: * Copyright (c) 1995-2003 Jcorporate Ltd. All rights reserved.
005: *
006: * Redistribution and use in source and binary forms, with or without
007: * modification, are permitted provided that the following conditions
008: * are met:
009: *
010: * 1. Redistributions of source code must retain the above copyright
011: * notice, this list of conditions and the following disclaimer.
012: *
013: * 2. Redistributions in binary form must reproduce the above copyright
014: * notice, this list of conditions and the following disclaimer in
015: * the documentation and/or other materials provided with the
016: * distribution.
017: *
018: * 3. The end-user documentation included with the redistribution,
019: * if any, must include the following acknowledgment:
020: * "This product includes software developed by Jcorporate Ltd.
021: * (http://www.jcorporate.com/)."
022: * Alternately, this acknowledgment may appear in the software itself,
023: * if and wherever such third-party acknowledgments normally appear.
024: *
025: * 4. "Jcorporate" and product names such as "Expresso" must
026: * not be used to endorse or promote products derived from this
027: * software without prior written permission. For written permission,
028: * please contact info@jcorporate.com.
029: *
030: * 5. Products derived from this software may not be called "Expresso",
031: * or other Jcorporate product names; nor may "Expresso" or other
032: * Jcorporate product names appear in their name, without prior
033: * written permission of Jcorporate Ltd.
034: *
035: * 6. No product derived from this software may compete in the same
036: * market space, i.e. framework, without prior written permission
037: * of Jcorporate Ltd. For written permission, please contact
038: * partners@jcorporate.com.
039: *
040: * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
041: * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
042: * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
043: * DISCLAIMED. IN NO EVENT SHALL JCORPORATE LTD OR ITS CONTRIBUTORS
044: * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
045: * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
046: * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
047: * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
048: * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
049: * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
050: * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
051: * SUCH DAMAGE.
052: * ====================================================================
053: *
054: * This software consists of voluntary contributions made by many
055: * individuals on behalf of the Jcorporate Ltd. Contributions back
056: * to the project(s) are encouraged when you make modifications.
057: * Please send them to support@jcorporate.com. For more information
058: * on Jcorporate Ltd. and its products, please see
059: * <http://www.jcorporate.com/>.
060: *
061: * Portions of this software are based upon other open source
062: * products and are subject to their respective licenses.
063: */
064: package com.jcorporate.expresso.kernel.internal;
065:
066: import com.jcorporate.expresso.kernel.ComponentContainer;
067: import com.jcorporate.expresso.kernel.Containable;
068: import com.jcorporate.expresso.kernel.ExpressoComponent;
069: import com.jcorporate.expresso.kernel.InstallLog;
070: import com.jcorporate.expresso.kernel.InstallationOptions;
071:
072: import java.util.Map;
073:
074: /**
075: * This class provides a basic implementation of the ComponentContainer interface.
076: * the majority of the information such as how container references are stored are implemented
077: * by the subclass
078: *
079: * @author Michael Rimov
080: * @version $Revision: 1.6 $ on $Date: 2004/11/17 20:48:16 $
081: * @since Expresso 5.1
082: */
083:
084: abstract public class ContainerImplBase implements ComponentContainer {
085: ComponentContainer parent;
086: Containable nested;
087:
088: public ContainerImplBase() {
089: parent = null;
090: nested = null;
091: }
092:
093: /**
094: * Locates an Expresso Service for use by a client.
095: *
096: * @param componentName the name of the service to locate.
097: * @return ExpressoService.
098: * @throws IllegalArgumentException if the service cannot be found.
099: * @throws IllegalStateException if the service exists, but is not in a
100: * 'runnable' state due to some configuration error or other unforeseen
101: * issue.
102: */
103: abstract public ExpressoComponent locateComponent(
104: String componentName);
105:
106: /**
107: * Query the container to see if a particular service name is installed
108: * in the system
109: *
110: * @param componentName the name of the component to query for.
111: * @return true if the service is installed and running.
112: */
113: abstract public boolean isComponentExists(String componentName);
114:
115: /**
116: * To register the component for control by the Component Manager. This will
117: * in essense transfer the control of ther service to the Component Manager.
118: * This will often be called by the Configuration Bootstrap system.
119: *
120: * @param newComponent the component to install
121: */
122: abstract public void addComponent(ExpressoComponent newComponent);
123:
124: /**
125: * Removes a component from this container.
126: *
127: * @param componentName The name of the component to remove.
128: */
129: abstract public void removeComponent(String componentName);
130:
131: /**
132: * Install a component into the system. If newComponent implements <code>
133: * installable</code> then it shall be installed. After that, the component
134: * is added.
135: *
136: * @param newComponent An instance of the component to install.
137: * @param log a Logger-like interface to a component tha records the process
138: * of the installation including any errors, etc.
139: * @param installOptions the installation options
140: */
141: abstract public void installComponent(
142: ExpressoComponent newComponent,
143: InstallationOptions installOptions, InstallLog log);
144:
145: /**
146: * Uninstalls the component. If the component implements <code>
147: * installable</code> then it shall be uninstalled. After that, it shall
148: * be removed.
149: *
150: * @param componentName the name of the component to uninstall
151: * @param log a Logger-like interface to a component tha records the process
152: * of the installation including any errors, etc.
153: * @param installOptions the Installation Options bean
154: */
155: abstract public void uninstallComponent(String componentName,
156: InstallationOptions installOptions, InstallLog log);
157:
158: /**
159: * Retrieves a list of instances of all contained ExpressoComponents. Use
160: * this for iterating through the components of a current 'context'. Do not
161: * attempt to modify the map given. Either add or remove a component through
162: * the addComponent or removeComponent methods.
163: *
164: * @return Read only map of the components.
165: */
166: abstract public Map getChildComponents();
167:
168: public void destroyContainer() {
169:
170: }
171:
172: /**
173: * Return the 'wrapped' container ExpressoComponent.
174: *
175: * @return <code>Containable</code>
176: */
177: public Containable getContainerComponent() {
178: return nested;
179: }
180:
181: /**
182: * Sets the nested component. This is usually called by the system
183: * factory.
184: *
185: * @param newComponent the component that is the 'container' for this implementation
186: */
187: public void setContainerComponent(Containable newComponent) {
188: nested = newComponent;
189: }
190:
191: /**
192: * Return the parent container
193: *
194: * @return ContainerImpl interface
195: */
196: public ComponentContainer getParentContainer() {
197: return parent;
198: }
199:
200: /**
201: * Set the parent container of this container
202: *
203: * @param newParent the new Parent Container
204: */
205: public void setParentContainer(ComponentContainer newParent) {
206: parent = newParent;
207: }
208:
209: }
|