Statistics
| Revision:

svn-gvsig-desktop / trunk / org.gvsig.desktop / org.gvsig.desktop.library / org.gvsig.installer / org.gvsig.installer.swing / org.gvsig.installer.swing.impl / src / main / java / org / gvsig / installer / swing / impl / DefaultSwingInstallerManager.java @ 44525

History | View | Annotate | Download (17.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.swing.impl;
30

    
31
import java.io.BufferedReader;
32
import java.io.File;
33
import java.io.FileInputStream;
34
import java.io.FileNotFoundException;
35
import java.io.IOException;
36
import java.io.InputStream;
37
import java.io.InputStreamReader;
38
import java.net.MalformedURLException;
39
import java.net.URL;
40
import java.util.ArrayList;
41
import java.util.Collection;
42
import java.util.Iterator;
43
import java.util.List;
44
import java.util.ListIterator;
45
import org.apache.commons.lang3.StringUtils;
46

    
47
import org.gvsig.i18n.Messages;
48
import org.gvsig.installer.lib.api.Dependencies;
49
import org.gvsig.installer.lib.api.InstallerLocator;
50
import org.gvsig.installer.lib.api.InstallerManager;
51
import org.gvsig.installer.lib.api.PackageInfo;
52
import org.gvsig.installer.lib.api.Version;
53
import org.gvsig.installer.swing.api.JProgressPanel;
54
import org.gvsig.installer.swing.api.SwingInstallerManager;
55
import org.gvsig.installer.swing.api.creation.JOutputPanel;
56
import org.gvsig.installer.swing.api.creation.JPackageInfoPanel;
57
import org.gvsig.installer.swing.api.creation.MakePluginPackageWizard;
58
import org.gvsig.installer.swing.api.creation.MakePluginPackageWizardException;
59
import org.gvsig.installer.swing.api.execution.InstallPackageWizardException;
60
import org.gvsig.installer.swing.api.execution.InstallWizardPanel;
61
import org.gvsig.installer.swing.api.execution.JShowPackageStatusAndAskContinuePanel;
62
import org.gvsig.installer.swing.api.execution.JShowPackagesAndAskContinuePanel;
63
import org.gvsig.installer.swing.api.execution.JShowRequiredPackagesAndAskContinuePanel;
64
import org.gvsig.installer.swing.api.execution.JShowUnresolvedDependenciesAndAskContinuePanel;
65
import org.gvsig.installer.swing.api.execution.PackageFilter;
66
import org.gvsig.installer.swing.api.packagebuilder.PackageBuildder;
67
import org.gvsig.installer.swing.api.wizard.InstallerWizardPanel;
68
import org.gvsig.installer.swing.impl.creation.panel.DefaultOutputPanel;
69
import org.gvsig.installer.swing.impl.creation.panel.DefaultPackageInfoPanel;
70
import org.gvsig.installer.swing.impl.execution.panel.filters.TypeFilter;
71
import org.gvsig.installer.swing.impl.packagebuilder.BasePackageWizard;
72
import org.gvsig.installer.swing.impl.panel.DefaultProgressPanel;
73
import org.gvsig.tools.ToolsLocator;
74
import org.gvsig.tools.extensionpoint.ExtensionPoint;
75
import org.gvsig.tools.extensionpoint.ExtensionPointManager;
76
import org.slf4j.Logger;
77
import org.slf4j.LoggerFactory;
78

    
79
/**
80
 * @author <a href="mailto:jpiera@gvsig.org">Jorge Piera Llodr&aacute;</a>
81
 */
82
public class DefaultSwingInstallerManager implements SwingInstallerManager {
83

    
84
        public class DefaultUrlAndLabel implements UrlAndLabel {
85

    
86
                private URL url;
87
                private String label;
88

    
89
                public DefaultUrlAndLabel(URL url, String label) {
90
                        this.url = url;
91
                        this.label = label;
92
                }
93
                public URL getURL() {
94
                        return this.url;
95
                }
96

    
97
                public String getLabel() {
98
                        return this.label;
99
                }
100
                
101
                public void setLabel(String label) {
102
                        this.label = label;
103
                }
104
                @Override
105
                public String toString() {
106
                        if( label == null ) {
107
                                return this.url.toString();
108
                        }
109
                        return this.label + " - " + this.url.toString();
110
                }
111
        }
112

    
113
        /**
114
         * 
115
         * This class is for compatibility with deprecated method 
116
         * List<URL> getDefaultDownloadURLs()
117
         *  
118
         * @author jjdelcerro
119
         *
120
         */
121
        public class DefaultDownloadURLsIterator<URL> implements ListIterator<URL> {
122
                private List<UrlAndLabel> urlAndLabels;
123
                private ListIterator<UrlAndLabel> it;
124
                
125
                DefaultDownloadURLsIterator(List<UrlAndLabel> urlAndLabels, int index) {
126
                        this.urlAndLabels = urlAndLabels;
127
                        this.it = this.urlAndLabels.listIterator(index);
128
                }
129

    
130
                DefaultDownloadURLsIterator(List<UrlAndLabel> urlAndLabels) {
131
                        this.urlAndLabels = urlAndLabels;
132
                        this.it = this.urlAndLabels.listIterator();
133
                }
134

    
135
                public boolean hasNext() {
136
                        return this.it.hasNext();
137
                }
138

    
139
                public URL next() {
140
                        UrlAndLabel value = this.it.next();
141
                        if( value == null ) {
142
                                return null;
143
                        }
144
                        return (URL) value.getURL();
145
                }
146

    
147
                public boolean hasPrevious() {
148
                        return it.hasPrevious();
149
                }
150

    
151
                public int nextIndex() {
152
                        return it.nextIndex();
153
                }
154

    
155
                public URL previous() {
156
                        UrlAndLabel value = this.it.previous();
157
                        if( value == null ) {
158
                                return null;
159
                        }
160
                        return (URL) value.getURL();
161
                }
162

    
163
                public int previousIndex() {
164
                        return it.previousIndex();
165
                }
166

    
167
                public void remove() {
168
                        throw new UnsupportedOperationException("This is read-only");
169
                }
170

    
171
                public void add(Object arg0) {
172
                        throw new UnsupportedOperationException("This is read-only");
173
                }
174

    
175
                public void set(Object arg0) {
176
                        throw new UnsupportedOperationException("This is read-only");
177
                }
178
        }
179
        
180
        /**
181
         * 
182
         * This class is for compatibility with deprecated method 
183
         * List<URL> getDefaultDownloadURLs()
184
         *  
185
         * @author jjdelcerro
186
         *
187
         */
188
        public class DefaultDownloadURLs<URL> implements List<URL> {
189

    
190
                private List<UrlAndLabel> urlAndLabels;
191

    
192
                DefaultDownloadURLs(List<UrlAndLabel> urlAndLabels) {
193
                        this.urlAndLabels = urlAndLabels;
194
                }
195
                
196
                public boolean add(Object url) {
197
                        throw new UnsupportedOperationException("This is a read-only list");
198
                }
199

    
200
                public void add(int arg0, Object url) {
201
                        throw new UnsupportedOperationException("This is a read-only list");
202
                }
203

    
204
                public boolean addAll(Collection arg0) {
205
                        throw new UnsupportedOperationException("This is a read-only list");
206
                }
207

    
208
                public boolean addAll(int arg0, Collection arg1) {
209
                        throw new UnsupportedOperationException("This is a read-only list");
210
                }
211

    
212
                public void clear() {
213
                        throw new UnsupportedOperationException("This is a read-only list");
214
                }
215

    
216
                public boolean contains(Object arg0) {
217
                        Iterator<UrlAndLabel> it = this.urlAndLabels.iterator();
218
                        while( it.hasNext() ) {
219
                                UrlAndLabel x = it.next();
220
                                if( x.getURL().equals(arg0) ) {
221
                                        return true;
222
                                }
223
                        }
224
                        return false;
225
                }
226

    
227
                public boolean containsAll(Collection arg0) {
228
                        throw new UnsupportedOperationException("This method is not supported");
229
                }
230

    
231
                public URL get(int arg0) {
232
                        return (URL) this.urlAndLabels.get(arg0).getURL();
233
                }
234

    
235
                public int indexOf(Object arg0) {
236
                        for( int i=0; i<this.urlAndLabels.size(); i++) {
237
                                if( this.urlAndLabels.get(i).getURL().equals(arg0) ) {
238
                                        return i;
239
                                }
240
                        }
241
                        return -1;
242
                }
243

    
244
                public boolean isEmpty() {
245
                        return this.urlAndLabels.isEmpty();
246
                }
247

    
248
                public Iterator iterator() {
249
                        return new DefaultDownloadURLsIterator(this.urlAndLabels);
250
                }
251

    
252
                public int lastIndexOf(Object arg0) {
253
                        for( int i=this.urlAndLabels.size()-1; i>=0; i--) {
254
                                if( this.urlAndLabels.get(i).getURL().equals(arg0) ) {
255
                                        return i;
256
                                }
257
                        }
258
                        return -1;
259
                }
260

    
261
                public ListIterator listIterator() {
262
                        return new DefaultDownloadURLsIterator(this.urlAndLabels);
263
                }
264

    
265
                public ListIterator listIterator(int arg0) {
266
                        return new DefaultDownloadURLsIterator(this.urlAndLabels, arg0);
267
                }
268

    
269
                public boolean remove(Object arg0) {
270
                        throw new UnsupportedOperationException("This is a read-only list");
271
                }
272

    
273
                public URL remove(int arg0) {
274
                        throw new UnsupportedOperationException("This is a read-only list");
275
                }
276

    
277
                public boolean removeAll(Collection arg0) {
278
                        throw new UnsupportedOperationException("This is a read-only list");
279
                }
280

    
281
                public boolean retainAll(Collection arg0) {
282
                        throw new UnsupportedOperationException("This is a read-only list");
283
                }
284

    
285
                public Object set(int arg0, Object arg1) {
286
                        throw new UnsupportedOperationException("This is a read-only list");
287
                }
288

    
289
                public int size() {
290
                        return this.urlAndLabels.size();
291
                }
292

    
293
                public List subList(int arg0, int arg1) {
294
                        throw new UnsupportedOperationException("This method is not supported");
295
                }
296

    
297
                public Object[] toArray() {
298
                        throw new UnsupportedOperationException("This method is not supported");
299
                }
300

    
301
                public Object[] toArray(Object[] arg0) {
302
                        throw new UnsupportedOperationException("This method is not supported");
303
                }
304
                
305
        }
306
        
307
        private static Logger logger = LoggerFactory
308
                        .getLogger(DefaultSwingInstallerManager.class);
309

    
310
        private static final String SWING_INSTALLER_MANAGER_EXTENSION_POINT = "SwingInstallerManagerExtensionPoint";
311
        private static final String CREATE_INSTALLER_WIZARD_NAME = "CreateInstallerWizard";
312
        private static final String EXECUTE_INSTALLER_WIZARD_NAME = "ExecuteInstallerWizard";
313
        private ExtensionPointManager extensionPoints = ToolsLocator
314
                        .getExtensionPointManager();
315

    
316
        private String applicationVersion = "1.0.0";
317
        private List<UrlAndLabel> defaultDownloadURLs = new ArrayList<UrlAndLabel>();
318

    
319
        public String getText(String key) {
320
                return Messages.translate(key);
321
        }
322

    
323
        public void registerMakePluginPackageWizardInstallerCreationWizard(
324
                        Class<? extends MakePluginPackageWizard> clazz) {
325
                ExtensionPoint extensionPoint = extensionPoints.add(
326
                                SWING_INSTALLER_MANAGER_EXTENSION_POINT, "");
327
                extensionPoint.append(CREATE_INSTALLER_WIZARD_NAME, "", clazz);
328
        }
329

    
330
        public void registerInstallPackageWizard(
331
                        Class<? extends InstallerWizardPanel> clazz) {
332
                ExtensionPoint extensionPoint = extensionPoints.add(
333
                                SWING_INSTALLER_MANAGER_EXTENSION_POINT, "");
334
                extensionPoint.append(EXECUTE_INSTALLER_WIZARD_NAME, "", clazz);
335
        }
336

    
337
        public String getApplicationVersion() {
338
                return applicationVersion;
339
        }
340

    
341
        public void setApplicationVersion(String gvSIGVersion) {
342
                this.applicationVersion = gvSIGVersion;
343
        }
344

    
345
        public URL getDefaultDownloadURL() {
346
                if (defaultDownloadURLs.size() < 1) {
347
                        return null;
348
                }
349
                return defaultDownloadURLs.get(0).getURL();
350
        }
351

    
352
        public List<URL> getDefaultDownloadURLs() {
353
                return new DefaultDownloadURLs(this.defaultDownloadURLs);
354
        }
355

    
356
    public List<UrlAndLabel> getDefaultDownloadUrlAndLabels() {
357
            return this.defaultDownloadURLs;
358
    }
359
    
360
        public void setDefaultDownloadURL(String defaultDownloadURLs) {
361
                String[] urls = defaultDownloadURLs.split(";");
362
                for (int i = 0; i < urls.length; i++) {
363
                        try {
364
                                this.addDefaultDownloadURL(urls[i]);
365
                        } catch (MalformedURLException e) {
366
                                logger.info("Malformed URL ("+urls[i]+").", e);
367
                        }
368
                }
369
        }
370

    
371
        public void setDefaultDownloadURL(URL defaultDownloadURL) {
372
                this.defaultDownloadURLs.clear();
373
                this.addDefaultDownloadURL(defaultDownloadURL);
374
        }
375

    
376
        public void setDefaultDownloadURL(File defaultDownloadURLs) {
377
                if( defaultDownloadURLs == null || !defaultDownloadURLs.exists() ) {
378
                    return;
379
                }
380
                InputStream is;
381
                try {
382
                        is = new FileInputStream(defaultDownloadURLs);
383
                } catch (FileNotFoundException e1) {
384
                        logger.warn("Can't open the file " + defaultDownloadURLs.getName(), e1);
385
                        return;
386
                }
387
                BufferedReader in = new BufferedReader(new InputStreamReader(is));
388
                String line = null;
389
                try {
390
                        for (line = in.readLine(); line != null; line = in.readLine()) {
391
                                try {
392
                                        this.addDefaultDownloadURL(line);
393
                                } catch (MalformedURLException e) {
394
                                        logger.warn(
395
                                                        "Error creating the default packages download URL pointing to "
396
                                                                        + line, e);
397
                                }
398
                        }
399
                } catch (IOException e) {
400
                        logger.warn("Error reading the file "
401
                                        + defaultDownloadURLs.getName(), e);
402
                }
403
        }
404

    
405
        public void addDefaultDownloadURL(URL url) {
406
                addDefaultDownloadURL(url,null);
407
        }
408
        
409
        public void addDefaultDownloadURL(URL url, String label) {
410
                Iterator<UrlAndLabel> it = this.defaultDownloadURLs.iterator();
411
                while( it.hasNext() ) {
412
                        DefaultUrlAndLabel value = (DefaultUrlAndLabel) it.next();
413
                        // Hacket by jbadia ;)
414
                        if( value.getURL().toString().equals(url.toString()) ) {
415
                                if( value.getLabel() == null ) {
416
                                        value.setLabel(label);
417
                                }
418
                                // Already exists the url, don't duplicate.
419
                                return;
420
                        }
421
                }
422
                this.defaultDownloadURLs.add( new DefaultUrlAndLabel(url, label));
423
        }
424
        
425
        @Override
426
        public void addDefaultDownloadURL(String theURL) throws MalformedURLException {
427
                if( StringUtils.isEmpty(theURL) ) {
428
                    return;
429
                }
430
                String label;
431
                String url = StringUtils.trim(theURL);
432
                if( url.startsWith("#") ) {
433
                        return;
434
                }
435
                Version version = getInstallerManager().createVersion();
436
                String versionFormat = version.getMajor() + "." + version.getMinor()
437
                                + "." + version.getRevision();
438
                String[] parts = StringUtils.split(url, "##");
439
                switch(parts.length) {
440
                    case 1:
441
                        url = parts[0];
442
                        label = url;
443
                        break;
444
                    case 2:
445
                        url = parts[0];
446
                        label = parts[1];
447
                        break;
448
                    default:
449
                        logger.warn("Can't parse url/url+label ("+theURL+").");
450
                        return;
451
                }
452
                if( StringUtils.isEmpty(url) ) {
453
                        logger.warn("Can't parse url/url+label ("+theURL+").");
454
                        return;
455
                }
456
                url = url.replace("$version", versionFormat);
457
                url = url.replace("<%Version%>", versionFormat);
458
                url = url.replace("$build", Integer.toString(version.getBuild()));
459
                url = url.replace("<%Build%>", Integer.toString(version.getBuild()));
460
                if( StringUtils.isEmpty(label) ) {
461
                    label = url;
462
                } else {
463
                    label = label.replace("$version", versionFormat);
464
                    label = label.replace("<%Version%>", versionFormat);
465
                    label = label.replace("$build", Integer.toString(version.getBuild()));
466
                    label = label.replace("<%Build%>", Integer.toString(version.getBuild()));
467
                }
468
                addDefaultDownloadURL(new URL(url), label);
469
        }
470

    
471
        public InstallerManager getInstallerManager() {
472
                return InstallerLocator.getInstallerManager();
473
        }
474

    
475
        public JShowPackageStatusAndAskContinuePanel createJShowPackageStatusAndAskContinuePanel(
476
                        List<PackageInfo> packages, String message) {
477
                return new DefaultJShowPackageStatusAndAskContinuePanel(this, packages,
478
                                message);
479
        }
480

    
481
        public JShowPackagesAndAskContinuePanel createJShowTroubledPackagesAndAskContinuePanel(
482
                        List<PackageInfo> packages, String message) {
483
                return new DefaultJShowTroubledPackagesAndAskContinuePanel(this, packages,
484
                                message);
485
        }
486
        
487
        public JShowRequiredPackagesAndAskContinuePanel createJShowRequiredPackagesAndAskContinuePanel(
488
                        List<PackageInfo> packages, String message) {
489
                return new DefaultJShowRequiredPackagesAndAskContinuePanel(this,
490
                                packages, message);
491
        }
492

    
493
        public JShowUnresolvedDependenciesAndAskContinuePanel createJShowUnresolvedDependenciesAndAskContinuePanel(
494
                        Dependencies dependencies, String message) {
495
                return new DefaultJShowUnresolvedDependenciesAndAskContinuePanel(this,
496
                                dependencies, message);
497
        }
498

    
499
        public JPackageInfoPanel createPackageInfoPanel() {
500
                return new DefaultPackageInfoPanel();
501
        }
502

    
503
        public JPackageInfoPanel createPackageInfoPanel(String packageType) {
504
                return new DefaultPackageInfoPanel(packageType);
505
        }
506

    
507
        public JOutputPanel createOutputPanel() {
508
                return new DefaultOutputPanel();
509
        }
510

    
511
        public JProgressPanel createProgressPanel() {
512
                return new DefaultProgressPanel();
513
        }
514

    
515
        public InstallWizardPanel createInstallPackageWizard(
516
                        File applicationDirectory, File installFolder)
517
                        throws InstallPackageWizardException {
518
                ExtensionPoint ep = extensionPoints
519
                                .add(SWING_INSTALLER_MANAGER_EXTENSION_POINT);
520
                try {
521
                        Object[] args = new Object[2];
522
                        args[0] = applicationDirectory;
523
                        args[1] = installFolder;
524
                        return (InstallWizardPanel) ep.create(
525
                                        EXECUTE_INSTALLER_WIZARD_NAME, args);
526

    
527
                } catch (Exception e) {
528
                        throw new InstallPackageWizardException(
529
                                        "Error creating the wizard", e);
530
                }
531
        }
532

    
533
        @Override
534
        public MakePluginPackageWizard createMakePluginPackageWizard(
535
                        File applicationDirectory, File installFolder)
536
                        throws MakePluginPackageWizardException {
537
                ExtensionPoint ep = extensionPoints
538
                                .add(SWING_INSTALLER_MANAGER_EXTENSION_POINT);
539
                try {
540
                        Object[] args = new Object[2];
541
                        args[0] = applicationDirectory;
542
                        args[1] = installFolder;
543
                        return (MakePluginPackageWizard) ep.create(
544
                                        CREATE_INSTALLER_WIZARD_NAME, args);
545
                } catch (Exception e) {
546
                        throw new MakePluginPackageWizardException(
547
                                        "Error creating the wizard", e);
548
                }
549
        }
550

    
551
        @Override
552
        public PackageBuildder createPackagerPanel(String packageType, File selectionFolder, File outputFolder) {
553
            PackageBuildder packager = new BasePackageWizard(packageType, selectionFolder, outputFolder);
554
            return packager;
555
        }
556
        
557
        public PackageFilter createPackageTypeFilter(String type) {
558
            return new TypeFilter(type);
559
        }
560
}