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.deployment.plugin.jmx;
018    
019    import java.io.File;
020    import java.io.InputStream;
021    import java.util.ArrayList;
022    import java.util.Collection;
023    import java.util.List;
024    import java.util.Locale;
025    
026    import javax.enterprise.deploy.model.DeployableObject;
027    import javax.enterprise.deploy.shared.DConfigBeanVersionType;
028    import javax.enterprise.deploy.shared.ModuleType;
029    import javax.enterprise.deploy.spi.DeploymentConfiguration;
030    import javax.enterprise.deploy.spi.DeploymentManager;
031    import javax.enterprise.deploy.spi.Target;
032    import javax.enterprise.deploy.spi.TargetModuleID;
033    import javax.enterprise.deploy.spi.exceptions.DConfigBeanVersionUnsupportedException;
034    import javax.enterprise.deploy.spi.exceptions.InvalidModuleException;
035    import javax.enterprise.deploy.spi.exceptions.TargetException;
036    import javax.enterprise.deploy.spi.status.ProgressObject;
037    
038    import org.apache.geronimo.deployment.ModuleConfigurer;
039    import org.apache.geronimo.deployment.plugin.TargetImpl;
040    import org.apache.geronimo.deployment.plugin.TargetModuleIDImpl;
041    import org.apache.geronimo.deployment.plugin.local.CommandSupport;
042    import org.apache.geronimo.deployment.plugin.local.DistributeCommand;
043    import org.apache.geronimo.deployment.plugin.local.RedeployCommand;
044    import org.apache.geronimo.deployment.plugin.local.StartCommand;
045    import org.apache.geronimo.deployment.plugin.local.StopCommand;
046    import org.apache.geronimo.deployment.plugin.local.UndeployCommand;
047    import org.apache.geronimo.gbean.AbstractName;
048    import org.apache.geronimo.kernel.Kernel;
049    import org.apache.geronimo.kernel.config.ConfigurationInfo;
050    import org.apache.geronimo.kernel.config.ConfigurationManager;
051    import org.apache.geronimo.kernel.config.ConfigurationModuleType;
052    import org.apache.geronimo.kernel.config.ConfigurationUtil;
053    import org.apache.geronimo.kernel.management.State;
054    
055    
056    /**
057     * @version $Rev: 706640 $ $Date: 2008-10-21 14:44:05 +0000 (Tue, 21 Oct 2008) $
058     */
059    public abstract class JMXDeploymentManager implements DeploymentManager {
060    
061        protected Kernel kernel;
062        private ConfigurationManager configurationManager;
063        protected CommandContext commandContext;
064        private final Collection<ModuleConfigurer> moduleConfigurers;
065    
066        public JMXDeploymentManager(Collection<ModuleConfigurer> moduleConfigurers) {
067            if (null == moduleConfigurers) {
068                throw new IllegalArgumentException("moduleConfigurers is required");
069            }
070            this.moduleConfigurers = moduleConfigurers;
071        }
072        
073        protected void initialize(Kernel kernel) {
074            this.kernel = kernel;
075            configurationManager = ConfigurationUtil.getConfigurationManager(kernel);
076            commandContext = new CommandContext(true, true, null, null, false);
077        }
078    
079        public void setAuthentication(String username, String password) {
080            commandContext.setUsername(username);
081            commandContext.setPassword(password);
082        }
083    
084        public void release() {
085            if(kernel != null && configurationManager != null) {
086                try {
087                    ConfigurationUtil.releaseConfigurationManager(kernel, configurationManager);
088                } finally {
089                    configurationManager = null;
090                    kernel = null;
091                }
092            }
093        }
094    
095        public Target[] getTargets() {
096            if (kernel == null) {
097                throw new IllegalStateException("Disconnected");
098            }
099            List stores = configurationManager.listStores();
100            if (stores.isEmpty()) {
101                return null;
102            }
103    
104            Target[] targets = new Target[stores.size()];
105            for (int i = 0; i < stores.size(); i++) {
106                AbstractName storeName = (AbstractName) stores.get(i);
107                targets[i] = new TargetImpl(storeName, null);
108            }
109            return targets;
110        }
111    
112        public TargetModuleID[] getAvailableModules(final ModuleType moduleType, Target[] targetList) throws TargetException {
113            ConfigFilter filter = new ConfigFilter() {
114                public boolean accept(ConfigurationInfo info) {
115                    return moduleType == null || info.getType() == ConfigurationModuleType.getFromValue(moduleType.getValue());
116                }
117            };
118            return getModules(targetList, filter);
119        }
120    
121        public TargetModuleID[] getNonRunningModules(final ModuleType moduleType, Target[] targetList) throws TargetException {
122            ConfigFilter filter = new ConfigFilter() {
123                public boolean accept(ConfigurationInfo info) {
124                    return info.getState() != State.RUNNING && (moduleType == null || info.getType() == ConfigurationModuleType.getFromValue(moduleType.getValue()));
125                }
126            };
127            return getModules(targetList, filter);
128        }
129    
130        public TargetModuleID[] getRunningModules(final ModuleType moduleType, Target[] targetList) throws TargetException {
131            ConfigFilter filter = new ConfigFilter() {
132                public boolean accept(ConfigurationInfo info) {
133                    return info.getState() == State.RUNNING && (moduleType == null || info.getType() == ConfigurationModuleType.getFromValue(moduleType.getValue()));
134                }
135            };
136            return getModules(targetList, filter);
137        }
138    
139        private static interface ConfigFilter {
140            boolean accept(ConfigurationInfo info);
141        }
142    
143        private TargetModuleID[] getModules(Target[] targetList, ConfigFilter filter) throws TargetException {
144            if (kernel == null) {
145                throw new IllegalStateException("Disconnected");
146            }
147    
148            if (targetList == null) {
149                return null;
150            }
151    
152            try {
153                ArrayList<TargetModuleIDImpl> result = new ArrayList<TargetModuleIDImpl>();
154                for (Target aTargetList : targetList) {
155                    TargetImpl target = (TargetImpl) aTargetList;
156                    AbstractName storeName = target.getAbstractName();
157                    List infos = configurationManager.listConfigurations(storeName);
158                    for (Object info1 : infos) {
159                        ConfigurationInfo info = (ConfigurationInfo) info1;
160                        if (filter.accept(info)) {
161                            String name = info.getConfigID().toString();
162                            List list = CommandSupport.loadChildren(kernel, name);
163                            TargetModuleIDImpl moduleID = new TargetModuleIDImpl(target, name, (String[]) list.toArray(new String[list.size()]));
164                            moduleID.setType(CommandSupport.convertModuleType(info.getType()));
165                            if (moduleID.getChildTargetModuleID() != null) {
166                                for (int k = 0; k < moduleID.getChildTargetModuleID().length; k++) {
167                                    TargetModuleIDImpl child = (TargetModuleIDImpl) moduleID.getChildTargetModuleID()[k];
168                                    if (CommandSupport.isWebApp(kernel, child.getModuleID())) {
169                                        child.setType(ModuleType.WAR);
170                                    }
171                                }
172                            }
173                            result.add(moduleID);
174                        }
175                    }
176                }
177                CommandSupport.addWebContextPaths(kernel, result);
178                return result.size() == 0 ? null : result.toArray(new TargetModuleID[result.size()]);
179            } catch (Exception e) {
180                throw (TargetException) new TargetException(e.getMessage()).initCause(e);
181            }
182        }
183    
184        public ProgressObject distribute(Target[] targetList, File moduleArchive, File deploymentPlan) {
185            if (kernel == null) {
186                throw new IllegalStateException("Disconnected");
187            }
188            DistributeCommand command = createDistributeCommand(targetList, moduleArchive, deploymentPlan);
189            command.setCommandContext(commandContext);
190            new Thread(command).start();
191            return command;
192        }
193    
194        /**
195         * @deprecated
196         */
197        public ProgressObject distribute(Target[] targetList, InputStream moduleArchive, InputStream deploymentPlan) {
198            return distribute(targetList, null, moduleArchive, deploymentPlan);
199        }
200    
201        public ProgressObject distribute(Target[] targetList, ModuleType moduleType, InputStream moduleArchive, InputStream deploymentPlan) throws IllegalStateException {
202            if (kernel == null) {
203                throw new IllegalStateException("Disconnected");
204            }
205            DistributeCommand command = createDistributeCommand(targetList, moduleType, moduleArchive, deploymentPlan);
206            command.setCommandContext(commandContext);
207            new Thread(command).start();
208            return command;
209        }
210    
211        public ProgressObject start(TargetModuleID[] moduleIDList) {
212            if (kernel == null) {
213                throw new IllegalStateException("Disconnected");
214            }
215            StartCommand command = new StartCommand(kernel, moduleIDList);
216            command.setCommandContext(commandContext);
217            new Thread(command).start();
218            return command;
219        }
220    
221        public ProgressObject stop(TargetModuleID[] moduleIDList) {
222            if (kernel == null) {
223                throw new IllegalStateException("Disconnected");
224            }
225            StopCommand command = new StopCommand(kernel, moduleIDList);
226            command.setCommandContext(commandContext);
227            new Thread(command).start();
228            return command;
229        }
230    
231        public ProgressObject undeploy(TargetModuleID[] moduleIDList) {
232            if (kernel == null) {
233                throw new IllegalStateException("Disconnected");
234            }
235            UndeployCommand command = new UndeployCommand(kernel, moduleIDList);
236            command.setCommandContext(commandContext);
237            new Thread(command).start();
238            return command;
239        }
240    
241        public boolean isRedeploySupported() {
242            return true;
243        }
244    
245        public ProgressObject redeploy(TargetModuleID[] moduleIDList, File moduleArchive, File deploymentPlan) {
246            if (kernel == null) {
247                throw new IllegalStateException("Disconnected");
248            }
249            RedeployCommand command = createRedeployCommand(moduleIDList, moduleArchive, deploymentPlan);
250            command.setCommandContext(commandContext);
251            new Thread(command).start();
252            return command;
253        }
254    
255        public ProgressObject redeploy(TargetModuleID[] moduleIDList, InputStream moduleArchive, InputStream deploymentPlan) {
256            if (kernel == null) {
257                throw new IllegalStateException("Disconnected");
258            }
259            RedeployCommand command = createRedeployCommand(moduleIDList, moduleArchive, deploymentPlan);
260            command.setCommandContext(commandContext);
261            new Thread(command).start();
262            return command;
263        }
264    
265        public Locale[] getSupportedLocales() {
266            return new Locale[]{getDefaultLocale()};
267        }
268    
269        public Locale getCurrentLocale() {
270            return getDefaultLocale();
271        }
272    
273        public Locale getDefaultLocale() {
274            return Locale.getDefault();
275        }
276    
277        public boolean isLocaleSupported(Locale locale) {
278            return getDefaultLocale().equals(locale);
279        }
280    
281        public void setLocale(Locale locale) {
282            throw new UnsupportedOperationException("Cannot set Locale");
283        }
284    
285        public DConfigBeanVersionType getDConfigBeanVersion() {
286            return DConfigBeanVersionType.V1_4;
287        }
288    
289        public boolean isDConfigBeanVersionSupported(DConfigBeanVersionType version) {
290            return DConfigBeanVersionType.V1_4.equals(version);
291        }
292    
293        public void setDConfigBeanVersion(DConfigBeanVersionType version) throws DConfigBeanVersionUnsupportedException {
294            if (!isDConfigBeanVersionSupported(version)) {
295                throw new DConfigBeanVersionUnsupportedException("Version not supported " + version);
296            }
297        }
298    
299        public DeploymentConfiguration createConfiguration(DeployableObject dObj) throws InvalidModuleException {
300            if (dObj == null) {
301                throw new NullPointerException("No deployable object supplied to configure");
302            }
303            ModuleConfigurer configurer = null;
304            for (ModuleConfigurer moduleConfigurer : moduleConfigurers) {
305                if (moduleConfigurer.getModuleType() == dObj.getType()) {
306                    configurer = moduleConfigurer;
307                   break;
308                }
309            }
310            if (configurer == null) {
311                throw new InvalidModuleException("No configurer for module type: " + dObj.getType() + " registered");
312            }
313            return configurer.createConfiguration(dObj);
314        }
315    
316        protected DistributeCommand createDistributeCommand(Target[] targetList, File moduleArchive, File deploymentPlan) {
317            return new DistributeCommand(kernel, targetList, moduleArchive, deploymentPlan);
318        }
319    
320        protected DistributeCommand createDistributeCommand(Target[] targetList, ModuleType moduleType, InputStream moduleArchive, InputStream deploymentPlan) {
321            return new DistributeCommand(kernel, targetList, moduleType, moduleArchive, deploymentPlan);
322        }
323    
324        protected RedeployCommand createRedeployCommand(TargetModuleID[] moduleIDList, File moduleArchive, File deploymentPlan) {
325            return new RedeployCommand(kernel, moduleIDList, moduleArchive, deploymentPlan);
326        }
327    
328        protected RedeployCommand createRedeployCommand(TargetModuleID[] moduleIDList, InputStream moduleArchive, InputStream deploymentPlan) {
329            return new RedeployCommand(kernel, moduleIDList, moduleArchive, deploymentPlan);
330        }
331    
332        public void setLogConfiguration(boolean shouldLog, boolean verboseStatus) {
333            commandContext.setLogErrors(shouldLog);
334            commandContext.setVerbose(verboseStatus);
335        }
336    
337        public void setInPlace(boolean inPlace) {
338            commandContext.setInPlace(inPlace);
339        }
340    }