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 / selectPackages2 / model / PackagesTableModel.java @ 37538

History | View | Annotate | Download (17.1 KB)

1
/* gvSIG. Geographic Information System of the Valencian Government
2
 *
3
 * Copyright (C) 2007-2008 Infrastructures and Transports Department
4
 * of the Valencian Government (CIT)
5
 * 
6
 * This program is free software; you can redistribute it and/or
7
 * modify it under the terms of the GNU General Public License
8
 * as published by the Free Software Foundation; either version 2
9
 * of the License, or (at your option) any later version.
10
 * 
11
 * This program is distributed in the hope that it will be useful,
12
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
 * GNU General Public License for more details.
15
 * 
16
 * You should have received a copy of the GNU General Public License
17
 * along with this program; if not, write to the Free Software
18
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, 
19
 * MA  02110-1301, USA.
20
 * 
21
 */
22

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

    
28
package org.gvsig.installer.swing.impl.execution.panel.selectPackages2.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.selectPackages2.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 =
70
        InstallerLocator.getInstallerManager();
71
    InstallPackageService installerExecutionService;
72

    
73
    boolean isOfficial;
74
    File pluginsFolder;
75
    private PackageFilter packageFilter = null;
76

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

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

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

    
90
        columnNames =
91
            new String[] {
92
                "", // Check column
93
                "", "", swingInstallerManager.getText("name"),
94
                swingInstallerManager.getText("version"),
95
                swingInstallerManager.getText("type") };
96

    
97
    }
98

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

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

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

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

    
114
        Map<String, TablePackageInfo> infos =
115
            new HashMap<String, TablePackageInfo>();
116
        // Add installable package infos
117
        for (int i = 0; i < installerExecutionService.getPackageCount(); i++) {
118
            PackageInfo installerInfo =
119
                installerExecutionService.getPackageInfo(i);
120
            if (installerInfo.isOfficial() == isOfficial) {
121
                TablePackageInfo info =
122
                    new TablePackageInfo(installerInfo, 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(installerManager.getOperatingSystem())
129
                                || info.getPackageInfo().getOperatingSystem()
130
                                    .equals("all")) {
131
                                info.setDefault(true);
132
                                break;
133
                            }
134

    
135
                        }
136
                    }
137

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

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

    
163
        return infos;
164
    }
165

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

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

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

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

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

    
187
    // selects default packages
188
    public void selectDefaultPackages() {
189
        for (int i = 0; i < installerInfos.length; i++) {
190
            if (installerInfos[i].isDefault()) {
191
                installerInfos[i].setSelected(true);
192
            } else {
193
                installerInfos[i].setSelected(false);
194
            }
195
        }
196
    }
197

    
198
    public void selectPackage(PackageInfo pkg) {
199
        for (int i = 0; i < installerInfos.length; i++) {
200
            if (pkg.equals(installerInfos[i].getPackageInfo())) {
201
                installerInfos[i].setSelected(true);
202
                return;
203
            }
204
        }
205
    }
206

    
207
    public void updatePackages() {
208

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

    
211
        if (isFilterSet()) {
212
            infos = getFilteredPackages(infos);
213
        }
214

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

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

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

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

    
248
    public Class<?> getColumnClass(int columnIndex) {
249
        switch (columnIndex) {
250
        case 0:
251
            return PackageStatus.class;
252
        case 1:
253
            return PackageOfficialRecommended.class;
254
        case 2:
255
            return PackageOsAndArchitecture.class;
256
        default:
257
            return String.class;
258
        }
259
    }
260

    
261
    public int getColumnCount() {
262
        return columnNames.length;
263
    }
264

    
265
    public String getColumnName(int columnIndex) {
266
        return columnIndex >= columnNames.length ? ""
267
            : columnNames[columnIndex];
268
    }
269

    
270
    public int getRowCount() {
271
        return installerInfos.length;
272
    }
273

    
274
    public Object getValueAt(int rowIndex, int columnIndex) {
275
        TablePackageInfo tableInfo = installerInfos[rowIndex];
276
        PackageInfo installerInfo = tableInfo.getPackageInfo();
277

    
278
        switch (columnIndex) {
279
        case 0:
280
            PackageStatus installStatus = checkStatus(rowIndex);
281
            return installStatus;
282
        case 1:
283
            PackageOfficialRecommended officialRecommended =
284
                checkOfficialRecommended(rowIndex);
285
            return officialRecommended;
286
        case 2:
287
            PackageOsAndArchitecture packageSystem =
288
                checkPackageSystem(rowIndex);
289
            return packageSystem;
290
        case 3:
291
            return installerInfo.getName();
292
        case 4:
293
            return installerInfo.getVersion();
294
        case 5:
295
            return installerInfo.getType();
296
            // case 5:
297
            // if (installerInfo.getOperatingSystem().equals(
298
            // installerInfo.getArchitecture())) {
299
            // return "all";
300
            // } else {
301
            // return installerInfo.getOperatingSystem() + " "
302
            // + installerInfo.getArchitecture();
303
            // }
304
        default:
305
            return "";
306

    
307
        }
308
    }
309

    
310
    /**
311
     * @param rowIndex
312
     * @return
313
     */
314
    private PackageOsAndArchitecture checkPackageSystem(int rowIndex) {
315
        TablePackageInfo tableInfo = installerInfos[rowIndex];
316
        PackageInfo installerInfo = tableInfo.getPackageInfo();
317
        PackageOsAndArchitecture oSArch;
318

    
319
        if (installerInfo.getOperatingSystem().equals(
320
            installerInfo.getArchitecture())) {
321
            oSArch = PackageOsAndArchitecture.ALL;
322
        } else
323
            if ((installerInfo.getOperatingSystem().equals("lin"))) {
324
                if (installerInfo.getArchitecture().equals("x86")) {
325
                    oSArch = PackageOsAndArchitecture.LINUX_32;
326
                } else {
327
                    oSArch = PackageOsAndArchitecture.LINUX_64;
328
                }
329
            } else
330
                if ((installerInfo.getOperatingSystem().equals("win"))) {
331
                    if (installerInfo.getArchitecture().equals("x86")) {
332
                        oSArch = PackageOsAndArchitecture.WINDOLS_32;
333
                    } else {
334
                        oSArch = PackageOsAndArchitecture.WINDOLS_64;
335
                    }
336
                } else {
337
                    oSArch = PackageOsAndArchitecture.OTHER;
338
                }
339
        return oSArch;
340
    }
341

    
342
    /**
343
     * @return
344
     */
345
    private PackageStatus checkStatus(int rowIndex) {
346
        TablePackageInfo tableInfo = installerInfos[rowIndex];
347

    
348
        if (tableInfo.isInstalled()) {
349
            if (tableInfo.isInstallable()) {
350
                if (tableInfo.isSelected()) {
351
                    return PackageStatus.TO_REINSTALL;
352
                } else {
353
                    return PackageStatus.INSTALLED;
354
                }
355
            } else {
356
                return PackageStatus.INSTALLED_NOT_INSTALLABLE;
357
            }
358

    
359
        } else {
360
            if (tableInfo.isSelected()) {
361
                return PackageStatus.TO_INSTALL;
362
            } else {
363
                return PackageStatus.NOT_INSTALLED;
364
            }
365
        }
366
    }
367

    
368
    private PackageOfficialRecommended checkOfficialRecommended(int rowIndex) {
369
        TablePackageInfo tableInfo = installerInfos[rowIndex];
370
        PackageInfo packageInfo = tableInfo.getPackageInfo();
371

    
372
        if (packageInfo.isOfficial()) {
373
            if (installerInfos[rowIndex].isDefault()) {
374
                return PackageOfficialRecommended.OFFICIAL_RECOMMENDED;
375
            } else {
376
                return PackageOfficialRecommended.OFFICIAL_NOT_RECOMMENDED;
377
            }
378
        } else {
379
            if (installerInfos[rowIndex].isDefault()) {
380
                return PackageOfficialRecommended.NOT_OFFICIAL_RECOMMENDED;
381
            } else {
382
                return PackageOfficialRecommended.NOT_OFFICIAL_NOT_RECOMMENDED;
383
            }
384
        }
385
    }
386

    
387
    public PackageInfo getPackageInfoAt(int rowIndex) {
388
        return installerInfos[rowIndex].getPackageInfo();
389
    }
390

    
391
    public String getDescriptionAt(int rowIndex) {
392
        return getPackageInfoAt(rowIndex).getDescription();
393
    }
394

    
395
    public URL getSourcesAt(int rowIndex) {
396
        return getPackageInfoAt(rowIndex).getSourcesURL();
397
    }
398

    
399
    public String getOwnerAt(int rowIndex) {
400
        return getPackageInfoAt(rowIndex).getOwner();
401
    }
402

    
403
    public boolean isCellEditable(int rowIndex, int columnIndex) {
404
        return (columnIndex == 0) && installerInfos[rowIndex].isInstallable();
405
    }
406

    
407
    public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
408

    
409
        if (columnIndex == 0) {
410
            PackageStatus status = (PackageStatus) aValue;
411
            TablePackageInfo tableInfo = installerInfos[rowIndex];
412
            switch (status) {
413
            case INSTALLED:
414
            case NOT_INSTALLED:
415
                tableInfo.setSelected(false);
416
                break;
417

    
418
            case TO_REINSTALL:
419
            case TO_INSTALL:
420
                tableInfo.setSelected(true);
421
                break;
422
            }
423
        }
424
    }
425

    
426
    public List<PackageInfo> getPackagesToInstall() {
427
        List<PackageInfo> packageInfosToInstall = new ArrayList<PackageInfo>();
428
        for (int i = 0; i < installerInfos.length; i++) {
429
            TablePackageInfo tableInfo = installerInfos[i];
430
            if (tableInfo.isSelected()) {
431
                packageInfosToInstall.add(tableInfo.getPackageInfo());
432
            }
433
        }
434
        return packageInfosToInstall;
435
    }
436

    
437
    public boolean hasAnyPackageSelected() {
438
        for (int i = 0; i < installerInfos.length; i++) {
439
            if (installerInfos[i].isSelected) {
440
                return true;
441
            }
442
        }
443
        return false;
444
    }
445

    
446
    public static final class TablePackageInfo {
447

    
448
        private final PackageInfo packageInfo;
449
        private boolean isInstalled;
450
        private final boolean isInstallable;
451
        private boolean isSelected;
452
        private boolean isDefault;
453

    
454
        public TablePackageInfo(PackageInfo packageInfo, boolean isInstalled,
455
            boolean isInstallable) {
456
            this(packageInfo, isInstalled, isInstallable, false, false);
457
        }
458

    
459
        public void setInstalled(boolean installed) {
460
            this.isInstalled = installed;
461
        }
462

    
463
        public TablePackageInfo(PackageInfo packageInfo, boolean isInstalled,
464
            boolean isInstallable, boolean isSelected, boolean isDefault) {
465
            this.packageInfo = packageInfo;
466
            this.isInstalled = isInstalled;
467
            this.isInstallable = isInstallable;
468
            this.isSelected = isSelected;
469
            this.isDefault = isDefault;
470
        }
471

    
472
        public String getID() {
473
            PackageInfo pkg = this.getPackageInfo();
474
            return pkg.getID();
475
        }
476

    
477
        public PackageInfo getPackageInfo() {
478
            return packageInfo;
479
        }
480

    
481
        public boolean isInstalled() {
482
            return isInstalled;
483
        }
484

    
485
        public boolean isInstallable() {
486
            return isInstallable;
487
        }
488

    
489
        public boolean isSelected() {
490
            return isSelected;
491
        }
492

    
493
        public void setSelected(boolean isSelected) {
494
            this.isSelected = isSelected;
495
        }
496

    
497
        public void setDefault(boolean isDefault) {
498
            this.isDefault = isDefault;
499
        }
500

    
501
        public boolean isDefault() {
502
            return isDefault;
503
        }
504

    
505
    }
506

    
507
    /**
508
     * Returns the TablePackageInfo located in the given row.
509
     * 
510
     * @param row
511
     *            the TablePackageInfo located in the given row
512
     */
513
    public TablePackageInfo getPackageInfo(int row) {
514
        return installerInfos[row];
515
    }
516

    
517
    public void setFilter(PackageFilter filter) {
518
        this.packageFilter = filter;
519
        // updatePackages();
520
    }
521

    
522
    public Boolean isFilterSet() {
523
        return this.packageFilter != null;
524
    }
525

    
526
    public PackageFilter getFilter() {
527
        return this.packageFilter;
528
    }
529

    
530
}