Statistics
| Revision:

root / tags / v2_0_0_Build_2047 / extensions / org.gvsig.installer / org.gvsig.installer / org.gvsig.installer.lib / org.gvsig.installer.lib.impl / src / main / java / org / gvsig / installer / lib / impl / creation / DefaultMakePluginPackageService.java @ 38358

History | View | Annotate | Download (13.9 KB)

1 32269 jpiera
/* gvSIG. Geographic Information System of the Valencian Government
2 32285 jpiera
 *
3
 * Copyright (C) 2007-2008 Infrastructures and Transports Department
4
 * of the Valencian Government (CIT)
5
 *
6
 * This program is free software; you can redistribute it and/or
7
 * modify it under the terms of the GNU General Public License
8
 * as published by the Free Software Foundation; either version 2
9
 * of the License, or (at your option) any later version.
10
 *
11
 * This program is distributed in the hope that it will be useful,
12
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
 * GNU General Public License for more details.
15
 *
16
 * You should have received a copy of the GNU General Public License
17
 * along with this program; if not, write to the Free Software
18
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
19
 * MA  02110-1301, USA.
20
 *
21
 */
22 32269 jpiera
23
/*
24 32285 jpiera
 * AUTHORS (In addition to CIT):
25
 * 2010 {Prodevelop}   {Task}
26
 */
27
28 32269 jpiera
package org.gvsig.installer.lib.impl.creation;
29
30 32411 jpiera
import java.io.BufferedReader;
31 32296 jpiera
import java.io.ByteArrayInputStream;
32 32269 jpiera
import java.io.File;
33 32285 jpiera
import java.io.FileInputStream;
34 32290 jpiera
import java.io.FileOutputStream;
35 32411 jpiera
import java.io.FileReader;
36 32290 jpiera
import java.io.IOException;
37
import java.io.InputStream;
38 34974 nfrancisco
import java.io.InputStreamReader;
39 32269 jpiera
import java.io.OutputStream;
40 34974 nfrancisco
import java.net.URL;
41
import java.net.URLConnection;
42 32411 jpiera
import java.util.ArrayList;
43
import java.util.List;
44 32269 jpiera
45 33686 cordinyana
import org.gvsig.installer.lib.api.InstallerManager;
46 32562 jpiera
import org.gvsig.installer.lib.api.PackageInfo;
47
import org.gvsig.installer.lib.api.creation.MakePluginPackageService;
48
import org.gvsig.installer.lib.api.creation.MakePluginPackageServiceException;
49
import org.gvsig.installer.lib.impl.DefaultPackageInfo;
50 35486 nfrancisco
import org.gvsig.installer.lib.impl.utils.DeleteFile;
51 32627 jpiera
import org.gvsig.installer.lib.spi.InstallPackageProviderServices;
52 32498 jpiera
import org.gvsig.installer.lib.spi.InstallerProviderLocator;
53 32400 jpiera
import org.gvsig.tools.service.Manager;
54 37822 nfrancisco
import org.slf4j.Logger;
55
import org.slf4j.LoggerFactory;
56 32269 jpiera
57
/**
58
 * @author <a href="mailto:jpiera@gvsig.org">Jorge Piera Llodr&aacute;</a>
59
 */
60 33686 cordinyana
public class DefaultMakePluginPackageService implements
61 34160 cordinyana
                MakePluginPackageService {
62 32562 jpiera
63 34160 cordinyana
        private static final Logger LOG = LoggerFactory
64
                        .getLogger(DefaultMakePluginPackageService.class);
65 34019 cordinyana
66 34160 cordinyana
        public static final String ANT_FILE_NAME = "install.xml";
67
        public static final String COPIED_FILES_DIRECTORY_NAME = "files";
68
        private static final Logger logger = org.slf4j.LoggerFactory
69
                        .getLogger(DefaultMakePluginPackageService.class);
70
        private final InstallerManager manager;
71 32562 jpiera
72 34160 cordinyana
        private List<PackageInfo> installerInfos = null;
73 32562 jpiera
74 34160 cordinyana
        protected String antScript = null;
75
        private InstallPackageProviderServices installerProviderServices = null;
76 32269 jpiera
77 37822 nfrancisco
        public DefaultMakePluginPackageService(InstallerManager manager)
78
                        throws MakePluginPackageServiceException {
79 34160 cordinyana
                super();
80
                this.manager = manager;
81 37822 nfrancisco
                this.installerInfos = new ArrayList<PackageInfo>();
82
                this.installerProviderServices = InstallerProviderLocator
83 34160 cordinyana
                                .getProviderManager().createInstallerProviderServices();
84 37822 nfrancisco
                initialize();
85 34160 cordinyana
        }
86 32290 jpiera
87 37822 nfrancisco
        private void initialize() throws MakePluginPackageServiceException {
88
89
                List<File> addonFolders = manager.getAddonFolders();
90
91
                if (addonFolders == null) {
92 34160 cordinyana
                        throw new MakePluginPackageServiceException(
93 37822 nfrancisco
                                        "The addonFolders list is null");
94 34160 cordinyana
                }
95 37822 nfrancisco
                // else if (addonFolders.size() <= 0) {
96
                // LOG.info("The addonFolders list is empty");
97
                // }
98
                else {
99
                        // Read all the installed plugins
100
                        for (int i = 0; i < addonFolders.size(); i++) {
101
                                File pluginDirectoryFile = addonFolders.get(i);
102 34947 cordinyana
103 37822 nfrancisco
                                if (!pluginDirectoryFile.exists()) {
104
                                        pluginDirectoryFile.mkdirs();
105
                                        LOG.info("Plugins folder created: {}", pluginDirectoryFile);
106
                                }
107 32562 jpiera
108 34160 cordinyana
                                DefaultPackageInfo packageInfo = new DefaultPackageInfo();
109 32562 jpiera
110 34160 cordinyana
                                installerProviderServices.readPackageInfo(new File(
111
                                                pluginDirectoryFile.getAbsolutePath()), packageInfo);
112 32597 jpiera
113 34160 cordinyana
                                // Checks if the ant file exists
114
                                File antFile = getAntFile(pluginDirectoryFile);
115
                                if (antFile.exists()) {
116
                                        try {
117 34974 nfrancisco
                                                packageInfo.setAntScript(readFileAsString(antFile
118 34160 cordinyana
                                                                .getAbsolutePath()));
119
                                        } catch (IOException e) {
120
                                                logger.error("Not possible to read the ant file");
121
                                        }
122
                                }
123 32597 jpiera
124 34160 cordinyana
                                // Checks if there are files to copy
125
                                File copiedFilesDirectory = getCopiedFilesDirectory(pluginDirectoryFile);
126
                                if (copiedFilesDirectory.exists()) {
127
                                        loadCopiedFiles(copiedFilesDirectory, copiedFilesDirectory,
128
                                                        packageInfo);
129
                                }
130 32597 jpiera
131 34160 cordinyana
                                installerInfos.add(packageInfo);
132
                        }
133
                }
134
        }
135 32597 jpiera
136 34160 cordinyana
        private void loadCopiedFiles(File file, File filesDirectory,
137
                        PackageInfo packageInfo) throws MakePluginPackageServiceException {
138
                if (file.isDirectory()) {
139
                        File[] files = file.listFiles();
140
                        for (int i = 0; i < files.length; i++) {
141
                                loadCopiedFiles(files[i], filesDirectory, packageInfo);
142
                        }
143
                } else {
144 37599 nfrancisco
                        // Removing the plugin prefix
145 32597 jpiera
146 37599 nfrancisco
                        String pluginFileName = file.getAbsolutePath().substring(
147
                                        filesDirectory.getAbsolutePath().length(),
148
                                        file.getAbsolutePath().length());
149 32597 jpiera
150 37822 nfrancisco
                        File pluginFile = new File(System.getProperty("user.dir")
151 37599 nfrancisco
                                        + pluginFileName);
152
153
                        packageInfo.getFilesToCopy().add(pluginFile);
154 34160 cordinyana
                }
155
        }
156 32562 jpiera
157 34160 cordinyana
        public void createPackageSet(PackageInfo packageInfo,
158
                        OutputStream packageStream)
159
                        throws MakePluginPackageServiceException {
160 32562 jpiera
161 34160 cordinyana
                LOG.debug("Creating a package set of the package info: \n{0}",
162
                                packageInfo);
163 34019 cordinyana
164 34160 cordinyana
                String pluginFileName = manager.getPackageFileName(packageInfo);
165
                installerProviderServices.compressPackageSet(
166
                                getAbsolutePluginPackageDirectory(packageInfo), pluginFileName,
167
                                packageStream);
168
        }
169 34005 cordinyana
170 37822 nfrancisco
        public void preparePackage(PackageInfo packageInfo, File originalPluginDir)
171 37599 nfrancisco
                        throws MakePluginPackageServiceException {
172 32285 jpiera
173 37599 nfrancisco
                LOG.debug("Preparing a package set of the package info: \n{0}",
174
                                packageInfo);
175 37822 nfrancisco
176 37599 nfrancisco
                // Write the package.info file
177 37829 nfrancisco
                writePackageInfo(packageInfo);
178 32423 jpiera
179 37599 nfrancisco
                if (packageInfo.getAntScript() != null) {
180
                        // Create the ant file
181
                        writeAntFile(packageInfo);
182
183
                        // Copy the selected files
184
                        writeSelectedFiles(packageInfo);
185
                }
186
        }
187
188 34160 cordinyana
        public void createPackage(PackageInfo packageInfo,
189
                        OutputStream packageStream)
190
                        throws MakePluginPackageServiceException {
191 34019 cordinyana
192 37829 nfrancisco
                LOG.debug("Creating package of the package info: \n{0}", packageInfo);
193
                installerProviderServices.compressPackage(
194
                                getAbsolutePluginPackageDirectory(packageInfo), packageStream);
195 34160 cordinyana
        }
196 32562 jpiera
197 37599 nfrancisco
        public void createPackageIndex(PackageInfo packageInfo,
198
                        OutputStream packageStream)
199
                        throws MakePluginPackageServiceException {
200
                LOG.debug("Creating package index of the package info: \n{0}",
201
                                packageInfo);
202 34444 cordinyana
203 37599 nfrancisco
                installerProviderServices.compressPackageIndex(
204
                                getAbsolutePluginPackageDirectory(packageInfo), packageStream);
205
        }
206 34444 cordinyana
207 34160 cordinyana
        private void writePackageInfo(PackageInfo packageInfo)
208
                        throws MakePluginPackageServiceException {
209 37822 nfrancisco
                // conseguir directorio destino
210 34160 cordinyana
                writePackageInfo(packageInfo,
211
                                getAbsolutePluginPackageDirectory(packageInfo));
212
        }
213 32562 jpiera
214 34160 cordinyana
        public void writePackageInfo(PackageInfo packageInfo, File folder)
215
                        throws MakePluginPackageServiceException {
216
                installerProviderServices.writePackageInfo(folder, packageInfo);
217
        }
218 33697 cordinyana
219 37599 nfrancisco
        public void writePackageInfoForIndex(PackageInfo packageInfo, File folder)
220
                        throws MakePluginPackageServiceException {
221
                installerProviderServices.writePackageInfoForIndex(folder, packageInfo);
222
        }
223 34444 cordinyana
224 37599 nfrancisco
        private void createInstallDirInPluginDir(PackageInfo packageInfo)
225
                        throws MakePluginPackageServiceException {
226
                File pluginDirectory;
227
                pluginDirectory = getAbsolutePluginPackageDirectory(packageInfo);
228
                File installdir = new File(pluginDirectory, "install");
229
                installdir.mkdir();
230 34974 nfrancisco
231 37599 nfrancisco
        }
232
233 34160 cordinyana
        private void writeAntFile(PackageInfo packageInfo)
234
                        throws MakePluginPackageServiceException {
235
                try {
236 37599 nfrancisco
                        createInstallDirInPluginDir(packageInfo);
237 34160 cordinyana
                        ByteArrayInputStream in = new ByteArrayInputStream(packageInfo
238
                                        .getAntScript().getBytes());
239
                        OutputStream out = new FileOutputStream(
240
                                        getAbsoluteAntFile(packageInfo));
241 32562 jpiera
242 34160 cordinyana
                        // Copy the bits from instream to outstream
243
                        byte[] buf = new byte[1024];
244
                        int len;
245
                        while ((len = in.read(buf)) > 0) {
246
                                out.write(buf, 0, len);
247
                        }
248
                        in.close();
249
                        out.close();
250
                } catch (IOException e) {
251
                        throw new MakePluginPackageServiceException(
252
                                        "Exception writing the ant file");
253
                }
254 32285 jpiera
255 34160 cordinyana
        }
256 32296 jpiera
257 37599 nfrancisco
        private void writeSelectedFiles(PackageInfo packageInfo)
258
                        throws MakePluginPackageServiceException {
259
                try {
260
                        createInstallDirInPluginDir(packageInfo);
261
                        String copiedFilesDirectoryName = getAbsoulteCopiedFilesDirectoryName(packageInfo);
262 32597 jpiera
263 37599 nfrancisco
                        // Deleting the previous files folder
264
                        File copiedFilesDirectoryfile = new File(copiedFilesDirectoryName);
265
                        deleteDirectory(copiedFilesDirectoryfile);
266 32296 jpiera
267 37599 nfrancisco
                        // It works if the plugins directory is in the folder
268
                        // "gvSIG/extensiones"
269 37822 nfrancisco
                        String applicationDirectory = System.getProperty("user.dir");
270 32562 jpiera
271 37599 nfrancisco
                        List<File> files = packageInfo.getFilesToCopy();
272 32290 jpiera
273 37599 nfrancisco
                        for (int i = 0; i < files.size(); i++) {
274
                                String sourceFile = files.get(i).getAbsolutePath();
275 32597 jpiera
276 37599 nfrancisco
                                // Create the final path
277
                                String destFile = sourceFile.substring(applicationDirectory
278
                                                .length(), sourceFile.length());
279
                                destFile = copiedFilesDirectoryName + destFile;
280 32597 jpiera
281 37599 nfrancisco
                                // Copy the files
282
                                copy(new File(sourceFile), new File(destFile));
283
                        }
284
                } catch (IOException e) {
285
                        throw new MakePluginPackageServiceException(
286
                                        "Exception copying the files", e);
287
                }
288
        }
289 35486 nfrancisco
290 34160 cordinyana
        static public boolean deleteDirectory(File path) {
291
                if (path.exists()) {
292
                        File[] files = path.listFiles();
293
                        for (int i = 0; i < files.length; i++) {
294
                                if (files[i].isDirectory()) {
295
                                        deleteDirectory(files[i]);
296
                                } else {
297
                                        files[i].delete();
298
                                }
299
                        }
300
                }
301
                return (path.delete());
302
        }
303 32423 jpiera
304 37822 nfrancisco
        private void copy(File sourceLocation, File targetLocation)
305
                        throws IOException {
306 34160 cordinyana
                if (sourceLocation.isDirectory()) {
307
                        if (!targetLocation.exists()) {
308
                                targetLocation.mkdir();
309
                        }
310 32290 jpiera
311 34160 cordinyana
                        String[] children = sourceLocation.list();
312
                        for (int i = 0; i < children.length; i++) {
313
                                copy(new File(sourceLocation, children[i]), new File(
314
                                                targetLocation, children[i]));
315
                        }
316
                } else {
317
                        targetLocation.getParentFile().mkdirs();
318 32423 jpiera
319 34160 cordinyana
                        InputStream in = new FileInputStream(sourceLocation);
320
                        OutputStream out = new FileOutputStream(targetLocation);
321 32411 jpiera
322 34160 cordinyana
                        // Copy the bits from instream to outstream
323
                        byte[] buf = new byte[1024];
324
                        int len;
325
                        while ((len = in.read(buf)) > 0) {
326
                                out.write(buf, 0, len);
327
                        }
328
                        in.close();
329
                        out.close();
330
                }
331
        }
332 32411 jpiera
333 34160 cordinyana
        private File getCopiedFilesDirectory(File pluginDirectory)
334
                        throws MakePluginPackageServiceException {
335 37599 nfrancisco
                return new File(pluginDirectory.getAbsolutePath() + File.separator
336
                                + "install" + File.separator + COPIED_FILES_DIRECTORY_NAME);
337 34160 cordinyana
        }
338 32290 jpiera
339 34160 cordinyana
        private String getAbsoulteCopiedFilesDirectoryName(PackageInfo packageInfo)
340
                        throws MakePluginPackageServiceException {
341
                return getAbsolutePluginPackageDirectory(packageInfo).getAbsolutePath()
342 37599 nfrancisco
                                + File.separator + "install" + File.separator
343
                                + COPIED_FILES_DIRECTORY_NAME;
344 34160 cordinyana
        }
345 32290 jpiera
346 34160 cordinyana
        private File getAntFile(File pluginDirectory)
347
                        throws MakePluginPackageServiceException {
348 37599 nfrancisco
                return new File(pluginDirectory.getAbsolutePath() + File.separator
349
                                + "install" + File.separator + ANT_FILE_NAME);
350 34160 cordinyana
        }
351 32290 jpiera
352 34160 cordinyana
        private File getAbsoluteAntFile(PackageInfo packageInfo)
353
                        throws MakePluginPackageServiceException {
354 37829 nfrancisco
                String destinationFilePath = manager.getDefaultLocalAddonRepository()
355 37822 nfrancisco
                                .getAbsolutePath()
356
                                + File.separator + packageInfo.getCode();
357 38238 jjdelcerro
                return new File(destinationFilePath + File.separator + "install" + File.separator  + ANT_FILE_NAME);
358 34160 cordinyana
        }
359 32290 jpiera
360 34160 cordinyana
        private File getAbsolutePluginPackageDirectory(PackageInfo packageInfo)
361
                        throws MakePluginPackageServiceException {
362 37829 nfrancisco
                String destinationFilePath = manager.getDefaultLocalAddonRepository()
363 37822 nfrancisco
                                .getAbsolutePath()
364
                                + File.separator + packageInfo.getCode();
365
                return new File(destinationFilePath);
366 34160 cordinyana
        }
367 32269 jpiera
368 34160 cordinyana
        public Manager getManager() {
369
                return this.manager;
370
        }
371 32597 jpiera
372 34160 cordinyana
        public PackageInfo getPluginPackageInfo(int index) {
373
                if (index >= installerInfos.size()) {
374
                        return null;
375
                }
376
                return installerInfos.get(index);
377
        }
378 32290 jpiera
379 34160 cordinyana
        public PackageInfo getPluginPackageInfo(String code) {
380
                for (int i = 0; i < getPluginPackageCount(); i++) {
381
                        if (installerInfos.get(i).getCode() != null
382
                                        && installerInfos.get(i).getCode().equals(code)) {
383
                                return installerInfos.get(i);
384
                        }
385
                }
386 34230 cordinyana
                PackageInfo info = new DefaultPackageInfo();
387
                info.setCode(code);
388
                return info;
389 34160 cordinyana
        }
390 32423 jpiera
391 34160 cordinyana
        public int getPluginPackageCount() {
392
                return installerInfos.size();
393
        }
394 32597 jpiera
395 34160 cordinyana
        public String getDefaultAntScript()
396
                        throws MakePluginPackageServiceException {
397
                try {
398 37599 nfrancisco
                        URL resource = getClass().getResource(ANT_FILE_NAME);
399
                        return readUrlAsString(resource);
400 34160 cordinyana
                } catch (IOException e) {
401
                        throw new MakePluginPackageServiceException(
402
                                        "Impossible to read the default ant file", e);
403
                }
404
        }
405 32269 jpiera
406 37599 nfrancisco
        private String readUrlAsString(URL url) throws java.io.IOException {
407
                URLConnection urlConnection = url.openConnection();
408
                InputStream inputStream = urlConnection.getInputStream();
409
                BufferedReader bufferedReader = new BufferedReader(
410
                                new InputStreamReader(inputStream));
411
                StringBuffer fileData = new StringBuffer(1000);
412
                String line = bufferedReader.readLine();
413
                while (line != null) {
414
                        fileData.append(line + "\n");
415
                        line = bufferedReader.readLine();
416
                }
417
                bufferedReader.close();
418
                return fileData.toString();
419
        }
420 32290 jpiera
421 37599 nfrancisco
        private String readFileAsString(String filePath) throws java.io.IOException {
422
                StringBuffer fileData = new StringBuffer(1000);
423
                BufferedReader reader = new BufferedReader(new FileReader(filePath));
424
                char[] buf = new char[1024];
425
                int numRead = 0;
426
                while ((numRead = reader.read(buf)) != -1) {
427
                        String readData = String.valueOf(buf, 0, numRead);
428
                        fileData.append(readData);
429
                        buf = new char[1024];
430
                }
431
                reader.close();
432
                return fileData.toString();
433
        }
434 34974 nfrancisco
435 34160 cordinyana
        public PackageInfo[] getInstalledPackages()
436
                        throws MakePluginPackageServiceException {
437
                return installerInfos.toArray(new PackageInfo[installerInfos.size()]);
438
        }
439 34444 cordinyana
440 37599 nfrancisco
        public File getPluginFolder(PackageInfo packageInfo)
441
                        throws MakePluginPackageServiceException {
442
                return getAbsolutePluginPackageDirectory(packageInfo);
443
        }
444 35486 nfrancisco
445 37599 nfrancisco
        public boolean deleteDir(File folder) {
446
                DeleteFile file = new DeleteFile();
447
                return file.delete(folder);
448
        }
449
450 32269 jpiera
}