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.system.plugin;
018
019 import java.io.BufferedReader;
020 import java.io.File;
021 import java.io.IOException;
022 import java.io.InputStreamReader;
023 import java.net.MalformedURLException;
024 import java.net.URI;
025 import java.net.URISyntaxException;
026 import java.net.URL;
027 import java.util.ArrayList;
028 import java.util.List;
029
030 import org.apache.commons.logging.Log;
031 import org.apache.commons.logging.LogFactory;
032 import org.apache.geronimo.gbean.AbstractName;
033 import org.apache.geronimo.gbean.GBeanInfo;
034 import org.apache.geronimo.gbean.GBeanInfoBuilder;
035 import org.apache.geronimo.kernel.Kernel;
036
037 /**
038 * An implementation of PluginRepositoryList that downloads plugins from
039 * an Apache web site.
040 *
041 * @version $Rev: 706640 $ $Date: 2008-10-21 14:44:05 +0000 (Tue, 21 Oct 2008) $
042 */
043 public class PluginRepositoryDownloader implements PluginRepositoryList {
044 private final static Log log = LogFactory.getLog(PluginRepositoryDownloader.class);
045 private List<String> downloadRepositories = new ArrayList<String>();
046 private List<String> userRepositories = new ArrayList<String>();
047 private Kernel kernel;
048 private AbstractName name;
049 private URL repositoryList;
050
051 public PluginRepositoryDownloader(List<String> downloadRepositories, List<String> userRepositories, URL repositoryList, Kernel kernel, AbstractName name) {
052 if (downloadRepositories != null) this.downloadRepositories = downloadRepositories;
053 if (userRepositories != null) this.userRepositories = userRepositories;
054 this.repositoryList = repositoryList;
055 this.kernel = kernel;
056 this.name = name;
057 }
058
059 /**
060 * The list of repositories that were downloaded from central.
061 */
062 public void setDownloadRepositories(List<String> downloadRepositories) {
063 this.downloadRepositories = downloadRepositories;
064 if (this.downloadRepositories == null) this.downloadRepositories = new ArrayList<String>();
065 }
066
067 /**
068 * Any repositories that the user added manually
069 */
070 public void setUserRepositories(List<String> userRepositories) {
071 this.userRepositories = userRepositories;
072 if (this.userRepositories == null) this.userRepositories = new ArrayList<String>();
073 }
074
075 /**
076 * Gets the union of centrally-listed repositories and user-added repositories.
077 */
078 public List<URL> getRepositories() {
079 List<URL> list = new ArrayList<URL>();
080 for (String url : downloadRepositories) {
081 url = url.trim();
082 if (!url.endsWith("/")) {
083 url = url + "/";
084 }
085 try {
086 list.add(new URL(url));
087 } catch (MalformedURLException e) {
088 log.error("Unable to format plugin repository URL " + url, e);
089 }
090 }
091 for (String userRepository : userRepositories) {
092 userRepository = userRepository.trim();
093 URL url = null;
094 try {
095 url = resolveRepository(userRepository).toURL();
096 } catch (MalformedURLException e) {
097 log.error("Unable to format plugin repository URL " + userRepository, e);
098 }
099 if (url != null) {
100 list.add(url);
101 }
102 }
103 return list;
104 }
105
106 static URI resolveRepository(String userRepository) {
107 if (!userRepository.endsWith("/")) {
108 userRepository = userRepository + "/";
109 }
110 try {
111 URI uri = new URI(userRepository);
112 if (!uri.isAbsolute()) {
113 if (userRepository.startsWith("/")) {
114 return new URI("file", userRepository, null);
115 } else if (userRepository.startsWith("~")) {
116 return new File(System.getProperty("user.home")).getAbsoluteFile().toURI().resolve(userRepository.substring(2));
117 } else {
118 log.error("Can't interpret path: " + userRepository);
119 }
120 } else {
121 return uri;
122 }
123 } catch (URISyntaxException e) {
124 log.error("Unable to format plugin repository URL " + userRepository, e);
125 }
126 return null;
127 }
128
129 /**
130 * Go download a fresh copy of the repository list.
131 */
132 public void refresh() {
133 BufferedReader in = null;
134 try {
135 in = new BufferedReader(new InputStreamReader(repositoryList.openStream()));
136 String line;
137 List<String> list = new ArrayList<String>();
138 while ((line = in.readLine()) != null) {
139 line = line.trim();
140 if (!line.equals("") && !line.startsWith("#")) {
141 list.add(line);
142 }
143 }
144 in.close();
145 in = null;
146 //this saves the new value in config.xml
147 kernel.setAttribute(name, "downloadRepositories", list);
148 } catch (Exception e) {
149 log.error("Unable to save download repositories", e);
150 } finally {
151 if (in != null) {
152 try {
153 in.close();
154 } catch (IOException ignored) {
155 }
156 }
157 }
158 }
159
160 /**
161 * Adds a new repository that the user put in manually.
162 */
163 public void addUserRepository(URL repo) {
164 userRepositories.add(repo.toString());
165 try {
166 kernel.setAttribute(name, "userRepositories", userRepositories);
167 } catch (Exception e) {
168 log.error("Unable to save user repositories", e);
169 }
170 }
171
172 public static final GBeanInfo GBEAN_INFO;
173
174 static {
175 GBeanInfoBuilder infoFactory = GBeanInfoBuilder.createStatic(PluginRepositoryDownloader.class);
176
177 infoFactory.addAttribute("downloadRepositories", List.class, true);
178 infoFactory.addAttribute("userRepositories", List.class, true);
179 infoFactory.addAttribute("repositoryList", URL.class, true);
180 infoFactory.addAttribute("kernel", Kernel.class, false);
181 infoFactory.addAttribute("abstractName", AbstractName.class, false);
182 infoFactory.addInterface(PluginRepositoryList.class);
183 infoFactory.setConstructor(new String[]{"downloadRepositories", "userRepositories", "repositoryList", "kernel", "abstractName"});
184
185 GBEAN_INFO = infoFactory.getBeanInfo();
186 }
187
188 public static GBeanInfo getGBeanInfo() {
189 return GBEAN_INFO;
190 }
191 }