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.console.car; 018 019 import java.io.IOException; 020 import java.net.URL; 021 import javax.portlet.ActionRequest; 022 import javax.portlet.ActionResponse; 023 import javax.portlet.PortletException; 024 import javax.portlet.PortletSession; 025 import javax.portlet.RenderRequest; 026 import javax.portlet.RenderResponse; 027 import javax.security.auth.login.FailedLoginException; 028 import org.apache.commons.logging.Log; 029 import org.apache.commons.logging.LogFactory; 030 import org.apache.geronimo.console.MultiPageModel; 031 import org.apache.geronimo.console.ajax.ProgressInfo; 032 import org.apache.geronimo.console.util.PortletManager; 033 import org.apache.geronimo.kernel.repository.Artifact; 034 import org.apache.geronimo.system.plugin.PluginList; 035 import org.apache.geronimo.system.plugin.PluginMetadata; 036 import org.apache.geronimo.system.plugin.PluginInstaller; 037 import org.apache.geronimo.system.plugin.DownloadResults; 038 039 /** 040 * Handler for the initial download screen. 041 * 042 * @version $Rev: 476061 $ $Date: 2006-11-17 01:36:50 -0500 (Fri, 17 Nov 2006) $ 043 */ 044 public class DownloadCARHandler extends BaseImportExportHandler { 045 private final static Log log = LogFactory.getLog(DownloadCARHandler.class); 046 047 public DownloadCARHandler() { 048 super(DOWNLOAD_MODE, "/WEB-INF/view/car/download.jsp"); 049 } 050 051 public String actionBeforeView(ActionRequest request, ActionResponse response, MultiPageModel model) throws PortletException, IOException { 052 String configId = request.getParameter("configId"); 053 String repo = request.getParameter("repository"); 054 String user = request.getParameter("repo-user"); 055 String pass = request.getParameter("repo-pass"); 056 response.setRenderParameter("configId", configId); 057 response.setRenderParameter("repository", repo); 058 if(!isEmpty(user)) response.setRenderParameter("repo-user", user); 059 if(!isEmpty(pass)) response.setRenderParameter("repo-pass", pass); 060 061 return getMode(); 062 } 063 064 public void renderView(RenderRequest request, RenderResponse response, MultiPageModel model) throws PortletException, IOException { 065 String configId = request.getParameter("configId"); 066 String repo = request.getParameter("repository"); 067 String user = request.getParameter("repo-user"); 068 String pass = request.getParameter("repo-pass"); 069 PluginMetadata config = null; 070 try { 071 PluginList list = (PluginList) request.getPortletSession(true).getAttribute(CONFIG_LIST_SESSION_KEY); 072 if(list == null) { 073 list = PortletManager.getCurrentServer(request).getPluginInstaller().listPlugins(new URL(repo), user, pass); 074 request.getPortletSession(true).setAttribute(CONFIG_LIST_SESSION_KEY, list); 075 } 076 for (int i = 0; i < list.getPlugins().length; i++) { 077 PluginMetadata metadata = list.getPlugins()[i]; 078 if(metadata.getModuleId().toString().equals(configId)) { 079 config = metadata; 080 break; 081 } 082 } 083 } catch (FailedLoginException e) { 084 throw new PortletException("Invalid login for Maven repository '"+repo+"'", e); 085 } 086 if(config == null) { 087 throw new PortletException("No configuration found for '"+configId+"'"); 088 } 089 request.setAttribute("configId", configId); 090 request.setAttribute("dependencies", config.getDependencies()); 091 request.setAttribute("repository", repo); 092 request.setAttribute("repouser", user); 093 request.setAttribute("repopass", pass); 094 } 095 096 public String actionAfterView(ActionRequest request, ActionResponse response, MultiPageModel model) throws PortletException, IOException { 097 String repo = request.getParameter("repository"); 098 String user = request.getParameter("repo-user"); 099 String pass = request.getParameter("repo-pass"); 100 boolean proceed = Boolean.valueOf(request.getParameter("proceed")).booleanValue(); 101 if(proceed) { 102 String configId = request.getParameter("configId"); 103 104 PluginList installList; 105 try { 106 PluginList list = (PluginList) request.getPortletSession(true).getAttribute(CONFIG_LIST_SESSION_KEY); 107 if(list == null) { 108 list = PortletManager.getCurrentServer(request).getPluginInstaller().listPlugins(new URL(repo), user, pass); 109 request.getPortletSession(true).setAttribute(CONFIG_LIST_SESSION_KEY, list); 110 } 111 installList = PluginList.createInstallList(list, Artifact.create(configId)); 112 } catch (FailedLoginException e) { 113 throw new PortletException("Invalid login for Maven repository '"+repo+"'", e); 114 } 115 if(installList == null) { 116 throw new PortletException("No configuration found for '"+configId+"'"); 117 } 118 119 PluginInstaller configInstaller = PortletManager.getCurrentServer(request).getPluginInstaller(); 120 Object downloadKey = configInstaller.startInstall(installList, user, pass); 121 ProgressInfo progressInfo = new ProgressInfo(); 122 request.getPortletSession(true).setAttribute(ProgressInfo.PROGRESS_INFO_KEY, progressInfo, PortletSession.APPLICATION_SCOPE); 123 // Kick off the download monitoring 124 new Thread(new Installer(configInstaller, downloadKey, progressInfo, request.getPortletSession(true))).start(); 125 126 response.setRenderParameter("configId", configId); 127 response.setRenderParameter("repository", repo); 128 if(!isEmpty(user)) response.setRenderParameter("repo-user", user); 129 if(!isEmpty(pass)) response.setRenderParameter("repo-pass", pass); 130 } 131 return DOWNLOAD_STATUS_MODE+BEFORE_ACTION; 132 } 133 134 public static class Installer implements Runnable { 135 private PluginInstaller configInstaller; 136 private Object downloadKey; 137 private ProgressInfo progressInfo; 138 private PortletSession session; 139 140 public Installer(PluginInstaller configInstaller, Object downloadKey, ProgressInfo progressInfo, PortletSession session) { 141 this.configInstaller = configInstaller; 142 this.downloadKey = downloadKey; 143 this.progressInfo = progressInfo; 144 this.session = session; 145 } 146 147 public void run() { 148 DownloadResults results; 149 150 while (true) { 151 results = configInstaller.checkOnInstall(downloadKey); 152 progressInfo.setMainMessage(results.getCurrentMessage()); 153 progressInfo.setProgressPercent(results.getCurrentFilePercent()); 154 progressInfo.setFinished(results.isFinished()); 155 log.debug(progressInfo.getMainMessage()); 156 if (results.isFinished()) { 157 log.debug("Installation finished"); 158 session.setAttribute(DOWNLOAD_RESULTS_SESSION_KEY, results); 159 break; 160 } else { 161 try { Thread.sleep(1000); } catch (InterruptedException e) { 162 log.error("Download monitor thread interrupted", e); 163 } 164 } 165 } 166 } 167 } 168 }