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

History | View | Annotate | Download (21.8 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.io.FileUtils;
45
import org.apache.commons.lang3.StringUtils;
46

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

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

    
80
    private static Logger logger = LoggerFactory.getLogger(DefaultInstallerManager.class);
81
            
82
    private static class LocalRepositoryLocation {
83

    
84
        private File location;
85
        private Set<String> types;
86

    
87
        public LocalRepositoryLocation(File localtion, String type) {
88
            this.location = localtion;
89
            this.types = new HashSet<String>();
90
            this.addType(type);
91
        }
92

    
93
        public LocalRepositoryLocation(File localtion) {
94
            this(localtion, null);
95
        }
96

    
97
        public void addType(String type) {
98
            if ( !StringUtils.isBlank(type) ) {
99
                this.types.add(type);
100
            }
101
        }
102

    
103
        public void addType(LocalRepositoryLocation location) {
104
            this.types.addAll(location.getTypes());
105
        }
106

    
107
        public Collection<String> getTypes() {
108
            return this.types;
109
        }
110

    
111
        public File getLocation() {
112
            return this.location;
113
        }
114

    
115
        public String getDefaultType() {
116
            if ( this.types.isEmpty() ) {
117
                return null;
118
            }
119
            return this.types.iterator().next();
120
        }
121

    
122
        public boolean is(File location) {
123
            if ( location.equals(this.location) ) {
124
                return true;
125
            }
126
            return false;
127
        }
128

    
129
        public boolean contains(File file) {
130
            if ( file.getAbsolutePath().startsWith(this.location.getAbsolutePath()) ) {
131
                return true;
132
            }
133
            return false;
134
        }
135
        
136
        public boolean contains(PackageInfo packageInfo) {
137
            if( !this.support(packageInfo.getType()) ) {
138
                return false;
139
            }
140
            String packageInfoName = packageInfo.getCode() + File.separator + PACKAGE_INFO_FILE_NAME;
141
            File packageInfoFile = new File(this.location,packageInfoName);
142
            return packageInfoFile.exists();
143
        }
144
        
145
        public boolean support(String type) {
146
            for( String atype : this.types ) {
147
                if( atype != null ) {
148
                    if( atype.equalsIgnoreCase(type) ) {
149
                        return true;
150
                    }
151
                }
152
            }
153
            return false;
154
        }
155
    }
156

    
157
    private static class LocalRepositoriesLocations extends ArrayList<LocalRepositoryLocation> {
158

    
159
        public LocalRepositoryLocation getLocation(File location) {
160
            Iterator<LocalRepositoryLocation> it = super.iterator();
161
            while ( it.hasNext() ) {
162
                LocalRepositoryLocation x = it.next();
163
                if ( x.is(location) ) {
164
                    return x;
165
                }
166
            }
167
            return null;
168
        }
169

    
170
        public boolean add(LocalRepositoryLocation location) {
171
            LocalRepositoryLocation old = this.getLocation(location.getLocation());
172
            if ( old != null ) {
173
                old.addType(location);
174
                return true;
175
            }
176
            return super.add(location);
177
        }
178

    
179
    }
180

    
181
    private static final String INSTALLER_MANAGER_EXTENSION_POINT = "InstallerManagerExtensionPoint";
182
    private static final String INSTALLER_CREATION_SERVICE_NAME = "InstallerCreationService";
183
    private static final String INSTALLER_EXECUTION_SERVICE_NAME = "InstallerExecutionService";
184
    private ExtensionPointManager extensionPoints = ToolsLocator
185
            .getExtensionPointManager();
186

    
187
    private String packageSetNameFormat = "gvSIG-desktop-{0}-{1}-{2}-{4}-{5}-{6}-{7}.gvspks";
188
    private String packageNameFormat = "gvSIG-desktop-{0}-{1}-{2}-{4}-{5}-{6}-{7}.gvspkg";
189
    private String packageIndexNameFormat = "gvSIG-desktop-{0}-{1}-{2}-{4}-{5}-{6}-{7}.gvspki";
190

    
191
    private URL BaseDownloadURL = null;
192
    private Version version = null;
193
    private List<LocalRepositoryLocation> localRepositoriesLocation = null;
194
    private Map<String,File> defaultRepositoryLocation = null;
195

    
196
    public DefaultInstallerManager() {
197
        super(new DefaultInstallerProviderManager());
198
        this.defaultRepositoryLocation = new HashMap<String,File>();
199
        localRepositoriesLocation = new LocalRepositoriesLocations();
200
    }
201

    
202
    public String getPackageSetNameFormat() {
203
        return packageSetNameFormat;
204
    }
205

    
206
    public void setPackageSetNameFormat(String packageSetNameFormat) {
207
        this.packageSetNameFormat = packageSetNameFormat;
208
    }
209

    
210
    public String getPackageNameFormat() {
211
        return packageNameFormat;
212
    }
213

    
214
    public void setPackageNameFormat(String packageNameFormat) {
215
        this.packageNameFormat = packageNameFormat;
216
    }
217

    
218
    public String getPackageIndexNameFormat() {
219
        return packageIndexNameFormat;
220
    }
221

    
222
    public void setPackageIndexNameFormat(String packageIndexNameFormat) {
223
        this.packageIndexNameFormat = packageIndexNameFormat;
224
    }
225

    
226
    public MakePluginPackageService getMakePluginPackageService()
227
            throws MakePluginPackageServiceException {
228
        ExtensionPoint ep = extensionPoints
229
                .add(INSTALLER_MANAGER_EXTENSION_POINT);
230
        try {
231
            Object[] args = new Object[]{this};
232
            return (MakePluginPackageService) ep.create(
233
                    INSTALLER_CREATION_SERVICE_NAME, args);
234
        } catch (Exception e) {
235
            throw new MakePluginPackageServiceException(
236
                    "Exception creating the installer service to create installers",
237
                    e);
238
        }
239
    }
240

    
241
    public class InstallerCreationException extends
242
            InstallPackageServiceException {
243

    
244
        private static final long serialVersionUID = 759329820705535873L;
245

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

    
248
        private static final String KEY = "_Error_creating_the_installer_service_to_install_plugins";
249

    
250
        public InstallerCreationException(Exception e) {
251
            super(message, e, KEY, serialVersionUID);
252
        }
253

    
254
    }
255

    
256
    public InstallPackageService getInstallPackageService()
257
            throws InstallPackageServiceException {
258
        ExtensionPoint ep = extensionPoints
259
                .add(INSTALLER_MANAGER_EXTENSION_POINT);
260
        try {
261
            Object[] args = new Object[1];
262
            args[0] = this;
263
            return (InstallPackageService) ep.create(
264
                    INSTALLER_EXECUTION_SERVICE_NAME, args);
265
        } catch (Exception e) {
266
            throw new InstallerCreationException(e);
267
        }
268
    }
269

    
270
    public void registerMakePluginPackageService(
271
            Class<? extends MakePluginPackageService> clazz) {
272
        ExtensionPoint extensionPoint = extensionPoints.add(
273
                INSTALLER_MANAGER_EXTENSION_POINT, "");
274
        extensionPoint.append(INSTALLER_CREATION_SERVICE_NAME, "", clazz);
275
    }
276

    
277
    public void registerInstallPackageService(
278
            Class<? extends InstallPackageService> clazz) {
279
        ExtensionPoint extensionPoint = extensionPoints.add(
280
                INSTALLER_MANAGER_EXTENSION_POINT, "");
281
        extensionPoint.append(INSTALLER_EXECUTION_SERVICE_NAME, "", clazz);
282
    }
283

    
284
    public Service getService(DynObject parameters) throws ServiceException {
285
        return null;
286
    }
287

    
288
    public String getPackageSetFileName(PackageInfo info) {
289
        Object[] parameters = getPackageNameFormatParameters(info);
290
        return MessageFormat.format(getPackageSetNameFormat(), parameters);
291
    }
292

    
293
    public String getPackageFileName(PackageInfo info) {
294
        Object[] parameters = getPackageNameFormatParameters(info);
295
        return MessageFormat.format(getPackageNameFormat(), parameters);
296
    }
297

    
298
    public String getPackageIndexFileName(PackageInfo info) {
299
        Object[] parameters = getPackageNameFormatParameters(info);
300
        return MessageFormat.format(getPackageIndexNameFormat(), parameters);
301
    }
302

    
303
    private Object[] getPackageNameFormatParameters(PackageInfo info) {
304
        Object[] parameters = new Object[8];
305
        parameters[PACKAGE_FILE_NAME_FIELDS.GVSIG_VERSION] = info
306
                .getGvSIGVersion();
307
        parameters[PACKAGE_FILE_NAME_FIELDS.NAME] = info.getCode();
308
        parameters[PACKAGE_FILE_NAME_FIELDS.VERSION] = info.getVersion();
309
        parameters[PACKAGE_FILE_NAME_FIELDS.BUILD] = info.getBuild();
310
        parameters[PACKAGE_FILE_NAME_FIELDS.STATE] = info.getState();
311
        parameters[PACKAGE_FILE_NAME_FIELDS.OS] = info.getOperatingSystem();
312
        parameters[PACKAGE_FILE_NAME_FIELDS.ARCH] = info.getArchitecture();
313
        parameters[PACKAGE_FILE_NAME_FIELDS.JVM] = info.getJavaVM();
314
        return parameters;
315
    }
316

    
317
    public PackageInfo[] getInstalledPackages(File pluginsDirectory)
318
            throws MakePluginPackageServiceException {
319
        MakePluginPackageService service = getMakePluginPackageService();
320
        return service.getInstalledPackages();
321
    }
322

    
323
    public PackageInfo[] getInstalledPackages()
324
            throws MakePluginPackageServiceException {
325
        MakePluginPackageService service = getMakePluginPackageService();
326
        return service.getInstalledPackages();
327
    }
328

    
329
    public String getDefaultPackageFileExtension() {
330
        return "gvspkg";
331
    }
332

    
333
    public String getDefaultPackageSetFileExtension() {
334
        return "gvspks";
335
    }
336

    
337
    public String getDefaultIndexSetFileExtension() {
338
        return "gvspki";
339
    }
340

    
341
    public String getOperatingSystem() {
342
        String osname = System.getProperty("os.name");
343
        if ( osname.toLowerCase().startsWith("linux") ) {
344
            return InstallerManager.OS.LINUX;
345
        }
346
        if ( osname.toLowerCase().startsWith("window") ) {
347
            return InstallerManager.OS.WINDOWS;
348
        }
349
        return osname;
350
    }
351

    
352
    public String getArchitecture() {
353
        String osarch = System.getProperty("os.arch");
354
        if ( osarch.toLowerCase().startsWith("i386") ) {
355
            return InstallerManager.ARCH.X86;
356
        }
357
        if ( osarch.toLowerCase().startsWith("x86") ) {
358
            return InstallerManager.ARCH.X86;
359
        }
360
        if ( osarch.toLowerCase().startsWith("amd64") ) {
361
            return InstallerManager.ARCH.X86_64;
362
        }
363
        return osarch;
364
    }
365

    
366
    public Dependency createDependency(PackageInfo packageInfo) {
367
        return new DefaultDependency(packageInfo);
368
    }
369

    
370
    public Dependency createDependency() {
371
        return new DefaultDependency();
372
    }
373

    
374
    public DependenciesCalculator createDependenciesCalculator(
375
            InstallPackageService installService) {
376
        return new DefaultDependenciesCalculator(installService);
377
    }
378

    
379
    public Version createVersion() {
380
        if ( version == null ) {
381
            return new DefaultVersion();
382
        }
383
        Version v = null;
384
        try {
385
            v = (Version) version.clone();
386
        } catch (CloneNotSupportedException e) {
387
            // Version clone can't trow exception
388
        }
389
        return v;
390
    }
391

    
392
    public PackageInfoReader getDefaultPackageInfoReader() {
393
        return new InstallerInfoFileReader();
394
    }
395

    
396
    public PackageInfoWriter getDefaultPackageInfoWriter() {
397
        return new InstallerInfoFileWriter();
398
    }
399

    
400
    public MakePackageService createMakePackage(File packageFolder,
401
            PackageInfo packageInfo) {
402
        return new DefaultMakePackageService(this, packageFolder, packageInfo);
403
    }
404

    
405
    public PackageInfo createPackageInfo() {
406
        return new DefaultPackageInfo();
407
    }
408

    
409
    public PackageInfo createPackageInfo(InputStream stream) throws BaseException {
410
        PackageInfo pkg = new DefaultPackageInfo();
411
        PackageInfoReader reader = this.getDefaultPackageInfoReader();
412
        reader.read(pkg, stream);
413
        return pkg;
414
    }
415

    
416
    public PackageInfo createPackageInfo(File file) throws BaseException {
417
        FileInputStream fis = null;
418
        PackageInfo pkg = null;
419
        try {
420
            fis = new FileInputStream(file);
421
            pkg = this.createPackageInfo(fis);
422
            fis.close();
423
        } catch (Exception ex) {
424

    
425
        } finally {
426
            try {
427
                fis.close();
428
            } catch (IOException ex) {
429
                //
430
            }
431
        }
432
        return pkg;
433
    }
434

    
435
    public URL getDownloadBaseURL() {
436
        return this.BaseDownloadURL;
437
    }
438

    
439
    public String getVersion() {
440
        return this.version.toString();
441
    }
442

    
443
    public void setVersion(Version version) {
444
        try {
445
            this.version = (Version) version.clone();
446
        } catch (CloneNotSupportedException e) {
447
            // This should not happen
448
        }
449

    
450
    }
451

    
452
    public Version getVersionEx() {
453
        try {
454
            return (Version) this.version.clone();
455
        } catch (CloneNotSupportedException e) {
456
            // This should not happen
457
            return null;
458
        }
459
    }
460

    
461
    public void setDownloadBaseURL(URL url) {
462
        this.BaseDownloadURL = url;
463
    }
464

    
465
    public void setVersion(String version) {
466
        if ( this.version == null ) {
467
            this.version = new DefaultVersion();
468
        }
469
        this.version.parse(version);
470
    }
471

    
472
    public File getDefaultLocalAddonRepository() {
473
        File f = this.defaultRepositoryLocation.get("plugin");
474
        return f;
475
    }
476

    
477
    public void setDefaultLocalAddonRepository(File defaultAddonsRepository) {
478
        this.defaultRepositoryLocation.put("plugin", defaultAddonsRepository);
479
        this.localRepositoriesLocation.add(new LocalRepositoryLocation(defaultAddonsRepository, "plugin"));
480
    }
481

    
482
    public void addLocalAddonRepository(File path) {
483
        this.addLocalAddonRepository(path, "plugin");
484
    }
485

    
486
    public File getDefaultLocalAddonRepository(String packageType) {
487
        return this.getDefaultLocalAddonRepository(packageType,ACCESS_READ);
488
    }
489

    
490
    private boolean canWrite(File f) {
491
        if( !f.canWrite() ) {
492
            return false;
493
        }
494
//        En MS Windows File.canWrite retorna true aunque luego no se pueden crear 
495
//        escribir en esa carpeta, asi que probamos a crear una carpeta para 
496
//        asegurarnos si se puede escribir realmente.
497
        File f2 = new File(f,"test.dir");
498
        if( f2.mkdir() ) {
499
            f2.delete();
500
            return true;
501
        }
502
        return false;
503
    }
504
    
505
    public File getDefaultLocalAddonRepository(String packageType, int access) {
506
        File f = this.defaultRepositoryLocation.get(packageType);
507
        switch(access) {
508
        case ACCESS_WRITE:
509
            if( canWrite(f) ) {
510
                return f;
511
            }
512
            break;
513
        case ACCESS_READ:
514
        default:
515
            if( f.canRead()) {
516
                return f;
517
            }
518
            break;
519
        }
520
        List<File> repositoriesLocaltions = this.getLocalAddonRepositories(packageType);
521
        for( File repositoryLocation : repositoriesLocaltions ) {
522
            switch(access) {
523
            case ACCESS_WRITE:
524
                if( canWrite(repositoryLocation) ) {
525
                    return repositoryLocation;
526
                }
527
                break;
528
            case ACCESS_READ:
529
            default:
530
                if( repositoryLocation.canRead()) {
531
                    return repositoryLocation;
532
                }
533
                break;
534
            }
535
        }
536
        return null;
537
    }
538

    
539
    public void setDefaultLocalAddonRepository(File defaultAddonsRepository, String packageType) {
540
        this.defaultRepositoryLocation.put(packageType, defaultAddonsRepository);
541
        this.localRepositoriesLocation.add(new LocalRepositoryLocation(defaultAddonsRepository, packageType));
542
    }
543

    
544
    public void addLocalAddonRepository(File path, String type) {
545
        localRepositoriesLocation.add(new LocalRepositoryLocation(path, type));
546
    }
547

    
548
    public String getDefaultLocalRepositoryType(File file) {
549
        Iterator<LocalRepositoryLocation> it = localRepositoriesLocation.iterator();
550
        while ( it.hasNext() ) {
551
            LocalRepositoryLocation location = it.next();
552
            if ( location.contains(file) ) {
553
                return location.getDefaultType();
554
            }
555
        }
556
        return null;
557
    }
558

    
559
    public List<File> getLocalAddonRepositories() {
560
        return this.getLocalAddonRepositories(null);
561
    }
562

    
563
    public List<File> getLocalAddonRepositories(String type) {
564
        List<File> l = new ArrayList<File>();
565
        Iterator<LocalRepositoryLocation> it = localRepositoriesLocation.iterator();
566
        while ( it.hasNext() ) {
567
            LocalRepositoryLocation location = it.next();
568
            if( type==null || location.support(type) ) {
569
                l.add(location.getLocation());
570
            }
571
        }
572
        return l;
573
    }
574

    
575
    public List<File> getAddonFolders() {
576
        return this.getAddonFolders(null);
577
    }
578
    
579
    public List<File> getAddonFolders(String type) {
580
        List<File> addonFolders = new ArrayList<File>();
581

    
582
        // Para cada directorio en la lista de repositorios locales
583
        List<File> localAddonRepositories = this.getLocalAddonRepositories(type);
584
        for ( int i = 0; i < localAddonRepositories.size(); i++ ) {
585
            File repoPath = localAddonRepositories.get(i);
586
            if ( repoPath.isDirectory() && repoPath.exists() ) {
587
                File[] folderRepoList = repoPath.listFiles();
588

    
589
                // recorrer los directorios que haya dentro
590
                for ( int j = 0; j < folderRepoList.length; j++ ) {
591
                    File addonFolder = folderRepoList[j];
592
                    if ( addonFolder.isDirectory() ) {
593
                        File pkginfofile = new File(addonFolder, "package.info");
594
                        if ( pkginfofile.exists() ) {
595
                            addonFolders.add(addonFolder);
596
                        }
597
                    }
598

    
599
                }
600
            }
601
        }
602

    
603
        return addonFolders;
604
    }
605

    
606
    public File getAddonFolder(String code) {
607
        List<File> packagePaths = this.getAddonFolders();
608
        for ( int i = 0; i < packagePaths.size(); i++ ) {
609
            try {
610
                File pkgfile = new File(packagePaths.get(i), "package.info");
611
                PackageInfo pkg = this.createPackageInfo(pkgfile);
612
                if ( pkg.getCode().equalsIgnoreCase(code) ) {
613
                    return packagePaths.get(i);
614
                }
615
            } catch (Exception ex) {
616
                
617
            }
618
        }
619
        return null;
620
    }
621

    
622
    public List<byte[]> getPublicKeys() {
623
        byte[] rawkey;
624
        try {
625
            InputStream is = this.getClass().getResourceAsStream("/org/gvsig/installer/lib/keys/key.public");
626
            rawkey = new byte[is.available()];
627
            is.read(rawkey);
628
            is.close();
629
        } catch (IOException e) {
630
            return null;
631
        }
632
        List<byte[]> keys = new ArrayList<byte[]>();
633
        keys.add(rawkey);
634
        return keys;
635
    }
636

    
637
    public boolean hasProviderToThisPackage(PackageInfo packageInfo) {
638
        InstallerProviderManager provmgr = (InstallerProviderManager) this.getProviderManager();
639
        try {
640
            return provmgr.getProviderFactory(packageInfo.getType()) != null;
641
        } catch (Exception e) {
642
            return false;
643
        }
644
    }
645

    
646
}