source: josm/trunk/src/org/openstreetmap/josm/plugins/ReadLocalPluginInformationTask.java@ 3779

Last change on this file since 3779 was 3730, checked in by bastiK, 13 years ago

improve migration when remotecontrol plugin is removed (set remotecontol.enabled=yes) (see also #5748)

  • Property svn:eol-style set to native
File size: 9.3 KB
Line 
1// License: GPL. For details, see LICENSE file.
2package org.openstreetmap.josm.plugins;
3
4import static org.openstreetmap.josm.tools.I18n.tr;
5
6import java.io.File;
7import java.io.FileInputStream;
8import java.io.FilenameFilter;
9import java.io.IOException;
10import java.util.ArrayList;
11import java.util.Collection;
12import java.util.HashMap;
13import java.util.List;
14import java.util.Map;
15
16import org.openstreetmap.josm.gui.PleaseWaitRunnable;
17import org.openstreetmap.josm.gui.progress.ProgressMonitor;
18import org.openstreetmap.josm.io.OsmTransferException;
19import org.openstreetmap.josm.tools.ImageProvider;
20import org.xml.sax.SAXException;
21
22/**
23 * This is an asynchronous task for reading plugin information from the files
24 * in the local plugin repositories.
25 *
26 * It scans the files in the local plugins repository (see {@see Preferences#getPluginsDirectory()}
27 * and extracts plugin information from three kind of files:
28 * <ul>
29 * <li>.jar-files, assuming that they represent plugin jars</li>
30 * <li>.jar.new-files, assuming that these are downloaded but not yet installed plugins</li>
31 * <li>cached lists of available plugins, downloaded for instance from
32 * <a href="http://josm.openstreetmap.de/plugins">http://josm.openstreetmap.de/plugins</a></li>
33 * </ul>
34 *
35 */
36public class ReadLocalPluginInformationTask extends PleaseWaitRunnable {
37 private Map<String, PluginInformation> availablePlugins;
38 private boolean canceled;
39
40 public ReadLocalPluginInformationTask() {
41 super(tr("Reading local plugin information.."), false);
42 availablePlugins = new HashMap<String, PluginInformation>();
43 }
44
45 public ReadLocalPluginInformationTask(ProgressMonitor monitor) {
46 super(tr("Reading local plugin information.."),monitor, false);
47 availablePlugins = new HashMap<String, PluginInformation>();
48 }
49
50 @Override
51 protected void cancel() {
52 canceled = true;
53 }
54
55 @Override
56 protected void finish() {}
57
58 protected void processJarFile(File f, String pluginName) throws PluginException{
59 PluginInformation info = new PluginInformation(
60 f,
61 pluginName
62 );
63 if (!availablePlugins.containsKey(info.getName())) {
64 info.localversion = info.version;
65 availablePlugins.put(info.getName(), info);
66 } else {
67 availablePlugins.get(info.getName()).localversion = info.version;
68 if (info.icon != null) {
69 availablePlugins.get(info.getName()).icon = info.icon;
70 }
71 }
72 }
73
74 protected void scanSiteCacheFiles(ProgressMonitor monitor, File pluginsDirectory) {
75 File[] siteCacheFiles = pluginsDirectory.listFiles(
76 new FilenameFilter() {
77 public boolean accept(File dir, String name) {
78 return name.matches("^([0-9]+-)?site.*\\.txt$");
79 }
80 }
81 );
82 if (siteCacheFiles == null || siteCacheFiles.length == 0)
83 return;
84 monitor.subTask(tr("Processing plugin site cache files..."));
85 monitor.setTicksCount(siteCacheFiles.length);
86 for (File f: siteCacheFiles) {
87 String fname = f.getName();
88 monitor.setCustomText(tr("Processing file ''{0}''", fname));
89 try {
90 processLocalPluginInformationFile(f);
91 } catch(PluginListParseException e) {
92 System.err.println(tr("Warning: Failed to scan file ''{0}'' for plugin information. Skipping.", fname));
93 e.printStackTrace();
94 }
95 monitor.worked(1);
96 }
97 }
98
99 protected void scanIconCacheFiles(ProgressMonitor monitor, File pluginsDirectory) {
100 File[] siteCacheFiles = pluginsDirectory.listFiles(
101 new FilenameFilter() {
102 public boolean accept(File dir, String name) {
103 return name.matches("^([0-9]+-)?site.*plugin-icons\\.zip$");
104 }
105 }
106 );
107 if (siteCacheFiles == null || siteCacheFiles.length == 0)
108 return;
109 monitor.subTask(tr("Processing plugin site cache icon files..."));
110 monitor.setTicksCount(siteCacheFiles.length);
111 for (File f: siteCacheFiles) {
112 String fname = f.getName();
113 monitor.setCustomText(tr("Processing file ''{0}''", fname));
114 for (PluginInformation pi : availablePlugins.values()) {
115 if (pi.icon == null && pi.iconPath != null) {
116 pi.icon = ImageProvider.getIfAvailable(null, null, null, pi.name+".jar/"+pi.iconPath, f);
117 }
118 }
119 monitor.worked(1);
120 }
121 }
122
123 protected void scanPluginFiles(ProgressMonitor monitor, File pluginsDirectory) {
124 File[] pluginFiles = pluginsDirectory.listFiles(
125 new FilenameFilter() {
126 public boolean accept(File dir, String name) {
127 return name.endsWith(".jar") || name.endsWith(".jar.new");
128 }
129 }
130 );
131 if (pluginFiles == null || pluginFiles.length == 0)
132 return;
133 monitor.subTask(tr("Processing plugin files..."));
134 monitor.setTicksCount(pluginFiles.length);
135 for (File f: pluginFiles) {
136 String fname = f.getName();
137 monitor.setCustomText(tr("Processing file ''{0}''", fname));
138 try {
139 if (fname.endsWith(".jar")) {
140 String pluginName = fname.substring(0, fname.length() - 4);
141 processJarFile(f, pluginName);
142 } else if (fname.endsWith(".jar.new")) {
143 String pluginName = fname.substring(0, fname.length() - 8);
144 processJarFile(f, pluginName);
145 }
146 } catch(PluginException e){
147 System.err.println(tr("Warning: Failed to scan file ''{0}'' for plugin information. Skipping.", fname));
148 e.printStackTrace();
149 }
150 monitor.worked(1);
151 }
152 }
153
154 protected void scanLocalPluginRepository(ProgressMonitor monitor, File pluginsDirectory) {
155 if (pluginsDirectory == null) return;
156 try {
157 monitor.beginTask("");
158 scanSiteCacheFiles(monitor, pluginsDirectory);
159 scanIconCacheFiles(monitor, pluginsDirectory);
160 scanPluginFiles(monitor, pluginsDirectory);
161 } finally {
162 monitor.setCustomText("");
163 monitor.finishTask();
164 }
165 }
166
167 protected void processLocalPluginInformationFile(File file) throws PluginListParseException{
168 FileInputStream fin = null;
169 try {
170 fin = new FileInputStream(file);
171 List<PluginInformation> pis = new PluginListParser().parse(fin);
172 for (PluginInformation pi : pis) {
173 // we always keep plugin information from a plugin site because it
174 // includes information not available in the plugin jars Manifest, i.e.
175 // the download link or localized descriptions
176 //
177 availablePlugins.put(pi.name, pi);
178 }
179 } catch(IOException e) {
180 throw new PluginListParseException(e);
181 } finally {
182 if (fin != null) {
183 try {
184 fin.close();
185 } catch(IOException e){ /* ignore */}
186 }
187 }
188 }
189
190 protected void analyseInProcessPlugins() {
191 for (PluginProxy proxy : PluginHandler.pluginList) {
192 PluginInformation info = proxy.getPluginInformation();
193 if (canceled)return;
194 if (!availablePlugins.containsKey(info.name)) {
195 availablePlugins.put(info.name, info);
196 } else {
197 availablePlugins.get(info.name).localversion = info.localversion;
198 }
199 }
200 }
201
202 protected void filterOldPlugins() {
203 for (PluginHandler.DeprecatedPlugin p : PluginHandler.DEPRECATED_PLUGINS) {
204 if (canceled)return;
205 if (availablePlugins.containsKey(p.name)) {
206 availablePlugins.remove(p.name);
207 }
208 }
209 }
210
211 @Override
212 protected void realRun() throws SAXException, IOException, OsmTransferException {
213 Collection<String> pluginLocations = PluginInformation.getPluginLocations();
214 getProgressMonitor().setTicksCount(pluginLocations.size() + 2);
215 if (canceled) return;
216 for (String location : pluginLocations) {
217 scanLocalPluginRepository(
218 getProgressMonitor().createSubTaskMonitor(1, false),
219 new File(location)
220 );
221 getProgressMonitor().worked(1);
222 if (canceled)return;
223 }
224 analyseInProcessPlugins();
225 getProgressMonitor().worked(1);
226 if (canceled)return;
227 filterOldPlugins();
228 getProgressMonitor().worked(1);
229 }
230
231 /**
232 * Replies information about available plugins detected by this task.
233 *
234 * @return information about available plugins detected by this task.
235 */
236 public List<PluginInformation> getAvailablePlugins() {
237 return new ArrayList<PluginInformation>(availablePlugins.values());
238 }
239
240 /**
241 * Replies true if the task was cancelled by the user
242 *
243 * @return true if the task was cancelled by the user
244 */
245 public boolean isCanceled() {
246 return canceled;
247 }
248}
Note: See TracBrowser for help on using the repository browser.