1 /**
2 *
3 * Copyright 2005 The Apache Software Foundation
4 *
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
8 *
9 * http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 */
17 package org.apache.geronimo.system.plugin;
18
19 import java.net.URL;
20 import java.net.MalformedURLException;
21 import java.util.List;
22 import java.util.ArrayList;
23 import java.io.BufferedReader;
24 import java.io.IOException;
25 import java.io.InputStreamReader;
26 import org.apache.commons.logging.Log;
27 import org.apache.commons.logging.LogFactory;
28 import org.apache.geronimo.kernel.Kernel;
29 import org.apache.geronimo.gbean.AbstractName;
30 import org.apache.geronimo.gbean.GBeanInfo;
31 import org.apache.geronimo.gbean.GBeanInfoBuilder;
32
33 /**
34 * An implementation of PluginRepositoryList that downloads plugins from
35 * an Apache web site.
36 *
37 * @version $Rev: 412620 $ $Date: 2006-06-07 17:04:49 -0700 (Wed, 07 Jun 2006) $
38 */
39 public class PluginRepositoryDownloader implements PluginRepositoryList {
40 private final static Log log = LogFactory.getLog(PluginRepositoryDownloader.class);
41 private List downloadRepositories = new ArrayList();
42 private List userRepositories = new ArrayList();
43 private Kernel kernel;
44 private AbstractName name;
45 private URL repositoryList;
46
47 public PluginRepositoryDownloader(List downloadRepositories, List userRepositories, URL repositoryList, Kernel kernel, AbstractName name) {
48 if(downloadRepositories != null) this.downloadRepositories = downloadRepositories;
49 if(userRepositories != null) this.userRepositories = userRepositories;
50 this.repositoryList = repositoryList;
51 this.kernel = kernel;
52 this.name = name;
53 }
54
55 /**
56 * The list of repositories that were downloaded from central.
57 */
58 public void setDownloadRepositories(List downloadRepositories) {
59 this.downloadRepositories = downloadRepositories;
60 if(this.downloadRepositories == null) this.downloadRepositories = new ArrayList();
61 }
62
63 /**
64 * Any repositories that the user added manually
65 */
66 public void setUserRepositories(List userRepositories) {
67 this.userRepositories = userRepositories;
68 if(this.userRepositories == null) this.userRepositories = new ArrayList();
69 }
70
71 /**
72 * Gets the union of centrally-listed repositories and user-added repositories.
73 */
74 public URL[] getRepositories() {
75 List list = new ArrayList();
76 for (int i = 0; i < downloadRepositories.size(); i++) {
77 String url = (String) downloadRepositories.get(i);
78 try {
79 list.add(new URL(url.trim()));
80 } catch (MalformedURLException e) {
81 log.error("Unable to format plugin repository URL "+url, e);
82 }
83 }
84 for (int i = 0; i < userRepositories.size(); i++) {
85 String url = (String) userRepositories.get(i);
86 try {
87 list.add(new URL(url.trim()));
88 } catch (MalformedURLException e) {
89 log.error("Unable to format plugin repository URL "+url, e);
90 }
91 }
92 return (URL[]) list.toArray(new URL[list.size()]);
93 }
94
95 /**
96 * Go download a fresh copy of the repository list.
97 */
98 public void refresh() {
99 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 }