Statistics
| Revision:

root / branches / v2_0_0_prep / 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 @ 37822

History | View | Annotate | Download (14.8 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.List;
36
import java.util.Map;
37

    
38
import javax.swing.table.AbstractTableModel;
39

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

    
49
public class PackagesTableModel extends AbstractTableModel {
50

    
51
        private static final long serialVersionUID = -454014676003979512L;
52

    
53
        public enum PackageStatus {
54
                INSTALLED, NOT_INSTALLED, TO_REINSTALL, TO_INSTALL, INSTALLED_NOT_INSTALLABLE;
55
        }
56

    
57
        public enum PackageOfficialRecommended {
58
                OFFICIAL_NOT_RECOMMENDED, OFFICIAL_RECOMMENDED, NOT_OFFICIAL_RECOMMENDED, NOT_OFFICIAL_NOT_RECOMMENDED
59
        }
60

    
61
        public enum PackageOsAndArchitecture {
62
                WINDOLS_32, WINDOLS_64, LINUX_32, LINUX_64, ALL, OTHER
63
        }
64

    
65
        private TablePackageInfo[] installerInfos = null;
66

    
67
        private final String[] columnNames;
68

    
69
        private InstallerManager installerManager = InstallerLocator
70
                        .getInstallerManager();
71
        private InstallPackageService installerExecutionService;
72

    
73
        boolean isOfficial;
74
        private NameDescriptionOrCodeFilter packageFastFilter = null;
75
        private PackageFilter packageFilter = null;
76

    
77
        public PackagesTableModel(SwingInstallerManager swingInstallerManager,
78
                        InstallPackageService installerExecutionService, boolean isOfficial) {
79

    
80
                this.installerExecutionService = installerExecutionService;
81
                this.isOfficial = isOfficial;
82
                Map<String, TablePackageInfo> infos = getDefaultPackages();
83

    
84
                installerInfos = infos.values().toArray(
85
                                new TablePackageInfo[infos.size()]);
86
                sortInstallerInfos();
87

    
88
                columnNames = new String[] {
89
                                "", // Check column
90
                                "", "", swingInstallerManager.getText("_name"),
91
                                swingInstallerManager.getText("_version"),
92
                                swingInstallerManager.getText("_type") };
93

    
94
        }
95

    
96
        private void sortInstallerInfos() {
97
                Arrays.sort(this.installerInfos, new Comparator<TablePackageInfo>() {
98

    
99
                        public int compare(TablePackageInfo o1, TablePackageInfo o2) {
100
                                return o1.getPackageInfo().getName().compareToIgnoreCase(
101
                                                o2.getPackageInfo().getName());
102
                        }
103
                });
104
        }
105

    
106
        private Map<String, TablePackageInfo> getDefaultPackages() {
107

    
108
                List<String> defaultIDs = installerExecutionService
109
                                .getDefaultSelectedPackagesIDs();
110

    
111
                Map<String, TablePackageInfo> infos = new HashMap<String, TablePackageInfo>();
112
                // Add installable package infos
113
                for (int i = 0; i < installerExecutionService.getPackageCount(); i++) {
114
                        PackageInfo installerInfo = installerExecutionService
115
                                        .getPackageInfo(i);
116
                        TablePackageInfo info = new TablePackageInfo(installerInfo, false,
117
                                        true);
118
                        if (defaultIDs != null) {
119
                                for (int j = 0; j < defaultIDs.size(); j++) {
120
                                        if (info.getPackageInfo().matchID(defaultIDs.get(j))) {
121
                                                if (info.getPackageInfo().getOperatingSystem().equals(
122
                                                                installerManager.getOperatingSystem())
123
                                                                || info.getPackageInfo().getOperatingSystem()
124
                                                                                .equals("all")) {
125
                                                        info.setDefault(true);
126
                                                        break;
127
                                                }
128

    
129
                                        }
130
                                }
131
                        }
132
                        infos.put(info.getID(), info);
133
                }
134
                // Add already installed package infos
135
                try {
136
                        PackageInfo[] installedPackages = installerManager
137
                                        .getInstalledPackages();
138

    
139
                        for (int i = 0; i < installedPackages.length; i++) {
140
                                TablePackageInfo info = new TablePackageInfo(
141
                                                installedPackages[i], true, false);
142
                                TablePackageInfo x = infos.get(info.getID());
143
                                if (x == null) {
144
                                        infos.put(info.getID(), info);
145
                                } else {
146
                                        x.setInstalled(true);
147
                                }
148
                        }
149
                } catch (MakePluginPackageServiceException e) {
150
                        throw new RuntimeException(e);
151
                }
152

    
153
                return infos;
154
        }
155

    
156
        // get filtered packages
157
        private Map<String, TablePackageInfo> getFilteredPackages(
158
                        Map<String, TablePackageInfo> packageInfos) {
159

    
160
                Map<String, TablePackageInfo> infos = new HashMap<String, TablePackageInfo>();
161

    
162
                TablePackageInfo[] packs = packageInfos.values().toArray(
163
                                new TablePackageInfo[infos.size()]);
164

    
165
                for (int i = 0; i < packs.length; i++) {
166
                        PackageInfo installerInfo = packs[i].getPackageInfo();
167

    
168
                        if (packageFilter.match(installerInfo)) {
169
                                TablePackageInfo info = packs[i];
170
                                infos.put(installerInfo.getID(), info);
171
                        }
172
                }
173
                return infos;
174
        }
175

    
176
        // get fast filtered packages (by name or description)
177
        private Map<String, TablePackageInfo> getFastFilteredPackages(
178
                        Map<String, TablePackageInfo> packageInfos) {
179

    
180
                Map<String, TablePackageInfo> infos = new HashMap<String, TablePackageInfo>();
181

    
182
                TablePackageInfo[] packs = packageInfos.values().toArray(
183
                                new TablePackageInfo[infos.size()]);
184

    
185
                for (int i = 0; i < packs.length; i++) {
186
                        PackageInfo installerInfo = packs[i].getPackageInfo();
187

    
188
                        if (packageFastFilter.match(installerInfo)) {
189
                                TablePackageInfo info = packs[i];
190
                                infos.put(installerInfo.getID(), info);
191
                        }
192
                }
193
                return infos;
194
        }
195

    
196
        public void updatePackages() {
197

    
198
                Map<String, TablePackageInfo> infos = getDefaultPackages();
199

    
200
                // check if there is a filter set (category, type, etc)
201
                if (isPackageFilterSet()) {
202
                        infos = getFilteredPackages(infos);
203
                }
204

    
205
                // check if there is any filter set (fastFilter)
206
                if (isFastFilterSet()) {
207
                        infos = getFastFilteredPackages(infos);
208
                }
209

    
210
                for (int i = 0; i < installerInfos.length; i++) {
211
                        TablePackageInfo installerInfo = infos.get(installerInfos[i]
212
                                        .getID());
213
                        if (installerInfo != null) {
214
                                installerInfo.setSelected(installerInfos[i].isSelected());
215
                        }
216
                }
217

    
218
                installerInfos = infos.values().toArray(
219
                                new TablePackageInfo[infos.size()]);
220
                sortInstallerInfos();
221

    
222
                List<String> idList = installerExecutionService
223
                                .getDefaultSelectedPackagesIDs();
224

    
225
                if (idList != null) {
226
                        for (int i = 0; i < installerInfos.length; i++) {
227
                                for (int j = 0; j < idList.size(); j++) {
228
                                        if (installerInfos[i].getPackageInfo().matchID(
229
                                                        idList.get(j))) {
230
                                                if (installerInfos[i].getPackageInfo()
231
                                                                .getOperatingSystem().equals(
232
                                                                                installerManager.getOperatingSystem())
233
                                                                || installerInfos[i].getPackageInfo()
234
                                                                                .getOperatingSystem().equals("all")) {
235
                                                        installerInfos[i].setDefault(true);
236
                                                }
237
                                        }
238
                                }
239
                        }
240
                }
241
        }
242

    
243
        // selects default packages
244
        public void selectDefaultPackages() {
245
                for (int i = 0; i < installerInfos.length; i++) {
246
                        if (installerInfos[i].isDefault()) {
247
                                installerInfos[i].setSelected(true);
248
                        } else {
249
                                installerInfos[i].setSelected(false);
250
                        }
251
                }
252
        }
253

    
254
        public void selectPackage(PackageInfo pkg) {
255
                for (int i = 0; i < installerInfos.length; i++) {
256
                        if (pkg.equals(installerInfos[i].getPackageInfo())) {
257
                                installerInfos[i].setSelected(true);
258
                                return;
259
                        }
260
                }
261
        }
262

    
263
        @Override
264
        public Class<?> getColumnClass(int columnIndex) {
265
                switch (columnIndex) {
266
                case 0:
267
                        return PackageStatus.class;
268
                case 1:
269
                        return PackageOfficialRecommended.class;
270
                case 2:
271
                        return PackageOsAndArchitecture.class;
272
                default:
273
                        return String.class;
274
                }
275
        }
276

    
277
        public int getColumnCount() {
278
                return columnNames.length;
279
        }
280

    
281
        @Override
282
        public String getColumnName(int columnIndex) {
283
                return columnIndex >= columnNames.length ? ""
284
                                : columnNames[columnIndex];
285
        }
286

    
287
        public int getRowCount() {
288
                return installerInfos.length;
289
        }
290

    
291
        public Object getValueAt(int rowIndex, int columnIndex) {
292
                TablePackageInfo tableInfo = installerInfos[rowIndex];
293
                PackageInfo installerInfo = tableInfo.getPackageInfo();
294

    
295
                switch (columnIndex) {
296
                case 0:
297
                        PackageStatus installStatus = checkStatus(rowIndex);
298
                        return installStatus;
299
                case 1:
300
                        PackageOfficialRecommended officialRecommended = checkOfficialRecommended(rowIndex);
301
                        return officialRecommended;
302
                case 2:
303
                        PackageOsAndArchitecture packageSystem = checkPackageSystem(rowIndex);
304
                        return packageSystem;
305
                case 3:
306
                        return installerInfo.getName();
307
                case 4:
308
                        return installerInfo.getVersion();
309
                case 5:
310
                        return installerInfo.getType();
311
                default:
312
                        return "";
313

    
314
                }
315
        }
316

    
317
        /**
318
         * @param rowIndex
319
         * @return
320
         */
321
        private PackageOsAndArchitecture checkPackageSystem(int rowIndex) {
322
                TablePackageInfo tableInfo = installerInfos[rowIndex];
323
                PackageInfo installerInfo = tableInfo.getPackageInfo();
324
                PackageOsAndArchitecture oSArch;
325

    
326
                if (installerInfo.getOperatingSystem().equals(
327
                                installerInfo.getArchitecture())) {
328
                        oSArch = PackageOsAndArchitecture.ALL;
329
                } else if ((installerInfo.getOperatingSystem().equals("lin"))) {
330
                        if (installerInfo.getArchitecture().equals("x86")) {
331
                                oSArch = PackageOsAndArchitecture.LINUX_32;
332
                        } else {
333
                                oSArch = PackageOsAndArchitecture.LINUX_64;
334
                        }
335
                } else if ((installerInfo.getOperatingSystem().equals("win"))) {
336
                        if (installerInfo.getArchitecture().equals("x86")) {
337
                                oSArch = PackageOsAndArchitecture.WINDOLS_32;
338
                        } else {
339
                                oSArch = PackageOsAndArchitecture.WINDOLS_64;
340
                        }
341
                } else {
342
                        oSArch = PackageOsAndArchitecture.OTHER;
343
                }
344
                return oSArch;
345
        }
346

    
347
        /**
348
         * @return
349
         */
350
        private PackageStatus checkStatus(int rowIndex) {
351
                TablePackageInfo tableInfo = installerInfos[rowIndex];
352

    
353
                if (tableInfo.isInstalled()) {
354
                        if (tableInfo.isInstallable()) {
355
                                if (tableInfo.isSelected()) {
356
                                        return PackageStatus.TO_REINSTALL;
357
                                } else {
358
                                        return PackageStatus.INSTALLED;
359
                                }
360
                        } else {
361
                                return PackageStatus.INSTALLED_NOT_INSTALLABLE;
362
                        }
363

    
364
                } else {
365
                        if (tableInfo.isSelected()) {
366
                                return PackageStatus.TO_INSTALL;
367
                        } else {
368
                                return PackageStatus.NOT_INSTALLED;
369
                        }
370
                }
371
        }
372

    
373
        private PackageOfficialRecommended checkOfficialRecommended(int rowIndex) {
374
                TablePackageInfo tableInfo = installerInfos[rowIndex];
375
                PackageInfo packageInfo = tableInfo.getPackageInfo();
376

    
377
                if (packageInfo.isOfficial()) {
378
                        if (installerInfos[rowIndex].isDefault()) {
379
                                return PackageOfficialRecommended.OFFICIAL_RECOMMENDED;
380
                        } else {
381
                                return PackageOfficialRecommended.OFFICIAL_NOT_RECOMMENDED;
382
                        }
383
                } else {
384
                        if (installerInfos[rowIndex].isDefault()) {
385
                                return PackageOfficialRecommended.NOT_OFFICIAL_RECOMMENDED;
386
                        } else {
387
                                return PackageOfficialRecommended.NOT_OFFICIAL_NOT_RECOMMENDED;
388
                        }
389
                }
390
        }
391

    
392
        public PackageInfo getPackageInfoAt(int rowIndex) {
393
                return installerInfos[rowIndex].getPackageInfo();
394
        }
395

    
396
        public String getDescriptionAt(int rowIndex) {
397
                return getPackageInfoAt(rowIndex).getDescription();
398
        }
399

    
400
        public URL getSourcesAt(int rowIndex) {
401
                return getPackageInfoAt(rowIndex).getSourcesURL();
402
        }
403

    
404
        public URL getOwnerUrlAt(int rowIndex) {
405
                return getPackageInfoAt(rowIndex).getOwnerURL();
406
        }
407

    
408
        public String getOwnerAt(int rowIndex) {
409
                return getPackageInfoAt(rowIndex).getOwner();
410
        }
411

    
412
        @Override
413
        public boolean isCellEditable(int rowIndex, int columnIndex) {
414
                return (columnIndex == 0) && installerInfos[rowIndex].isInstallable();
415
        }
416

    
417
        @Override
418
        public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
419

    
420
                if (columnIndex == 0) {
421
                        PackageStatus status = (PackageStatus) aValue;
422
                        TablePackageInfo tableInfo = installerInfos[rowIndex];
423
                        switch (status) {
424
                        case INSTALLED:
425
                        case NOT_INSTALLED:
426
                                tableInfo.setSelected(false);
427
                                break;
428

    
429
                        case TO_REINSTALL:
430
                        case TO_INSTALL:
431
                                tableInfo.setSelected(true);
432
                                break;
433
                        }
434
                }
435
        }
436

    
437
        public List<PackageInfo> getPackagesToInstall() {
438
                List<PackageInfo> packageInfosToInstall = new ArrayList<PackageInfo>();
439
                for (int i = 0; i < installerInfos.length; i++) {
440
                        TablePackageInfo tableInfo = installerInfos[i];
441
                        if (tableInfo.isSelected()) {
442
                                packageInfosToInstall.add(tableInfo.getPackageInfo());
443
                        }
444
                }
445
                return packageInfosToInstall;
446
        }
447

    
448
        public boolean hasAnyPackageSelected() {
449
                for (int i = 0; i < installerInfos.length; i++) {
450
                        if (installerInfos[i].isSelected) {
451
                                return true;
452
                        }
453
                }
454
                return false;
455
        }
456

    
457
        public static final class TablePackageInfo {
458

    
459
                private final PackageInfo packageInfo;
460
                private boolean isInstalled;
461
                private final boolean isInstallable;
462
                private boolean isSelected;
463
                private boolean isDefault;
464

    
465
                public TablePackageInfo(PackageInfo packageInfo, boolean isInstalled,
466
                                boolean isInstallable) {
467
                        this(packageInfo, isInstalled, isInstallable, false, false);
468
                }
469

    
470
                public void setInstalled(boolean installed) {
471
                        this.isInstalled = installed;
472
                }
473

    
474
                public TablePackageInfo(PackageInfo packageInfo, boolean isInstalled,
475
                                boolean isInstallable, boolean isSelected, boolean isDefault) {
476
                        this.packageInfo = packageInfo;
477
                        this.isInstalled = isInstalled;
478
                        this.isInstallable = isInstallable;
479
                        this.isSelected = isSelected;
480
                        this.isDefault = isDefault;
481
                }
482

    
483
                public String getID() {
484
                        PackageInfo pkg = this.getPackageInfo();
485
                        return pkg.getID();
486
                }
487

    
488
                public PackageInfo getPackageInfo() {
489
                        return packageInfo;
490
                }
491

    
492
                public boolean isInstalled() {
493
                        return isInstalled;
494
                }
495

    
496
                public boolean isInstallable() {
497
                        return isInstallable;
498
                }
499

    
500
                public boolean isSelected() {
501
                        return isSelected;
502
                }
503

    
504
                public void setSelected(boolean isSelected) {
505
                        this.isSelected = isSelected;
506
                }
507

    
508
                public void setDefault(boolean isDefault) {
509
                        this.isDefault = isDefault;
510
                }
511

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

    
516
        }
517

    
518
        /**
519
         * Returns the TablePackageInfo located in the given row.
520
         * 
521
         * @param row
522
         *            the TablePackageInfo located in the given row
523
         */
524
        public TablePackageInfo getPackageInfo(int row) {
525
                return installerInfos[row];
526
        }
527

    
528
        public void setFilter(PackageFilter filter) {
529
                this.packageFilter = filter;
530
        }
531

    
532
        public void setFilter(NameDescriptionOrCodeFilter filter) {
533
                this.packageFastFilter = filter;
534
        }
535

    
536
        private Boolean isFastFilterSet() {
537
                return this.packageFastFilter != null;
538
        }
539

    
540
        private Boolean isPackageFilterSet() {
541
                return this.packageFilter != null;
542
        }
543

    
544
        public PackageFilter getFilter() {
545
                return this.packageFastFilter;
546
        }
547

    
548
        public InstallPackageService getInstallPackageService() {
549
                return this.installerExecutionService;
550
        }
551
}