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

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

    
29
package org.gvsig.installer.lib.impl;
30

    
31
import java.io.File;
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.HashSet;
38
import java.util.List;
39
import java.util.Set;
40

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

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

    
74
        private static final String INSTALLER_MANAGER_EXTENSION_POINT = "InstallerManagerExtensionPoint";
75
        private static final String INSTALLER_CREATION_SERVICE_NAME = "InstallerCreationService";
76
        private static final String INSTALLER_EXECUTION_SERVICE_NAME = "InstallerExecutionService";
77
        private ExtensionPointManager extensionPoints = ToolsLocator
78
                        .getExtensionPointManager();
79

    
80
        private String packageSetNameFormat = "gvSIG-desktop-{0}-{1}-{2}-{4}-{5}-{6}-{7}.gvspks";
81
        private String packageNameFormat = "gvSIG-desktop-{0}-{1}-{2}-{4}-{5}-{6}-{7}.gvspkg";
82
        private String packageIndexNameFormat = "gvSIG-desktop-{0}-{1}-{2}-{4}-{5}-{6}-{7}.gvspki";
83

    
84
        private URL BaseDownloadURL = null;
85
        private Version version = null;
86
        private Set<File> repositoriesPaths = null;
87
        private File defaultRepositoriesPath = null;
88

    
89
        public DefaultInstallerManager() {
90
                super(new DefaultInstallerProviderManager());
91
                repositoriesPaths = new HashSet<File>();
92
        }
93

    
94
        public String getPackageSetNameFormat() {
95
                return packageSetNameFormat;
96
        }
97

    
98
        public void setPackageSetNameFormat(String packageSetNameFormat) {
99
                this.packageSetNameFormat = packageSetNameFormat;
100
        }
101

    
102
        public String getPackageNameFormat() {
103
                return packageNameFormat;
104
        }
105

    
106
        public void setPackageNameFormat(String packageNameFormat) {
107
                this.packageNameFormat = packageNameFormat;
108
        }
109

    
110
        public String getPackageIndexNameFormat() {
111
                return packageIndexNameFormat;
112
        }
113

    
114
        public void setPackageIndexNameFormat(String packageIndexNameFormat) {
115
                this.packageIndexNameFormat = packageIndexNameFormat;
116
        }
117

    
118
        public MakePluginPackageService getMakePluginPackageService()
119
                        throws MakePluginPackageServiceException {
120
                ExtensionPoint ep = extensionPoints
121
                                .add(INSTALLER_MANAGER_EXTENSION_POINT);
122
                try {
123
                        Object[] args = new Object[] { this };
124
                        return (MakePluginPackageService) ep.create(
125
                                        INSTALLER_CREATION_SERVICE_NAME, args);
126
                } catch (Exception e) {
127
                        throw new MakePluginPackageServiceException(
128
                                        "Exception creating the installer service to create installers",
129
                                        e);
130
                }
131
        }
132

    
133
        public class InstallerCreationException extends
134
                        InstallPackageServiceException {
135

    
136
                private static final long serialVersionUID = 759329820705535873L;
137

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

    
140
                private static final String KEY = "_Error_creating_the_installer_service_to_install_plugins";
141

    
142
                public InstallerCreationException(Exception e) {
143
                        super(message, e, KEY, serialVersionUID);
144
                }
145

    
146
        }
147

    
148
        public InstallPackageService getInstallPackageService()
149
                        throws InstallPackageServiceException {
150
                ExtensionPoint ep = extensionPoints
151
                                .add(INSTALLER_MANAGER_EXTENSION_POINT);
152
                try {
153
                        Object[] args = new Object[1];
154
                        args[0] = this;
155
                        return (InstallPackageService) ep.create(
156
                                        INSTALLER_EXECUTION_SERVICE_NAME, args);
157
                } catch (Exception e) {
158
                        throw new InstallerCreationException(e);
159
                }
160
        }
161

    
162
        public void registerMakePluginPackageService(
163
                        Class<? extends MakePluginPackageService> clazz) {
164
                ExtensionPoint extensionPoint = extensionPoints.add(
165
                                INSTALLER_MANAGER_EXTENSION_POINT, "");
166
                extensionPoint.append(INSTALLER_CREATION_SERVICE_NAME, "", clazz);
167
        }
168

    
169
        public void registerInstallPackageService(
170
                        Class<? extends InstallPackageService> clazz) {
171
                ExtensionPoint extensionPoint = extensionPoints.add(
172
                                INSTALLER_MANAGER_EXTENSION_POINT, "");
173
                extensionPoint.append(INSTALLER_EXECUTION_SERVICE_NAME, "", clazz);
174
        }
175

    
176
        public Service getService(DynObject parameters) throws ServiceException {
177
                return null;
178
        }
179

    
180
        public String getPackageSetFileName(PackageInfo info) {
181
                Object[] parameters = getPackageNameFormatParameters(info);
182
                return MessageFormat.format(getPackageSetNameFormat(), parameters);
183
        }
184

    
185
        public String getPackageFileName(PackageInfo info) {
186
                Object[] parameters = getPackageNameFormatParameters(info);
187
                return MessageFormat.format(getPackageNameFormat(), parameters);
188
        }
189

    
190
        public String getPackageIndexFileName(PackageInfo info) {
191
                Object[] parameters = getPackageNameFormatParameters(info);
192
                return MessageFormat.format(getPackageIndexNameFormat(), parameters);
193
        }
194

    
195
        private Object[] getPackageNameFormatParameters(PackageInfo info) {
196
                Object[] parameters = new Object[8];
197
                parameters[PACKAGE_FILE_NAME_FIELDS.GVSIG_VERSION] = info
198
                                .getGvSIGVersion();
199
                parameters[PACKAGE_FILE_NAME_FIELDS.NAME] = info.getCode();
200
                parameters[PACKAGE_FILE_NAME_FIELDS.VERSION] = info.getVersion();
201
                parameters[PACKAGE_FILE_NAME_FIELDS.BUILD] = info.getBuild();
202
                parameters[PACKAGE_FILE_NAME_FIELDS.STATE] = info.getState();
203
                parameters[PACKAGE_FILE_NAME_FIELDS.OS] = info.getOperatingSystem();
204
                parameters[PACKAGE_FILE_NAME_FIELDS.ARCH] = info.getArchitecture();
205
                parameters[PACKAGE_FILE_NAME_FIELDS.JVM] = info.getJavaVM();
206
                return parameters;
207
        }
208

    
209
        public PackageInfo[] getInstalledPackages(File pluginsDirectory)
210
                        throws MakePluginPackageServiceException {
211
                MakePluginPackageService service = getMakePluginPackageService();
212
                return service.getInstalledPackages();
213
        }
214

    
215
        public PackageInfo[] getInstalledPackages()
216
                        throws MakePluginPackageServiceException {
217
                MakePluginPackageService service = getMakePluginPackageService();
218
                return service.getInstalledPackages();
219
        }
220

    
221
        public String getDefaultPackageFileExtension() {
222
                return "gvspkg";
223
        }
224

    
225
        public String getDefaultPackageSetFileExtension() {
226
                return "gvspks";
227
        }
228

    
229
        public String getDefaultIndexSetFileExtension() {
230
                return "gvspki";
231
        }
232

    
233
        public String getOperatingSystem() {
234
                String osname = System.getProperty("os.name");
235
                if (osname.toLowerCase().startsWith("linux")) {
236
                        return InstallerManager.OS.LINUX;
237
                }
238
                if (osname.toLowerCase().startsWith("window")) {
239
                        return InstallerManager.OS.WINDOWS;
240
                }
241
                return osname;
242
        }
243

    
244
        public String getArchitecture() {
245
                String osarch = System.getProperty("os.arch");
246
                if (osarch.toLowerCase().startsWith("i386")) {
247
                        return InstallerManager.ARCH.X86;
248
                }
249
                if (osarch.toLowerCase().startsWith("x86")) {
250
                        return InstallerManager.ARCH.X86;
251
                }
252
                if (osarch.toLowerCase().startsWith("amd64")) {
253
                        return InstallerManager.ARCH.X86_64;
254
                }
255
                return osarch;
256
        }
257

    
258
        public Dependency createDependency(PackageInfo packageInfo) {
259
                return new DefaultDependency(packageInfo);
260
        }
261

    
262
        public Dependency createDependency() {
263
                return new DefaultDependency();
264
        }
265

    
266
        public DependenciesCalculator createDependenciesCalculator(
267
                        InstallPackageService installService) {
268
                return new DefaultDependenciesCalculator(installService);
269
        }
270

    
271
        public Version createVersion() {
272
                if( version == null ) {
273
                        return new DefaultVersion();
274
                }
275
                Version v = null;
276
                try {
277
                        v = (Version) version.clone();
278
                } catch (CloneNotSupportedException e) {
279
                        // Version clone can't trow exception
280
                }
281
                return v;
282
        }
283

    
284
        public PackageInfoReader getDefaultPackageInfoReader() {
285
                return new InstallerInfoFileReader();
286
        }
287

    
288
        public PackageInfoWriter getDefaultPackageInfoWriter() {
289
                return new InstallerInfoFileWriter();
290
        }
291

    
292
        public MakePackageService createMakePackage(File packageFolder,
293
                        PackageInfo packageInfo) {
294
                return new DefaultMakePackageService(this, packageFolder, packageInfo);
295
        }
296

    
297
        public PackageInfo createPackageInfo() {
298
                return new DefaultPackageInfo();
299
        }
300

    
301
        public PackageInfo createPackageInfo(InputStream stream) throws BaseException  {
302
                PackageInfo pkg = new DefaultPackageInfo();
303
                PackageInfoReader reader = this.getDefaultPackageInfoReader();
304
                reader.read(pkg, stream);
305
                return pkg;
306
        }
307

    
308
        public URL getDownloadBaseURL() {
309
                return this.BaseDownloadURL;
310
        }
311

    
312
        public String getVersion() {
313
                return this.version.toString();
314
        }
315
        
316

    
317
    public void setVersion(Version version) {
318
        try {
319
            this.version = (Version) version.clone();
320
        } catch (CloneNotSupportedException e) {
321
            // This should not happen
322
        }
323
        
324
    }
325

    
326
    public Version getVersionEx() {
327
        try {
328
            return (Version) this.version.clone();
329
        } catch (CloneNotSupportedException e) {
330
            // This should not happen
331
            return null;
332
        }
333
    }
334
        
335
        public void setDownloadBaseURL(URL url) {
336
                this.BaseDownloadURL = url;
337
        }
338

    
339
        public void setVersion(String version) {
340
                if( this.version == null ) {
341
                        this.version = new DefaultVersion();
342
                }
343
                this.version.parse(version);
344
        }
345

    
346
        public File getDefaultLocalAddonRepository() {
347
                return this.defaultRepositoriesPath;
348
        }
349

    
350
        public void setDefaultLocalAddonRepository(File defaultAddonsRepository) {
351
                this.defaultRepositoriesPath = defaultAddonsRepository;
352
                this.repositoriesPaths.add(defaultAddonsRepository);
353
        }
354

    
355
        public void addLocalAddonRepository(File path) {
356
                repositoriesPaths.add(path);
357
        }
358

    
359
        public List<File> getLocalAddonRepositories() {
360
                List<File> l = new ArrayList<File>();
361
                l.addAll(repositoriesPaths);
362
                return l;
363
        }
364

    
365
        public List<File> getAddonFolders() {
366
                List<File> addonFolders = new ArrayList<File>();
367

    
368
                // Para cada directorio en repositoriesPathsList
369
                List<File> localAddonRepositories = this.getLocalAddonRepositories();
370
                for (int i = 0; i < localAddonRepositories.size(); i++) {
371
                        File repoPath = localAddonRepositories.get(i);
372
                        if (repoPath.isDirectory() && repoPath.exists()) {
373
                                File[] folderRepoList = repoPath.listFiles();
374

    
375
                                // recorrer los directorios que haya dentro
376
                                for (int j = 0; j < folderRepoList.length; j++) {
377
                                        File addonFolder = folderRepoList[j];
378
                                        if (addonFolder.isDirectory()) {
379
                                                File pkginfofile = new File(addonFolder, "package.info");
380
                                                if (pkginfofile.exists()) {
381
                                                        addonFolders.add(addonFolder);
382
                                                }
383
                                        }
384

    
385
                                }
386
                        }
387
                }
388

    
389
                return addonFolders;
390
        }
391

    
392
        public File getAddonFolder(String code) {
393
                List<File> pluginPaths = this.getAddonFolders();
394
                for (int i = 0; i < pluginPaths.size(); i++) {
395
                        if (pluginPaths.get(i).getName().equals(code)) {
396
                                return pluginPaths.get(i);
397
                        }
398
                }
399
                return null;
400
        }
401

    
402
        public List<byte[]> getPublicKeys() {
403
                byte[] rawkey;
404
                try {
405
                        InputStream is = this.getClass().getResourceAsStream("/org/gvsig/installer/lib/keys/key.public");
406
                        rawkey = new byte[is.available()];
407
                        is.read(rawkey);
408
                        is.close();
409
                } catch (IOException e) {
410
                        return null;
411
                }
412
                List<byte[]> keys = new ArrayList<byte[]>();
413
                keys.add(rawkey);
414
                return keys;
415
        }
416

    
417
        public boolean hasProviderToThisPackage(PackageInfo packageInfo) {
418
                InstallerProviderManager provmgr = (InstallerProviderManager) this.getProviderManager();
419
                try {
420
                        return provmgr.getProviderFactory(packageInfo.getType())!=null;
421
                } catch (Exception e) {
422
                        return false;
423
                }
424
        }
425

    
426
}