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.deployment.cli; 019 020 import java.io.File; 021 import java.io.PrintWriter; 022 import java.util.Arrays; 023 import java.util.List; 024 import java.util.StringTokenizer; 025 026 import javax.enterprise.deploy.spi.DeploymentManager; 027 import javax.enterprise.deploy.spi.Target; 028 import javax.enterprise.deploy.spi.TargetModuleID; 029 import javax.enterprise.deploy.spi.status.ProgressObject; 030 031 import org.apache.geronimo.cli.deployer.CommandArgs; 032 import org.apache.geronimo.cli.deployer.DistributeCommandArgs; 033 import org.apache.geronimo.common.DeploymentException; 034 import org.apache.geronimo.deployment.plugin.jmx.JMXDeploymentManager; 035 036 /** 037 * The CLI deployer logic to distribute. 038 * 039 * @version $Rev: 535507 $ $Date: 2007-05-05 07:22:39 -0400 (Sat, 05 May 2007) $ 040 */ 041 public class CommandDistribute extends AbstractCommand { 042 043 protected ProgressObject runCommand(DeploymentManager mgr, PrintWriter out, boolean inPlace, Target[] tlist, File module, File plan) throws DeploymentException { 044 if (inPlace) { 045 if (!(mgr instanceof JMXDeploymentManager)) { 046 throw new DeploymentSyntaxException( 047 "Target DeploymentManager is not a Geronimo one. \n" + 048 "Cannot perform in-place deployment."); 049 } 050 JMXDeploymentManager jmxMgr = (JMXDeploymentManager) mgr; 051 try { 052 jmxMgr.setInPlace(true); 053 return mgr.distribute(tlist, module, plan); 054 } finally { 055 jmxMgr.setInPlace(false); 056 } 057 } else { 058 return mgr.distribute(tlist, module, plan); 059 } 060 } 061 062 protected String getAction() { 063 return "Distributed"; 064 } 065 066 public void execute(PrintWriter out, ServerConnection connection, CommandArgs commandArgs) throws DeploymentException { 067 if (!(commandArgs instanceof DistributeCommandArgs)) { 068 throw new DeploymentSyntaxException("CommandArgs has the type [" + commandArgs.getClass() + "]; expected [" + DistributeCommandArgs.class + "]"); 069 } 070 DistributeCommandArgs distributeCommandArgs = (DistributeCommandArgs) commandArgs; 071 072 BooleanHolder inPlaceHolder = new BooleanHolder(); 073 inPlaceHolder.inPlace = distributeCommandArgs.isInPlace(); 074 075 List<String> targets = Arrays.asList(distributeCommandArgs.getTargets()); 076 077 String[] args = distributeCommandArgs.getArgs(); 078 File module = null; 079 File plan = null; 080 if(args.length > 0) { 081 File test = new File(args[0]); 082 if(DeployUtils.isJarFile(test) || test.isDirectory()) { 083 if(module != null) { 084 throw new DeploymentSyntaxException("Module and plan cannot both be JAR files or directories!"); 085 } 086 module = test; 087 } else { 088 if(plan != null) { 089 throw new DeploymentSyntaxException("Module or plan must be a JAR file or directory!"); 090 } 091 plan = test; 092 } 093 } 094 if(args.length > 1) { 095 File test = new File(args[1]); 096 if(DeployUtils.isJarFile(test) || test.isDirectory()) { 097 if(module != null) { 098 throw new DeploymentSyntaxException("Module and plan cannot both be JAR files or directories!"); 099 } 100 module = test; 101 } else { 102 if(plan != null) { 103 throw new DeploymentSyntaxException("Module or plan must be a JAR file or directory!"); 104 } 105 plan = test; 106 } 107 } 108 if(module != null) { 109 module = module.getAbsoluteFile(); 110 } 111 if(plan != null) { 112 plan = plan.getAbsoluteFile(); 113 } 114 executeOnline(connection, inPlaceHolder.inPlace, targets, out, module, plan); 115 } 116 117 private void executeOnline(ServerConnection connection, boolean inPlace, List targets, PrintWriter out, File module, File plan) throws DeploymentException { 118 final DeploymentManager mgr = connection.getDeploymentManager(); 119 TargetModuleID[] results; 120 boolean multipleTargets; 121 ProgressObject po; 122 if(targets.size() > 0) { 123 Target[] tlist = identifyTargets(targets, mgr); 124 multipleTargets = tlist.length > 1; 125 po = runCommand(mgr, out, inPlace, tlist, module, plan); 126 waitForProgress(out, po); 127 } else { 128 final Target[] tlist = mgr.getTargets(); 129 multipleTargets = tlist.length > 1; 130 po = runCommand(mgr, out, inPlace, tlist, module, plan); 131 waitForProgress(out, po); 132 } 133 134 // print the results that succeeded 135 results = po.getResultTargetModuleIDs(); 136 for (int i = 0; i < results.length; i++) { 137 TargetModuleID result = results[i]; 138 out.print(DeployUtils.reformat(getAction()+" "+result.getModuleID()+(multipleTargets ? " to "+result.getTarget().getName() : "")+(result.getWebURL() == null || !getAction().equals("Deployed") ? "" : " @ "+result.getWebURL()), 4, 72)); 139 if(result.getChildTargetModuleID() != null) { 140 for (int j = 0; j < result.getChildTargetModuleID().length; j++) { 141 TargetModuleID child = result.getChildTargetModuleID()[j]; 142 out.print(DeployUtils.reformat(" `-> "+child.getModuleID()+(child.getWebURL() == null || !getAction().equals("Deployed") ? "" : " @ "+child.getWebURL()),4, 72)); 143 } 144 } 145 } 146 147 // if any results failed then throw so that we'll return non-0 148 // to the operating system 149 if(po.getDeploymentStatus().isFailed()) { 150 throw new DeploymentException("Operation failed: "+po.getDeploymentStatus().getMessage()); 151 } 152 } 153 154 private String[] processTargets(String[] args, List targets) { 155 if(args.length >= 2 && args[0].equals("--targets")) { 156 String value = args[1]; 157 StringTokenizer tok = new StringTokenizer(value, ";", false); 158 while(tok.hasMoreTokens()) { 159 targets.add(tok.nextToken()); 160 } 161 String[] temp = new String[args.length-2]; 162 System.arraycopy(args, 2, temp, 0, temp.length); 163 args = temp; 164 } 165 return args; 166 } 167 168 private String[] processInPlace(String[] args, BooleanHolder inPlaceHolder) { 169 if(args.length >= 2 && args[0].equals("--inPlace")) { 170 inPlaceHolder.inPlace = true; 171 String[] temp = new String[args.length - 1]; 172 System.arraycopy(args, 1, temp, 0, temp.length); 173 args = temp; 174 } 175 return args; 176 } 177 178 private final class BooleanHolder { 179 public boolean inPlace; 180 } 181 }