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

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.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
        public Class<?> getColumnClass(int columnIndex) {
268
                switch (columnIndex) {
269
                case 0:
270
                        return PackageStatus.class;
271
                case 1:
272
                        return PackageOfficialRecommended.class;
273
                case 2:
274
                        return PackageOsAndArchitecture.class;
275
                default:
276
                        return String.class;
277
                }
278
        }
279

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

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

    
289
        public int getRowCount() {
290
                return installerInfos.length;
291
        }
292

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

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

    
316
                }
317
        }
318

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

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

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

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

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

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

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

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

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

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

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

    
410
        public boolean isCellEditable(int rowIndex, int columnIndex) {
411
                return (columnIndex == 0) && installerInfos[rowIndex].isInstallable();
412
        }
413

    
414
        public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
415

    
416
                if (columnIndex == 0) {
417
                        PackageStatus status = (PackageStatus) aValue;
418
                        TablePackageInfo tableInfo = installerInfos[rowIndex];
419
                        switch (status) {
420
                        case INSTALLED:
421
                        case NOT_INSTALLED:
422
                                tableInfo.setSelected(false);
423
                                break;
424

    
425
                        case TO_REINSTALL:
426
                        case TO_INSTALL:
427
                                tableInfo.setSelected(true);
428
                                break;
429
                        }
430
                }
431
        }
432

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

    
444
        public boolean hasAnyPackageSelected() {
445
                for (int i = 0; i < installerInfos.length; i++) {
446
                        if (installerInfos[i].isSelected) {
447
                                return true;
448
                        }
449
                }
450
                return false;
451
        }
452

    
453
        public static final class TablePackageInfo {
454

    
455
                private final PackageInfo packageInfo;
456
                private boolean isInstalled;
457
                private final boolean isInstallable;
458
                private boolean isSelected;
459
                private boolean isDefault;
460

    
461
                public TablePackageInfo(PackageInfo packageInfo, boolean isInstalled,
462
                                boolean isInstallable) {
463
                        this(packageInfo, isInstalled, isInstallable, false, false);
464
                }
465

    
466
                public void setInstalled(boolean installed) {
467
                        this.isInstalled = installed;
468
                }
469

    
470
                public TablePackageInfo(PackageInfo packageInfo, boolean isInstalled,
471
                                boolean isInstallable, boolean isSelected, boolean isDefault) {
472
                        this.packageInfo = packageInfo;
473
                        this.isInstalled = isInstalled;
474
                        this.isInstallable = isInstallable;
475
                        this.isSelected = isSelected;
476
                        this.isDefault = isDefault;
477
                }
478

    
479
                public String getID() {
480
                        PackageInfo pkg = this.getPackageInfo();
481
                        return pkg.getID();
482
                }
483

    
484
                public PackageInfo getPackageInfo() {
485
                        return packageInfo;
486
                }
487

    
488
                public boolean isInstalled() {
489
                        return isInstalled;
490
                }
491

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

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

    
500
                public void setSelected(boolean isSelected) {
501
                        this.isSelected = isSelected;
502
                }
503

    
504
                public void setDefault(boolean isDefault) {
505
                        this.isDefault = isDefault;
506
                }
507

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

    
512
        }
513

    
514
        /**
515
         * Returns the TablePackageInfo located in the given row.
516
         * 
517
         * @param row
518
         *            the TablePackageInfo located in the given row
519
         */
520
        public TablePackageInfo getPackageInfo(int row) {
521
                return installerInfos[row];
522
        }
523

    
524
        public void setFilter(PackageFilter filter) {
525
                this.packageFilter = filter;
526
        }
527

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

    
532
        private Boolean isFastFilterSet() {
533
                return this.packageFastFilter != null;
534
        }
535

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

    
540
        public PackageFilter getFilter() {
541
                return this.packageFastFilter;
542
        }
543

    
544
        public InstallPackageService getInstallPackageService() {
545
                return this.installerExecutionService;
546
        }
547
}