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    
018    package org.apache.geronimo.kernel.config;
019    
020    import java.io.File;
021    import java.io.Serializable;
022    import java.util.ArrayList;
023    import java.util.Collections;
024    import java.util.LinkedHashMap;
025    import java.util.LinkedHashSet;
026    import java.util.List;
027    import java.util.Map;
028    import java.util.Set;
029    
030    import org.apache.geronimo.gbean.GBeanData;
031    import org.apache.geronimo.gbean.GBeanInfo;
032    import org.apache.geronimo.kernel.Naming;
033    import org.apache.geronimo.kernel.repository.Artifact;
034    import org.apache.geronimo.kernel.repository.Environment;
035    
036    /**
037     * @version $Rev: 706640 $ $Date: 2008-10-21 14:44:05 +0000 (Tue, 21 Oct 2008) $
038     */
039    public class ConfigurationData implements Serializable {
040        private static final long serialVersionUID = 4324193220056650732L;
041    
042        /**
043         * The time at which this configuration was created.
044         */
045        private final long created = System.currentTimeMillis();
046    
047        /**
048         * Identifies the type of configuration (WAR, RAR et cetera)
049         */
050        private final ConfigurationModuleType moduleType;
051    
052        /**
053         * Defines the configuration id, parent configurations, and classpath
054         */
055        private final Environment environment;
056    
057        /**
058         * List of URIs in this configuration's classpath.  These are for the classes directly included in the configuration
059         */
060        private final LinkedHashSet<String> classPath = new LinkedHashSet<String>();
061    
062        /**
063         * The gbeans contained in this configuration
064         */
065        private final GBeanState gbeanState;
066    
067        /**
068         * Child configurations of this configuration
069         */
070        private final Map<String, ConfigurationData> childConfigurations = new LinkedHashMap<String, ConfigurationData>();
071    
072        /**
073         * Configurations owned by this configuration.  This is only used for cascade-uninstall.
074         */
075        private final Set<Artifact> ownedConfigurations = new LinkedHashSet<Artifact>();
076    
077        /**
078         * The base file of the configuation
079         */
080        private transient File configurationDir;
081    
082        /**
083         * The base file of an in-place configuration
084         */
085        private File inPlaceConfigurationDir;
086    
087        /**
088         * Should this configuraiton be autoStarted
089         */
090        private boolean autoStart = true;
091    
092        /**
093         * The naming system
094         */
095        private transient Naming naming;
096    
097        /**
098         * The configuration store from which this configuration was loaded, or null if it was not loaded from a configuration store.
099         */
100        private transient ConfigurationStore configurationStore;
101    
102        public ConfigurationData(Artifact configId, Naming naming, GBeanState gbeanState) {
103            this(new Environment(configId), naming, gbeanState);
104        }
105    
106        public ConfigurationData(Environment environment, Naming naming, GBeanState gbeanState) {
107            if (environment == null) throw new NullPointerException("environment is null");
108            if (environment.getConfigId() == null) throw new NullPointerException("environment.configId is null");
109            if (naming == null) throw new NullPointerException("naming is null");
110    
111            this.environment = environment;
112            this.naming = naming;
113            this.gbeanState = gbeanState;
114    
115            this.moduleType = ConfigurationModuleType.CAR;
116        }
117    
118        public ConfigurationData(Artifact configId, Naming naming) {
119            this(new Environment(configId), naming);
120        }
121    
122        public ConfigurationData(Environment environment, Naming naming) {
123            this(null, null, null, null, environment, null, null, naming);
124        }
125    
126        public ConfigurationData(ConfigurationModuleType moduleType, LinkedHashSet<String> classPath, List<GBeanData> gbeans, Map<String, ConfigurationData> childConfigurations, Environment environment, File configurationDir, File inPlaceConfigurationDir, Naming naming) {
127            if (naming == null) throw new NullPointerException("naming is null");
128            this.naming = naming;
129            if (moduleType != null) {
130                this.moduleType = moduleType;
131            } else {
132                this.moduleType = ConfigurationModuleType.CAR;
133            }
134            if (classPath != null) {
135                this.classPath.addAll(classPath);
136            }
137            gbeanState = ConfigurationUtil.newGBeanState(gbeans);
138            if (childConfigurations != null) {
139                this.childConfigurations.putAll(childConfigurations);
140            }
141    
142            if (environment == null) throw new NullPointerException("environment is null");
143            if (environment.getConfigId() == null) throw new NullPointerException("environment.configId is null");
144            this.environment = environment;
145            this.configurationDir = configurationDir;
146            this.inPlaceConfigurationDir = inPlaceConfigurationDir;
147        }
148    
149        public Artifact getId() {
150            return environment.getConfigId();
151        }
152    
153        /**
154         * Gets the time at which this configuration was created (or deployed).
155         *
156         * @return the time at which this configuration was created (or deployed)
157         */
158        public long getCreated() {
159            return created;
160        }
161    
162        public ConfigurationModuleType getModuleType() {
163            return moduleType;
164        }
165    
166        public List getClassPath() {
167            return Collections.unmodifiableList(new ArrayList(classPath));
168        }
169    
170        public List getGBeans(ClassLoader classLoader) throws InvalidConfigException {
171            if (classLoader == null) throw new NullPointerException("classLoader is null");
172            return gbeanState.getGBeans(classLoader);
173        }
174    
175        public void addGBean(GBeanData gbeanData) {
176            if (gbeanData == null) throw new NullPointerException("gbeanData is null");
177            gbeanState.addGBean(gbeanData);
178        }
179    
180        public GBeanData addGBean(String name, GBeanInfo gbeanInfo) {
181            if (name == null) throw new NullPointerException("name is null");
182            if (gbeanInfo == null) throw new NullPointerException("gbeanInfo is null");
183            return gbeanState.addGBean(name, gbeanInfo, naming, environment);
184        }
185    
186        public GBeanState getGbeanState() {
187            return gbeanState;
188        }
189    
190        /**
191         * Gets a map of module name to ConfigurationData for nested
192         * configurations (as in, a WAR within an EAR, not dependencies between
193         * totally separate configurations).
194         */
195        public Map<String, ConfigurationData> getChildConfigurations() {
196            return Collections.unmodifiableMap(childConfigurations);
197        }
198    
199        public void addChildConfiguration(String moduleName, ConfigurationData configurationData) {
200            if (configurationData == null) throw new NullPointerException("configurationData is null");
201            childConfigurations.put(moduleName, configurationData);
202        }
203    
204        /**
205         * Gets the configurations owned by this configuration.  This is only used
206         * for cascade-uninstall.
207         *
208         * @return the configurations owned by this configuration
209         */
210        public Set<Artifact> getOwnedConfigurations() {
211            return Collections.unmodifiableSet(ownedConfigurations);
212        }
213    
214        public void addOwnedConfigurations(Artifact id) {
215            if (id == null) throw new NullPointerException("id is null");
216            if (!id.isResolved()) throw new IllegalArgumentException("id is not resolved: " + id);
217            ownedConfigurations.add(id);
218        }
219    
220        public Environment getEnvironment() {
221            return environment;
222        }
223    
224        public File getInPlaceConfigurationDir() {
225            return inPlaceConfigurationDir;
226        }
227    
228        public File getConfigurationDir() {
229            return configurationDir;
230        }
231    
232        public void setConfigurationDir(File configurationDir) {
233            if (configurationDir == null) throw new NullPointerException("configurationDir is null");
234            this.configurationDir = configurationDir;
235        }
236    
237        public Naming getNaming() {
238            return naming;
239        }
240    
241        public void setNaming(Naming naming) {
242            this.naming = naming;
243        }
244    
245        public boolean isAutoStart() {
246            return autoStart;
247        }
248    
249        public void setAutoStart(boolean autoStart) {
250            this.autoStart = autoStart;
251        }
252    
253        public ConfigurationStore getConfigurationStore() {
254            return configurationStore;
255        }
256    
257        public void setConfigurationStore(ConfigurationStore configurationStore) {
258            if (configurationStore == null) throw new NullPointerException("configurationStore is null");
259            this.configurationStore = configurationStore;
260        }
261    }