Statistics
| Revision:

root / tags / v2_0_0_Build_2051 / extensions / 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 @ 38753

History | View | Annotate | Download (16.1 KB)

1
/* gvSIG. Geographic Information System of the Valencian Government
2
 *
3
 * Copyright (C) 2007-2008 Infrastructures and Transports Department
4
 * of the Valencian Government (CIT)
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 2
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
 */
22

    
23
/*
24
 * AUTHORS (In addition to CIT):
25
 * 2010 {Prodevelop}   {Task}
26
 */
27

    
28
package org.gvsig.installer.swing.impl.execution.panel.model;
29

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

    
41
import javax.swing.table.AbstractTableModel;
42

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

    
52
public class PackagesTableModel extends AbstractTableModel {
53

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

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

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

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

    
74
        private TablePackageInfo[] currentlyVisiblePackages = null;
75

    
76
        private final String[] columnNames;
77

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

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

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

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

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

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

    
107
        }
108

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

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

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

    
121
        if (allPackages == null) {
122

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
249
        public void updatePackages() {
250

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

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

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

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

    
268

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

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

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

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

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

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

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

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

    
347
                }
348
        }
349

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

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

    
369
                // TODO: checkboxes when a package is broken dont work correctly
370
                if (tableInfo.getPackageInfo().isBroken()) {
371
                        return PackageStatus.BROKEN;
372
                }
373

    
374
                if (tableInfo.isInstalled()) {
375
                        if (tableInfo.isInstallable()) {
376
                                if (tableInfo.isSelected()) {
377
                                        return PackageStatus.TO_REINSTALL;
378
                                } else {
379
                                        return PackageStatus.INSTALLED;
380
                                }
381
                        } else {
382
                                return PackageStatus.INSTALLED_NOT_INSTALLABLE;
383
                        }
384

    
385
                } else {
386
                        if (tableInfo.isSelected()) {
387
                                return PackageStatus.TO_INSTALL;
388
                        } else {
389
                                return PackageStatus.NOT_INSTALLED;
390
                        }
391
                }
392
        }
393

    
394
        private PackageOfficialRecommended checkOfficialRecommended(int rowIndex) {
395
                TablePackageInfo tableInfo = currentlyVisiblePackages[rowIndex];
396
                PackageInfo packageInfo = tableInfo.getPackageInfo();
397

    
398
                if (packageInfo.isOfficial()) {
399
                        if (currentlyVisiblePackages[rowIndex].isDefault()) {
400
                                return PackageOfficialRecommended.OFFICIAL_RECOMMENDED;
401
                        } else {
402
                                return PackageOfficialRecommended.OFFICIAL_NOT_RECOMMENDED;
403
                        }
404
                } else {
405
                        if (currentlyVisiblePackages[rowIndex].isDefault()) {
406
                                return PackageOfficialRecommended.NOT_OFFICIAL_RECOMMENDED;
407
                        } else {
408
                                return PackageOfficialRecommended.NOT_OFFICIAL_NOT_RECOMMENDED;
409
                        }
410
                }
411
        }
412

    
413
        public PackageInfo getPackageInfoAt(int rowIndex) {
414
                return currentlyVisiblePackages[rowIndex].getPackageInfo();
415
        }
416

    
417
        public String getDescriptionAt(int rowIndex) {
418
                return getPackageInfoAt(rowIndex).getDescription();
419
        }
420

    
421
        public URL getSourcesAt(int rowIndex) {
422
                return getPackageInfoAt(rowIndex).getSourcesURL();
423
        }
424

    
425
        public URL getOwnerUrlAt(int rowIndex) {
426
                return getPackageInfoAt(rowIndex).getOwnerURL();
427
        }
428

    
429
        public String getOwnerAt(int rowIndex) {
430
                return getPackageInfoAt(rowIndex).getOwner();
431
        }
432

    
433
        @Override
434
        public boolean isCellEditable(int rowIndex, int columnIndex) {
435
                return (columnIndex == 0) && currentlyVisiblePackages[rowIndex].isInstallable();
436
        }
437

    
438
        @Override
439
        public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
440

    
441
                if (columnIndex == 0) {
442
                        PackageStatus status = (PackageStatus) aValue;
443
                        TablePackageInfo tableInfo = currentlyVisiblePackages[rowIndex];
444
                        switch (status) {
445
                        case INSTALLED:
446
                        case NOT_INSTALLED:
447
                                tableInfo.setSelected(false);
448
                                break;
449

    
450
                        case TO_REINSTALL:
451
                        case TO_INSTALL:
452
                                tableInfo.setSelected(true);
453
                                break;
454
                        }
455
                }
456
        }
457

    
458
        public List<PackageInfo> getPackagesToInstall() {
459
            
460
            List<PackageInfo> packageInfosToInstall = new ArrayList<PackageInfo>();
461
            packageInfosToInstall.addAll(selectedPackages);
462
            return packageInfosToInstall;
463
        }
464

    
465
        public boolean hasAnyPackageSelected() {
466
            return (selectedPackages.size() > 0);
467
        }
468

    
469
        public final class TablePackageInfo {
470

    
471
                private final PackageInfo packageInfo;
472
                private boolean isInstalled;
473
                private final boolean isInstallable;
474
                // private boolean isSelected;
475
                private boolean isDefault;
476

    
477
                public TablePackageInfo(PackageInfo packageInfo, boolean isInstalled,
478
                                boolean isInstallable) {
479
                        this(packageInfo, isInstalled, isInstallable, false);
480
                }
481

    
482
                public void setInstalled(boolean installed) {
483
                        this.isInstalled = installed;
484
                }
485

    
486
                public TablePackageInfo(PackageInfo packageInfo, boolean isInstalled,
487
                                boolean isInstallable, boolean isDefault) {
488
                        this.packageInfo = packageInfo;
489
                        this.isInstalled = isInstalled;
490
                        this.isInstallable = isInstallable;
491
                        this.isDefault = isDefault;
492
                }
493

    
494
                public String getID() {
495
                        PackageInfo pkg = this.getPackageInfo();
496
                        return pkg.getID();
497
                }
498

    
499
                public PackageInfo getPackageInfo() {
500
                        return packageInfo;
501
                }
502

    
503
                public boolean isInstalled() {
504
                        return isInstalled;
505
                }
506

    
507
                public boolean isInstallable() {
508
                        return isInstallable;
509
                }
510

    
511
                public boolean isSelected() {
512
                        return selectedPackages.contains(packageInfo);
513
                }
514

    
515
                public void setSelected(boolean isSelected) {
516
                    if (isSelected) {
517
                        selectedPackages.add(packageInfo);
518
                    } else {
519
                        selectedPackages.remove(packageInfo);
520
                    }
521
                }
522

    
523
                public void setDefault(boolean isDefault) {
524
                        this.isDefault = isDefault;
525
                }
526

    
527
                public boolean isDefault() {
528
                        return isDefault;
529
                }
530

    
531
        }
532

    
533
        /**
534
         * Returns the TablePackageInfo located in the given row.
535
         * 
536
         * @param row
537
         *            the TablePackageInfo located in the given row
538
         */
539
        public TablePackageInfo getPackageInfo(int row) {
540
                return currentlyVisiblePackages[row];
541
        }
542

    
543
        public void setFilter(PackageFilter filter) {
544
                this.packageFilter = filter;
545
        }
546

    
547
        public void setFilter(NameDescriptionOrCodeFilter filter) {
548
                this.packageFastFilter = filter;
549
        }
550

    
551
        private Boolean isFastFilterSet() {
552
                return this.packageFastFilter != null;
553
        }
554

    
555
        private Boolean isPackageFilterSet() {
556
                return this.packageFilter != null;
557
        }
558

    
559
        public PackageFilter getFilter() {
560
                return this.packageFastFilter;
561
        }
562

    
563
        public InstallPackageService getInstallPackageService() {
564
                return this.installerExecutionService;
565
        }
566
}