Statistics
| Revision:

svn-gvsig-desktop / branches / v2_0_0_prep / extensions / org.gvsig.installer / org.gvsig.installer.lib / org.gvsig.installer.lib.impl / src / main / java / org / gvsig / installer / lib / impl / creation / DefaultMakePluginPackageService.java @ 34974

History | View | Annotate | Download (15.1 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.HashMap;
44
import java.util.List;
45
import java.util.Map;
46

    
47
import org.slf4j.Logger;
48
import org.slf4j.LoggerFactory;
49

    
50
import org.gvsig.installer.lib.api.InstallerManager;
51
import org.gvsig.installer.lib.api.PackageInfo;
52
import org.gvsig.installer.lib.api.creation.MakePluginPackageService;
53
import org.gvsig.installer.lib.api.creation.MakePluginPackageServiceException;
54
import org.gvsig.installer.lib.impl.DefaultPackageInfo;
55
import org.gvsig.installer.lib.spi.InstallPackageProviderServices;
56
import org.gvsig.installer.lib.spi.InstallerProviderLocator;
57
import org.gvsig.tools.service.Manager;
58

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

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

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

    
75
        private List<PackageInfo> installerInfos = null;
76
        private Map<PackageInfo, String> directories = null;
77

    
78
        protected List<File> selectedFiles = null;
79
        protected String antScript = null;
80
        private InstallPackageProviderServices installerProviderServices = null;
81

    
82
        public DefaultMakePluginPackageService(InstallerManager manager,
83
                        File pluginsDirectory)
84
                        throws MakePluginPackageServiceException {
85
                super();
86
                this.manager = manager;
87
                installerInfos = new ArrayList<PackageInfo>();
88
                directories = new HashMap<PackageInfo, String>();
89
                selectedFiles = new ArrayList<File>();
90
                installerProviderServices = InstallerProviderLocator
91
                                .getProviderManager().createInstallerProviderServices();
92
                initialize(pluginsDirectory);
93
        }
94

    
95
        private void initialize(File pluginsDirectory)
96
                        throws MakePluginPackageServiceException {
97
        if (!pluginsDirectory.exists()) {
98
            pluginsDirectory.mkdirs();
99
            LOG.info("Plugins folder created: {}", pluginsDirectory);
100
        } else
101
            if (!pluginsDirectory.isDirectory()) {
102
                        throw new MakePluginPackageServiceException(
103
                    "The plugins directory exists and not is a directory");
104
                }
105

    
106
                this.pluginsDirectory = pluginsDirectory;
107

    
108
                // Read all the installed plugins
109
                String[] plugins = pluginsDirectory.list();
110

    
111
                if (plugins != null) {
112
                        for (int i = 0; i < plugins.length; i++) {
113
                                String pluginDirectoryName = plugins[i];
114
                                File pluginDirectoryFile = getAbsolutePluginPackageDirectory(pluginDirectoryName);
115
                                DefaultPackageInfo packageInfo = new DefaultPackageInfo();
116

    
117
                                installerProviderServices.readPackageInfo(new File(
118
                                                pluginDirectoryFile.getAbsolutePath()), packageInfo);
119

    
120
                                // Checks if the ant file exists
121
                                File antFile = getAntFile(pluginDirectoryFile);
122
                                if (antFile.exists()) {
123
                                        try {
124
                                                packageInfo.setAntScript(readFileAsString(antFile
125
                                                                .getAbsolutePath()));
126
                                        } catch (IOException e) {
127
                                                logger.error("Not possible to read the ant file");
128
                                        }
129
                                }
130

    
131
                                // Checks if there are files to copy
132
                                File copiedFilesDirectory = getCopiedFilesDirectory(pluginDirectoryFile);
133
                                if (copiedFilesDirectory.exists()) {
134
                                        loadCopiedFiles(copiedFilesDirectory, copiedFilesDirectory,
135
                                                        packageInfo);
136
                                }
137

    
138
                                installerInfos.add(packageInfo);
139
                                directories.put(packageInfo, pluginDirectoryName);
140
                        }
141
                }
142
        }
143

    
144
        private void loadCopiedFiles(File file, File filesDirectory,
145
                        PackageInfo packageInfo) throws MakePluginPackageServiceException {
146
                if (file.isDirectory()) {
147
                        File[] files = file.listFiles();
148
                        for (int i = 0; i < files.length; i++) {
149
                                loadCopiedFiles(files[i], filesDirectory, packageInfo);
150
                        }
151
                } else {
152
                        // Removing the plugin prefix
153

    
154
                        String pluginFileName = file.getAbsolutePath().substring(
155
                                        filesDirectory.getAbsolutePath().length(),
156
                                        file.getAbsolutePath().length());
157

    
158
                        // Ading the root directory
159
                        File pluginFile = new File(pluginsDirectory.getParentFile()
160
                                        .getParentFile().getAbsolutePath()
161
                                        + pluginFileName);
162

    
163
                        packageInfo.getAuxFiles().add(pluginFile);
164
                }
165
        }
166

    
167
        public void createPackageSet(PackageInfo packageInfo,
168
                        OutputStream packageStream)
169
                        throws MakePluginPackageServiceException {
170

    
171
                LOG.debug("Creating a package set of the package info: \n{0}",
172
                                packageInfo);
173

    
174
                writeAdditionalFiles(packageInfo);
175
                String pluginFileName = manager.getPackageFileName(packageInfo);
176
                installerProviderServices.compressPackageSet(
177
                                getAbsolutePluginPackageDirectory(packageInfo), pluginFileName,
178
                                packageStream);
179
        }
180

    
181
        private void writeAdditionalFiles(PackageInfo packageInfo)
182
                        throws MakePluginPackageServiceException {
183
                // Write the package.info file
184
                writePackageInfo(packageInfo);
185

    
186
                if (packageInfo.getAntScript() != null) {
187
                        // Create the ant file
188
                        writeAntFile(packageInfo);
189

    
190
                        // Copy the selected files
191
                        writeSelectedFiles(packageInfo);
192
                }
193
        }
194

    
195
        public void createPackage(PackageInfo packageInfo,
196
                        OutputStream packageStream)
197
                        throws MakePluginPackageServiceException {
198

    
199
                LOG.debug("Creating package of the package info: \n{0}", packageInfo);
200

    
201
                writeAdditionalFiles(packageInfo);
202
                installerProviderServices.compressPackage(
203
                                getAbsolutePluginPackageDirectory(packageInfo), packageStream);
204
        }
205

    
206
    public void createPackageIndex(PackageInfo packageInfo,
207
        OutputStream packageStream) throws MakePluginPackageServiceException {
208
        LOG.debug("Creating package index of the package info: \n{0}",
209
            packageInfo);
210

    
211
        installerProviderServices.compressPackageIndex(
212
            getAbsolutePluginPackageDirectory(packageInfo), packageStream);
213
    }
214

    
215
        private void writePackageInfo(PackageInfo packageInfo)
216
                        throws MakePluginPackageServiceException {
217
                writePackageInfo(packageInfo,
218
                                getAbsolutePluginPackageDirectory(packageInfo));
219
        }
220

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

    
226
    public void writePackageInfoForIndex(PackageInfo packageInfo, File folder)
227
        throws MakePluginPackageServiceException {
228
        installerProviderServices.writePackageInfoForIndex(folder, packageInfo);
229
    }
230

    
231
    private void createInstallDirInPluginDir(PackageInfo packageInfo) throws MakePluginPackageServiceException {
232
        File pluginDirectory;
233
        pluginDirectory = getAbsolutePluginPackageDirectory(packageInfo);
234
        File installdir = new File(pluginDirectory, "install");
235
        installdir.mkdir();
236

    
237
    }
238
    
239
        private void writeAntFile(PackageInfo packageInfo)
240
                        throws MakePluginPackageServiceException {
241
                try {
242
                    createInstallDirInPluginDir(packageInfo);
243
                        ByteArrayInputStream in = new ByteArrayInputStream(packageInfo
244
                                        .getAntScript().getBytes());
245
                        OutputStream out = new FileOutputStream(
246
                                        getAbsoluteAntFile(packageInfo));
247

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

    
261
        }
262

    
263
        private void writeSelectedFiles(PackageInfo packageInfo)
264
                        throws MakePluginPackageServiceException {
265
                try {
266
            createInstallDirInPluginDir(packageInfo);
267
                        String copiedFilesDirectoryName = getAbsoulteCopiedFilesDirectoryName(packageInfo);
268

    
269
                        // Deleting the previous files folder
270
                        File copiedFilesDirectoryfile = new File(copiedFilesDirectoryName);
271
                        deleteDirectory(copiedFilesDirectoryfile);
272

    
273
                        // It works if the plugins directory is in the folder
274
                        // "gvSIG/extensiones"
275
                        String applicationDirectory = pluginsDirectory.getParentFile()
276
                                        .getParent();
277

    
278
                        List<File> files = packageInfo.getAuxFiles();
279
                        for (int i = 0; i < files.size(); i++) {
280
                                String sourceFile = files.get(i).getAbsolutePath();
281

    
282
                                // Create the final path
283
                                String destFile = sourceFile.substring(
284
                                                applicationDirectory.length(), sourceFile.length());
285
                                destFile = copiedFilesDirectoryName + destFile;
286

    
287
                                // Copy the files
288
                                copy(new File(sourceFile), new File(destFile));
289
                        }
290
                } catch (IOException e) {
291
                        throw new MakePluginPackageServiceException(
292
                                        "Exception copying the files");
293
                }
294
        }
295

    
296
        static public boolean deleteDirectory(File path) {
297
                if (path.exists()) {
298
                        File[] files = path.listFiles();
299
                        for (int i = 0; i < files.length; i++) {
300
                                if (files[i].isDirectory()) {
301
                                        deleteDirectory(files[i]);
302
                                } else {
303
                                        files[i].delete();
304
                                }
305
                        }
306
                }
307
                return (path.delete());
308
        }
309

    
310
        void copy(File sourceLocation, File targetLocation) throws IOException {
311
                if (sourceLocation.isDirectory()) {
312
                        if (!targetLocation.exists()) {
313
                                targetLocation.mkdir();
314
                        }
315

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

    
324
                        InputStream in = new FileInputStream(sourceLocation);
325
                        OutputStream out = new FileOutputStream(targetLocation);
326

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

    
338
        private String getPluginPackageDirectory(PackageInfo packageInfo) {
339
                return directories.get(packageInfo);
340
        }
341

    
342
//        private String getCopiedFilesDirectoryName(PackageInfo packageInfo)
343
//                        throws MakePluginPackageServiceException {
344
//                return getPluginPackageDirectory(packageInfo) +  File.separator + "install" + File.separator
345
//                                + COPIED_FILES_DIRECTORY_NAME;
346
//        }
347

    
348
        private File getCopiedFilesDirectory(File pluginDirectory)
349
                        throws MakePluginPackageServiceException {
350
                return new File(pluginDirectory.getAbsolutePath() +  File.separator + "install" +  File.separator
351
                                + COPIED_FILES_DIRECTORY_NAME);
352
        }
353

    
354
        private String getAbsoulteCopiedFilesDirectoryName(PackageInfo packageInfo)
355
                        throws MakePluginPackageServiceException {
356
                return getAbsolutePluginPackageDirectory(packageInfo).getAbsolutePath()
357
                                 +  File.separator + "install" +  File.separator + COPIED_FILES_DIRECTORY_NAME;
358
        }
359

    
360
        private String getAntFileName(PackageInfo packageInfo)
361
                        throws MakePluginPackageServiceException {
362
                return getPluginPackageDirectory(packageInfo) +  File.separator + "install" +  File.separator
363
                                + ANT_FILE_NAME;
364
        }
365

    
366
        private File getAntFile(File pluginDirectory)
367
                        throws MakePluginPackageServiceException {
368
                return new File(pluginDirectory.getAbsolutePath() +  File.separator + "install" +  File.separator
369
                                + ANT_FILE_NAME);
370
        }
371

    
372
        private File getAbsoluteAntFile(PackageInfo packageInfo)
373
                        throws MakePluginPackageServiceException {
374
                return new File(pluginsDirectory.getAbsolutePath() +  File.separator
375
                                + getAntFileName(packageInfo));
376
        }
377

    
378
        private File getAbsolutePluginPackageDirectory(PackageInfo packageInfo)
379
                        throws MakePluginPackageServiceException {
380

    
381
                return new File(pluginsDirectory.getAbsolutePath() + File.separator
382
                                + getPluginPackageDirectory(packageInfo));
383
        }
384

    
385
        private File getAbsolutePluginPackageDirectory(String pluginDirectory)
386
                        throws MakePluginPackageServiceException {
387
                return new File(pluginsDirectory.getAbsolutePath() + File.separator
388
                                + pluginDirectory);
389
        }
390

    
391
        public Manager getManager() {
392
                return this.manager;
393
        }
394

    
395
        public PackageInfo getPluginPackageInfo(int index) {
396
                if (index >= installerInfos.size()) {
397
                        return null;
398
                }
399
                return installerInfos.get(index);
400
        }
401

    
402
        public PackageInfo getPluginPackageInfo(String code) {
403
                for (int i = 0; i < getPluginPackageCount(); i++) {
404
                        if (installerInfos.get(i).getCode() != null
405
                                        && installerInfos.get(i).getCode().equals(code)) {
406
                                return installerInfos.get(i);
407
                        }
408
                }
409
                PackageInfo info = new DefaultPackageInfo();
410
                info.setCode(code);
411
                return info;
412
        }
413

    
414
        public int getPluginPackageCount() {
415
                return installerInfos.size();
416
        }
417

    
418
        public String getDefaultAntScript()
419
                        throws MakePluginPackageServiceException {
420
                try {
421
            URL resource = getClass().getResource(ANT_FILE_NAME);
422
            return readUrlAsString(resource);
423
                } catch (IOException e) {
424
                        throw new MakePluginPackageServiceException(
425
                                        "Impossible to read the default ant file", e);
426
                }
427
        }
428

    
429
    private String readUrlAsString(URL url) throws java.io.IOException {
430
        URLConnection urlConnection = url.openConnection();
431
        InputStream inputStream = urlConnection.getInputStream();
432
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
433
        StringBuffer fileData = new StringBuffer(1000);
434
        String line = bufferedReader.readLine();
435
        while (line != null) {
436
             fileData.append(line+"\n");
437
             line = bufferedReader.readLine();
438
        }
439
        bufferedReader.close();
440
        return fileData.toString();
441
    }
442

    
443
    private String readFileAsString(String filePath) throws java.io.IOException {
444
        StringBuffer fileData = new StringBuffer(1000);
445
        BufferedReader reader = new BufferedReader(new FileReader(filePath));
446
        char[] buf = new char[1024];
447
        int numRead = 0;
448
        while ((numRead = reader.read(buf)) != -1) {
449
            String readData = String.valueOf(buf, 0, numRead);
450
            fileData.append(readData);
451
            buf = new char[1024];
452
        }
453
        reader.close();
454
        return fileData.toString();
455
    }
456

    
457
        public File getPluginsDirectory() {
458
                return pluginsDirectory;
459
        }
460

    
461
        public PackageInfo[] getInstalledPackages()
462
                        throws MakePluginPackageServiceException {
463
                return installerInfos.toArray(new PackageInfo[installerInfos.size()]);
464
        }
465

    
466
    public File getPluginFolder(PackageInfo packageInfo)
467
        throws MakePluginPackageServiceException {
468
        return getAbsolutePluginPackageDirectory(packageInfo);
469
    }
470
}