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 / execution / panel / model / PackagesTableModel.java @ 40560

History | View | Annotate | Download (16.3 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.execution.panel.model;
30

    
31
import java.net.URL;
32
import java.util.ArrayList;
33
import java.util.Arrays;
34
import java.util.Comparator;
35
import java.util.HashMap;
36
import java.util.HashSet;
37
import java.util.Iterator;
38
import java.util.List;
39
import java.util.Map;
40
import java.util.Set;
41

    
42
import javax.swing.table.AbstractTableModel;
43

    
44
import org.gvsig.installer.lib.api.InstallerLocator;
45
import org.gvsig.installer.lib.api.InstallerManager;
46
import org.gvsig.installer.lib.api.PackageInfo;
47
import org.gvsig.installer.lib.api.creation.MakePluginPackageServiceException;
48
import org.gvsig.installer.lib.api.execution.InstallPackageService;
49
import org.gvsig.installer.swing.api.SwingInstallerManager;
50
import org.gvsig.installer.swing.impl.execution.panel.filters.NameDescriptionOrCodeFilter;
51
import org.gvsig.installer.swing.impl.execution.panel.filters.PackageFilter;
52

    
53
public class PackagesTableModel extends AbstractTableModel {
54

    
55
        private static final long serialVersionUID = -454014676003979512L;
56

    
57
        public enum PackageStatus {
58
                INSTALLED, NOT_INSTALLED, TO_REINSTALL, TO_INSTALL, INSTALLED_NOT_INSTALLABLE, BROKEN, INSTALLATION_NOT_AVAILABLE;
59
        }
60

    
61
        public enum PackageOfficialRecommended {
62
                OFFICIAL_NOT_RECOMMENDED, OFFICIAL_RECOMMENDED, NOT_OFFICIAL_RECOMMENDED, NOT_OFFICIAL_NOT_RECOMMENDED
63
        }
64

    
65
        public class PackageOsAndArchitecture {
66
                public String os;
67
                public String arch;
68
        }
69
        
70
//        
71
//        public enum PackageOsAndArchitecture {
72
//                WINDOLS_32, WINDOLS_64, LINUX_32, LINUX_64, ALL, OTHER
73
//        }
74

    
75
        private TablePackageInfo[] currentlyVisiblePackages = null;
76

    
77
        private final String[] columnNames;
78

    
79
        private InstallerManager installerManager = InstallerLocator
80
                        .getInstallerManager();
81
        private InstallPackageService installerExecutionService;
82

    
83
        boolean isOfficial;
84
        private NameDescriptionOrCodeFilter packageFastFilter = null;
85
        private PackageFilter packageFilter = null;
86
        
87
        private Set<PackageInfo> selectedPackages = new HashSet<PackageInfo>();
88
        private Map<String, TablePackageInfo> allPackages = null;
89

    
90
        public PackagesTableModel(SwingInstallerManager swingInstallerManager,
91
                        InstallPackageService installerExecutionService, boolean isOfficial) {
92

    
93
                this.installerExecutionService = installerExecutionService;
94
                this.isOfficial = isOfficial;
95
                
96
                Map<String, TablePackageInfo> infos = getDefaultPackages();
97

    
98
                currentlyVisiblePackages = infos.values().toArray(
99
                                new TablePackageInfo[infos.size()]);
100
                sortInstallerInfos();
101

    
102
                columnNames = new String[] {
103
                                "", // Check column
104
                                "", "", swingInstallerManager.getText("_name"),
105
                                swingInstallerManager.getText("_version"),
106
                                swingInstallerManager.getText("_type") };
107

    
108
        }
109

    
110
        private void sortInstallerInfos() {
111
                Arrays.sort(currentlyVisiblePackages, new Comparator<TablePackageInfo>() {
112

    
113
                        public int compare(TablePackageInfo o1, TablePackageInfo o2) {
114
                                return o1.getPackageInfo().getName().compareToIgnoreCase(
115
                                                o2.getPackageInfo().getName());
116
                        }
117
                });
118
        }
119

    
120
    private Map<String, TablePackageInfo> getDefaultPackages() {
121

    
122
        if (allPackages == null) {
123

    
124
            List<String> defaultIDs =
125
                installerExecutionService.getDefaultSelectedPackagesIDs();
126

    
127
            allPackages =
128
                new HashMap<String, PackagesTableModel.TablePackageInfo>();
129

    
130
            // Add installable package infos
131
            for (int i = 0; i < installerExecutionService.getPackageCount(); i++) {
132
                PackageInfo installerInfo =
133
                    installerExecutionService.getPackageInfo(i);
134
                TablePackageInfo info =
135
                    new TablePackageInfo(installerInfo, false, true);
136
                if (defaultIDs != null) {
137
                    for (int j = 0; j < defaultIDs.size(); j++) {
138
                        if (info.getPackageInfo().matchID(defaultIDs.get(j))) {
139
                            if (info.getPackageInfo().getOperatingSystem()
140
                                .equals(installerManager.getOperatingSystem())
141
                                || info.getPackageInfo().getOperatingSystem()
142
                                    .equals("all")) {
143
                                info.setDefault(true);
144
                                break;
145
                            }
146

    
147
                        }
148
                    }
149
                }
150
                allPackages.put(info.getID(), info);
151
            }
152
            // Add already installed package infos
153
            try {
154
                PackageInfo[] installedPackages =
155
                    installerManager.getInstalledPackages();
156

    
157
                for (int i = 0; i < installedPackages.length; i++) {
158
                    TablePackageInfo info =
159
                        new TablePackageInfo(installedPackages[i], true, false);
160
                    TablePackageInfo x = allPackages.get(info.getID());
161
                    if (x == null) {
162
                        allPackages.put(info.getID(), info);
163
                    } else {
164
                        x.setInstalled(true);
165
                    }
166
                }
167
            } catch (MakePluginPackageServiceException e) {
168
                throw new RuntimeException(e);
169
            }
170
            
171
            // ==========================================
172
            // Set default
173
            
174
            TablePackageInfo tpi = null;
175
            String os = null;
176
            List<String> idList = installerExecutionService
177
                .getDefaultSelectedPackagesIDs();
178
            
179
            if (idList != null) {
180
                for (int i=0; i<idList.size(); i++) {
181
                    
182
                    tpi = getMatch(idList.get(i), allPackages);
183
                    if (tpi != null) {
184
                        os = tpi.getPackageInfo().getOperatingSystem();
185
                        if (os.equals(installerManager.getOperatingSystem())
186
                            || os.equals("all")) {
187
                            
188
                            tpi.setDefault(true);
189
                        }
190
                    }
191
                }
192
            }
193
        }
194
        return allPackages;
195
    }
196
    
197
    private TablePackageInfo getMatch(String id, Map<String, TablePackageInfo> map) {
198
        
199
        Iterator<TablePackageInfo> iter = map.values().iterator();
200
        TablePackageInfo item = null;
201
        while (iter.hasNext()) {
202
            item = iter.next();
203
            if (item.getPackageInfo().matchID(id)) {
204
                return item;
205
            }
206
        }
207
        return null;
208
    }
209

    
210
        // get filtered packages
211
        private Map<String, TablePackageInfo> getFilteredPackages(
212
                        Map<String, TablePackageInfo> packageInfos) {
213

    
214
                Map<String, TablePackageInfo> infos = new HashMap<String, TablePackageInfo>();
215

    
216
                TablePackageInfo[] packs = packageInfos.values().toArray(
217
                                new TablePackageInfo[infos.size()]);
218

    
219
                for (int i = 0; i < packs.length; i++) {
220
                        PackageInfo installerInfo = packs[i].getPackageInfo();
221

    
222
                        if (packageFilter.match(installerInfo)) {
223
                                TablePackageInfo info = packs[i];
224
                                infos.put(installerInfo.getID(), info);
225
                        }
226
                }
227
                return infos;
228
        }
229

    
230
        // get fast filtered packages (by name or description)
231
        private Map<String, TablePackageInfo> getFastFilteredPackages(
232
                        Map<String, TablePackageInfo> packageInfos) {
233

    
234
                Map<String, TablePackageInfo> infos = new HashMap<String, TablePackageInfo>();
235

    
236
                TablePackageInfo[] packs = packageInfos.values().toArray(
237
                                new TablePackageInfo[infos.size()]);
238

    
239
                for (int i = 0; i < packs.length; i++) {
240
                        PackageInfo installerInfo = packs[i].getPackageInfo();
241

    
242
                        if (packageFastFilter.match(installerInfo)) {
243
                                TablePackageInfo info = packs[i];
244
                                infos.put(installerInfo.getID(), info);
245
                        }
246
                }
247
                return infos;
248
        }
249

    
250
        public void updatePackages() {
251

    
252
                Map<String, TablePackageInfo> infos = getDefaultPackages();
253

    
254
                // check if there is a filter set (category, type, etc)
255
                if (isPackageFilterSet()) {
256
                        infos = getFilteredPackages(infos);
257
                }
258

    
259
                // check if there is any filter set (fastFilter)
260
                if (isFastFilterSet()) {
261
                        infos = getFastFilteredPackages(infos);
262
                }
263

    
264
                currentlyVisiblePackages = infos.values().toArray(
265
                                new TablePackageInfo[infos.size()]);
266
                sortInstallerInfos();
267
        }
268

    
269

    
270
        public void selectDefaultPackages() {
271
            
272
            Iterator<String> iter = allPackages.keySet().iterator();
273
            TablePackageInfo tpi = null;
274
            while (iter.hasNext()) {
275
                
276
                tpi = allPackages.get(iter.next());
277
                if (tpi.isDefault()) {
278
                    tpi.setSelected(true);
279
                }
280
            }
281
        }
282

    
283
        public void selectPackage(PackageInfo pkg) {
284
            
285
            Iterator<String> iter = allPackages.keySet().iterator();
286
        TablePackageInfo tpi = null;
287
        while (iter.hasNext()) {
288
            
289
            tpi = allPackages.get(iter.next());
290
            if (pkg.equals(tpi.getPackageInfo())) {
291
                tpi.setSelected(true);
292
                return;
293
            }
294
        }
295
        }
296

    
297
        @Override
298
        public Class<?> getColumnClass(int columnIndex) {
299
                switch (columnIndex) {
300
                case 0:
301
                        return PackageStatus.class;
302
                case 1:
303
                        return PackageOfficialRecommended.class;
304
                case 2:
305
                        return PackageOsAndArchitecture.class;
306
                default:
307
                        return String.class;
308
                }
309
        }
310

    
311
        public int getColumnCount() {
312
                return columnNames.length;
313
        }
314

    
315
        @Override
316
        public String getColumnName(int columnIndex) {
317
                return columnIndex >= columnNames.length ? ""
318
                                : columnNames[columnIndex];
319
        }
320

    
321
        public int getRowCount() {
322
                return currentlyVisiblePackages.length;
323
        }
324

    
325
        public Object getValueAt(int rowIndex, int columnIndex) {
326
                TablePackageInfo tableInfo = currentlyVisiblePackages[rowIndex];
327
                PackageInfo installerInfo = tableInfo.getPackageInfo();
328

    
329
                switch (columnIndex) {
330
                case 0:
331
                        PackageStatus installStatus = checkStatus(rowIndex);
332
                        return installStatus;
333
                case 1:
334
                        PackageOfficialRecommended officialRecommended = checkOfficialRecommended(rowIndex);
335
                        return officialRecommended;
336
                case 2:
337
                        PackageOsAndArchitecture packageSystem = checkPackageSystem(rowIndex);
338
                        return packageSystem;
339
                case 3:
340
                        return installerInfo.getName();
341
                case 4:
342
                        return installerInfo.getVersion();
343
                case 5:
344
                        return installerInfo.getType();
345
                default:
346
                        return "";
347

    
348
                }
349
        }
350

    
351
        /**
352
         * @param rowIndex
353
         * @return
354
         */
355
        private PackageOsAndArchitecture checkPackageSystem(int rowIndex) {
356
                PackageOsAndArchitecture oSArch = new PackageOsAndArchitecture();
357
                TablePackageInfo tableInfo = currentlyVisiblePackages[rowIndex];
358
                PackageInfo installerInfo = tableInfo.getPackageInfo();
359
                oSArch.os = installerInfo.getOperatingSystem();
360
                oSArch.arch = installerInfo.getArchitecture();
361
                return oSArch;
362
        }
363

    
364
        /**
365
         * @return
366
         */
367
        private PackageStatus checkStatus(int rowIndex) {
368
                TablePackageInfo tableInfo = currentlyVisiblePackages[rowIndex];
369

    
370
                // TODO: checkboxes when a package is broken dont work correctly
371
                if (tableInfo.getPackageInfo().isBroken()) {
372
                        return PackageStatus.BROKEN;
373
                }
374
                
375
                if( !installerManager.hasProviderToThisPackage( tableInfo.getPackageInfo()) ) {
376
                        return PackageStatus.INSTALLATION_NOT_AVAILABLE;
377
                }
378
                
379
                if (tableInfo.isInstalled()) {
380
                        if (tableInfo.isInstallable()) {
381
                                if (tableInfo.isSelected()) {
382
                                        return PackageStatus.TO_REINSTALL;
383
                                } else {
384
                                        return PackageStatus.INSTALLED;
385
                                }
386
                        } else {
387
                                return PackageStatus.INSTALLED_NOT_INSTALLABLE;
388
                        }
389

    
390
                } else {
391
                        if (tableInfo.isSelected()) {
392
                                return PackageStatus.TO_INSTALL;
393
                        } else {
394
                                return PackageStatus.NOT_INSTALLED;
395
                        }
396
                }
397
        }
398

    
399
        private PackageOfficialRecommended checkOfficialRecommended(int rowIndex) {
400
                TablePackageInfo tableInfo = currentlyVisiblePackages[rowIndex];
401
                PackageInfo packageInfo = tableInfo.getPackageInfo();
402

    
403
                if (packageInfo.isOfficial()) {
404
                        if (currentlyVisiblePackages[rowIndex].isDefault()) {
405
                                return PackageOfficialRecommended.OFFICIAL_RECOMMENDED;
406
                        } else {
407
                                return PackageOfficialRecommended.OFFICIAL_NOT_RECOMMENDED;
408
                        }
409
                } else {
410
                        if (currentlyVisiblePackages[rowIndex].isDefault()) {
411
                                return PackageOfficialRecommended.NOT_OFFICIAL_RECOMMENDED;
412
                        } else {
413
                                return PackageOfficialRecommended.NOT_OFFICIAL_NOT_RECOMMENDED;
414
                        }
415
                }
416
        }
417

    
418
        public PackageInfo getPackageInfoAt(int rowIndex) {
419
                return currentlyVisiblePackages[rowIndex].getPackageInfo();
420
        }
421

    
422
        public String getDescriptionAt(int rowIndex) {
423
                return getPackageInfoAt(rowIndex).getDescription();
424
        }
425

    
426
        public URL getSourcesAt(int rowIndex) {
427
                return getPackageInfoAt(rowIndex).getSourcesURL();
428
        }
429

    
430
        public URL getOwnerUrlAt(int rowIndex) {
431
                return getPackageInfoAt(rowIndex).getOwnerURL();
432
        }
433

    
434
        public String getOwnerAt(int rowIndex) {
435
                return getPackageInfoAt(rowIndex).getOwner();
436
        }
437

    
438
        @Override
439
        public boolean isCellEditable(int rowIndex, int columnIndex) {
440
                return (columnIndex == 0) && currentlyVisiblePackages[rowIndex].isInstallable();
441
        }
442

    
443
        @Override
444
        public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
445

    
446
                if (columnIndex == 0) {
447
                        PackageStatus status = (PackageStatus) aValue;
448
                        TablePackageInfo tableInfo = currentlyVisiblePackages[rowIndex];
449
                        switch (status) {
450
                        case INSTALLED:
451
                        case NOT_INSTALLED:
452
                                tableInfo.setSelected(false);
453
                                break;
454

    
455
                        case TO_REINSTALL:
456
                        case TO_INSTALL:
457
                                tableInfo.setSelected(true);
458
                                break;
459
                        }
460
                }
461
        }
462

    
463
        public List<PackageInfo> getPackagesToInstall() {
464
            
465
            List<PackageInfo> packageInfosToInstall = new ArrayList<PackageInfo>();
466
            packageInfosToInstall.addAll(selectedPackages);
467
            return packageInfosToInstall;
468
        }
469

    
470
        public boolean hasAnyPackageSelected() {
471
            return (selectedPackages.size() > 0);
472
        }
473

    
474
        public final class TablePackageInfo {
475

    
476
                private final PackageInfo packageInfo;
477
                private boolean isInstalled;
478
                private final boolean isInstallable;
479
                // private boolean isSelected;
480
                private boolean isDefault;
481

    
482
                public TablePackageInfo(PackageInfo packageInfo, boolean isInstalled,
483
                                boolean isInstallable) {
484
                        this(packageInfo, isInstalled, isInstallable, false);
485
                }
486

    
487
                public void setInstalled(boolean installed) {
488
                        this.isInstalled = installed;
489
                }
490

    
491
                public TablePackageInfo(PackageInfo packageInfo, boolean isInstalled,
492
                                boolean isInstallable, boolean isDefault) {
493
                        this.packageInfo = packageInfo;
494
                        this.isInstalled = isInstalled;
495
                        this.isInstallable = isInstallable;
496
                        this.isDefault = isDefault;
497
                }
498

    
499
                public String getID() {
500
                        PackageInfo pkg = this.getPackageInfo();
501
                        return pkg.getID();
502
                }
503

    
504
                public PackageInfo getPackageInfo() {
505
                        return packageInfo;
506
                }
507

    
508
                public boolean isInstalled() {
509
                        return isInstalled;
510
                }
511

    
512
                public boolean isInstallable() {
513
                        return isInstallable;
514
                }
515

    
516
                public boolean isSelected() {
517
                        return selectedPackages.contains(packageInfo);
518
                }
519

    
520
                public void setSelected(boolean isSelected) {
521
                    if (isSelected) {
522
                        selectedPackages.add(packageInfo);
523
                    } else {
524
                        selectedPackages.remove(packageInfo);
525
                    }
526
                }
527

    
528
                public void setDefault(boolean isDefault) {
529
                        this.isDefault = isDefault;
530
                }
531

    
532
                public boolean isDefault() {
533
                        return isDefault;
534
                }
535

    
536
        }
537

    
538
        /**
539
         * Returns the TablePackageInfo located in the given row.
540
         * 
541
         * @param row
542
         *            the TablePackageInfo located in the given row
543
         */
544
        public TablePackageInfo getPackageInfo(int row) {
545
                return currentlyVisiblePackages[row];
546
        }
547

    
548
        public void setFilter(PackageFilter filter) {
549
                this.packageFilter = filter;
550
        }
551

    
552
        public void setFilter(NameDescriptionOrCodeFilter filter) {
553
                this.packageFastFilter = filter;
554
        }
555

    
556
        private Boolean isFastFilterSet() {
557
                return this.packageFastFilter != null;
558
        }
559

    
560
        private Boolean isPackageFilterSet() {
561
                return this.packageFilter != null;
562
        }
563

    
564
        public PackageFilter getFilter() {
565
                return this.packageFastFilter;
566
        }
567

    
568
        public InstallPackageService getInstallPackageService() {
569
                return this.installerExecutionService;
570
        }
571
}