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.cli;
018    
019    import java.io.File;
020    import java.io.IOException;
021    
022    import javax.enterprise.deploy.spi.DeploymentManager;
023    
024    import org.apache.geronimo.cli.deployer.BaseCommandArgs;
025    import org.apache.geronimo.cli.deployer.CommandArgs;
026    import org.apache.geronimo.common.DeploymentException;
027    import org.apache.geronimo.deployment.plugin.GeronimoDeploymentManager;
028    import org.apache.geronimo.kernel.repository.Artifact;
029    import org.apache.geronimo.kernel.repository.MissingDependencyException;
030    import org.apache.geronimo.system.plugin.DownloadResults;
031    import jline.ConsoleReader;
032    
033    /**
034     * The CLI deployer logic to start.
035     *
036     * @version $Rev: 706640 $ $Date: 2008-10-21 14:44:05 +0000 (Tue, 21 Oct 2008) $
037     */
038    public class CommandInstallCAR extends AbstractCommand {
039    
040        //todo: provide a way to handle a username and password for the remote repo?
041    
042        public void execute(ConsoleReader consoleReader, ServerConnection connection, CommandArgs commandArgs) throws DeploymentException {
043            DeploymentManager dmgr = connection.getDeploymentManager();
044            if(dmgr instanceof GeronimoDeploymentManager) {
045                try {
046                    GeronimoDeploymentManager mgr = (GeronimoDeploymentManager) dmgr;
047                    if (commandArgs.getArgs().length == 0) {
048                        throw new DeploymentException("Must specify Plugin CAR file");
049                    }
050                    File carFile = new File(commandArgs.getArgs()[0]);
051                    carFile = carFile.getAbsoluteFile();
052                    if(!carFile.exists() || !carFile.canRead()) {
053                        throw new DeploymentException("CAR file cannot be read: "+carFile.getAbsolutePath());
054                    }
055                    //TODO figure out if there is a plausible default repo
056                    Object key = mgr.startInstall(carFile, null, false, null, null);
057                    long start = System.currentTimeMillis();
058                    DownloadResults results = showProgress(consoleReader, mgr, key);
059                    int time = (int)(System.currentTimeMillis() - start) / 1000;
060                    printResults(consoleReader, results, time);            
061                } catch (IOException e) {
062                    throw new DeploymentException("Cannot install plugin", e);
063                }
064            } else {
065                throw new DeploymentException("Cannot install plugins using " + dmgr.getClass().getName() + " deployment manager");
066            }
067        }
068    
069        static DownloadResults showProgress(ConsoleReader consoleReader, GeronimoDeploymentManager mgr, Object key) throws IOException {
070            DeployUtils.println("Checking for status every 1000ms:", 0, consoleReader);
071            String last = null, status;
072            while(true) {
073                DownloadResults results = mgr.checkOnInstall(key);
074                if(results.getCurrentFile() != null) {
075                    if(results.getCurrentFilePercent() > -1) {
076                        status = results.getCurrentMessage()+" ("+results.getCurrentFilePercent()+"%)";
077                    } else {
078                        status = results.getCurrentMessage();
079                    }
080                    if(last == null || !last.equals(status)) {
081                        last = status;
082                        DeployUtils.println(status, 0, consoleReader);
083                        consoleReader.flushConsole();
084                    }
085                }
086                if(results.isFinished()) {
087                    if(results.isFailed()) {
088                        DeployUtils.println("Installation FAILED: "+results.getFailure().getMessage(), 0, consoleReader);
089                    }
090                    return results;
091                }
092                try {
093                    Thread.sleep(1000);
094                } catch (InterruptedException e) {
095                    return results;
096                }
097            }
098        }
099        
100        static void printResults(ConsoleReader consoleReader, DownloadResults results, int time) throws IOException, DeploymentException {
101            consoleReader.printNewline();
102            if (!results.isFailed()) {
103                DeployUtils.println("**** Installation Complete!", 0, consoleReader);
104                for (MissingDependencyException e : results.getSkippedPlugins()) {
105                    DeployUtils.println(e.getMessage(), 0, consoleReader);
106                }
107                for (Artifact uri: results.getDependenciesPresent()) {
108                    DeployUtils.println("Used existing: " + uri, 0, consoleReader);
109                }
110                for (Artifact uri: results.getDependenciesInstalled()) {
111                    DeployUtils.println("Installed new: " + uri, 0, consoleReader);
112                }
113                consoleReader.printNewline();
114                if (results.getTotalDownloadBytes() > 0 && time > 0) {
115                    DeployUtils.println(
116                        "Downloaded " + (results.getTotalDownloadBytes() / 1024) + " kB in " + time + "s (" + results.getTotalDownloadBytes() / (1024 * time) + " kB/s)",
117                        0, consoleReader);
118                }
119            }
120        }
121    }