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 / DefaultInstallerManager.java @ 41691

History | View | Annotate | Download (19.1 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
package org.gvsig.installer.lib.impl;
29

    
30
import java.io.File;
31
import java.io.FileInputStream;
32
import java.io.IOException;
33
import java.io.InputStream;
34
import java.net.URL;
35
import java.text.MessageFormat;
36
import java.util.ArrayList;
37
import java.util.Collection;
38
import java.util.HashMap;
39
import java.util.HashSet;
40
import java.util.Iterator;
41
import java.util.List;
42
import java.util.Map;
43
import java.util.Set;
44
import org.apache.commons.lang3.StringUtils;
45

    
46
import org.gvsig.installer.lib.api.DependenciesCalculator;
47
import org.gvsig.installer.lib.api.Dependency;
48
import org.gvsig.installer.lib.api.InstallerManager;
49
import org.gvsig.installer.lib.api.PackageInfo;
50
import org.gvsig.installer.lib.api.PackageInfoReader;
51
import org.gvsig.installer.lib.api.PackageInfoWriter;
52
import org.gvsig.installer.lib.api.Version;
53
import org.gvsig.installer.lib.api.creation.MakePackageService;
54
import org.gvsig.installer.lib.api.creation.MakePluginPackageService;
55
import org.gvsig.installer.lib.api.creation.MakePluginPackageServiceException;
56
import org.gvsig.installer.lib.api.execution.InstallPackageService;
57
import org.gvsig.installer.lib.api.execution.InstallPackageServiceException;
58
import org.gvsig.installer.lib.impl.creation.DefaultMakePackageService;
59
import org.gvsig.installer.lib.impl.info.InstallerInfoFileReader;
60
import org.gvsig.installer.lib.impl.info.InstallerInfoFileWriter;
61
import org.gvsig.installer.lib.spi.InstallerProviderManager;
62
import org.gvsig.tools.ToolsLocator;
63
import org.gvsig.tools.dynobject.DynObject;
64
import org.gvsig.tools.exception.BaseException;
65
import org.gvsig.tools.extensionpoint.ExtensionPoint;
66
import org.gvsig.tools.extensionpoint.ExtensionPointManager;
67
import org.gvsig.tools.service.AbstractManager;
68
import org.gvsig.tools.service.Service;
69
import org.gvsig.tools.service.ServiceException;
70

    
71
/**
72
 * @author <a href="mailto:jpiera@gvsig.org">Jorge Piera Llodr&aacute;</a>
73
 */
74
public class DefaultInstallerManager extends AbstractManager implements
75
        InstallerManager {
76

    
77
    private static class LocalRepositoryLocation {
78

    
79
        private File location;
80
        private Set<String> types;
81

    
82
        public LocalRepositoryLocation(File localtion, String type) {
83
            this.location = localtion;
84
            this.types = new HashSet<String>();
85
            this.addType(type);
86
        }
87

    
88
        public LocalRepositoryLocation(File localtion) {
89
            this(localtion, null);
90
        }
91

    
92
        public void addType(String type) {
93
            if ( !StringUtils.isBlank(type) ) {
94
                this.types.add(type);
95
            }
96
        }
97

    
98
        public void addType(LocalRepositoryLocation location) {
99
            this.types.addAll(location.getTypes());
100
        }
101

    
102
        public Collection<String> getTypes() {
103
            return this.types;
104
        }
105

    
106
        public File getLocation() {
107
            return this.location;
108
        }
109

    
110
        public String getDefaultType() {
111
            if ( this.types.isEmpty() ) {
112
                return null;
113
            }
114
            return this.types.iterator().next();
115
        }
116

    
117
        public boolean is(File location) {
118
            if ( location.equals(this.location) ) {
119
                return true;
120
            }
121
            return false;
122
        }
123

    
124
        public boolean contains(File file) {
125
            if ( file.getAbsolutePath().startsWith(this.location.getAbsolutePath()) ) {
126
                return true;
127
            }
128
            return false;
129
        }
130
    }
131

    
132
    private static class LocalRepositoriesLocations extends ArrayList<LocalRepositoryLocation> {
133

    
134
        public LocalRepositoryLocation getLocation(File location) {
135
            Iterator<LocalRepositoryLocation> it = super.iterator();
136
            while ( it.hasNext() ) {
137
                LocalRepositoryLocation x = it.next();
138
                if ( x.is(location) ) {
139
                    return x;
140
                }
141
            }
142
            return null;
143
        }
144

    
145
        public boolean add(LocalRepositoryLocation location) {
146
            LocalRepositoryLocation old = this.getLocation(location.getLocation());
147
            if ( old != null ) {
148
                old.addType(location);
149
                return true;
150
            }
151
            return super.add(location);
152
        }
153

    
154
    }
155

    
156
    private static final String INSTALLER_MANAGER_EXTENSION_POINT = "InstallerManagerExtensionPoint";
157
    private static final String INSTALLER_CREATION_SERVICE_NAME = "InstallerCreationService";
158
    private static final String INSTALLER_EXECUTION_SERVICE_NAME = "InstallerExecutionService";
159
    private ExtensionPointManager extensionPoints = ToolsLocator
160
            .getExtensionPointManager();
161

    
162
    private String packageSetNameFormat = "gvSIG-desktop-{0}-{1}-{2}-{4}-{5}-{6}-{7}.gvspks";
163
    private String packageNameFormat = "gvSIG-desktop-{0}-{1}-{2}-{4}-{5}-{6}-{7}.gvspkg";
164
    private String packageIndexNameFormat = "gvSIG-desktop-{0}-{1}-{2}-{4}-{5}-{6}-{7}.gvspki";
165

    
166
    private URL BaseDownloadURL = null;
167
    private Version version = null;
168
    private List<LocalRepositoryLocation> localRepositoriesLocation = null;
169
    private Map<String,File> defaultRepositoryLocation = null;
170

    
171
    public DefaultInstallerManager() {
172
        super(new DefaultInstallerProviderManager());
173
        this.defaultRepositoryLocation = new HashMap<String,File>();
174
        localRepositoriesLocation = new LocalRepositoriesLocations();
175
    }
176

    
177
    public String getPackageSetNameFormat() {
178
        return packageSetNameFormat;
179
    }
180

    
181
    public void setPackageSetNameFormat(String packageSetNameFormat) {
182
        this.packageSetNameFormat = packageSetNameFormat;
183
    }
184

    
185
    public String getPackageNameFormat() {
186
        return packageNameFormat;
187
    }
188

    
189
    public void setPackageNameFormat(String packageNameFormat) {
190
        this.packageNameFormat = packageNameFormat;
191
    }
192

    
193
    public String getPackageIndexNameFormat() {
194
        return packageIndexNameFormat;
195
    }
196

    
197
    public void setPackageIndexNameFormat(String packageIndexNameFormat) {
198
        this.packageIndexNameFormat = packageIndexNameFormat;
199
    }
200

    
201
    public MakePluginPackageService getMakePluginPackageService()
202
            throws MakePluginPackageServiceException {
203
        ExtensionPoint ep = extensionPoints
204
                .add(INSTALLER_MANAGER_EXTENSION_POINT);
205
        try {
206
            Object[] args = new Object[]{this};
207
            return (MakePluginPackageService) ep.create(
208
                    INSTALLER_CREATION_SERVICE_NAME, args);
209
        } catch (Exception e) {
210
            throw new MakePluginPackageServiceException(
211
                    "Exception creating the installer service to create installers",
212
                    e);
213
        }
214
    }
215

    
216
    public class InstallerCreationException extends
217
            InstallPackageServiceException {
218

    
219
        private static final long serialVersionUID = 759329820705535873L;
220

    
221
        private static final String message = "Error creating the installer service to install plugins";
222

    
223
        private static final String KEY = "_Error_creating_the_installer_service_to_install_plugins";
224

    
225
        public InstallerCreationException(Exception e) {
226
            super(message, e, KEY, serialVersionUID);
227
        }
228

    
229
    }
230

    
231
    public InstallPackageService getInstallPackageService()
232
            throws InstallPackageServiceException {
233
        ExtensionPoint ep = extensionPoints
234
                .add(INSTALLER_MANAGER_EXTENSION_POINT);
235
        try {
236
            Object[] args = new Object[1];
237
            args[0] = this;
238
            return (InstallPackageService) ep.create(
239
                    INSTALLER_EXECUTION_SERVICE_NAME, args);
240
        } catch (Exception e) {
241
            throw new InstallerCreationException(e);
242
        }
243
    }
244

    
245
    public void registerMakePluginPackageService(
246
            Class<? extends MakePluginPackageService> clazz) {
247
        ExtensionPoint extensionPoint = extensionPoints.add(
248
                INSTALLER_MANAGER_EXTENSION_POINT, "");
249
        extensionPoint.append(INSTALLER_CREATION_SERVICE_NAME, "", clazz);
250
    }
251

    
252
    public void registerInstallPackageService(
253
            Class<? extends InstallPackageService> clazz) {
254
        ExtensionPoint extensionPoint = extensionPoints.add(
255
                INSTALLER_MANAGER_EXTENSION_POINT, "");
256
        extensionPoint.append(INSTALLER_EXECUTION_SERVICE_NAME, "", clazz);
257
    }
258

    
259
    public Service getService(DynObject parameters) throws ServiceException {
260
        return null;
261
    }
262

    
263
    public String getPackageSetFileName(PackageInfo info) {
264
        Object[] parameters = getPackageNameFormatParameters(info);
265
        return MessageFormat.format(getPackageSetNameFormat(), parameters);
266
    }
267

    
268
    public String getPackageFileName(PackageInfo info) {
269
        Object[] parameters = getPackageNameFormatParameters(info);
270
        return MessageFormat.format(getPackageNameFormat(), parameters);
271
    }
272

    
273
    public String getPackageIndexFileName(PackageInfo info) {
274
        Object[] parameters = getPackageNameFormatParameters(info);
275
        return MessageFormat.format(getPackageIndexNameFormat(), parameters);
276
    }
277

    
278
    private Object[] getPackageNameFormatParameters(PackageInfo info) {
279
        Object[] parameters = new Object[8];
280
        parameters[PACKAGE_FILE_NAME_FIELDS.GVSIG_VERSION] = info
281
                .getGvSIGVersion();
282
        parameters[PACKAGE_FILE_NAME_FIELDS.NAME] = info.getCode();
283
        parameters[PACKAGE_FILE_NAME_FIELDS.VERSION] = info.getVersion();
284
        parameters[PACKAGE_FILE_NAME_FIELDS.BUILD] = info.getBuild();
285
        parameters[PACKAGE_FILE_NAME_FIELDS.STATE] = info.getState();
286
        parameters[PACKAGE_FILE_NAME_FIELDS.OS] = info.getOperatingSystem();
287
        parameters[PACKAGE_FILE_NAME_FIELDS.ARCH] = info.getArchitecture();
288
        parameters[PACKAGE_FILE_NAME_FIELDS.JVM] = info.getJavaVM();
289
        return parameters;
290
    }
291

    
292
    public PackageInfo[] getInstalledPackages(File pluginsDirectory)
293
            throws MakePluginPackageServiceException {
294
        MakePluginPackageService service = getMakePluginPackageService();
295
        return service.getInstalledPackages();
296
    }
297

    
298
    public PackageInfo[] getInstalledPackages()
299
            throws MakePluginPackageServiceException {
300
        MakePluginPackageService service = getMakePluginPackageService();
301
        return service.getInstalledPackages();
302
    }
303

    
304
    public String getDefaultPackageFileExtension() {
305
        return "gvspkg";
306
    }
307

    
308
    public String getDefaultPackageSetFileExtension() {
309
        return "gvspks";
310
    }
311

    
312
    public String getDefaultIndexSetFileExtension() {
313
        return "gvspki";
314
    }
315

    
316
    public String getOperatingSystem() {
317
        String osname = System.getProperty("os.name");
318
        if ( osname.toLowerCase().startsWith("linux") ) {
319
            return InstallerManager.OS.LINUX;
320
        }
321
        if ( osname.toLowerCase().startsWith("window") ) {
322
            return InstallerManager.OS.WINDOWS;
323
        }
324
        return osname;
325
    }
326

    
327
    public String getArchitecture() {
328
        String osarch = System.getProperty("os.arch");
329
        if ( osarch.toLowerCase().startsWith("i386") ) {
330
            return InstallerManager.ARCH.X86;
331
        }
332
        if ( osarch.toLowerCase().startsWith("x86") ) {
333
            return InstallerManager.ARCH.X86;
334
        }
335
        if ( osarch.toLowerCase().startsWith("amd64") ) {
336
            return InstallerManager.ARCH.X86_64;
337
        }
338
        return osarch;
339
    }
340

    
341
    public Dependency createDependency(PackageInfo packageInfo) {
342
        return new DefaultDependency(packageInfo);
343
    }
344

    
345
    public Dependency createDependency() {
346
        return new DefaultDependency();
347
    }
348

    
349
    public DependenciesCalculator createDependenciesCalculator(
350
            InstallPackageService installService) {
351
        return new DefaultDependenciesCalculator(installService);
352
    }
353

    
354
    public Version createVersion() {
355
        if ( version == null ) {
356
            return new DefaultVersion();
357
        }
358
        Version v = null;
359
        try {
360
            v = (Version) version.clone();
361
        } catch (CloneNotSupportedException e) {
362
            // Version clone can't trow exception
363
        }
364
        return v;
365
    }
366

    
367
    public PackageInfoReader getDefaultPackageInfoReader() {
368
        return new InstallerInfoFileReader();
369
    }
370

    
371
    public PackageInfoWriter getDefaultPackageInfoWriter() {
372
        return new InstallerInfoFileWriter();
373
    }
374

    
375
    public MakePackageService createMakePackage(File packageFolder,
376
            PackageInfo packageInfo) {
377
        return new DefaultMakePackageService(this, packageFolder, packageInfo);
378
    }
379

    
380
    public PackageInfo createPackageInfo() {
381
        return new DefaultPackageInfo();
382
    }
383

    
384
    public PackageInfo createPackageInfo(InputStream stream) throws BaseException {
385
        PackageInfo pkg = new DefaultPackageInfo();
386
        PackageInfoReader reader = this.getDefaultPackageInfoReader();
387
        reader.read(pkg, stream);
388
        return pkg;
389
    }
390

    
391
    public PackageInfo createPackageInfo(File file) throws BaseException {
392
        FileInputStream fis = null;
393
        PackageInfo pkg = null;
394
        try {
395
            fis = new FileInputStream(file);
396
            pkg = this.createPackageInfo(fis);
397
            fis.close();
398
        } catch (Exception ex) {
399

    
400
        } finally {
401
            try {
402
                fis.close();
403
            } catch (IOException ex) {
404
                //
405
            }
406
        }
407
        return pkg;
408
    }
409

    
410
    public URL getDownloadBaseURL() {
411
        return this.BaseDownloadURL;
412
    }
413

    
414
    public String getVersion() {
415
        return this.version.toString();
416
    }
417

    
418
    public void setVersion(Version version) {
419
        try {
420
            this.version = (Version) version.clone();
421
        } catch (CloneNotSupportedException e) {
422
            // This should not happen
423
        }
424

    
425
    }
426

    
427
    public Version getVersionEx() {
428
        try {
429
            return (Version) this.version.clone();
430
        } catch (CloneNotSupportedException e) {
431
            // This should not happen
432
            return null;
433
        }
434
    }
435

    
436
    public void setDownloadBaseURL(URL url) {
437
        this.BaseDownloadURL = url;
438
    }
439

    
440
    public void setVersion(String version) {
441
        if ( this.version == null ) {
442
            this.version = new DefaultVersion();
443
        }
444
        this.version.parse(version);
445
    }
446

    
447
    public File getDefaultLocalAddonRepository() {
448
        File f = this.defaultRepositoryLocation.get("plugin");
449
        return f;
450
    }
451

    
452
    public void setDefaultLocalAddonRepository(File defaultAddonsRepository) {
453
        this.defaultRepositoryLocation.put("plugin", defaultAddonsRepository);
454
        this.localRepositoriesLocation.add(new LocalRepositoryLocation(defaultAddonsRepository, "plugin"));
455
    }
456

    
457
    public void addLocalAddonRepository(File path) {
458
        this.addLocalAddonRepository(path, "plugin");
459
    }
460

    
461
    public File getDefaultLocalAddonRepository(String packageType) {
462
        File f = this.defaultRepositoryLocation.get(packageType);
463
        return f;
464
    }
465

    
466
    public void setDefaultLocalAddonRepository(File defaultAddonsRepository, String packageType) {
467
        this.defaultRepositoryLocation.put(packageType, defaultAddonsRepository);
468
        this.localRepositoriesLocation.add(new LocalRepositoryLocation(defaultAddonsRepository, packageType));
469
    }
470

    
471
    public void addLocalAddonRepository(File path, String type) {
472
        localRepositoriesLocation.add(new LocalRepositoryLocation(path, type));
473
    }
474

    
475
    public String getDefaultLocalRepositoryType(File file) {
476
        Iterator<LocalRepositoryLocation> it = localRepositoriesLocation.iterator();
477
        while ( it.hasNext() ) {
478
            LocalRepositoryLocation location = it.next();
479
            if ( location.contains(file) ) {
480
                return location.getDefaultType();
481
            }
482
        }
483
        return null;
484
    }
485

    
486
    public List<File> getLocalAddonRepositories() {
487
        List<File> l = new ArrayList<File>();
488
        Iterator<LocalRepositoryLocation> it = localRepositoriesLocation.iterator();
489
        while ( it.hasNext() ) {
490
            l.add(it.next().getLocation());
491
        }
492
        return l;
493
    }
494

    
495
    public List<File> getAddonFolders() {
496
        List<File> addonFolders = new ArrayList<File>();
497

    
498
        // Para cada directorio en repositoriesPathsList
499
        List<File> localAddonRepositories = this.getLocalAddonRepositories();
500
        for ( int i = 0; i < localAddonRepositories.size(); i++ ) {
501
            File repoPath = localAddonRepositories.get(i);
502
            if ( repoPath.isDirectory() && repoPath.exists() ) {
503
                File[] folderRepoList = repoPath.listFiles();
504

    
505
                // recorrer los directorios que haya dentro
506
                for ( int j = 0; j < folderRepoList.length; j++ ) {
507
                    File addonFolder = folderRepoList[j];
508
                    if ( addonFolder.isDirectory() ) {
509
                        File pkginfofile = new File(addonFolder, "package.info");
510
                        if ( pkginfofile.exists() ) {
511
                            addonFolders.add(addonFolder);
512
                        }
513
                    }
514

    
515
                }
516
            }
517
        }
518

    
519
        return addonFolders;
520
    }
521

    
522
    public File getAddonFolder(String code) {
523
        List<File> packagePaths = this.getAddonFolders();
524
        for ( int i = 0; i < packagePaths.size(); i++ ) {
525
            try {
526
                File pkgfile = new File(packagePaths.get(i), "package.info");
527
                PackageInfo pkg = this.createPackageInfo(pkgfile);
528
                if ( pkg.getCode().equalsIgnoreCase(code) ) {
529
                    return packagePaths.get(i);
530
                }
531
            } catch (Exception ex) {
532
                
533
            }
534
        }
535
        return null;
536
    }
537

    
538
    public List<byte[]> getPublicKeys() {
539
        byte[] rawkey;
540
        try {
541
            InputStream is = this.getClass().getResourceAsStream("/org/gvsig/installer/lib/keys/key.public");
542
            rawkey = new byte[is.available()];
543
            is.read(rawkey);
544
            is.close();
545
        } catch (IOException e) {
546
            return null;
547
        }
548
        List<byte[]> keys = new ArrayList<byte[]>();
549
        keys.add(rawkey);
550
        return keys;
551
    }
552

    
553
    public boolean hasProviderToThisPackage(PackageInfo packageInfo) {
554
        InstallerProviderManager provmgr = (InstallerProviderManager) this.getProviderManager();
555
        try {
556
            return provmgr.getProviderFactory(packageInfo.getType()) != null;
557
        } catch (Exception e) {
558
            return false;
559
        }
560
    }
561

    
562
}