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.system.plugin;
018
019 import java.net.URL;
020 import java.net.MalformedURLException;
021 import java.util.List;
022 import java.util.ArrayList;
023 import java.io.BufferedReader;
024 import java.io.IOException;
025 import java.io.InputStreamReader;
026 import org.apache.commons.logging.Log;
027 import org.apache.commons.logging.LogFactory;
028 import org.apache.geronimo.kernel.Kernel;
029 import org.apache.geronimo.gbean.AbstractName;
030 import org.apache.geronimo.gbean.GBeanInfo;
031 import org.apache.geronimo.gbean.GBeanInfoBuilder;
032
033 /**
034 * An implementation of PluginRepositoryList that downloads plugins from
035 * an Apache web site.
036 *
037 * @version $Rev: 412620 $ $Date: 2006-06-07 17:04:49 -0700 (Wed, 07 Jun 2006) $
038 */
039 public class PluginRepositoryDownloader implements PluginRepositoryList {
040 private final static Log log = LogFactory.getLog(PluginRepositoryDownloader.class);
041 private List downloadRepositories = new ArrayList();
042 private List userRepositories = new ArrayList();
043 private Kernel kernel;
044 private AbstractName name;
045 private URL repositoryList;
046
047 public PluginRepositoryDownloader(List downloadRepositories, List userRepositories, URL repositoryList, Kernel kernel, AbstractName name) {
048 if(downloadRepositories != null) this.downloadRepositories = downloadRepositories;
049 if(userRepositories != null) this.userRepositories = userRepositories;
050 this.repositoryList = repositoryList;
051 this.kernel = kernel;
052 this.name = name;
053 }
054
055 /**
056 * The list of repositories that were downloaded from central.
057 */
058 public void setDownloadRepositories(List downloadRepositories) {
059 this.downloadRepositories = downloadRepositories;
060 if(this.downloadRepositories == null) this.downloadRepositories = new ArrayList();
061 }
062
063 /**
064 * Any repositories that the user added manually
065 */
066 public void setUserRepositories(List userRepositories) {
067 this.userRepositories = userRepositories;
068 if(this.userRepositories == null) this.userRepositories = new ArrayList();
069 }
070
071 /**
072 * Gets the union of centrally-listed repositories and user-added repositories.
073 */
074 public URL[] getRepositories() {
075 List list = new ArrayList();
076 for (int i = 0; i < downloadRepositories.size(); i++) {
077 String url = (String) downloadRepositories.get(i);
078 try {
079 list.add(new URL(url.trim()));
080 } catch (MalformedURLException e) {
081 log.error("Unable to format plugin repository URL "+url, e);
082 }
083 }
084 for (int i = 0; i < userRepositories.size(); i++) {
085 String url = (String) userRepositories.get(i);
086 try {
087 list.add(new URL(url.trim()));
088 } catch (MalformedURLException e) {
089 log.error("Unable to format plugin repository URL "+url, e);
090 }
091 }
092 return (URL[]) list.toArray(new URL[list.size()]);
093 }
094
095 /**
096 * Go download a fresh copy of the repository list.
097 */
098 public void refresh() {
099 BufferedReader in = null;
100 try {
101 in = new BufferedReader(new InputStreamReader(repositoryList.openStream()));
102 String line;
103 List list = new ArrayList();
104 while((line = in.readLine()) != null) {
105 line = line.trim();
106 if(!line.equals("") && !line.startsWith("#")) {
107 list.add(line);
108 }
109 }
110 in.close();
111 in = null;
112 kernel.setAttribute(name, "downloadRepositories", list);
113 } catch (Exception e) {
114 log.error("Unable to save download repositories", e);
115 } finally {
116 if (in != null) {
117 try {
118 in.close();
119 } catch (IOException ignored) {}
120 }
121 }
122 }
123
124 /**
125 * Adds a new repository that the user put in manually.
126 */
127 public void addUserRepository(URL repo) {
128 userRepositories.add(repo.toString());
129 try {
130 kernel.setAttribute(name, "userRepositories", userRepositories);
131 } catch (Exception e) {
132 log.error("Unable to save user repositories", e);
133 }
134 }
135
136 public static final GBeanInfo GBEAN_INFO;
137
138 static {
139 GBeanInfoBuilder infoFactory = GBeanInfoBuilder.createStatic(PluginRepositoryDownloader.class);
140
141 infoFactory.addAttribute("downloadRepositories", List.class, true);
142 infoFactory.addAttribute("userRepositories", List.class, true);
143 infoFactory.addAttribute("repositoryList", URL.class, true);
144 infoFactory.addAttribute("kernel", Kernel.class, false);
145 infoFactory.addAttribute("abstractName", AbstractName.class, false);
146 infoFactory.addInterface(PluginRepositoryList.class);
147 infoFactory.setConstructor(new String[]{"downloadRepositories","userRepositories","repositoryList","kernel","abstractName"});
148
149 GBEAN_INFO = infoFactory.getBeanInfo();
150 }
151
152 public static GBeanInfo getGBeanInfo() {
153 return GBEAN_INFO;
154 }
155 }