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.BufferedReader; 020 import java.io.IOException; 021 import java.io.InputStreamReader; 022 import java.io.PrintWriter; 023 import java.net.URL; 024 import java.util.ArrayList; 025 import java.util.HashMap; 026 import java.util.Iterator; 027 import java.util.List; 028 import java.util.Map; 029 030 import javax.enterprise.deploy.spi.DeploymentManager; 031 import javax.security.auth.login.FailedLoginException; 032 033 import org.apache.geronimo.cli.deployer.BaseCommandArgs; 034 import org.apache.geronimo.cli.deployer.CommandArgs; 035 import org.apache.geronimo.common.DeploymentException; 036 import org.apache.geronimo.deployment.plugin.GeronimoDeploymentManager; 037 import org.apache.geronimo.kernel.repository.Artifact; 038 import org.apache.geronimo.system.plugin.DownloadResults; 039 import org.apache.geronimo.system.plugin.PluginList; 040 import org.apache.geronimo.system.plugin.PluginMetadata; 041 042 /** 043 * The CLI deployer logic to start. 044 * 045 * @version $Rev: 549455 $ $Date: 2007-06-21 08:12:27 -0400 (Thu, 21 Jun 2007) $ 046 */ 047 public class CommandListConfigurations extends AbstractCommand { 048 049 //todo: provide a way to handle a username and password for the remote repo? 050 051 public void execute(PrintWriter out, ServerConnection connection, CommandArgs commandArgs) throws DeploymentException { 052 DeploymentManager dmgr = connection.getDeploymentManager(); 053 if(dmgr instanceof GeronimoDeploymentManager) { 054 GeronimoDeploymentManager mgr = (GeronimoDeploymentManager) dmgr; 055 try { 056 String repo = null; 057 if(commandArgs.getArgs().length == 1) { 058 repo = commandArgs.getArgs()[0]; 059 } else { 060 repo = getRepository(out, new BufferedReader(new InputStreamReader(System.in)), mgr); 061 } 062 PluginList data; 063 URL repository; 064 try { 065 repository = new URL(repo); 066 data = mgr.listPlugins(repository, null, null); 067 } catch (IOException e) { 068 throw new DeploymentException("Unable to list configurations", e); 069 } catch (FailedLoginException e) { 070 throw new DeploymentException("Invalid login for Maven repository '"+repo+"'", e); 071 } 072 if (data == null) { 073 out.println(); 074 out.println("No plugins were returned from this site."); 075 return; 076 } 077 Map categories = new HashMap(); 078 List available = new ArrayList(); 079 for (int i = 0; i < data.getPlugins().length; i++) { 080 PluginMetadata metadata = data.getPlugins()[i]; 081 List list = (List) categories.get(metadata.getCategory()); 082 if(list == null) { 083 list = new ArrayList(); 084 categories.put(metadata.getCategory(), list); 085 } 086 list.add(metadata); 087 } 088 for (Iterator it = categories.entrySet().iterator(); it.hasNext();) { 089 Map.Entry entry = (Map.Entry) it.next(); 090 String category = (String) entry.getKey(); 091 List items = (List) entry.getValue(); 092 out.println(); 093 out.print(DeployUtils.reformat(category, 4, 72)); 094 for (int i = 0; i < items.size(); i++) { 095 PluginMetadata metadata = (PluginMetadata) items.get(i); 096 String prefix = " "; 097 if(!metadata.isInstalled() && metadata.isEligible()) { 098 available.add(metadata); 099 prefix = Integer.toString(available.size()); 100 if(available.size() < 10) { 101 prefix += " "; 102 } 103 prefix += ": "; 104 } 105 out.print(DeployUtils.reformat(prefix+metadata.getName()+" ("+metadata.getVersion()+")", 8, 72)); 106 out.flush(); 107 } 108 } 109 if(available.size() == 0) { 110 out.println(); 111 out.println("No plugins from this site are eligible for installation."); 112 return; 113 } 114 out.println(); 115 out.print("Install Service [enter number or 'q' to quit]: "); 116 out.flush(); 117 BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); 118 String answer = in.readLine(); 119 if(answer.equalsIgnoreCase("q")) { 120 return; 121 } 122 int selection = Integer.parseInt(answer); 123 PluginMetadata target = ((PluginMetadata) available.get(selection - 1)); 124 long start = System.currentTimeMillis(); 125 Object key = mgr.startInstall(PluginList.createInstallList(data, target.getModuleId()), null, null); 126 DownloadResults results = CommandInstallCAR.showProgress(mgr, key); 127 int time = (int)(System.currentTimeMillis() - start) / 1000; 128 out.println(); 129 if(!results.isFailed()) { 130 out.print(DeployUtils.reformat("**** Installation Complete!", 4, 72)); 131 for (int i = 0; i < results.getDependenciesPresent().length; i++) { 132 Artifact uri = results.getDependenciesPresent()[i]; 133 out.print(DeployUtils.reformat("Used existing: "+uri, 4, 72)); 134 } 135 for (int i = 0; i < results.getDependenciesInstalled().length; i++) { 136 Artifact uri = results.getDependenciesInstalled()[i]; 137 out.print(DeployUtils.reformat("Installed new: "+uri, 4, 72)); 138 } 139 out.println(); 140 out.print(DeployUtils.reformat("Downloaded "+(results.getTotalDownloadBytes()/1024)+" kB in "+time+"s ("+results.getTotalDownloadBytes()/(1024*time)+" kB/s)", 4, 72)); 141 } 142 if(results.isFinished() && !results.isFailed()) { 143 out.print(DeployUtils.reformat("Now starting "+target.getModuleId()+"...", 4, 72)); 144 out.flush(); 145 new CommandStart().execute(out, connection, new BaseCommandArgs(new String[]{target.getModuleId().toString()})); 146 } 147 } catch (IOException e) { 148 throw new DeploymentException("Unable to install configuration", e); 149 } catch(NumberFormatException e) { 150 throw new DeploymentException("Invalid response"); 151 } 152 } else { 153 throw new DeploymentException("Cannot list repositories when connected to "+connection.getServerURI()); 154 } 155 } 156 157 private String getRepository(PrintWriter out, BufferedReader in, GeronimoDeploymentManager mgr) throws IOException, DeploymentException { 158 URL[] all = mgr.getRepositories(); 159 if(all.length == 0) { 160 throw new DeploymentException("No default repositories available. Please either specify the repository " + 161 "URL on the command line, or go into the console Plugin page and update the list of available " + 162 "repositories."); 163 } 164 out.println(); 165 out.println("Select repository:"); 166 for (int i = 0; i < all.length; i++) { 167 URL url = all[i]; 168 out.println(" "+(i+1)+". "+url); 169 } 170 out.println(); 171 out.print("Enter Repository Number: "); 172 out.flush(); 173 String entry = in.readLine().trim(); 174 int index = Integer.parseInt(entry); 175 return all[index-1].toString(); 176 } 177 }