Statistics
| Revision:

svn-gvsig-desktop / trunk / org.gvsig.desktop / org.gvsig.desktop.library / org.gvsig.installer / org.gvsig.installer.lib / org.gvsig.installer.lib.impl / src / main / java / org / gvsig / installer / lib / impl / creation / DefaultMakePluginPackageService.java @ 40560

History | View | Annotate | Download (13.9 KB)

1
/**
2
 * gvSIG. Desktop Geographic Information System.
3
 *
4
 * Copyright (C) 2007-2013 gvSIG Association.
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 3
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
 * For any additional information, do not hesitate to contact us
22
 * at info AT gvsig.com, or visit our website www.gvsig.com.
23
 */
24
/*
25
 * AUTHORS (In addition to CIT):
26
 * 2010 {Prodevelop}   {Task}
27
 */
28

    
29
package org.gvsig.installer.lib.impl.creation;
30

    
31
import java.io.BufferedReader;
32
import java.io.ByteArrayInputStream;
33
import java.io.File;
34
import java.io.FileInputStream;
35
import java.io.FileOutputStream;
36
import java.io.FileReader;
37
import java.io.IOException;
38
import java.io.InputStream;
39
import java.io.InputStreamReader;
40
import java.io.OutputStream;
41
import java.net.URL;
42
import java.net.URLConnection;
43
import java.util.ArrayList;
44
import java.util.List;
45

    
46
import org.gvsig.installer.lib.api.InstallerManager;
47
import org.gvsig.installer.lib.api.PackageInfo;
48
import org.gvsig.installer.lib.api.creation.MakePluginPackageService;
49
import org.gvsig.installer.lib.api.creation.MakePluginPackageServiceException;
50
import org.gvsig.installer.lib.impl.DefaultPackageInfo;
51
import org.gvsig.installer.lib.impl.utils.DeleteFile;
52
import org.gvsig.installer.lib.spi.InstallPackageProviderServices;
53
import org.gvsig.installer.lib.spi.InstallerProviderLocator;
54
import org.gvsig.tools.service.Manager;
55
import org.slf4j.Logger;
56
import org.slf4j.LoggerFactory;
57

    
58
/**
59
 * @author <a href="mailto:jpiera@gvsig.org">Jorge Piera Llodr&aacute;</a>
60
 */
61
public class DefaultMakePluginPackageService implements
62
                MakePluginPackageService {
63

    
64
        private static final Logger LOG = LoggerFactory
65
                        .getLogger(DefaultMakePluginPackageService.class);
66

    
67
        public static final String ANT_FILE_NAME = "install.xml";
68
        public static final String COPIED_FILES_DIRECTORY_NAME = "files";
69
        private static final Logger logger = org.slf4j.LoggerFactory
70
                        .getLogger(DefaultMakePluginPackageService.class);
71
        private final InstallerManager manager;
72

    
73
        private List<PackageInfo> installerInfos = null;
74

    
75
        protected String antScript = null;
76
        private InstallPackageProviderServices installerProviderServices = null;
77

    
78
        public DefaultMakePluginPackageService(InstallerManager manager)
79
                        throws MakePluginPackageServiceException {
80
                super();
81
                this.manager = manager;
82
                this.installerInfos = new ArrayList<PackageInfo>();
83
                this.installerProviderServices = InstallerProviderLocator
84
                                .getProviderManager().createInstallerProviderServices();
85
                initialize();
86
        }
87

    
88
        private void initialize() throws MakePluginPackageServiceException {
89

    
90
                List<File> addonFolders = manager.getAddonFolders();
91

    
92
                if (addonFolders == null) {
93
                        throw new MakePluginPackageServiceException(
94
                                        "The addonFolders list is null");
95
                }
96
                // else if (addonFolders.size() <= 0) {
97
                // LOG.info("The addonFolders list is empty");
98
                // }
99
                else {
100
                        // Read all the installed plugins
101
                        for (int i = 0; i < addonFolders.size(); i++) {
102
                                File pluginDirectoryFile = addonFolders.get(i);
103

    
104
                                if (!pluginDirectoryFile.exists()) {
105
                                        pluginDirectoryFile.mkdirs();
106
                                        LOG.info("Plugins folder created: {}", pluginDirectoryFile);
107
                                }
108

    
109
                                DefaultPackageInfo packageInfo = new DefaultPackageInfo();
110

    
111
                                installerProviderServices.readPackageInfo(new File(
112
                                                pluginDirectoryFile.getAbsolutePath()), packageInfo);
113

    
114
                                // Checks if the ant file exists
115
                                File antFile = getAntFile(pluginDirectoryFile);
116
                                if (antFile.exists()) {
117
                                        try {
118
                                                packageInfo.setAntScript(readFileAsString(antFile
119
                                                                .getAbsolutePath()));
120
                                        } catch (IOException e) {
121
                                                logger.error("Not possible to read the ant file");
122
                                        }
123
                                }
124

    
125
                                // Checks if there are files to copy
126
                                File copiedFilesDirectory = getCopiedFilesDirectory(pluginDirectoryFile);
127
                                if (copiedFilesDirectory.exists()) {
128
                                        loadCopiedFiles(copiedFilesDirectory, copiedFilesDirectory,
129
                                                        packageInfo);
130
                                }
131

    
132
                                installerInfos.add(packageInfo);
133
                        }
134
                }
135
        }
136

    
137
        private void loadCopiedFiles(File file, File filesDirectory,
138
                        PackageInfo packageInfo) throws MakePluginPackageServiceException {
139
                if (file.isDirectory()) {
140
                        File[] files = file.listFiles();
141
                        for (int i = 0; i < files.length; i++) {
142
                                loadCopiedFiles(files[i], filesDirectory, packageInfo);
143
                        }
144
                } else {
145
                        // Removing the plugin prefix
146

    
147
                        String pluginFileName = file.getAbsolutePath().substring(
148
                                        filesDirectory.getAbsolutePath().length(),
149
                                        file.getAbsolutePath().length());
150

    
151
                        File pluginFile = new File(System.getProperty("user.dir")
152
                                        + pluginFileName);
153

    
154
                        packageInfo.getFilesToCopy().add(pluginFile);
155
                }
156
        }
157

    
158
        public void createPackageSet(PackageInfo packageInfo,
159
                        OutputStream packageStream)
160
                        throws MakePluginPackageServiceException {
161

    
162
                LOG.debug("Creating a package set of the package info: \n{0}",
163
                                packageInfo);
164

    
165
                String pluginFileName = manager.getPackageFileName(packageInfo);
166
                installerProviderServices.compressPackageSet(
167
                                getAbsolutePluginPackageDirectory(packageInfo), pluginFileName,
168
                                packageStream);
169
        }
170

    
171
        public void preparePackage(PackageInfo packageInfo, File originalPluginDir)
172
                        throws MakePluginPackageServiceException {
173

    
174
                LOG.debug("Preparing a package set of the package info: \n{0}",
175
                                packageInfo);
176

    
177
                // Write the package.info file
178
                writePackageInfo(packageInfo);
179

    
180
                if (packageInfo.getAntScript() != null) {
181
                        // Create the ant file
182
                        writeAntFile(packageInfo);
183

    
184
                        // Copy the selected files
185
                        writeSelectedFiles(packageInfo);
186
                }
187
        }
188

    
189
        public void createPackage(PackageInfo packageInfo,
190
                        OutputStream packageStream)
191
                        throws MakePluginPackageServiceException {
192

    
193
                LOG.debug("Creating package of the package info: \n{0}", packageInfo);
194
                installerProviderServices.compressPackage(
195
                                getAbsolutePluginPackageDirectory(packageInfo), packageStream);
196
        }
197

    
198
        public void createPackageIndex(PackageInfo packageInfo,
199
                        OutputStream packageStream)
200
                        throws MakePluginPackageServiceException {
201
                LOG.debug("Creating package index of the package info: \n{0}",
202
                                packageInfo);
203

    
204
                installerProviderServices.compressPackageIndex(
205
                                getAbsolutePluginPackageDirectory(packageInfo), packageStream);
206
        }
207

    
208
        private void writePackageInfo(PackageInfo packageInfo)
209
                        throws MakePluginPackageServiceException {
210
                // conseguir directorio destino
211
                writePackageInfo(packageInfo,
212
                                getAbsolutePluginPackageDirectory(packageInfo));
213
        }
214

    
215
        public void writePackageInfo(PackageInfo packageInfo, File folder)
216
                        throws MakePluginPackageServiceException {
217
                installerProviderServices.writePackageInfo(folder, packageInfo);
218
        }
219

    
220
        public void writePackageInfoForIndex(PackageInfo packageInfo, File folder)
221
                        throws MakePluginPackageServiceException {
222
                installerProviderServices.writePackageInfoForIndex(folder, packageInfo);
223
        }
224

    
225
        private void createInstallDirInPluginDir(PackageInfo packageInfo)
226
                        throws MakePluginPackageServiceException {
227
                File pluginDirectory;
228
                pluginDirectory = getAbsolutePluginPackageDirectory(packageInfo);
229
                File installdir = new File(pluginDirectory, "install");
230
                installdir.mkdir();
231

    
232
        }
233

    
234
        private void writeAntFile(PackageInfo packageInfo)
235
                        throws MakePluginPackageServiceException {
236
                try {
237
                        createInstallDirInPluginDir(packageInfo);
238
                        ByteArrayInputStream in = new ByteArrayInputStream(packageInfo
239
                                        .getAntScript().getBytes());
240
                        OutputStream out = new FileOutputStream(
241
                                        getAbsoluteAntFile(packageInfo));
242

    
243
                        // Copy the bits from instream to outstream
244
                        byte[] buf = new byte[1024];
245
                        int len;
246
                        while ((len = in.read(buf)) > 0) {
247
                                out.write(buf, 0, len);
248
                        }
249
                        in.close();
250
                        out.close();
251
                } catch (IOException e) {
252
                        throw new MakePluginPackageServiceException(
253
                                        "Exception writing the ant file");
254
                }
255

    
256
        }
257

    
258
        private void writeSelectedFiles(PackageInfo packageInfo)
259
                        throws MakePluginPackageServiceException {
260
                try {
261
                        createInstallDirInPluginDir(packageInfo);
262
                        String copiedFilesDirectoryName = getAbsoulteCopiedFilesDirectoryName(packageInfo);
263

    
264
                        // Deleting the previous files folder
265
                        File copiedFilesDirectoryfile = new File(copiedFilesDirectoryName);
266
                        deleteDirectory(copiedFilesDirectoryfile);
267

    
268
                        // It works if the plugins directory is in the folder
269
                        // "gvSIG/extensiones"
270
                        String applicationDirectory = System.getProperty("user.dir");
271

    
272
                        List<File> files = packageInfo.getFilesToCopy();
273

    
274
                        for (int i = 0; i < files.size(); i++) {
275
                                String sourceFile = files.get(i).getAbsolutePath();
276

    
277
                                // Create the final path
278
                                String destFile = sourceFile.substring(applicationDirectory
279
                                                .length(), sourceFile.length());
280
                                destFile = copiedFilesDirectoryName + destFile;
281

    
282
                                // Copy the files
283
                                copy(new File(sourceFile), new File(destFile));
284
                        }
285
                } catch (IOException e) {
286
                        throw new MakePluginPackageServiceException(
287
                                        "Exception copying the files", e);
288
                }
289
        }
290

    
291
        static public boolean deleteDirectory(File path) {
292
                if (path.exists()) {
293
                        File[] files = path.listFiles();
294
                        for (int i = 0; i < files.length; i++) {
295
                                if (files[i].isDirectory()) {
296
                                        deleteDirectory(files[i]);
297
                                } else {
298
                                        files[i].delete();
299
                                }
300
                        }
301
                }
302
                return (path.delete());
303
        }
304

    
305
        private void copy(File sourceLocation, File targetLocation)
306
                        throws IOException {
307
                if (sourceLocation.isDirectory()) {
308
                        if (!targetLocation.exists()) {
309
                                targetLocation.mkdir();
310
                        }
311

    
312
                        String[] children = sourceLocation.list();
313
                        for (int i = 0; i < children.length; i++) {
314
                                copy(new File(sourceLocation, children[i]), new File(
315
                                                targetLocation, children[i]));
316
                        }
317
                } else {
318
                        targetLocation.getParentFile().mkdirs();
319

    
320
                        InputStream in = new FileInputStream(sourceLocation);
321
                        OutputStream out = new FileOutputStream(targetLocation);
322

    
323
                        // Copy the bits from instream to outstream
324
                        byte[] buf = new byte[1024];
325
                        int len;
326
                        while ((len = in.read(buf)) > 0) {
327
                                out.write(buf, 0, len);
328
                        }
329
                        in.close();
330
                        out.close();
331
                }
332
        }
333

    
334
        private File getCopiedFilesDirectory(File pluginDirectory)
335
                        throws MakePluginPackageServiceException {
336
                return new File(pluginDirectory.getAbsolutePath() + File.separator
337
                                + "install" + File.separator + COPIED_FILES_DIRECTORY_NAME);
338
        }
339

    
340
        private String getAbsoulteCopiedFilesDirectoryName(PackageInfo packageInfo)
341
                        throws MakePluginPackageServiceException {
342
                return getAbsolutePluginPackageDirectory(packageInfo).getAbsolutePath()
343
                                + File.separator + "install" + File.separator
344
                                + COPIED_FILES_DIRECTORY_NAME;
345
        }
346

    
347
        private File getAntFile(File pluginDirectory)
348
                        throws MakePluginPackageServiceException {
349
                return new File(pluginDirectory.getAbsolutePath() + File.separator
350
                                + "install" + File.separator + ANT_FILE_NAME);
351
        }
352

    
353
        private File getAbsoluteAntFile(PackageInfo packageInfo)
354
                        throws MakePluginPackageServiceException {
355
                String destinationFilePath = manager.getDefaultLocalAddonRepository()
356
                                .getAbsolutePath()
357
                                + File.separator + packageInfo.getCode();
358
                return new File(destinationFilePath + File.separator + "install" + File.separator  + ANT_FILE_NAME);
359
        }
360

    
361
        private File getAbsolutePluginPackageDirectory(PackageInfo packageInfo)
362
                        throws MakePluginPackageServiceException {
363
                String destinationFilePath = manager.getDefaultLocalAddonRepository()
364
                                .getAbsolutePath()
365
                                + File.separator + packageInfo.getCode();
366
                return new File(destinationFilePath);
367
        }
368

    
369
        public Manager getManager() {
370
                return this.manager;
371
        }
372

    
373
        public PackageInfo getPluginPackageInfo(int index) {
374
                if (index >= installerInfos.size()) {
375
                        return null;
376
                }
377
                return installerInfos.get(index);
378
        }
379

    
380
        public PackageInfo getPluginPackageInfo(String code) {
381
                for (int i = 0; i < getPluginPackageCount(); i++) {
382
                        if (installerInfos.get(i).getCode() != null
383
                                        && installerInfos.get(i).getCode().equals(code)) {
384
                                return installerInfos.get(i);
385
                        }
386
                }
387
                PackageInfo info = new DefaultPackageInfo();
388
                info.setCode(code);
389
                return info;
390
        }
391

    
392
        public int getPluginPackageCount() {
393
                return installerInfos.size();
394
        }
395

    
396
        public String getDefaultAntScript()
397
                        throws MakePluginPackageServiceException {
398
                try {
399
                        URL resource = getClass().getResource(ANT_FILE_NAME);
400
                        return readUrlAsString(resource);
401
                } catch (IOException e) {
402
                        throw new MakePluginPackageServiceException(
403
                                        "Impossible to read the default ant file", e);
404
                }
405
        }
406

    
407
        private String readUrlAsString(URL url) throws java.io.IOException {
408
                URLConnection urlConnection = url.openConnection();
409
                InputStream inputStream = urlConnection.getInputStream();
410
                BufferedReader bufferedReader = new BufferedReader(
411
                                new InputStreamReader(inputStream));
412
                StringBuffer fileData = new StringBuffer(1000);
413
                String line = bufferedReader.readLine();
414
                while (line != null) {
415
                        fileData.append(line + "\n");
416
                        line = bufferedReader.readLine();
417
                }
418
                bufferedReader.close();
419
                return fileData.toString();
420
        }
421

    
422
        private String readFileAsString(String filePath) throws java.io.IOException {
423
                StringBuffer fileData = new StringBuffer(1000);
424
                BufferedReader reader = new BufferedReader(new FileReader(filePath));
425
                char[] buf = new char[1024];
426
                int numRead = 0;
427
                while ((numRead = reader.read(buf)) != -1) {
428
                        String readData = String.valueOf(buf, 0, numRead);
429
                        fileData.append(readData);
430
                        buf = new char[1024];
431
                }
432
                reader.close();
433
                return fileData.toString();
434
        }
435

    
436
        public PackageInfo[] getInstalledPackages()
437
                        throws MakePluginPackageServiceException {
438
                return installerInfos.toArray(new PackageInfo[installerInfos.size()]);
439
        }
440

    
441
        public File getPluginFolder(PackageInfo packageInfo)
442
                        throws MakePluginPackageServiceException {
443
                return getAbsolutePluginPackageDirectory(packageInfo);
444
        }
445

    
446
        public boolean deleteDir(File folder) {
447
                DeleteFile file = new DeleteFile();
448
                return file.delete(folder);
449
        }
450

    
451
}