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.geronimo.kernel.config;
018    
019    import java.util.Iterator;
020    import java.util.LinkedHashSet;
021    import java.util.Map;
022    import java.util.Set;
023    import java.util.TreeMap;
024    import java.util.List;
025    import java.util.ArrayList;
026    
027    import org.apache.geronimo.kernel.repository.Artifact;
028    
029    /**
030     * @version $Rev: 706640 $ $Date: 2008-10-21 14:44:05 +0000 (Tue, 21 Oct 2008) $
031     */
032    public class ConfigurationModel {
033        private final Map configurations = new TreeMap();
034    
035        public void addConfiguation(Artifact configurationId, Set loadParentIds, Set startParentIds) throws NoSuchConfigException {
036            Set startParents = getStatuses(startParentIds);
037    
038            // load parents are a superset of start parents
039            Set loadParents = new LinkedHashSet(startParents);
040            loadParents.addAll(getStatuses(loadParentIds));
041    
042            ConfigurationStatus configurationStatus = new ConfigurationStatus(configurationId, loadParents, startParents);
043            configurations.put(configurationId, configurationStatus);
044        }
045    
046        private Set getStatuses(Set configurationIds) throws NoSuchConfigException {
047            LinkedHashSet statuses = new LinkedHashSet(configurationIds.size());
048            for (Iterator iterator = configurationIds.iterator(); iterator.hasNext();) {
049                Artifact configurationId = (Artifact) iterator.next();
050                ConfigurationStatus configurationStatus = (ConfigurationStatus) configurations.get(configurationId);
051                if (configurationStatus == null) {
052                    throw new NoSuchConfigException(configurationId);
053                }
054    
055                statuses.add(configurationStatus);
056            }
057            return statuses;
058        }
059    
060        public void removeConfiguration(Artifact configurationId) throws NoSuchConfigException {
061            ConfigurationStatus configurationStatus = (ConfigurationStatus) configurations.get(configurationId);
062            if (configurationStatus == null) {
063                throw new NoSuchConfigException(configurationId);
064            }
065            configurationStatus.destroy();
066            configurations.remove(configurationId);
067        }
068    
069        public boolean containsConfiguration(Artifact configurationId) {
070            return configurations.containsKey(configurationId);
071        }
072    
073        public void upgradeConfiguration(Artifact existingId, Artifact newId, Set newLoadParentIds, Set newStartParentIds) throws NoSuchConfigException {
074            Set newStartParents = getStatuses(newStartParentIds);
075    
076            // load parents are a superset of start parents
077            Set newLoadParents = new LinkedHashSet(newStartParents);
078            newLoadParents.addAll(getStatuses(newLoadParentIds));
079    
080            ConfigurationStatus configurationStatus = (ConfigurationStatus) configurations.remove(existingId);
081            if (configurationStatus == null) {
082                throw new NoSuchConfigException(existingId);
083            }
084            configurations.put(newId, configurationStatus);
085            configurationStatus.upgrade(newId, newLoadParents, newStartParents);
086        }
087    
088        public boolean isLoaded(Artifact configurationId) {
089            ConfigurationStatus configurationStatus = (ConfigurationStatus) configurations.get(configurationId);
090            if (configurationStatus != null) {
091                return configurationStatus.isLoaded();
092            }
093            return false;
094        }
095    
096        public Artifact[] getLoaded(Artifact query) {
097            List results = new ArrayList();
098            for (Iterator it = configurations.entrySet().iterator(); it.hasNext();) {
099                Map.Entry entry = (Map.Entry) it.next();
100                Artifact test = (Artifact) entry.getKey();
101                ConfigurationStatus status = (ConfigurationStatus) entry.getValue();
102                if(query.matches(test) && status.isLoaded()) {
103                    results.add(test);
104                }
105            }
106            return (Artifact[]) results.toArray(new Artifact[results.size()]);
107        }
108    
109        public boolean isStarted(Artifact configurationId) {
110            ConfigurationStatus configurationStatus = (ConfigurationStatus) configurations.get(configurationId);
111            if (configurationStatus != null) {
112                return configurationStatus.isStarted();
113            }
114            return false;
115        }
116    
117        public Artifact[] getStarted(Artifact query) {
118            List results = new ArrayList();
119            for (Iterator it = configurations.entrySet().iterator(); it.hasNext();) {
120                Map.Entry entry = (Map.Entry) it.next();
121                Artifact test = (Artifact) entry.getKey();
122                ConfigurationStatus status = (ConfigurationStatus) entry.getValue();
123                if(query.matches(test) && status.isStarted()) {
124                    results.add(test);
125                }
126            }
127            return (Artifact[]) results.toArray(new Artifact[results.size()]);
128        }
129    
130        public LinkedHashSet load(Artifact configurationId) throws NoSuchConfigException {
131            ConfigurationStatus configurationStatus = (ConfigurationStatus) configurations.get(configurationId);
132            if (configurationStatus == null) {
133                throw new NoSuchConfigException(configurationId);
134            }
135            return configurationStatus.load();
136        }
137    
138        public LinkedHashSet start(Artifact configurationId) throws NoSuchConfigException {
139            ConfigurationStatus configurationStatus = (ConfigurationStatus) configurations.get(configurationId);
140            if (configurationStatus == null) {
141                throw new NoSuchConfigException(configurationId);
142            }
143            return configurationStatus.start();
144        }
145    
146        public LinkedHashSet stop(Artifact configurationId) throws NoSuchConfigException {
147            return stop(configurationId, true);
148        }
149    
150        public LinkedHashSet stop(Artifact configurationId, boolean gc) throws NoSuchConfigException {
151            ConfigurationStatus configurationStatus = (ConfigurationStatus) configurations.get(configurationId);
152            if (configurationStatus == null) {
153                throw new NoSuchConfigException(configurationId);
154            }
155            return configurationStatus.stop(gc);
156        }
157    
158        public LinkedHashSet restart(Artifact configurationId) throws NoSuchConfigException {
159            ConfigurationStatus configurationStatus = (ConfigurationStatus) configurations.get(configurationId);
160            if (configurationStatus == null) {
161                throw new NoSuchConfigException(configurationId);
162            }
163            return configurationStatus.restart();
164        }
165    
166        public LinkedHashSet unload(Artifact configurationId) throws NoSuchConfigException {
167            return unload(configurationId, true);
168        }
169    
170        public LinkedHashSet unload(Artifact configurationId, boolean gc) throws NoSuchConfigException {
171            ConfigurationStatus configurationStatus = (ConfigurationStatus) configurations.get(configurationId);
172            if (configurationStatus == null) {
173                throw new NoSuchConfigException(configurationId);
174            }
175            return configurationStatus.unload(gc);
176        }
177    
178        public LinkedHashSet reload(Artifact existingConfigurationId) throws NoSuchConfigException {
179            ConfigurationStatus configurationStatus = (ConfigurationStatus) configurations.get(existingConfigurationId);
180            if (configurationStatus == null) {
181                return new LinkedHashSet();
182            }
183            return configurationStatus.reload();
184        }
185    
186        public Set getLoaded() {
187            Set result = new LinkedHashSet();
188            for (Iterator iterator = configurations.values().iterator(); iterator.hasNext();) {
189                ConfigurationStatus status = (ConfigurationStatus) iterator.next();
190                if (status.isLoaded()) {
191                    result.add(status.getConfigurationId());
192                }
193            }
194            return result;
195        }
196    
197        public Set getStarted() {
198            Set result = new LinkedHashSet();
199            for (Iterator iterator = configurations.values().iterator(); iterator.hasNext();) {
200                ConfigurationStatus status = (ConfigurationStatus) iterator.next();
201                if (status.isStarted()) {
202                    result.add(status.getConfigurationId());
203                }
204            }
205            return result;
206        }
207    
208        public Set getUserLoaded() {
209            Set result = new LinkedHashSet();
210            for (Iterator iterator = configurations.values().iterator(); iterator.hasNext();) {
211                ConfigurationStatus status = (ConfigurationStatus) iterator.next();
212                if (status.isUserLoaded()) {
213                    result.add(status.getConfigurationId());
214                }
215            }
216            return result;
217        }
218    
219        public Set getUserStarted() {
220            Set result = new LinkedHashSet();
221            for (Iterator iterator = configurations.values().iterator(); iterator.hasNext();) {
222                ConfigurationStatus status = (ConfigurationStatus) iterator.next();
223                if (status.isUserStarted()) {
224                    result.add(status.getConfigurationId());
225                }
226            }
227            return result;
228        }
229        
230        public LinkedHashSet getStartedChildren(Artifact configurationId) {
231            ConfigurationStatus configurationStatus = (ConfigurationStatus) configurations.get(configurationId);
232            if (configurationStatus == null) {
233                return new LinkedHashSet();
234            }
235            return configurationStatus.getStartedChildren();
236        }
237    }