Statistics
| Revision:

svn-gvsig-desktop / trunk / org.gvsig.desktop / org.gvsig.desktop.library / org.gvsig.installer / org.gvsig.installer.lib / org.gvsig.installer.lib.impl / src / main / java / org / gvsig / installer / lib / impl / DefaultDependenciesCalculator.java @ 40560

History | View | Annotate | Download (10.2 KB)

1
/**
2
 * gvSIG. Desktop Geographic Information System.
3
 *
4
 * Copyright (C) 2007-2013 gvSIG Association.
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 3
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
 * For any additional information, do not hesitate to contact us
22
 * at info AT gvsig.com, or visit our website www.gvsig.com.
23
 */
24
package org.gvsig.installer.lib.impl;
25

    
26
import java.util.ArrayList;
27
import java.util.Collection;
28
import java.util.Collections;
29
import java.util.Comparator;
30
import java.util.HashMap;
31
import java.util.HashSet;
32
import java.util.Iterator;
33
import java.util.List;
34
import java.util.Map;
35
import java.util.Set;
36

    
37
import org.slf4j.Logger;
38
import org.slf4j.LoggerFactory;
39
import org.gvsig.installer.lib.api.Dependencies;
40
import org.gvsig.installer.lib.api.DependenciesCalculator;
41
import org.gvsig.installer.lib.api.Dependency;
42
import org.gvsig.installer.lib.api.PackageInfo;
43
import org.gvsig.installer.lib.api.Version;
44
import org.gvsig.installer.lib.api.execution.InstallPackageService;
45
import org.gvsig.tools.packageutils.StringWithAlias;
46

    
47
public class DefaultDependenciesCalculator implements DependenciesCalculator {
48

    
49
        private static Logger logger = LoggerFactory
50
                        .getLogger(DefaultDependenciesCalculator.class);
51

    
52
        private InstallPackageService installService = null;
53
        private List<PackageInfo> packagesInstalleds = null;
54
        private List<PackageInfo> packagesToInstall = null;
55
        private List<PackageInfo> requieredPackages = null;
56
        private List<PackageInfo> conflictsPackages = null;
57
        private Dependencies unresolvedDependencies = null;
58
        private Map<Dependency, Set<PackageInfo>> requiredPackagesOfDependency = null;
59

    
60
        public DefaultDependenciesCalculator(InstallPackageService installService) {
61
                super();
62
                this.installService = installService;
63
                this.packagesInstalleds = new ArrayList<PackageInfo>();
64
                this.packagesToInstall = new ArrayList<PackageInfo>();
65
                this.requiredPackagesOfDependency = new HashMap<Dependency, Set<PackageInfo>>();
66
        }
67

    
68
        private boolean addDependency(Dependencies dependencies,
69
                        Dependency dependency) {
70
                try {
71
                        if (dependencies.contains(dependency)) {
72
                                return false;
73
                        }
74
                        Dependency dep = (Dependency) dependency.clone();
75
                        dependencies.add(dep);
76
                } catch (CloneNotSupportedException e) {
77
                        throw new RuntimeException(e);
78
                }
79
                return true;
80
        }
81

    
82
        private void addDependency(Dependencies dependencies,
83
                        PackageInfo packageInfo) {
84

    
85
                Dependencies pkgdependencies = packageInfo.getDependencies();
86
                if (pkgdependencies != null) {
87
                        Iterator<Dependency> it = pkgdependencies.iterator();
88
                        Dependency dependency = null;
89
                        while (it.hasNext()) {
90
                                dependency = it.next();
91
                                Set<PackageInfo> requirers = requiredPackagesOfDependency
92
                                                .get(dependency);
93
                                if (requirers == null) {
94
                                        requirers = new HashSet<PackageInfo>();
95
                                        requiredPackagesOfDependency.put(dependency, requirers);
96
                                }
97

    
98
                                this.addDependency(dependencies, dependency);
99
                                requirers.add(packageInfo);
100
                        }
101
                }
102
        }
103

    
104
        public void addPackageToInstall(PackageInfo packageInfo) {
105
                this.packagesToInstall.add(packageInfo);
106
        }
107

    
108
        public void addPackageToInstall(Collection<PackageInfo> packages) {
109
                Iterator<PackageInfo> it = packages.iterator();
110
                while (it.hasNext()) {
111
                        this.addPackageToInstall(it.next());
112
                }
113
        }
114

    
115
        public void addInstalledPackage(PackageInfo packageInfo) {
116
                this.packagesInstalleds.add(packageInfo);
117
        }
118

    
119
        public void addInstalledPackage(PackageInfo[] packages) {
120
                for (int i = 0; i < packages.length; i++) {
121
                        this.addInstalledPackage(packages[i]);
122
                }
123
        }
124

    
125
        @SuppressWarnings({ "deprecation", "unchecked" })
126
        public void calculate() {
127

    
128
                // Inicializa el conjunto de paquetes ya instalados mas los que
129
                // se han solicitado instalar.
130
                List<PackageInfo> packages = new ArrayList<PackageInfo>();
131
                packages.addAll(this.packagesInstalleds);
132
                packages.addAll(this.packagesToInstall);
133

    
134
                Set<PackageInfo> allPackages = new HashSet<PackageInfo>();
135
                allPackages.addAll(packages);
136
                for (int i = 0; i < this.installService.getPackageCount(); i++) {
137
                        PackageInfo pkg = this.installService.getPackageInfo(i);
138
                        allPackages.add(pkg);
139
                }
140
                        
141
                List<PackageInfo> requieredPackages;
142

    
143
                for (int retries = 0; retries < 100; retries++) {
144

    
145
                        requieredPackages = new ArrayList<PackageInfo>();
146

    
147
                        System.out.println("Pass " + retries);
148
                        System.out.println("All packages (installed+to-install):");
149
                        System.out.println(dumpPackages(packages));
150

    
151
                        Dependencies dependencies = new DefaultDependencies();
152
                        Iterator<PackageInfo> it = packages.iterator();
153
                        while (it.hasNext()) {
154
                                this.addDependency(dependencies, it.next());
155
                        }
156
                        System.out.println("Dependencies:");
157
                        System.out.println(dumpDependencies(dependencies));
158

    
159
                        unresolvedDependencies = new DefaultDependencies();
160
                        unresolvedDependencies.addAll(dependencies);
161

    
162
                        Iterator<PackageInfo> itAllPackages = allPackages.iterator();
163
                        while( itAllPackages.hasNext() ) {
164
                                PackageInfo pkg = itAllPackages.next();
165
//                        for (int i = 0; i < this.installService.getPackageCount(); i++) {
166
//                                PackageInfo pkg = this.installService.getPackageInfo(i);
167
                                System.out.print("Check ");
168
                                System.out.println(pkg.toStringCompact());
169

    
170
                                List <Dependency> foundDependencies = dependencies.findAll(
171
                                                Dependency.REQUIRED, pkg.getAllCodes(), pkg.getVersion());
172
                                if (foundDependencies != null) {
173
                                        PackageInfo pkg1 = getByCodeAndVersion(packages, pkg
174
                                                        .getAllCodes(), pkg.getVersion());
175
                                        if (pkg1 == null) {
176
                                            System.out.println("           Add required");
177
                                                requieredPackages.add(pkg);
178
                                        }
179
                                        unresolvedDependencies.removeAll(foundDependencies);
180
                                }
181
                                if (dependencies.match(Dependency.CONFLICT, pkg.getAllCodes(), pkg
182
                                                .getVersion())) {
183
                                        PackageInfo pkg1 = getByCodeAndVersion(packages, pkg
184
                                                        .getAllCodes(), pkg.getVersion());
185
                                        if (pkg1 == null) {
186
                                            System.out.println("           Add conflicts");
187
                                                conflictsPackages.add(pkg);
188
                                        }
189
                                }
190
                                // if( dependencies.match(Dependency.RECOMMENDED, pkg.getCode(),
191
                                // pkg.getVersion())) {
192
                                // PackageInfo pkg1 = getByCodeAndVersion(packages,
193
                                // pkg.getCode(),pkg.getVersion());
194
                                // if( pkg1 == null ) {
195
                                // System.out.println("           Add conflicts");
196
                                // conflictsPackages.add(pkg);
197
                                // }
198
                                // }
199
                        }
200
                        System.out.println("required packages:");
201
                        System.out.println(dumpPackages(requieredPackages));
202

    
203
                        if (requieredPackages.size() == 0) {
204
                                break;
205
                        }
206
                        packages.addAll(requieredPackages);
207
                        removeDuplicateds(packages);
208
                }
209
                // Eliminamos de la lista de paquetes los que ya estan instalados o
210
                // los que elusuario pidio instalar.
211
                requieredPackages = new ArrayList<PackageInfo>();
212
                Iterator<PackageInfo> it = packages.iterator();
213
                while (it.hasNext()) {
214
                        PackageInfo pkg = it.next();
215
                        if (this.packagesInstalleds.contains(pkg)) {
216
                                continue;
217
                        }
218
                        if (this.packagesToInstall.contains(pkg)) {
219
                                continue;
220
                        }
221
                        requieredPackages.add(pkg);
222
                }
223

    
224
                Collections.sort(requieredPackages, new Comparator<PackageInfo>() {
225
                        public int compare(PackageInfo o1, PackageInfo o2) {
226
                                return o1.getName().compareTo(o2.getName());
227
                        }
228
                });
229

    
230
                System.out.println("required packages");
231
                System.out.println(dumpPackages(requieredPackages));
232

    
233
                this.requieredPackages = requieredPackages;
234
                dumpUnresolvedDependencies();
235
                
236
        }
237

    
238
        private void dumpUnresolvedDependencies() {
239

    
240
                Iterator<Dependency> iter = unresolvedDependencies.iterator();
241
                while (iter.hasNext()) {
242
                        Dependency dep = iter.next();
243
                        Set<PackageInfo> required = requiredPackagesOfDependency.get(dep);
244
                        if (required != null) {
245
                                StringBuffer str_buffer = new StringBuffer();
246
                                str_buffer.append("Unresolved dependency: " + dep.toString()
247
                                                + " required by:\n");
248
                                Iterator<PackageInfo> iter2 = required.iterator();
249
                                while (iter2.hasNext()) {
250
                                        str_buffer.append("   - " + iter2.next().toStringCompact()
251
                                                        + "\n");
252
                                }
253
                                logger.info(str_buffer.toString());
254
                        }
255
                }
256

    
257
        }
258

    
259
        public List<PackageInfo> getRequiredPackages() {
260
                return this.requieredPackages;
261
        }
262

    
263
        public List<PackageInfo> getConflictPackages() {
264
                return this.conflictsPackages;
265
        }
266

    
267
        public Dependencies getUnresolvedDependencies() {
268
                return this.unresolvedDependencies;
269
        }
270

    
271
        private PackageInfo getByCodeAndVersion(Collection<PackageInfo> packages,
272
                        StringWithAlias code, Version version) {
273
                Iterator<PackageInfo> it1 = packages.iterator();
274
                while (it1.hasNext()) {
275
                        PackageInfo pkg1 = it1.next();
276
                        if (pkg1.hasThisCode(code)) {
277
                                if (pkg1.getVersion().check(">=", version)) {
278
                                        return pkg1;
279
                                }
280
                        }
281
                }
282
                return null;
283
        }
284

    
285
        private void removeDuplicateds(List<PackageInfo> packages) {
286

    
287
                boolean copy;
288
                List<PackageInfo> lpackages = new ArrayList<PackageInfo>();
289

    
290
                Iterator<PackageInfo> it1 = packages.iterator();
291
                while (it1.hasNext()) {
292
                        PackageInfo pkg1 = it1.next();
293
                        copy = true;
294
                        Iterator<PackageInfo> it2 = packages.iterator();
295
                        while (it2.hasNext()) {
296
                                PackageInfo pkg2 = it2.next();
297
                                if (pkg1 == pkg2) {
298
                                        continue;
299
                                }
300
                                if (!pkg1.hasThisCode(pkg2.getAllCodes())) {
301
                                        continue;
302
                                }
303
                                if (pkg2.getVersion().check("<", pkg1.getVersion())) {
304
                                        continue;
305
                                }
306
                                copy = false;
307
                                break;
308
                        }
309
                        if (copy) {
310
                                lpackages.add(pkg1);
311
                        }
312
                }
313
                packages.clear();
314
                packages.addAll(lpackages);
315
        }
316

    
317
        private String dumpPackages(Collection<PackageInfo> pkgs) {
318
                StringBuffer s = new StringBuffer();
319
                Iterator<PackageInfo> it = pkgs.iterator();
320
                while (it.hasNext()) {
321
                        s.append(it.next().toStringCompact());
322
                        s.append("\n");
323
                }
324

    
325
                return s.toString();
326
        }
327

    
328
        private String dumpDependencies(Collection<Dependency> dependencies) {
329
                StringBuffer s = new StringBuffer();
330
                Iterator<Dependency> it = dependencies.iterator();
331
                while (it.hasNext()) {
332
                        s.append(it.next().toString());
333
                        s.append("\n");
334
                }
335
                return s.toString();
336
        }
337

    
338
}