Statistics
| Revision:

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

History | View | Annotate | Download (13.9 KB)

1
/* gvSIG. Geographic Information System of the Valencian Government
2
 *
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

    
23
/*
24
 * AUTHORS (In addition to CIT):
25
 * 2010 {Prodevelop}   {Task}
26
 */
27

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

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

    
45
import org.gvsig.installer.lib.api.InstallerManager;
46
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
import org.gvsig.installer.lib.impl.utils.DeleteFile;
51
import org.gvsig.installer.lib.spi.InstallPackageProviderServices;
52
import org.gvsig.installer.lib.spi.InstallerProviderLocator;
53
import org.gvsig.tools.service.Manager;
54
import org.slf4j.Logger;
55
import org.slf4j.LoggerFactory;
56

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

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

    
66
        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

    
72
        private List<PackageInfo> installerInfos = null;
73

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

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

    
87
        private void initialize() throws MakePluginPackageServiceException {
88

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

    
91
                if (addonFolders == null) {
92
                        throw new MakePluginPackageServiceException(
93
                                        "The addonFolders list is null");
94
                }
95
                // 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

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

    
108
                                DefaultPackageInfo packageInfo = new DefaultPackageInfo();
109

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

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

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

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

    
136
        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
                        // Removing the plugin prefix
145

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

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

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

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

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

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

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

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

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

    
179
                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
        public void createPackage(PackageInfo packageInfo,
189
                        OutputStream packageStream)
190
                        throws MakePluginPackageServiceException {
191

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

    
197
        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

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

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

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

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

    
224
        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

    
231
        }
232

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

    
242
                        // 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

    
255
        }
256

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

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

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

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

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

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

    
281
                                // 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

    
290
        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

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

    
311
                        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

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

    
322
                        // 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

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

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

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

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

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

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

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

    
379
        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
                PackageInfo info = new DefaultPackageInfo();
387
                info.setCode(code);
388
                return info;
389
        }
390

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

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

    
406
        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

    
421
        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

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

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

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

    
450
}