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 @ 37585

History | View | Annotate | Download (15 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
                        if (installerInfo.isOfficial() == isOfficial) {
121
                                TablePackageInfo info = new TablePackageInfo(installerInfo,
122
                                                false, true);
123
                                if (defaultIDs != null) {
124

    
125
                                        for (int j = 0; j < defaultIDs.size(); j++) {
126
                                                if (info.getPackageInfo().matchID(defaultIDs.get(j))) {
127
                                                        if (info.getPackageInfo().getOperatingSystem()
128
                                                                        .equals(
129
                                                                                        installerManager
130
                                                                                                        .getOperatingSystem())
131
                                                                        || info.getPackageInfo()
132
                                                                                        .getOperatingSystem().equals("all")) {
133
                                                                info.setDefault(true);
134
                                                                break;
135
                                                        }
136

    
137
                                                }
138
                                        }
139

    
140
                                }
141
                                infos.put(info.getID(), info);
142
                        }
143
                }
144
                // Add already installed package infos
145
                try {
146
                        PackageInfo[] installedPackages = installerManager
147
                                        .getInstalledPackages(pluginsFolder);
148

    
149
                        for (int i = 0; i < installedPackages.length; i++) {
150
                                if (installedPackages[i].isOfficial() == isOfficial) {
151
                                        TablePackageInfo info = new TablePackageInfo(
152
                                                        installedPackages[i], true, false);
153
                                        TablePackageInfo x = infos.get(info.getID());
154
                                        if (x == null) {
155
                                                infos.put(info.getID(), info);
156
                                        } else {
157
                                                x.setInstalled(true);
158
                                        }
159
                                }
160
                        }
161
                } catch (MakePluginPackageServiceException e) {
162
                        throw new RuntimeException(e);
163
                }
164

    
165
                return infos;
166
        }
167

    
168
        // get filtered packages
169
        private Map<String, TablePackageInfo> getFilteredPackages(
170
                        Map<String, TablePackageInfo> packageInfos) {
171

    
172
                Map<String, TablePackageInfo> infos = new HashMap<String, TablePackageInfo>();
173

    
174
                TablePackageInfo[] packs = packageInfos.values().toArray(
175
                                new TablePackageInfo[infos.size()]);
176

    
177
                for (int i = 0; i < packs.length; i++) {
178
                        PackageInfo installerInfo = packs[i].getPackageInfo();
179

    
180
                        if (packageFilter.match(installerInfo)) {
181
                                TablePackageInfo info = packs[i];
182
                                infos.put(installerInfo.getID(), info);
183
                        }
184
                }
185
                return infos;
186
        }
187

    
188
        // get fast filtered packages (by name or description)
189
        private Map<String, TablePackageInfo> getFastFilteredPackages(
190
                        Map<String, TablePackageInfo> packageInfos) {
191

    
192
                Map<String, TablePackageInfo> infos = new HashMap<String, TablePackageInfo>();
193

    
194
                TablePackageInfo[] packs = packageInfos.values().toArray(
195
                                new TablePackageInfo[infos.size()]);
196

    
197
                for (int i = 0; i < packs.length; i++) {
198
                        PackageInfo installerInfo = packs[i].getPackageInfo();
199

    
200
                        if (packageFastFilter.match(installerInfo)) {
201
                                TablePackageInfo info = packs[i];
202
                                infos.put(installerInfo.getID(), info);
203
                        }
204
                }
205
                return infos;
206
        }
207

    
208
        public void updatePackages() {
209

    
210
                Map<String, TablePackageInfo> infos = getDefaultPackages();
211

    
212
                // check if there is a filter set (category, type, etc)
213
                if (isPackageFilterSet()) {
214
                        infos = getFilteredPackages(infos);
215
                }
216

    
217
                // check if there is any filter set (fastFilter)
218
                if (isFastFilterSet()) {
219
                        infos = getFastFilteredPackages(infos);
220
                }
221

    
222
                for (int i = 0; i < installerInfos.length; i++) {
223
                        TablePackageInfo installerInfo = infos.get(installerInfos[i]
224
                                        .getID());
225
                        if (installerInfo != null) {
226
                                installerInfo.setSelected(installerInfos[i].isSelected());
227
                        }
228
                }
229

    
230
                installerInfos = infos.values().toArray(
231
                                new TablePackageInfo[infos.size()]);
232
                sortInstallerInfos();
233

    
234
                List<String> idList = installerExecutionService
235
                                .getDefaultSelectedPackagesIDs();
236

    
237
                if (idList != null) {
238
                        for (int i = 0; i < installerInfos.length; i++) {
239
                                for (int j = 0; j < idList.size(); j++) {
240
                                        if (installerInfos[i].getPackageInfo().matchID(
241
                                                        idList.get(j))) {
242
                                                if (installerInfos[i].getPackageInfo()
243
                                                                .getOperatingSystem().equals(
244
                                                                                installerManager.getOperatingSystem())
245
                                                                || installerInfos[i].getPackageInfo()
246
                                                                                .getOperatingSystem().equals("all")) {
247
                                                        installerInfos[i].setDefault(true);
248
                                                }
249
                                        }
250
                                }
251
                        }
252
                }
253
        }
254

    
255
        // selects default packages
256
        public void selectDefaultPackages() {
257
                for (int i = 0; i < installerInfos.length; i++) {
258
                        if (installerInfos[i].isDefault()) {
259
                                installerInfos[i].setSelected(true);
260
                        } else {
261
                                installerInfos[i].setSelected(false);
262
                        }
263
                }
264
        }
265

    
266
        public void selectPackage(PackageInfo pkg) {
267
                for (int i = 0; i < installerInfos.length; i++) {
268
                        if (pkg.equals(installerInfos[i].getPackageInfo())) {
269
                                installerInfos[i].setSelected(true);
270
                                return;
271
                        }
272
                }
273
        }
274

    
275
        public Class<?> getColumnClass(int columnIndex) {
276
                switch (columnIndex) {
277
                case 0:
278
                        return PackageStatus.class;
279
                case 1:
280
                        return PackageOfficialRecommended.class;
281
                case 2:
282
                        return PackageOsAndArchitecture.class;
283
                default:
284
                        return String.class;
285
                }
286
        }
287

    
288
        public int getColumnCount() {
289
                return columnNames.length;
290
        }
291

    
292
        public String getColumnName(int columnIndex) {
293
                return columnIndex >= columnNames.length ? ""
294
                                : columnNames[columnIndex];
295
        }
296

    
297
        public int getRowCount() {
298
                return installerInfos.length;
299
        }
300

    
301
        public Object getValueAt(int rowIndex, int columnIndex) {
302
                TablePackageInfo tableInfo = installerInfos[rowIndex];
303
                PackageInfo installerInfo = tableInfo.getPackageInfo();
304

    
305
                switch (columnIndex) {
306
                case 0:
307
                        PackageStatus installStatus = checkStatus(rowIndex);
308
                        return installStatus;
309
                case 1:
310
                        PackageOfficialRecommended officialRecommended = checkOfficialRecommended(rowIndex);
311
                        return officialRecommended;
312
                case 2:
313
                        PackageOsAndArchitecture packageSystem = checkPackageSystem(rowIndex);
314
                        return packageSystem;
315
                case 3:
316
                        return installerInfo.getName();
317
                case 4:
318
                        return installerInfo.getVersion();
319
                case 5:
320
                        return installerInfo.getType();
321
                default:
322
                        return "";
323

    
324
                }
325
        }
326

    
327
        /**
328
         * @param rowIndex
329
         * @return
330
         */
331
        private PackageOsAndArchitecture checkPackageSystem(int rowIndex) {
332
                TablePackageInfo tableInfo = installerInfos[rowIndex];
333
                PackageInfo installerInfo = tableInfo.getPackageInfo();
334
                PackageOsAndArchitecture oSArch;
335

    
336
                if (installerInfo.getOperatingSystem().equals(
337
                                installerInfo.getArchitecture())) {
338
                        oSArch = PackageOsAndArchitecture.ALL;
339
                } else if ((installerInfo.getOperatingSystem().equals("lin"))) {
340
                        if (installerInfo.getArchitecture().equals("x86")) {
341
                                oSArch = PackageOsAndArchitecture.LINUX_32;
342
                        } else {
343
                                oSArch = PackageOsAndArchitecture.LINUX_64;
344
                        }
345
                } else if ((installerInfo.getOperatingSystem().equals("win"))) {
346
                        if (installerInfo.getArchitecture().equals("x86")) {
347
                                oSArch = PackageOsAndArchitecture.WINDOLS_32;
348
                        } else {
349
                                oSArch = PackageOsAndArchitecture.WINDOLS_64;
350
                        }
351
                } else {
352
                        oSArch = PackageOsAndArchitecture.OTHER;
353
                }
354
                return oSArch;
355
        }
356

    
357
        /**
358
         * @return
359
         */
360
        private PackageStatus checkStatus(int rowIndex) {
361
                TablePackageInfo tableInfo = installerInfos[rowIndex];
362

    
363
                if (tableInfo.isInstalled()) {
364
                        if (tableInfo.isInstallable()) {
365
                                if (tableInfo.isSelected()) {
366
                                        return PackageStatus.TO_REINSTALL;
367
                                } else {
368
                                        return PackageStatus.INSTALLED;
369
                                }
370
                        } else {
371
                                return PackageStatus.INSTALLED_NOT_INSTALLABLE;
372
                        }
373

    
374
                } else {
375
                        if (tableInfo.isSelected()) {
376
                                return PackageStatus.TO_INSTALL;
377
                        } else {
378
                                return PackageStatus.NOT_INSTALLED;
379
                        }
380
                }
381
        }
382

    
383
        private PackageOfficialRecommended checkOfficialRecommended(int rowIndex) {
384
                TablePackageInfo tableInfo = installerInfos[rowIndex];
385
                PackageInfo packageInfo = tableInfo.getPackageInfo();
386

    
387
                if (packageInfo.isOfficial()) {
388
                        if (installerInfos[rowIndex].isDefault()) {
389
                                return PackageOfficialRecommended.OFFICIAL_RECOMMENDED;
390
                        } else {
391
                                return PackageOfficialRecommended.OFFICIAL_NOT_RECOMMENDED;
392
                        }
393
                } else {
394
                        if (installerInfos[rowIndex].isDefault()) {
395
                                return PackageOfficialRecommended.NOT_OFFICIAL_RECOMMENDED;
396
                        } else {
397
                                return PackageOfficialRecommended.NOT_OFFICIAL_NOT_RECOMMENDED;
398
                        }
399
                }
400
        }
401

    
402
        public PackageInfo getPackageInfoAt(int rowIndex) {
403
                return installerInfos[rowIndex].getPackageInfo();
404
        }
405

    
406
        public String getDescriptionAt(int rowIndex) {
407
                return getPackageInfoAt(rowIndex).getDescription();
408
        }
409

    
410
        public URL getSourcesAt(int rowIndex) {
411
                return getPackageInfoAt(rowIndex).getSourcesURL();
412
        }
413

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

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

    
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
}