Statistics
| Revision:

svn-gvsig-desktop / branches / v2_0_0_prep / extensions / org.gvsig.installer / org.gvsig.installer.lib / org.gvsig.installer.lib.impl / src / main / java / org / gvsig / installer / lib / impl / DefaultDependenciesCalculator.java @ 37409

History | View | Annotate | Download (7.62 KB)

1
package org.gvsig.installer.lib.impl;
2

    
3
import java.util.ArrayList;
4
import java.util.Collection;
5
import java.util.Collections;
6
import java.util.Comparator;
7
import java.util.Iterator;
8
import java.util.List;
9

    
10
import org.gvsig.installer.lib.api.Dependencies;
11
import org.gvsig.installer.lib.api.DependenciesCalculator;
12
import org.gvsig.installer.lib.api.Dependency;
13
import org.gvsig.installer.lib.api.PackageInfo;
14
import org.gvsig.installer.lib.api.Version;
15
import org.gvsig.installer.lib.api.execution.InstallPackageService;
16

    
17
public class DefaultDependenciesCalculator implements DependenciesCalculator {
18

    
19
        private InstallPackageService installService = null;
20
        private List<PackageInfo> packagesInstalleds = null;
21
        private List<PackageInfo> packagesToInstall = null;
22
    private List<PackageInfo> requieredPackages = null;
23
    private List<PackageInfo> conflictsPackages = null;
24
        private Dependencies unresolvedDependencies = null;
25
        
26
        public DefaultDependenciesCalculator(InstallPackageService installService) {
27
                super();
28
                this.installService = installService;
29
                this.packagesInstalleds = new ArrayList<PackageInfo>();
30
                this.packagesToInstall = new ArrayList<PackageInfo>();
31
        }
32
        
33
        private boolean addDependency(Dependencies dependencies, Dependency dependency) {
34
                try {
35
                        if( dependencies.contains(dependency) ) {
36
                                return false;
37
                        }
38
                        Dependency dep = (Dependency) dependency.clone();
39
                        dependencies.add(dep);
40
                } catch (CloneNotSupportedException e) {
41
                        throw new RuntimeException(e);
42
                }
43
                return true;
44
        }
45

    
46
        private void addDependency(Dependencies dependencies, PackageInfo packageInfo) {
47
                Dependencies pkgdependencies = packageInfo.getDependencies();
48
                if( pkgdependencies != null ) {
49
                        Iterator<Dependency> it = pkgdependencies.iterator();
50
                        while( it.hasNext() ) {
51
                                this.addDependency(dependencies, it.next());
52
                        }
53
                }
54
        }
55

    
56
        public void addPackageToInstall(PackageInfo packageInfo) {
57
                this.packagesToInstall.add(packageInfo);
58
        }
59
        
60
        public void addPackageToInstall(Collection<PackageInfo> packages) {
61
                Iterator<PackageInfo> it = packages.iterator();
62
                while(it.hasNext()) {
63
                        this.addPackageToInstall(it.next());
64
                }
65
        }
66

    
67
        public void addInstalledPackage(PackageInfo packageInfo) {
68
                this.packagesInstalleds.add(packageInfo);
69
        }
70
        
71
        public void addInstalledPackage(PackageInfo[] packages) {
72
                for(int i=0; i<packages.length; i++) {
73
                        this.addInstalledPackage(packages[i]);
74
                }
75
        }
76
        
77
        public void calculate() {
78

    
79
                // Inicializa el conjunto de paquetes ya instalados mas los que 
80
                // se han solicitado instalar.
81
                List<PackageInfo> packages = new ArrayList<PackageInfo>();
82
                packages.addAll(this.packagesInstalleds);
83
                packages.addAll(this.packagesToInstall);
84

    
85
                List<PackageInfo> requieredPackages;
86
                
87
                for( int retries=0; retries<100; retries++) {
88
                        
89
                        requieredPackages = new ArrayList<PackageInfo>();
90

    
91
                        System.out.println("Pass "+ retries);
92
                        System.out.println("All packages (installed+to-install):");
93
                        System.out.println(dumpPackages(packages));
94
                        
95
                        
96
                        Dependencies dependencies = new DefaultDependencies();
97
                        Iterator<PackageInfo> it = packages.iterator();
98
                        while( it.hasNext() ) {
99
                                this.addDependency(dependencies, it.next());
100
                        }
101
                        System.out.println("Dependencies:");
102
                        System.out.println(dumpDependencies(dependencies));
103
                        
104
                        unresolvedDependencies  = new DefaultDependencies();
105
                        unresolvedDependencies.addAll(dependencies);
106
                        
107
                        for( int i=0; i<this.installService.getPackageCount(); i++ ) {
108
                                PackageInfo pkg = this.installService.getPackageInfo(i);
109
                                System.out.print("Check ");
110
                                System.out.println(pkg.toStringCompact());
111
                                
112
                                Dependency foundDependency = dependencies.find(Dependency.REQUIRED, pkg.getCode(), pkg.getVersion());
113
                                if( foundDependency != null) {
114
                                        PackageInfo pkg1 = getByCodeAndVersion(packages, pkg.getCode(),pkg.getVersion());
115
                                        if( pkg1 == null ) {
116
                                                System.out.println("           Add required");
117
                                                requieredPackages.add(pkg);
118
                                        } 
119
                                        unresolvedDependencies.remove(foundDependency);
120
                                }
121
                if( dependencies.match(Dependency.CONFLICT, pkg.getCode(), pkg.getVersion())) {
122
                    PackageInfo pkg1 = getByCodeAndVersion(packages, pkg.getCode(),pkg.getVersion());
123
                    if( pkg1 == null ) {
124
                        System.out.println("           Add conflicts");
125
                        conflictsPackages.add(pkg);
126
                    } 
127
                }
128
//                if( dependencies.match(Dependency.RECOMMENDED, pkg.getCode(), pkg.getVersion())) {
129
//                    PackageInfo pkg1 = getByCodeAndVersion(packages, pkg.getCode(),pkg.getVersion());
130
//                    if( pkg1 == null ) {
131
//                        System.out.println("           Add conflicts");
132
//                        conflictsPackages.add(pkg);
133
//                    } 
134
//                }
135
                        }
136
                        System.out.println("required packages:");
137
                        System.out.println(dumpPackages(requieredPackages));
138
                        
139
                        if( requieredPackages.size() == 0 ) {
140
                                break;
141
                        }
142
                        packages.addAll(requieredPackages);
143
                        removeDuplicateds(packages);
144
                }
145
                // Eliminamos de la lista de paquetes los que ya estan instalados o
146
                // los que elusuario pidio instalar.
147
                requieredPackages = new ArrayList<PackageInfo>();
148
                Iterator<PackageInfo> it = packages.iterator();
149
                while( it.hasNext() ) {
150
                        PackageInfo pkg = it.next();
151
                        if( this.packagesInstalleds.contains(pkg) ) {
152
                                continue;
153
                        }
154
                        if( this.packagesToInstall.contains(pkg) ) {
155
                                continue;
156
                        }
157
                        requieredPackages.add(pkg);
158
                }
159
                
160
                Collections.sort(requieredPackages, new Comparator<PackageInfo>() {
161
                        public int compare(PackageInfo o1, PackageInfo o2) {
162
                                return o1.getName().compareTo(o2.getName());
163
                        }
164
                });
165
                
166
                System.out.println("required packages");
167
                System.out.println(dumpPackages(requieredPackages));
168

    
169
                this.requieredPackages = requieredPackages;
170
        }
171

    
172
    public List<PackageInfo> getRequiredPackages() {
173
        return this.requieredPackages;
174
    }
175
    
176
    public List<PackageInfo> getConflictPackages() {
177
        return this.conflictsPackages;
178
    }
179

    
180
    public Dependencies getUnresolvedDependencies() {
181
        return this.unresolvedDependencies;
182
    }
183

    
184
        private PackageInfo getByCodeAndVersion(Collection<PackageInfo> packages, String code, Version version) {
185
                Iterator<PackageInfo> it1 = packages.iterator();
186
                while( it1.hasNext() ) {
187
                        PackageInfo pkg1 = it1.next();
188
                        if( pkg1.getCode().equalsIgnoreCase(code) ) {
189
                                if( pkg1.getVersion().check(">=", version)) {
190
                                        return pkg1;
191
                                }
192
                        }
193
                }
194
                return null;
195
        }
196
        
197
        private void removeDuplicateds(List<PackageInfo> packages) {
198

    
199
                boolean copy;
200
                List<PackageInfo> lpackages = new ArrayList<PackageInfo>();
201
                
202
                Iterator<PackageInfo> it1 = packages.iterator();
203
                while( it1.hasNext() ) {
204
                        PackageInfo pkg1 = it1.next();
205
                        copy = true;
206
                        Iterator<PackageInfo> it2 = packages.iterator();
207
                        while( it2.hasNext() ) {
208
                                PackageInfo pkg2 = it2.next();
209
                                if( pkg1 == pkg2 ) {
210
                                        continue;
211
                                }
212
                                if( !pkg1.getCode().equalsIgnoreCase(pkg2.getCode())) {
213
                                        continue;
214
                                }
215
                                if( pkg2.getVersion().check("<", pkg1.getVersion())) {
216
                                        continue;
217
                                }
218
                                copy = false;
219
                                break;
220
                        }
221
                        if( copy ) {
222
                                lpackages.add(pkg1);
223
                        } 
224
                }
225
                packages.clear();
226
                packages.addAll(lpackages);
227
        }
228

    
229

    
230
        private String dumpPackages(Collection<PackageInfo> pkgs) {
231
                StringBuffer s = new StringBuffer();
232
                Iterator<PackageInfo> it = pkgs.iterator();
233
                while( it.hasNext() ) {
234
                        s.append(it.next().toStringCompact());
235
                        s.append("\n");
236
                }
237
                
238
                return s.toString();
239
        }
240

    
241
        private String dumpDependencies(Collection<Dependency> dependencies) {
242
                StringBuffer s = new StringBuffer();
243
                Iterator<Dependency> it = dependencies.iterator();
244
                while( it.hasNext() ) {
245
                        s.append(it.next().toString());
246
                        s.append("\n");
247
                }
248
                return s.toString();
249
        }
250
        
251

    
252
}