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 @ 34005

History | View | Annotate | Download (14.7 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

    
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.spi.InstallPackageProviderServices;
52
import org.gvsig.installer.lib.spi.InstallerProviderLocator;
53
import org.gvsig.tools.service.Manager;
54

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

    
61
    public static final String ANT_FILE_NAME = "install.xml";
62
    public static final String COPIED_FILES_DIRECTORY_NAME = "files";
63
    private File pluginsDirectory;
64
    private static final Logger logger = org.slf4j.LoggerFactory
65
        .getLogger(DefaultMakePluginPackageService.class);
66
    private final InstallerManager manager;
67

    
68
    private List<PackageInfo> installerInfos = null;
69
    private Map<PackageInfo, String> directories = null;
70

    
71
    protected List<File> selectedFiles = null;
72
    protected String antScript = null;
73
    private InstallPackageProviderServices installerProviderServices = null;
74

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

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

    
96
        // Read all the installed plugins
97
        String[] plugins = pluginsDirectory.list();
98

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

    
106
                installerProviderServices.readPackageInfo(new File(
107
                    pluginDirectoryFile.getAbsolutePath()), packageInfo);
108

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

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

    
128
                installerInfos.add(packageInfo);
129
                directories.put(packageInfo, pluginDirectoryName);
130
            }
131
        }
132
    }
133

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

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

    
149
            // Ading the root directory
150
            File pluginFile =
151
                new File(pluginsDirectory.getParentFile().getParentFile()
152
                    .getAbsolutePath()
153
                    + pluginFileName);
154

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

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

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

    
169
    private void writeAdditionalFiles(PackageInfo packageInfo)
170
        throws MakePluginPackageServiceException {
171
        // Write the package.info file
172
        writePackageInfo(packageInfo);
173

    
174
        if (packageInfo.getAntScript() != null) {
175
            // Create the ant file
176
            writeAntFile(packageInfo);
177

    
178
            // Copy the selected files
179
            writeSelectedFiles(packageInfo);
180
        }
181
    }
182

    
183
    public void createPackage(PackageInfo packageInfo,
184
        OutputStream packageStream) throws MakePluginPackageServiceException {
185

    
186
        writeAdditionalFiles(packageInfo);
187
        installerProviderServices.compressPackage(
188
            getAbsolutePluginPackageDirectory(packageInfo), packageStream);
189
    }
190

    
191
    private void writePackageInfo(PackageInfo packageInfo)
192
        throws MakePluginPackageServiceException {
193
        writePackageInfo(packageInfo,
194
            getAbsolutePluginPackageDirectory(packageInfo));
195
    }
196

    
197
    public void writePackageInfo(PackageInfo packageInfo, File folder)
198
        throws MakePluginPackageServiceException {
199
        installerProviderServices.writePackageInfo(folder, packageInfo);
200
    }
201

    
202
    private void writeAntFile(PackageInfo packageInfo)
203
        throws MakePluginPackageServiceException {
204
        try {
205
            ByteArrayInputStream in =
206
                new ByteArrayInputStream(packageInfo.getAntScript().getBytes());
207
            OutputStream out =
208
                new FileOutputStream(getAbsoluteAntFile(packageInfo));
209

    
210
            // Copy the bits from instream to outstream
211
            byte[] buf = new byte[1024];
212
            int len;
213
            while ((len = in.read(buf)) > 0) {
214
                out.write(buf, 0, len);
215
            }
216
            in.close();
217
            out.close();
218
        } catch (IOException e) {
219
            throw new MakePluginPackageServiceException(
220
                "Exception writing the ant file");
221
        }
222

    
223
    }
224

    
225
    private void writeSelectedFiles(PackageInfo packageInfo)
226
        throws MakePluginPackageServiceException {
227
        try {
228
            String copiedFilesDirectoryName =
229
                getAbsoulteCopiedFilesDirectoryName(packageInfo);
230

    
231
            // Deleting the previous files folder
232
            File copiedFilesDirectoryfile = new File(copiedFilesDirectoryName);
233
            deleteDirectory(copiedFilesDirectoryfile);
234

    
235
            // It works if the plugins directory is in the folder
236
            // "gvSIG/extensiones"
237
            String applicationDirectory =
238
                pluginsDirectory.getParentFile().getParent();
239

    
240
            for (int i = 0; i < packageInfo.getFileToCopySize(); i++) {
241
                String sourceFile =
242
                    packageInfo.getFileToCopyAt(i).getAbsolutePath();
243

    
244
                // Create the final path
245
                String destFile =
246
                    sourceFile.substring(applicationDirectory.length(),
247
                        sourceFile.length());
248
                destFile = copiedFilesDirectoryName + destFile;
249

    
250
                // Copy the files
251
                copy(new File(sourceFile), new File(destFile));
252
            }
253
        } catch (IOException e) {
254
            throw new MakePluginPackageServiceException(
255
                "Exception copying the files");
256
        }
257
    }
258

    
259
    static public boolean deleteDirectory(File path) {
260
        if (path.exists()) {
261
            File[] files = path.listFiles();
262
            for (int i = 0; i < files.length; i++) {
263
                if (files[i].isDirectory()) {
264
                    deleteDirectory(files[i]);
265
                } else {
266
                    files[i].delete();
267
                }
268
            }
269
        }
270
        return (path.delete());
271
    }
272

    
273
    void copy(File sourceLocation, File targetLocation) throws IOException {
274
        if (sourceLocation.isDirectory()) {
275
            if (!targetLocation.exists()) {
276
                targetLocation.mkdir();
277
            }
278

    
279
            String[] children = sourceLocation.list();
280
            for (int i = 0; i < children.length; i++) {
281
                copy(new File(sourceLocation, children[i]), new File(
282
                    targetLocation, children[i]));
283
            }
284
        } else {
285
            targetLocation.getParentFile().mkdirs();
286

    
287
            InputStream in = new FileInputStream(sourceLocation);
288
            OutputStream out = new FileOutputStream(targetLocation);
289

    
290
            // Copy the bits from instream to outstream
291
            byte[] buf = new byte[1024];
292
            int len;
293
            while ((len = in.read(buf)) > 0) {
294
                out.write(buf, 0, len);
295
            }
296
            in.close();
297
            out.close();
298
        }
299
    }
300

    
301
    private String getPluginPackageDirectory(PackageInfo packageInfo) {
302
        return directories.get(packageInfo);
303
    }
304

    
305
    private String getCopiedFilesDirectoryName(PackageInfo packageInfo)
306
        throws MakePluginPackageServiceException {
307
        return getPluginPackageDirectory(packageInfo) + File.separator
308
            + COPIED_FILES_DIRECTORY_NAME;
309
    }
310

    
311
    private File getCopiedFilesDirectory(File pluginDirectory)
312
        throws MakePluginPackageServiceException {
313
        return new File(pluginDirectory.getAbsolutePath() + File.separator
314
            + COPIED_FILES_DIRECTORY_NAME);
315
    }
316

    
317
    private String getAbsoulteCopiedFilesDirectoryName(PackageInfo packageInfo)
318
        throws MakePluginPackageServiceException {
319
        return getAbsolutePluginPackageDirectory(packageInfo).getAbsolutePath()
320
            + File.separator + COPIED_FILES_DIRECTORY_NAME;
321
    }
322

    
323
    private String getAntFileName(PackageInfo packageInfo)
324
        throws MakePluginPackageServiceException {
325
        return getPluginPackageDirectory(packageInfo) + File.separator
326
            + ANT_FILE_NAME;
327
    }
328

    
329
    private File getAntFile(File pluginDirectory)
330
        throws MakePluginPackageServiceException {
331
        return new File(pluginDirectory.getAbsolutePath() + File.separator
332
            + ANT_FILE_NAME);
333
    }
334

    
335
    private File getAbsoluteAntFile(PackageInfo packageInfo)
336
        throws MakePluginPackageServiceException {
337
        return new File(pluginsDirectory.getAbsolutePath() + File.separator
338
            + getAntFileName(packageInfo));
339
    }
340

    
341
    private File getAbsolutePluginPackageDirectory(PackageInfo packageInfo)
342
        throws MakePluginPackageServiceException {
343
        return new File(pluginsDirectory.getAbsolutePath() + File.separator
344
            + getPluginPackageDirectory(packageInfo));
345
    }
346

    
347
    private File getAbsolutePluginPackageDirectory(String pluginDirectory)
348
        throws MakePluginPackageServiceException {
349
        return new File(pluginsDirectory.getAbsolutePath() + File.separator
350
            + pluginDirectory);
351
    }
352

    
353
    public Manager getManager() {
354
        return this.manager;
355
    }
356

    
357
    public PackageInfo getPluginPackageInfo(int index) {
358
        if (index >= installerInfos.size()) {
359
            return null;
360
        }
361
        return installerInfos.get(index);
362
    }
363

    
364
    public PackageInfo getPluginPackageInfo(String code) {
365
        for (int i = 0; i < getPluginPackageCount(); i++) {
366
            if (installerInfos.get(i).getCode().equals(code)) {
367
                return installerInfos.get(i);
368
            }
369
        }
370
        return null;
371
    }
372

    
373
    public int getPluginPackageCount() {
374
        return installerInfos.size();
375
    }
376

    
377
    public String getDefaultAntScript()
378
        throws MakePluginPackageServiceException {
379
        try {
380
            return readFileAsString(getClass().getClassLoader()
381
                .getResource(ANT_FILE_NAME).getFile());
382
        } catch (IOException e) {
383
            throw new MakePluginPackageServiceException(
384
                "Impossible to read the default ant file", e);
385
        }
386
    }
387

    
388
    private String readFileAsString(String filePath) throws java.io.IOException {
389
        StringBuffer fileData = new StringBuffer(1000);
390
        BufferedReader reader = new BufferedReader(new FileReader(filePath));
391
        char[] buf = new char[1024];
392
        int numRead = 0;
393
        while ((numRead = reader.read(buf)) != -1) {
394
            String readData = String.valueOf(buf, 0, numRead);
395
            fileData.append(readData);
396
            buf = new char[1024];
397
        }
398
        reader.close();
399
        return fileData.toString();
400
    }
401

    
402
    public File getPluginsDirectory() {
403
        return pluginsDirectory;
404
    }
405

    
406
    public PackageInfo[] getInstalledPackages()
407
        throws MakePluginPackageServiceException {
408
        return installerInfos.toArray(new PackageInfo[installerInfos.size()]);
409
    }
410
}