001 /** 002 * 003 * Copyright 2005 The Apache Software Foundation 004 * 005 * Licensed under the Apache License, Version 2.0 (the "License"); 006 * you may not use this file except in compliance with the License. 007 * 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.cli; 018 019 import java.io.File; 020 import java.io.PrintWriter; 021 import javax.enterprise.deploy.spi.DeploymentManager; 022 import org.apache.geronimo.common.DeploymentException; 023 import org.apache.geronimo.deployment.plugin.GeronimoDeploymentManager; 024 import org.apache.geronimo.kernel.repository.Artifact; 025 import org.apache.geronimo.system.plugin.DownloadResults; 026 027 /** 028 * The CLI deployer logic to start. 029 * 030 * @version $Rev: 410741 $ $Date: 2006-05-31 21:35:48 -0700 (Wed, 31 May 2006) $ 031 */ 032 public class CommandInstallCAR extends AbstractCommand { 033 public CommandInstallCAR() { 034 super("install-plugin", "3. Geronimo Plugins", "PluginFile", 035 "Installs a Geronimo plugin you've exported from a Geronimo server " + 036 "or downloaded from an external repository. The file must be a " + 037 "properly configured Geronimo CAR file. This is used to add new " + 038 "functionality to the Geronimo server."); 039 } 040 041 //todo: provide a way to handle a username and password for the remote repo? 042 043 public CommandInstallCAR(String command, String group, String helpArgumentList, String helpText) { 044 super(command, group, helpArgumentList, helpText); 045 } 046 047 public void execute(PrintWriter out, ServerConnection connection, String[] args) throws DeploymentException { 048 if(args.length == 0) { 049 throw new DeploymentSyntaxException("Must specify Plugin CAR file"); 050 } 051 DeploymentManager dmgr = connection.getDeploymentManager(); 052 if(dmgr instanceof GeronimoDeploymentManager) { 053 GeronimoDeploymentManager mgr = (GeronimoDeploymentManager) dmgr; 054 File carFile = new File(args[0]); 055 carFile = carFile.getAbsoluteFile(); 056 if(!carFile.exists() || !carFile.canRead()) { 057 throw new DeploymentException("CAR file cannot be read: "+carFile.getAbsolutePath()); 058 } 059 Object key = mgr.startInstall(carFile, null, null); 060 long start = System.currentTimeMillis(); 061 DownloadResults results = showProgress(mgr, key); 062 int time = (int)(System.currentTimeMillis() - start) / 1000; 063 System.out.println(); 064 if(!results.isFailed()) { 065 System.out.print(DeployUtils.reformat("**** Installation Complete!", 4, 72)); 066 for (int i = 0; i < results.getDependenciesPresent().length; i++) { 067 Artifact uri = results.getDependenciesPresent()[i]; 068 System.out.print(DeployUtils.reformat("Used existing: "+uri, 4, 72)); 069 } 070 for (int i = 0; i < results.getDependenciesInstalled().length; i++) { 071 Artifact uri = results.getDependenciesInstalled()[i]; 072 System.out.print(DeployUtils.reformat("Installed new: "+uri, 4, 72)); 073 } 074 if(results.getTotalDownloadBytes() > 0 && time > 0) { 075 System.out.println(); 076 System.out.print(DeployUtils.reformat("Downloaded "+(results.getTotalDownloadBytes()/1024)+" kB in "+time+"s ("+results.getTotalDownloadBytes()/(1024*time)+" kB/s)", 4, 72)); 077 } 078 } 079 if(results.isFinished() && !results.isFailed() && results.getInstalledConfigIDs().length == 1) { 080 Artifact target = results.getInstalledConfigIDs()[0]; 081 System.out.print(DeployUtils.reformat("Now starting "+target+"...", 4, 72)); 082 System.out.flush(); 083 new CommandStart().execute(out, connection, new String[]{target.toString()}); 084 } 085 } else { 086 throw new DeploymentException("Cannot install plugins when connected to "+connection.getServerURI()); 087 } 088 } 089 090 static DownloadResults showProgress(GeronimoDeploymentManager mgr, Object key) { 091 System.out.println("Checking for status every 1000ms:"); 092 String last = null, status; 093 while(true) { 094 DownloadResults results = mgr.checkOnInstall(key); 095 if(results.getCurrentFile() != null) { 096 if(results.getCurrentFilePercent() > -1) { 097 status = results.getCurrentMessage()+" ("+results.getCurrentFilePercent()+"%)"; 098 } else { 099 status = results.getCurrentMessage(); 100 } 101 if(last == null || !last.equals(status)) { 102 last = status; 103 System.out.println(status); 104 } 105 } 106 if(results.isFinished()) { 107 if(results.isFailed()) { 108 System.err.println("Installation FAILED: "+results.getFailure().getMessage()); 109 } 110 return results; 111 } 112 try { 113 Thread.sleep(1000); 114 } catch (InterruptedException e) { 115 return results; 116 } 117 } 118 } 119 }