001 /** 002 * 003 * Licensed to the Apache Software Foundation (ASF) under one or more 004 * contributor license agreements. See the NOTICE file distributed with 005 * this work for additional information regarding copyright ownership. 006 * The ASF licenses this file to You under the Apache License, Version 2.0 007 * (the "License"); you may not use this file except in compliance with 008 * the License. You may obtain a copy of the License at 009 * 010 * http://www.apache.org/licenses/LICENSE-2.0 011 * 012 * Unless required by applicable law or agreed to in writing, software 013 * distributed under the License is distributed on an "AS IS" BASIS, 014 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 015 * See the License for the specific language governing permissions and 016 * limitations under the License. 017 */ 018 package org.apache.geronimo.deployment.plugin.jmx; 019 020 import java.io.File; 021 import java.io.InputStream; 022 import java.util.ArrayList; 023 import java.util.List; 024 import java.util.Locale; 025 import javax.enterprise.deploy.model.DeployableObject; 026 import javax.enterprise.deploy.shared.DConfigBeanVersionType; 027 import javax.enterprise.deploy.shared.ModuleType; 028 import javax.enterprise.deploy.spi.DeploymentConfiguration; 029 import javax.enterprise.deploy.spi.DeploymentManager; 030 import javax.enterprise.deploy.spi.Target; 031 import javax.enterprise.deploy.spi.TargetModuleID; 032 import javax.enterprise.deploy.spi.exceptions.DConfigBeanVersionUnsupportedException; 033 import javax.enterprise.deploy.spi.exceptions.InvalidModuleException; 034 import javax.enterprise.deploy.spi.exceptions.TargetException; 035 import javax.enterprise.deploy.spi.status.ProgressObject; 036 import org.apache.geronimo.connector.deployment.RARConfigurer; 037 import org.apache.geronimo.deployment.plugin.TargetImpl; 038 import org.apache.geronimo.deployment.plugin.TargetModuleIDImpl; 039 import org.apache.geronimo.deployment.plugin.local.CommandSupport; 040 import org.apache.geronimo.deployment.plugin.local.DistributeCommand; 041 import org.apache.geronimo.deployment.plugin.local.RedeployCommand; 042 import org.apache.geronimo.deployment.plugin.local.StartCommand; 043 import org.apache.geronimo.deployment.plugin.local.StopCommand; 044 import org.apache.geronimo.deployment.plugin.local.UndeployCommand; 045 import org.apache.geronimo.gbean.AbstractName; 046 import org.apache.geronimo.kernel.Kernel; 047 import org.apache.geronimo.kernel.config.ConfigurationInfo; 048 import org.apache.geronimo.kernel.config.ConfigurationManager; 049 import org.apache.geronimo.kernel.config.ConfigurationModuleType; 050 import org.apache.geronimo.kernel.config.ConfigurationUtil; 051 import org.apache.geronimo.kernel.config.NoSuchStoreException; 052 import org.apache.geronimo.kernel.management.State; 053 import org.apache.geronimo.web.deployment.WARConfigurer; 054 import org.apache.commons.logging.Log; 055 import org.apache.commons.logging.LogFactory; 056 057 058 /** 059 * @version $Rev: 470597 $ $Date: 2006-11-02 15:30:55 -0800 (Thu, 02 Nov 2006) $ 060 */ 061 public abstract class JMXDeploymentManager implements DeploymentManager { 062 private static final Log log = LogFactory.getLog(JMXDeploymentManager.class); 063 064 protected Kernel kernel; 065 private ConfigurationManager configurationManager; 066 private CommandContext commandContext; 067 068 protected void initialize(Kernel kernel) { 069 this.kernel = kernel; 070 configurationManager = ConfigurationUtil.getConfigurationManager(kernel); 071 commandContext = new CommandContext(true, true, null, null, false); 072 } 073 074 public void setAuthentication(String username, String password) { 075 commandContext.setUsername(username); 076 commandContext.setPassword(password); 077 } 078 079 public void release() { 080 if(kernel != null && configurationManager != null) { 081 try { 082 ConfigurationUtil.releaseConfigurationManager(kernel, configurationManager); 083 } finally { 084 configurationManager = null; 085 kernel = null; 086 } 087 } 088 } 089 090 public Target[] getTargets() { 091 if (kernel == null) { 092 throw new IllegalStateException("Disconnected"); 093 } 094 List stores = configurationManager.listStores(); 095 if (stores.size() == 0) { 096 return null; 097 } 098 099 Target[] targets = new Target[stores.size()]; 100 for (int i = 0; i < stores.size(); i++) { 101 AbstractName storeName = (AbstractName) stores.get(i); 102 targets[i] = new TargetImpl(storeName, null); 103 } 104 return targets; 105 } 106 107 public TargetModuleID[] getAvailableModules(final ModuleType moduleType, Target[] targetList) throws TargetException { 108 ConfigFilter filter = new ConfigFilter() { 109 public boolean accept(ConfigurationInfo info) { 110 return moduleType == null || info.getType() == ConfigurationModuleType.getFromValue(moduleType.getValue()); 111 } 112 }; 113 return getModules(targetList, filter); 114 } 115 116 public TargetModuleID[] getNonRunningModules(final ModuleType moduleType, Target[] targetList) throws TargetException { 117 ConfigFilter filter = new ConfigFilter() { 118 public boolean accept(ConfigurationInfo info) { 119 return info.getState() != State.RUNNING && (moduleType == null || info.getType() == ConfigurationModuleType.getFromValue(moduleType.getValue())); 120 } 121 }; 122 return getModules(targetList, filter); 123 } 124 125 public TargetModuleID[] getRunningModules(final ModuleType moduleType, Target[] targetList) throws TargetException { 126 ConfigFilter filter = new ConfigFilter() { 127 public boolean accept(ConfigurationInfo info) { 128 return info.getState() == State.RUNNING && (moduleType == null || info.getType() == ConfigurationModuleType.getFromValue(moduleType.getValue())); 129 } 130 }; 131 return getModules(targetList, filter); 132 } 133 134 private static interface ConfigFilter { 135 boolean accept(ConfigurationInfo info); 136 } 137 138 private TargetModuleID[] getModules(Target[] targetList, ConfigFilter filter) throws TargetException { 139 if (kernel == null) { 140 throw new IllegalStateException("Disconnected"); 141 } 142 try { 143 ArrayList result = new ArrayList(); 144 for (int i = 0; i < targetList.length; i++) { 145 TargetImpl target = (TargetImpl) targetList[i]; 146 AbstractName storeName = target.getAbstractName(); 147 List infos = configurationManager.listConfigurations(storeName); 148 for (int j = 0; j < infos.size(); j++) { 149 ConfigurationInfo info = (ConfigurationInfo) infos.get(j); 150 if (filter.accept(info)) { 151 String name = info.getConfigID().toString(); 152 List list = CommandSupport.loadChildren(kernel, name); 153 TargetModuleIDImpl moduleID = new TargetModuleIDImpl(target, name, (String[]) list.toArray(new String[list.size()])); 154 moduleID.setType(CommandSupport.convertModuleType(info.getType())); 155 if(moduleID.getChildTargetModuleID() != null) { 156 for (int k = 0; k < moduleID.getChildTargetModuleID().length; k++) { 157 TargetModuleIDImpl child = (TargetModuleIDImpl) moduleID.getChildTargetModuleID()[k]; 158 if(CommandSupport.isWebApp(kernel, child.getModuleID())) { 159 child.setType(ModuleType.WAR); 160 } 161 } 162 } 163 result.add(moduleID); 164 } 165 } 166 } 167 CommandSupport.addWebURLs(kernel, result); 168 return result.size() == 0 ? null : (TargetModuleID[]) result.toArray(new TargetModuleID[result.size()]); 169 } catch (NoSuchStoreException e) { 170 throw (TargetException) new TargetException(e.getMessage()).initCause(e); 171 } 172 } 173 174 public ProgressObject distribute(Target[] targetList, File moduleArchive, File deploymentPlan) { 175 if (kernel == null) { 176 throw new IllegalStateException("Disconnected"); 177 } 178 DistributeCommand command = createDistributeCommand(targetList, moduleArchive, deploymentPlan); 179 command.setCommandContext(commandContext); 180 new Thread(command).start(); 181 return command; 182 } 183 184 public ProgressObject distribute(Target[] targetList, InputStream moduleArchive, InputStream 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 public ProgressObject start(TargetModuleID[] moduleIDList) { 195 if (kernel == null) { 196 throw new IllegalStateException("Disconnected"); 197 } 198 StartCommand command = new StartCommand(kernel, moduleIDList); 199 command.setCommandContext(commandContext); 200 new Thread(command).start(); 201 return command; 202 } 203 204 public ProgressObject stop(TargetModuleID[] moduleIDList) { 205 if (kernel == null) { 206 throw new IllegalStateException("Disconnected"); 207 } 208 StopCommand command = new StopCommand(kernel, moduleIDList); 209 command.setCommandContext(commandContext); 210 new Thread(command).start(); 211 return command; 212 } 213 214 public ProgressObject undeploy(TargetModuleID[] moduleIDList) { 215 if (kernel == null) { 216 throw new IllegalStateException("Disconnected"); 217 } 218 UndeployCommand command = new UndeployCommand(kernel, moduleIDList); 219 command.setCommandContext(commandContext); 220 new Thread(command).start(); 221 return command; 222 } 223 224 public boolean isRedeploySupported() { 225 return true; 226 } 227 228 public ProgressObject redeploy(TargetModuleID[] moduleIDList, File moduleArchive, File deploymentPlan) { 229 if (kernel == null) { 230 throw new IllegalStateException("Disconnected"); 231 } 232 RedeployCommand command = createRedeployCommand(moduleIDList, moduleArchive, deploymentPlan); 233 command.setCommandContext(commandContext); 234 new Thread(command).start(); 235 return command; 236 } 237 238 public ProgressObject redeploy(TargetModuleID[] moduleIDList, InputStream moduleArchive, InputStream deploymentPlan) { 239 if (kernel == null) { 240 throw new IllegalStateException("Disconnected"); 241 } 242 RedeployCommand command = createRedeployCommand(moduleIDList, moduleArchive, deploymentPlan); 243 command.setCommandContext(commandContext); 244 new Thread(command).start(); 245 return command; 246 } 247 248 public Locale[] getSupportedLocales() { 249 return new Locale[]{getDefaultLocale()}; 250 } 251 252 public Locale getCurrentLocale() { 253 return getDefaultLocale(); 254 } 255 256 public Locale getDefaultLocale() { 257 return Locale.getDefault(); 258 } 259 260 public boolean isLocaleSupported(Locale locale) { 261 return getDefaultLocale().equals(locale); 262 } 263 264 public void setLocale(Locale locale) { 265 throw new UnsupportedOperationException("Cannot set Locale"); 266 } 267 268 public DConfigBeanVersionType getDConfigBeanVersion() { 269 return DConfigBeanVersionType.V1_4; 270 } 271 272 public boolean isDConfigBeanVersionSupported(DConfigBeanVersionType version) { 273 return DConfigBeanVersionType.V1_4.equals(version); 274 } 275 276 public void setDConfigBeanVersion(DConfigBeanVersionType version) throws DConfigBeanVersionUnsupportedException { 277 if (!isDConfigBeanVersionSupported(version)) { 278 throw new DConfigBeanVersionUnsupportedException("Version not supported " + version); 279 } 280 } 281 282 public DeploymentConfiguration createConfiguration(DeployableObject dObj) throws InvalidModuleException { 283 if(dObj.getType().equals(ModuleType.CAR)) { 284 //todo: need a client configurer 285 } else if(dObj.getType().equals(ModuleType.EAR)) { 286 //todo: need an EAR configurer 287 } else if(dObj.getType().equals(ModuleType.EJB)) { 288 try { 289 Class cls = Class.forName("org.apache.openejb.deployment.EJBConfigurer"); 290 return (DeploymentConfiguration)cls.getMethod("createConfiguration", new Class[]{DeployableObject.class}).invoke(cls.newInstance(), new Object[]{dObj}); 291 } catch (Exception e) { 292 log.error("Unable to invoke EJB deployer", e); 293 } 294 } else if(dObj.getType().equals(ModuleType.RAR)) { 295 return new RARConfigurer().createConfiguration(dObj); 296 } else if(dObj.getType().equals(ModuleType.WAR)) { 297 return new WARConfigurer().createConfiguration(dObj); 298 } 299 throw new InvalidModuleException("Not supported"); 300 } 301 302 protected DistributeCommand createDistributeCommand(Target[] targetList, File moduleArchive, File deploymentPlan) { 303 return new DistributeCommand(kernel, targetList, moduleArchive, deploymentPlan); 304 } 305 306 protected DistributeCommand createDistributeCommand(Target[] targetList, InputStream moduleArchive, InputStream deploymentPlan) { 307 return new DistributeCommand(kernel, targetList, moduleArchive, deploymentPlan); 308 } 309 310 protected RedeployCommand createRedeployCommand(TargetModuleID[] moduleIDList, File moduleArchive, File deploymentPlan) { 311 return new RedeployCommand(kernel, moduleIDList, moduleArchive, deploymentPlan); 312 } 313 314 protected RedeployCommand createRedeployCommand(TargetModuleID[] moduleIDList, InputStream moduleArchive, InputStream deploymentPlan) { 315 return new RedeployCommand(kernel, moduleIDList, moduleArchive, deploymentPlan); 316 } 317 318 public void setLogConfiguration(boolean shouldLog, boolean verboseStatus) { 319 commandContext.setLogErrors(shouldLog); 320 commandContext.setVerbose(verboseStatus); 321 } 322 323 public void setInPlace(boolean inPlace) { 324 commandContext.setInPlace(inPlace); 325 } 326 }