Statistics
| Revision:

root / 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 @ 34444

History | View | Annotate | Download (13.6 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.OutputStream;
39
import java.util.ArrayList;
40
import java.util.HashMap;
41
import java.util.List;
42
import java.util.Map;
43

    
44
import org.slf4j.Logger;
45
import org.slf4j.LoggerFactory;
46

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

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

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

    
65
        public static final String ANT_FILE_NAME = "install.xml";
66
        public static final String COPIED_FILES_DIRECTORY_NAME = "files";
67
        private File pluginsDirectory;
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
        private Map<PackageInfo, String> directories = null;
74

    
75
        protected List<File> selectedFiles = null;
76
        protected String antScript = null;
77
        private InstallPackageProviderServices installerProviderServices = null;
78

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

    
92
        private void initialize(File pluginsDirectory)
93
                        throws MakePluginPackageServiceException {
94
                if ((!pluginsDirectory.exists()) || (!pluginsDirectory.isDirectory())) {
95
                        throw new MakePluginPackageServiceException(
96
                                        "The plugins directory does't exists or not is a directory");
97
                }
98
                this.pluginsDirectory = pluginsDirectory;
99

    
100
                // Read all the installed plugins
101
                String[] plugins = pluginsDirectory.list();
102

    
103
                if (plugins != null) {
104
                        for (int i = 0; i < plugins.length; i++) {
105
                                String pluginDirectoryName = plugins[i];
106
                                File pluginDirectoryFile = getAbsolutePluginPackageDirectory(pluginDirectoryName);
107
                                DefaultPackageInfo packageInfo = new DefaultPackageInfo();
108

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

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

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

    
130
                                installerInfos.add(packageInfo);
131
                                directories.put(packageInfo, pluginDirectoryName);
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
                        // Ading the root directory
151
                        File pluginFile = new File(pluginsDirectory.getParentFile()
152
                                        .getParentFile().getAbsolutePath()
153
                                        + pluginFileName);
154

    
155
                        packageInfo.addFileToCopy(pluginFile);
156
                }
157
        }
158

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

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

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

    
173
        private void writeAdditionalFiles(PackageInfo packageInfo)
174
                        throws MakePluginPackageServiceException {
175
                // Write the package.info file
176
                writePackageInfo(packageInfo);
177

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

    
182
                        // Copy the selected files
183
                        writeSelectedFiles(packageInfo);
184
                }
185
        }
186

    
187
        public void createPackage(PackageInfo packageInfo,
188
                        OutputStream packageStream)
189
                        throws MakePluginPackageServiceException {
190

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

    
193
                writeAdditionalFiles(packageInfo);
194
                installerProviderServices.compressPackage(
195
                                getAbsolutePluginPackageDirectory(packageInfo), packageStream);
196
        }
197

    
198
    public void createPackageIndex(PackageInfo packageInfo,
199
        OutputStream packageStream) 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
                writePackageInfo(packageInfo,
210
                                getAbsolutePluginPackageDirectory(packageInfo));
211
        }
212

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

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

    
223
        private void writeAntFile(PackageInfo packageInfo)
224
                        throws MakePluginPackageServiceException {
225
                try {
226
                        ByteArrayInputStream in = new ByteArrayInputStream(packageInfo
227
                                        .getAntScript().getBytes());
228
                        OutputStream out = new FileOutputStream(
229
                                        getAbsoluteAntFile(packageInfo));
230

    
231
                        // Copy the bits from instream to outstream
232
                        byte[] buf = new byte[1024];
233
                        int len;
234
                        while ((len = in.read(buf)) > 0) {
235
                                out.write(buf, 0, len);
236
                        }
237
                        in.close();
238
                        out.close();
239
                } catch (IOException e) {
240
                        throw new MakePluginPackageServiceException(
241
                                        "Exception writing the ant file");
242
                }
243

    
244
        }
245

    
246
        private void writeSelectedFiles(PackageInfo packageInfo)
247
                        throws MakePluginPackageServiceException {
248
                try {
249
                        String copiedFilesDirectoryName = getAbsoulteCopiedFilesDirectoryName(packageInfo);
250

    
251
                        // Deleting the previous files folder
252
                        File copiedFilesDirectoryfile = new File(copiedFilesDirectoryName);
253
                        deleteDirectory(copiedFilesDirectoryfile);
254

    
255
                        // It works if the plugins directory is in the folder
256
                        // "gvSIG/extensiones"
257
                        String applicationDirectory = pluginsDirectory.getParentFile()
258
                                        .getParent();
259

    
260
                        for (int i = 0; i < packageInfo.getFileToCopySize(); i++) {
261
                                String sourceFile = packageInfo.getFileToCopyAt(i)
262
                                                .getAbsolutePath();
263

    
264
                                // Create the final path
265
                                String destFile = sourceFile.substring(
266
                                                applicationDirectory.length(), sourceFile.length());
267
                                destFile = copiedFilesDirectoryName + destFile;
268

    
269
                                // Copy the files
270
                                copy(new File(sourceFile), new File(destFile));
271
                        }
272
                } catch (IOException e) {
273
                        throw new MakePluginPackageServiceException(
274
                                        "Exception copying the files");
275
                }
276
        }
277

    
278
        static public boolean deleteDirectory(File path) {
279
                if (path.exists()) {
280
                        File[] files = path.listFiles();
281
                        for (int i = 0; i < files.length; i++) {
282
                                if (files[i].isDirectory()) {
283
                                        deleteDirectory(files[i]);
284
                                } else {
285
                                        files[i].delete();
286
                                }
287
                        }
288
                }
289
                return (path.delete());
290
        }
291

    
292
        void copy(File sourceLocation, File targetLocation) throws IOException {
293
                if (sourceLocation.isDirectory()) {
294
                        if (!targetLocation.exists()) {
295
                                targetLocation.mkdir();
296
                        }
297

    
298
                        String[] children = sourceLocation.list();
299
                        for (int i = 0; i < children.length; i++) {
300
                                copy(new File(sourceLocation, children[i]), new File(
301
                                                targetLocation, children[i]));
302
                        }
303
                } else {
304
                        targetLocation.getParentFile().mkdirs();
305

    
306
                        InputStream in = new FileInputStream(sourceLocation);
307
                        OutputStream out = new FileOutputStream(targetLocation);
308

    
309
                        // Copy the bits from instream to outstream
310
                        byte[] buf = new byte[1024];
311
                        int len;
312
                        while ((len = in.read(buf)) > 0) {
313
                                out.write(buf, 0, len);
314
                        }
315
                        in.close();
316
                        out.close();
317
                }
318
        }
319

    
320
        private String getPluginPackageDirectory(PackageInfo packageInfo) {
321
                return directories.get(packageInfo);
322
        }
323

    
324
        private String getCopiedFilesDirectoryName(PackageInfo packageInfo)
325
                        throws MakePluginPackageServiceException {
326
                return getPluginPackageDirectory(packageInfo) + File.separator
327
                                + COPIED_FILES_DIRECTORY_NAME;
328
        }
329

    
330
        private File getCopiedFilesDirectory(File pluginDirectory)
331
                        throws MakePluginPackageServiceException {
332
                return new File(pluginDirectory.getAbsolutePath() + File.separator
333
                                + COPIED_FILES_DIRECTORY_NAME);
334
        }
335

    
336
        private String getAbsoulteCopiedFilesDirectoryName(PackageInfo packageInfo)
337
                        throws MakePluginPackageServiceException {
338
                return getAbsolutePluginPackageDirectory(packageInfo).getAbsolutePath()
339
                                + File.separator + COPIED_FILES_DIRECTORY_NAME;
340
        }
341

    
342
        private String getAntFileName(PackageInfo packageInfo)
343
                        throws MakePluginPackageServiceException {
344
                return getPluginPackageDirectory(packageInfo) + File.separator
345
                                + ANT_FILE_NAME;
346
        }
347

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

    
354
        private File getAbsoluteAntFile(PackageInfo packageInfo)
355
                        throws MakePluginPackageServiceException {
356
                return new File(pluginsDirectory.getAbsolutePath() + File.separator
357
                                + getAntFileName(packageInfo));
358
        }
359

    
360
        private File getAbsolutePluginPackageDirectory(PackageInfo packageInfo)
361
                        throws MakePluginPackageServiceException {
362
                return new File(pluginsDirectory.getAbsolutePath() + File.separator
363
                                + getPluginPackageDirectory(packageInfo));
364
        }
365

    
366
        private File getAbsolutePluginPackageDirectory(String pluginDirectory)
367
                        throws MakePluginPackageServiceException {
368
                return new File(pluginsDirectory.getAbsolutePath() + File.separator
369
                                + pluginDirectory);
370
        }
371

    
372
        public Manager getManager() {
373
                return this.manager;
374
        }
375

    
376
        public PackageInfo getPluginPackageInfo(int index) {
377
                if (index >= installerInfos.size()) {
378
                        return null;
379
                }
380
                return installerInfos.get(index);
381
        }
382

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

    
395
        public int getPluginPackageCount() {
396
                return installerInfos.size();
397
        }
398

    
399
        public String getDefaultAntScript()
400
                        throws MakePluginPackageServiceException {
401
                try {
402
                        return readFileAsString(getClass().getClassLoader()
403
                                        .getResource(ANT_FILE_NAME).getFile());
404
                } catch (IOException e) {
405
                        throw new MakePluginPackageServiceException(
406
                                        "Impossible to read the default ant file", e);
407
                }
408
        }
409

    
410
        private String readFileAsString(String filePath) throws java.io.IOException {
411
                StringBuffer fileData = new StringBuffer(1000);
412
                BufferedReader reader = new BufferedReader(new FileReader(filePath));
413
                char[] buf = new char[1024];
414
                int numRead = 0;
415
                while ((numRead = reader.read(buf)) != -1) {
416
                        String readData = String.valueOf(buf, 0, numRead);
417
                        fileData.append(readData);
418
                        buf = new char[1024];
419
                }
420
                reader.close();
421
                return fileData.toString();
422
        }
423

    
424
        public File getPluginsDirectory() {
425
                return pluginsDirectory;
426
        }
427

    
428
        public PackageInfo[] getInstalledPackages()
429
                        throws MakePluginPackageServiceException {
430
                return installerInfos.toArray(new PackageInfo[installerInfos.size()]);
431
        }
432

    
433
    public File getPluginFolder(PackageInfo packageInfo)
434
        throws MakePluginPackageServiceException {
435
        return getAbsolutePluginPackageDirectory(packageInfo);
436
    }
437
}