Statistics
| Revision:

svn-gvsig-desktop / 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 @ 37601

History | View | Annotate | Download (14.9 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.io.File;
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.List;
37
import java.util.Map;
38

    
39
import javax.swing.table.AbstractTableModel;
40

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

    
50
public class PackagesTableModel extends AbstractTableModel {
51

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

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

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

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

    
66
        private TablePackageInfo[] installerInfos = null;
67

    
68
        private final String[] columnNames;
69

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

    
74
        boolean isOfficial;
75
        private File pluginsFolder;
76
        private NameDescriptionOrCodeFilter packageFastFilter = null;
77
        private PackageFilter packageFilter = null;
78

    
79
        public PackagesTableModel(SwingInstallerManager swingInstallerManager,
80
                        InstallPackageService installerExecutionService,
81
                        boolean isOfficial, File pluginsFolder) {
82

    
83
                this.installerExecutionService = installerExecutionService;
84
                this.isOfficial = isOfficial;
85
                this.pluginsFolder = pluginsFolder;
86
                Map<String, TablePackageInfo> infos = getDefaultPackages();
87

    
88
                installerInfos = infos.values().toArray(
89
                                new TablePackageInfo[infos.size()]);
90
                sortInstallerInfos();
91

    
92
                columnNames = new String[] {
93
                                "", // Check column
94
                                "", "", swingInstallerManager.getText("_name"),
95
                                swingInstallerManager.getText("_version"),
96
                                swingInstallerManager.getText("_type") };
97

    
98
        }
99

    
100
        private void sortInstallerInfos() {
101
                Arrays.sort(this.installerInfos, new Comparator<TablePackageInfo>() {
102

    
103
                        public int compare(TablePackageInfo o1, TablePackageInfo o2) {
104
                                return o1.getPackageInfo().getName().compareToIgnoreCase(
105
                                                o2.getPackageInfo().getName());
106
                        }
107
                });
108
        }
109

    
110
        private Map<String, TablePackageInfo> getDefaultPackages() {
111

    
112
                List<String> defaultIDs = installerExecutionService
113
                                .getDefaultSelectedPackagesIDs();
114

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

    
133
                                        }
134
                                }
135
                                infos.put(info.getID(), info);
136
                        }
137
                }
138
                // Add already installed package infos
139
                try {
140
                        PackageInfo[] installedPackages = installerManager
141
                                        .getInstalledPackages(pluginsFolder);
142

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

    
157
                return infos;
158
        }
159

    
160
        // get filtered packages
161
        private Map<String, TablePackageInfo> getFilteredPackages(
162
                        Map<String, TablePackageInfo> packageInfos) {
163

    
164
                Map<String, TablePackageInfo> infos = new HashMap<String, TablePackageInfo>();
165

    
166
                TablePackageInfo[] packs = packageInfos.values().toArray(
167
                                new TablePackageInfo[infos.size()]);
168

    
169
                for (int i = 0; i < packs.length; i++) {
170
                        PackageInfo installerInfo = packs[i].getPackageInfo();
171

    
172
                        if (packageFilter.match(installerInfo)) {
173
                                TablePackageInfo info = packs[i];
174
                                infos.put(installerInfo.getID(), info);
175
                        }
176
                }
177
                return infos;
178
        }
179

    
180
        // get fast filtered packages (by name or description)
181
        private Map<String, TablePackageInfo> getFastFilteredPackages(
182
                        Map<String, TablePackageInfo> packageInfos) {
183

    
184
                Map<String, TablePackageInfo> infos = new HashMap<String, TablePackageInfo>();
185

    
186
                TablePackageInfo[] packs = packageInfos.values().toArray(
187
                                new TablePackageInfo[infos.size()]);
188

    
189
                for (int i = 0; i < packs.length; i++) {
190
                        PackageInfo installerInfo = packs[i].getPackageInfo();
191

    
192
                        if (packageFastFilter.match(installerInfo)) {
193
                                TablePackageInfo info = packs[i];
194
                                infos.put(installerInfo.getID(), info);
195
                        }
196
                }
197
                return infos;
198
        }
199

    
200
        public void updatePackages() {
201

    
202
                Map<String, TablePackageInfo> infos = getDefaultPackages();
203

    
204
                // check if there is a filter set (category, type, etc)
205
                if (isPackageFilterSet()) {
206
                        infos = getFilteredPackages(infos);
207
                }
208

    
209
                // check if there is any filter set (fastFilter)
210
                if (isFastFilterSet()) {
211
                        infos = getFastFilteredPackages(infos);
212
                }
213

    
214
                for (int i = 0; i < installerInfos.length; i++) {
215
                        TablePackageInfo installerInfo = infos.get(installerInfos[i]
216
                                        .getID());
217
                        if (installerInfo != null) {
218
                                installerInfo.setSelected(installerInfos[i].isSelected());
219
                        }
220
                }
221

    
222
                installerInfos = infos.values().toArray(
223
                                new TablePackageInfo[infos.size()]);
224
                sortInstallerInfos();
225

    
226
                List<String> idList = installerExecutionService
227
                                .getDefaultSelectedPackagesIDs();
228

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

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

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

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

    
281
        public int getColumnCount() {
282
                return columnNames.length;
283
        }
284

    
285
        @Override
286
        public String getColumnName(int columnIndex) {
287
                return columnIndex >= columnNames.length ? ""
288
                                : columnNames[columnIndex];
289
        }
290

    
291
        public int getRowCount() {
292
                return installerInfos.length;
293
        }
294

    
295
        public Object getValueAt(int rowIndex, int columnIndex) {
296
                TablePackageInfo tableInfo = installerInfos[rowIndex];
297
                PackageInfo installerInfo = tableInfo.getPackageInfo();
298

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

    
318
                }
319
        }
320

    
321
        /**
322
         * @param rowIndex
323
         * @return
324
         */
325
        private PackageOsAndArchitecture checkPackageSystem(int rowIndex) {
326
                TablePackageInfo tableInfo = installerInfos[rowIndex];
327
                PackageInfo installerInfo = tableInfo.getPackageInfo();
328
                PackageOsAndArchitecture oSArch;
329

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

    
351
        /**
352
         * @return
353
         */
354
        private PackageStatus checkStatus(int rowIndex) {
355
                TablePackageInfo tableInfo = installerInfos[rowIndex];
356

    
357
                if (tableInfo.isInstalled()) {
358
                        if (tableInfo.isInstallable()) {
359
                                if (tableInfo.isSelected()) {
360
                                        return PackageStatus.TO_REINSTALL;
361
                                } else {
362
                                        return PackageStatus.INSTALLED;
363
                                }
364
                        } else {
365
                                return PackageStatus.INSTALLED_NOT_INSTALLABLE;
366
                        }
367

    
368
                } else {
369
                        if (tableInfo.isSelected()) {
370
                                return PackageStatus.TO_INSTALL;
371
                        } else {
372
                                return PackageStatus.NOT_INSTALLED;
373
                        }
374
                }
375
        }
376

    
377
        private PackageOfficialRecommended checkOfficialRecommended(int rowIndex) {
378
                TablePackageInfo tableInfo = installerInfos[rowIndex];
379
                PackageInfo packageInfo = tableInfo.getPackageInfo();
380

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

    
396
        public PackageInfo getPackageInfoAt(int rowIndex) {
397
                return installerInfos[rowIndex].getPackageInfo();
398
        }
399

    
400
        public String getDescriptionAt(int rowIndex) {
401
                return getPackageInfoAt(rowIndex).getDescription();
402
        }
403

    
404
        public URL getSourcesAt(int rowIndex) {
405
                return getPackageInfoAt(rowIndex).getSourcesURL();
406
        }
407
        
408
        public URL getOwnerUrlAt(int rowIndex) {
409
                return getPackageInfoAt(rowIndex).getOwnerURL();
410
        }
411

    
412
        public String getOwnerAt(int rowIndex) {
413
                return getPackageInfoAt(rowIndex).getOwner();
414
        }
415

    
416
        @Override
417
        public boolean isCellEditable(int rowIndex, int columnIndex) {
418
                return (columnIndex == 0) && installerInfos[rowIndex].isInstallable();
419
        }
420

    
421
        @Override
422
        public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
423

    
424
                if (columnIndex == 0) {
425
                        PackageStatus status = (PackageStatus) aValue;
426
                        TablePackageInfo tableInfo = installerInfos[rowIndex];
427
                        switch (status) {
428
                        case INSTALLED:
429
                        case NOT_INSTALLED:
430
                                tableInfo.setSelected(false);
431
                                break;
432

    
433
                        case TO_REINSTALL:
434
                        case TO_INSTALL:
435
                                tableInfo.setSelected(true);
436
                                break;
437
                        }
438
                }
439
        }
440

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

    
452
        public boolean hasAnyPackageSelected() {
453
                for (int i = 0; i < installerInfos.length; i++) {
454
                        if (installerInfos[i].isSelected) {
455
                                return true;
456
                        }
457
                }
458
                return false;
459
        }
460

    
461
        public static final class TablePackageInfo {
462

    
463
                private final PackageInfo packageInfo;
464
                private boolean isInstalled;
465
                private final boolean isInstallable;
466
                private boolean isSelected;
467
                private boolean isDefault;
468

    
469
                public TablePackageInfo(PackageInfo packageInfo, boolean isInstalled,
470
                                boolean isInstallable) {
471
                        this(packageInfo, isInstalled, isInstallable, false, false);
472
                }
473

    
474
                public void setInstalled(boolean installed) {
475
                        this.isInstalled = installed;
476
                }
477

    
478
                public TablePackageInfo(PackageInfo packageInfo, boolean isInstalled,
479
                                boolean isInstallable, boolean isSelected, boolean isDefault) {
480
                        this.packageInfo = packageInfo;
481
                        this.isInstalled = isInstalled;
482
                        this.isInstallable = isInstallable;
483
                        this.isSelected = isSelected;
484
                        this.isDefault = isDefault;
485
                }
486

    
487
                public String getID() {
488
                        PackageInfo pkg = this.getPackageInfo();
489
                        return pkg.getID();
490
                }
491

    
492
                public PackageInfo getPackageInfo() {
493
                        return packageInfo;
494
                }
495

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

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

    
504
                public boolean isSelected() {
505
                        return isSelected;
506
                }
507

    
508
                public void setSelected(boolean isSelected) {
509
                        this.isSelected = isSelected;
510
                }
511

    
512
                public void setDefault(boolean isDefault) {
513
                        this.isDefault = isDefault;
514
                }
515

    
516
                public boolean isDefault() {
517
                        return isDefault;
518
                }
519

    
520
        }
521

    
522
        /**
523
         * Returns the TablePackageInfo located in the given row.
524
         * 
525
         * @param row
526
         *            the TablePackageInfo located in the given row
527
         */
528
        public TablePackageInfo getPackageInfo(int row) {
529
                return installerInfos[row];
530
        }
531

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

    
536
        public void setFilter(NameDescriptionOrCodeFilter filter) {
537
                this.packageFastFilter = filter;
538
        }
539

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

    
544
        private Boolean isPackageFilterSet() {
545
                return this.packageFilter != null;
546
        }
547

    
548
        public PackageFilter getFilter() {
549
                return this.packageFastFilter;
550
        }
551

    
552
        public InstallPackageService getInstallPackageService() {
553
                return this.installerExecutionService;
554
        }
555
}