1 /** 2 * 3 * Copyright 2003-2004 The Apache Software Foundation 4 * 5 * Licensed under the Apache License, Version 2.0 (the "License"); 6 * you may not use this file except in compliance with the License. 7 * You may obtain a copy of the License at 8 * 9 * http://www.apache.org/licenses/LICENSE-2.0 10 * 11 * Unless required by applicable law or agreed to in writing, software 12 * distributed under the License is distributed on an "AS IS" BASIS, 13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 * See the License for the specific language governing permissions and 15 * limitations under the License. 16 */ 17 package org.apache.geronimo.deployment.plugin.local; 18 19 import java.io.File; 20 import java.io.FileOutputStream; 21 import java.io.IOException; 22 import java.io.InputStream; 23 import java.io.OutputStream; 24 import java.net.URL; 25 import java.util.Iterator; 26 import java.util.List; 27 import java.util.Set; 28 import javax.enterprise.deploy.shared.CommandType; 29 import javax.enterprise.deploy.shared.ModuleType; 30 import javax.enterprise.deploy.spi.Target; 31 32 import org.apache.geronimo.common.DeploymentException; 33 import org.apache.geronimo.deployment.Deployer; 34 import org.apache.geronimo.deployment.plugin.TargetModuleIDImpl; 35 import org.apache.geronimo.gbean.AbstractName; 36 import org.apache.geronimo.gbean.AbstractNameQuery; 37 import org.apache.geronimo.kernel.Kernel; 38 39 /** 40 * @version $Rev: 399026 $ $Date: 2006-05-02 13:03:28 -0700 (Tue, 02 May 2006) $ 41 */ 42 public abstract class AbstractDeployCommand extends CommandSupport { 43 protected final Kernel kernel; 44 private static final String[] DEPLOY_SIG = {boolean.class.getName(), File.class.getName(), File.class.getName(), String.class.getName()}; 45 protected final boolean spool; 46 protected File moduleArchive; 47 protected File deploymentPlan; 48 protected InputStream moduleStream; 49 protected InputStream deploymentStream; 50 protected AbstractName deployer; 51 52 public AbstractDeployCommand(CommandType command, Kernel kernel, File moduleArchive, File deploymentPlan, InputStream moduleStream, InputStream deploymentStream, boolean spool) { 53 super(command); 54 this.kernel = kernel; 55 this.moduleArchive = moduleArchive; 56 this.deploymentPlan = deploymentPlan; 57 this.moduleStream = moduleStream; 58 this.deploymentStream = deploymentStream; 59 this.spool = spool; 60 deployer = getDeployerName(); 61 } 62 63 private AbstractName getDeployerName() { 64 Set deployers = kernel.listGBeans(new AbstractNameQuery("org.apache.geronimo.deployment.Deployer")); 65 if (deployers.isEmpty()) { 66 fail("No Deployer GBean present in running Geronimo server. " + 67 "This usually indicates a serious problem with the configuration of " + 68 "your running Geronimo server. If " + 69 "the deployer is present but not started, the workaround is to run " + 70 "a deploy command like 'start geronimo/geronimo-gbean-deployer/1.0/car'. " + 71 "If the deployer service is not present at all (it was undeployed) then " + 72 "you need to either re-install Geronimo or get a deployment plan for the " + 73 "runtime deployer and distribute it while the server is not running and " + 74 "then start the server with a command like the above. For help on this, " + 75 "write to user@geronimo.apache.org and include the contents of your " + 76 "var/config/config.xml file."); 77 return null; 78 } 79 Iterator j = deployers.iterator(); 80 AbstractName deployer = (AbstractName) j.next(); 81 if (j.hasNext()) { 82 fail("More than one deployer found"); 83 return null; 84 } 85 return deployer; 86 87 } 88 89 protected void copyTo(File outfile, InputStream is) throws IOException { 90 byte[] buffer = new byte[4096]; 91 int count; 92 OutputStream os = new FileOutputStream(outfile); 93 try { 94 while ((count = is.read(buffer)) > 0) { 95 os.write(buffer, 0, count); 96 } 97 } finally { 98 os.close(); 99 } 100 } 101 102 protected void doDeploy(Target target, boolean finished) throws Exception { 103 File[] args = {moduleArchive, deploymentPlan}; 104 massageFileNames(args); 105 Object deployParams[] = new Object[] {Boolean.valueOf(commandContext.isInPlace()), args[0], args[1], target.getName()}; 106 List objectNames = (List) kernel.invoke(deployer, "deploy", deployParams, DEPLOY_SIG); 107 if (objectNames == null || objectNames.isEmpty()) { 108 throw new DeploymentException("Server didn't deploy anything"); 109 } 110 String parentName = (String) objectNames.get(0); 111 String[] childIDs = new String[objectNames.size()-1]; 112 for (int j=0; j < childIDs.length; j++) { 113 childIDs[j] = (String)objectNames.get(j+1); 114 } 115 116 TargetModuleIDImpl moduleID = new TargetModuleIDImpl(target, parentName, childIDs); 117 if(isWebApp(kernel, parentName)) { 118 moduleID.setType(ModuleType.WAR); 119 } 120 if(moduleID.getChildTargetModuleID() != null) { 121 for (int i = 0; i < moduleID.getChildTargetModuleID().length; i++) { 122 TargetModuleIDImpl id = (TargetModuleIDImpl) moduleID.getChildTargetModuleID()[i]; 123 if(isWebApp(kernel, id.getModuleID())) { 124 id.setType(ModuleType.WAR); 125 } 126 } 127 } 128 addModule(moduleID); 129 if(finished) { 130 addWebURLs(kernel); 131 complete("Completed with id " + parentName); 132 } 133 } 134 135 protected void massageFileNames(File[] inputs) { 136 } 137 138 public URL getRemoteDeployUploadURL() throws Exception { 139 return new URL((String)kernel.getAttribute(deployer, "remoteDeployUploadURL")); 140 } 141 }