Statistics
| Revision:

root / tags / v2_0_0_Build_2051 / extensions / org.gvsig.installer / org.gvsig.installer.lib / org.gvsig.installer.lib.impl / src / main / java / org / gvsig / installer / lib / impl / DefaultDependenciesCalculator.java @ 38753

History | View | Annotate | Download (8.89 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.HashMap;
8
import java.util.HashSet;
9
import java.util.Iterator;
10
import java.util.List;
11
import java.util.Map;
12
import java.util.Set;
13

    
14
import org.slf4j.Logger;
15
import org.slf4j.LoggerFactory;
16

    
17
import org.gvsig.installer.lib.api.Dependencies;
18
import org.gvsig.installer.lib.api.DependenciesCalculator;
19
import org.gvsig.installer.lib.api.Dependency;
20
import org.gvsig.installer.lib.api.PackageInfo;
21
import org.gvsig.installer.lib.api.Version;
22
import org.gvsig.installer.lib.api.execution.InstallPackageService;
23

    
24
public class DefaultDependenciesCalculator implements DependenciesCalculator {
25

    
26
    private static Logger logger = LoggerFactory.getLogger(DefaultDependenciesCalculator.class);
27

    
28
    private InstallPackageService installService = null;
29
        private List<PackageInfo> packagesInstalleds = null;
30
        private List<PackageInfo> packagesToInstall = null;
31
        private List<PackageInfo> requieredPackages = null;
32
        private List<PackageInfo> conflictsPackages = null;
33
        private Dependencies unresolvedDependencies = null;
34
        private Map<Dependency, Set<PackageInfo>> requiredPackagesOfDependency = null;   
35

    
36
        public DefaultDependenciesCalculator(InstallPackageService installService) {
37
                super();
38
                this.installService = installService;
39
                this.packagesInstalleds = new ArrayList<PackageInfo>();
40
                this.packagesToInstall = new ArrayList<PackageInfo>();
41
                this.requiredPackagesOfDependency = new HashMap<Dependency, Set<PackageInfo>>();
42
        }
43

    
44
        private boolean addDependency(Dependencies dependencies,
45
                        Dependency dependency) {
46
                try {
47
                        if (dependencies.contains(dependency)) {
48
                                return false;
49
                        }
50
                        Dependency dep = (Dependency) dependency.clone();
51
                        dependencies.add(dep);
52
                } catch (CloneNotSupportedException e) {
53
                        throw new RuntimeException(e);
54
                }
55
                return true;
56
        }
57

    
58
        private void addDependency(Dependencies dependencies,
59
                        PackageInfo packageInfo) {
60
            
61
                Dependencies pkgdependencies = packageInfo.getDependencies();
62
                if (pkgdependencies != null) {
63
                        Iterator<Dependency> it = pkgdependencies.iterator();
64
                        Dependency dependency = null;
65
                        while (it.hasNext()) {
66
                            dependency = it.next();
67
                            Set<PackageInfo> requirers = requiredPackagesOfDependency.get(dependency);
68
                            if (requirers == null) {
69
                                requirers = new HashSet<PackageInfo>();
70
                                requiredPackagesOfDependency.put(dependency, requirers);
71
                            }
72
                            
73
                                this.addDependency(dependencies, dependency);
74
                                requirers.add(packageInfo);
75
                        }
76
                }
77
        }
78

    
79
        public void addPackageToInstall(PackageInfo packageInfo) {
80
                this.packagesToInstall.add(packageInfo);
81
        }
82

    
83
        public void addPackageToInstall(Collection<PackageInfo> packages) {
84
                Iterator<PackageInfo> it = packages.iterator();
85
                while (it.hasNext()) {
86
                        this.addPackageToInstall(it.next());
87
                }
88
        }
89

    
90
        public void addInstalledPackage(PackageInfo packageInfo) {
91
                this.packagesInstalleds.add(packageInfo);
92
        }
93

    
94
        public void addInstalledPackage(PackageInfo[] packages) {
95
                for (int i = 0; i < packages.length; i++) {
96
                        this.addInstalledPackage(packages[i]);
97
                }
98
        }
99

    
100
        public void calculate() {
101

    
102
                // Inicializa el conjunto de paquetes ya instalados mas los que
103
                // se han solicitado instalar.
104
                List<PackageInfo> packages = new ArrayList<PackageInfo>();
105
                packages.addAll(this.packagesInstalleds);
106
                packages.addAll(this.packagesToInstall);
107

    
108
                List<PackageInfo> requieredPackages;
109

    
110
                for (int retries = 0; retries < 100; retries++) {
111

    
112
                        requieredPackages = new ArrayList<PackageInfo>();
113

    
114
                        System.out.println("Pass " + retries);
115
                        System.out.println("All packages (installed+to-install):");
116
                        System.out.println(dumpPackages(packages));
117

    
118
                        Dependencies dependencies = new DefaultDependencies();
119
                        Iterator<PackageInfo> it = packages.iterator();
120
                        while (it.hasNext()) {
121
                                this.addDependency(dependencies, it.next());
122
                        }
123
                        System.out.println("Dependencies:");
124
                        System.out.println(dumpDependencies(dependencies));
125

    
126
                        unresolvedDependencies = new DefaultDependencies();
127
                        unresolvedDependencies.addAll(dependencies);
128

    
129
                        for (int i = 0; i < this.installService.getPackageCount(); i++) {
130
                                PackageInfo pkg = this.installService.getPackageInfo(i);
131
                                System.out.print("Check ");
132
                                System.out.println(pkg.toStringCompact());
133

    
134
                                Dependency foundDependency = dependencies.find(
135
                                                Dependency.REQUIRED, pkg.getCode(), pkg.getVersion());
136
                                if (foundDependency != null) {
137
                                        PackageInfo pkg1 = getByCodeAndVersion(packages, pkg
138
                                                        .getCode(), pkg.getVersion());
139
                                        if (pkg1 == null) {
140
                                            System.out.println("           Add required");
141
                                                requieredPackages.add(pkg);
142
                                        }
143
                                        unresolvedDependencies.remove(foundDependency);
144
                                }
145
                                if (dependencies.match(Dependency.CONFLICT, pkg.getCode(), pkg
146
                                                .getVersion())) {
147
                                        PackageInfo pkg1 = getByCodeAndVersion(packages, pkg
148
                                                        .getCode(), pkg.getVersion());
149
                                        if (pkg1 == null) {
150
                                            System.out.println("           Add conflicts");
151
                                                conflictsPackages.add(pkg);
152
                                        }
153
                                }
154
                                // if( dependencies.match(Dependency.RECOMMENDED, pkg.getCode(),
155
                                // pkg.getVersion())) {
156
                                // PackageInfo pkg1 = getByCodeAndVersion(packages,
157
                                // pkg.getCode(),pkg.getVersion());
158
                                // if( pkg1 == null ) {
159
                                // System.out.println("           Add conflicts");
160
                                // conflictsPackages.add(pkg);
161
                                // }
162
                                // }
163
                        }
164
                        System.out.println("required packages:");
165
                        System.out.println(dumpPackages(requieredPackages));
166

    
167
                        if (requieredPackages.size() == 0) {
168
                                break;
169
                        }
170
                        packages.addAll(requieredPackages);
171
                        removeDuplicateds(packages);
172
                }
173
                // Eliminamos de la lista de paquetes los que ya estan instalados o
174
                // los que elusuario pidio instalar.
175
                requieredPackages = new ArrayList<PackageInfo>();
176
                Iterator<PackageInfo> it = packages.iterator();
177
                while (it.hasNext()) {
178
                        PackageInfo pkg = it.next();
179
                        if (this.packagesInstalleds.contains(pkg)) {
180
                                continue;
181
                        }
182
                        if (this.packagesToInstall.contains(pkg)) {
183
                                continue;
184
                        }
185
                        requieredPackages.add(pkg);
186
                }
187

    
188
                Collections.sort(requieredPackages, new Comparator<PackageInfo>() {
189
                        public int compare(PackageInfo o1, PackageInfo o2) {
190
                                return o1.getName().compareTo(o2.getName());
191
                        }
192
                });
193

    
194
                System.out.println("required packages");
195
                System.out.println(dumpPackages(requieredPackages));
196

    
197
                this.requieredPackages = requieredPackages;
198
                dumpUnresolvedDependencies();
199
                
200
        }
201
        
202
        private void dumpUnresolvedDependencies() {
203
            
204
            Iterator<Dependency> iter = unresolvedDependencies.iterator();
205
            while (iter.hasNext()) {
206
                Dependency dep = iter.next();
207
                Set<PackageInfo> required = requiredPackagesOfDependency.get(dep);
208
                if (required != null) {
209
                    StringBuffer str_buffer = new StringBuffer();
210
                    str_buffer.append("Unresolved dependency: " + dep.toString() + " required by:\n");
211
                    Iterator<PackageInfo> iter2 = required.iterator();
212
                    while (iter2.hasNext()) {
213
                        str_buffer.append("   - " + iter2.next().toStringCompact() + "\n");
214
                    }
215
                    logger.info(str_buffer.toString());
216
                }
217
            }
218
            
219
        }
220

    
221
        public List<PackageInfo> getRequiredPackages() {
222
                return this.requieredPackages;
223
        }
224

    
225
        public List<PackageInfo> getConflictPackages() {
226
                return this.conflictsPackages;
227
        }
228

    
229
        public Dependencies getUnresolvedDependencies() {
230
                return this.unresolvedDependencies;
231
        }
232

    
233
        private PackageInfo getByCodeAndVersion(Collection<PackageInfo> packages,
234
                        String code, Version version) {
235
                Iterator<PackageInfo> it1 = packages.iterator();
236
                while (it1.hasNext()) {
237
                        PackageInfo pkg1 = it1.next();
238
                        if (pkg1.getCode().equalsIgnoreCase(code)) {
239
                                if (pkg1.getVersion().check(">=", version)) {
240
                                        return pkg1;
241
                                }
242
                        }
243
                }
244
                return null;
245
        }
246

    
247
        private void removeDuplicateds(List<PackageInfo> packages) {
248

    
249
                boolean copy;
250
                List<PackageInfo> lpackages = new ArrayList<PackageInfo>();
251

    
252
                Iterator<PackageInfo> it1 = packages.iterator();
253
                while (it1.hasNext()) {
254
                        PackageInfo pkg1 = it1.next();
255
                        copy = true;
256
                        Iterator<PackageInfo> it2 = packages.iterator();
257
                        while (it2.hasNext()) {
258
                                PackageInfo pkg2 = it2.next();
259
                                if (pkg1 == pkg2) {
260
                                        continue;
261
                                }
262
                                if (!pkg1.getCode().equalsIgnoreCase(pkg2.getCode())) {
263
                                        continue;
264
                                }
265
                                if (pkg2.getVersion().check("<", pkg1.getVersion())) {
266
                                        continue;
267
                                }
268
                                copy = false;
269
                                break;
270
                        }
271
                        if (copy) {
272
                                lpackages.add(pkg1);
273
                        }
274
                }
275
                packages.clear();
276
                packages.addAll(lpackages);
277
        }
278

    
279
        private String dumpPackages(Collection<PackageInfo> pkgs) {
280
                StringBuffer s = new StringBuffer();
281
                Iterator<PackageInfo> it = pkgs.iterator();
282
                while (it.hasNext()) {
283
                        s.append(it.next().toStringCompact());
284
                        s.append("\n");
285
                }
286

    
287
                return s.toString();
288
        }
289

    
290
        private String dumpDependencies(Collection<Dependency> dependencies) {
291
                StringBuffer s = new StringBuffer();
292
                Iterator<Dependency> it = dependencies.iterator();
293
                while (it.hasNext()) {
294
                        s.append(it.next().toString());
295
                        s.append("\n");
296
                }
297
                return s.toString();
298
        }
299

    
300
}