This Bugzilla instance is a read-only archive of historic NetBeans bug reports. To report a bug in NetBeans please follow the project's instructions for reporting issues.

View | Details | Raw Unified | Return to bug 34699
Collapse All | Expand All

(-)openide/modules/src/org/openide/modules/Dependency.java (+12 lines)
Lines 47-52 Link Here
47
     */
47
     */
48
    public final static int TYPE_REQUIRES = 5;
48
    public final static int TYPE_REQUIRES = 5;
49
49
50
    /** Dependency on a token, but without need to have token provider be initialised sooner.
51
     * @see ModuleInfo#getProvides
52
     * @since JST-PENDING
53
     */
54
    public final static int TYPE_NEEDS = 6;
55
50
    /** Comparison by specification version. */
56
    /** Comparison by specification version. */
51
    public final static int COMPARE_SPEC = 1;
57
    public final static int COMPARE_SPEC = 1;
52
58
Lines 310-315 Link Here
310
            } else if (type == Dependency.TYPE_REQUIRES) {
316
            } else if (type == Dependency.TYPE_REQUIRES) {
311
                if (comparison != Dependency.COMPARE_ANY) {
317
                if (comparison != Dependency.COMPARE_ANY) {
312
                    throw new IllegalArgumentException("Cannot give a comparison for a token requires dep: " + body); // NOI18N
318
                    throw new IllegalArgumentException("Cannot give a comparison for a token requires dep: " + body); // NOI18N
319
                }
320
321
                checkCodeName(name, false);
322
            } else if (type == Dependency.TYPE_NEEDS) {
323
                if (comparison != Dependency.COMPARE_ANY) {
324
                    throw new IllegalArgumentException("Cannot give a comparison for a token needs dep: " + body); // NOI18N
313
                }
325
                }
314
326
315
                checkCodeName(name, false);
327
                checkCodeName(name, false);
(-)core/bootstrap/src/org/netbeans/Module.java (+1 lines)
Lines 393-398 Link Here
393
                dependencies.addAll(Dependency.create(Dependency.TYPE_PACKAGE, pkgdeps)); // NOI18N
393
                dependencies.addAll(Dependency.create(Dependency.TYPE_PACKAGE, pkgdeps)); // NOI18N
394
            }
394
            }
395
            dependencies.addAll(Dependency.create(Dependency.TYPE_REQUIRES, attr.getValue("OpenIDE-Module-Requires"))); // NOI18N
395
            dependencies.addAll(Dependency.create(Dependency.TYPE_REQUIRES, attr.getValue("OpenIDE-Module-Requires"))); // NOI18N
396
            dependencies.addAll(Dependency.create(Dependency.TYPE_NEEDS, attr.getValue("OpenIDE-Module-Needs"))); // NOI18N
396
            // Permit the concrete installer to make some changes:
397
            // Permit the concrete installer to make some changes:
397
            mgr.refineDependencies(this, dependencies);
398
            mgr.refineDependencies(this, dependencies);
398
            dependenciesA = dependencies.toArray(new Dependency[dependencies.size()]);
399
            dependenciesA = dependencies.toArray(new Dependency[dependencies.size()]);
(-)core/bootstrap/src/org/netbeans/ModuleManager.java (-1 / +37 lines)
Lines 1065-1071 Link Here
1065
                if (! other.isEnabled()) {
1065
                if (! other.isEnabled()) {
1066
                    maybeAddToEnableList(willEnable, mightEnable, other, false);
1066
                    maybeAddToEnableList(willEnable, mightEnable, other, false);
1067
                }
1067
                }
1068
            } else if (dep.getType() == Dependency.TYPE_REQUIRES) {
1068
            } else if (dep.getType() == Dependency.TYPE_REQUIRES || dep.getType() == Dependency.TYPE_NEEDS) {
1069
                String token = dep.getName();
1069
                String token = dep.getName();
1070
                Set<Module> providers = providersOf.get(token);
1070
                Set<Module> providers = providersOf.get(token);
1071
                if (providers == null) throw new IllegalStateException("Should have found a provider of: " + token); // NOI18N
1071
                if (providers == null) throw new IllegalStateException("Should have found a provider of: " + token); // NOI18N
Lines 1315-1320 Link Here
1315
    private Set<Union2<Dependency,InvalidException>> _missingDependencies(Module probed) {
1315
    private Set<Union2<Dependency,InvalidException>> _missingDependencies(Module probed) {
1316
            Set<Union2<Dependency,InvalidException>> probs = moduleProblems.get(probed);
1316
            Set<Union2<Dependency,InvalidException>> probs = moduleProblems.get(probed);
1317
            if (probs == null) {
1317
            if (probs == null) {
1318
                List<Set<Module>> enableAtLeastOne = new ArrayList<Set<Module>>();
1318
                probs = new HashSet<Union2<Dependency,InvalidException>>(8);
1319
                probs = new HashSet<Union2<Dependency,InvalidException>>(8);
1319
                probs.add(PROBING_IN_PROCESS);
1320
                probs.add(PROBING_IN_PROCESS);
1320
                moduleProblems.put(probed, probs);
1321
                moduleProblems.put(probed, probs);
Lines 1428-1433 Link Here
1428
                                probs.add(Union2.<Dependency,InvalidException>createFirst(dep));
1429
                                probs.add(Union2.<Dependency,InvalidException>createFirst(dep));
1429
                            }
1430
                            }
1430
                        }
1431
                        }
1432
                    } else if (dep.getType() == Dependency.TYPE_NEEDS) {
1433
                        String token = dep.getName();
1434
                        Set<Module> providers = providersOf.get(token);
1435
                        if (providers == null) {
1436
                            // Nobody provides it. This dep failed.
1437
                            probs.add(Union2.<Dependency,InvalidException>createFirst(dep));
1438
                        } else {
1439
                            // We have some possible providers. Check that at least one is good.
1440
                            boolean foundOne = false;
1441
                            Set<Module> possibleModules = new HashSet<Module>();
1442
                            for (Module other : providers) {
1443
                                if (other.isEnabled()) {
1444
                                    foundOne = true;
1445
                                } else {
1446
                                    possibleModules.add(other);
1447
                                }
1448
                            }
1449
                            if (!foundOne) {
1450
                                enableAtLeastOne.add(possibleModules);
1451
                            }
1452
                        }
1431
                    } else {
1453
                    } else {
1432
                        assert dep.getType() == Dependency.TYPE_JAVA;
1454
                        assert dep.getType() == Dependency.TYPE_JAVA;
1433
                        // Java dependency. Fixed for whole VM session, safe to check once and keep.
1455
                        // Java dependency. Fixed for whole VM session, safe to check once and keep.
Lines 1438-1443 Link Here
1438
                    }
1460
                    }
1439
                }
1461
                }
1440
                probs.remove(PROBING_IN_PROCESS);
1462
                probs.remove(PROBING_IN_PROCESS);
1463
                if (probs.isEmpty()) {
1464
                    // verify that at least one of the needed modules can be enabled
1465
                    GROUPS: for (Set<Module> group : enableAtLeastOne) {
1466
                        Set<Union2<Dependency,InvalidException>> err = null;
1467
                        for (Module m : group) {
1468
                            err = _missingDependencies(m);
1469
                            if (err.isEmpty()) {
1470
                                continue GROUPS;
1471
                            }
1472
                        }
1473
                        assert err != null;
1474
                        probs.addAll(err);
1475
                    }
1476
                }
1441
            }
1477
            }
1442
            return probs;
1478
            return probs;
1443
    }
1479
    }
(-)core/startup/test/unit/src/org/netbeans/core/startup/ModuleManagerTest.java (+83 lines)
Lines 49-54 Link Here
49
import org.openide.util.Lookup;
49
import org.openide.util.Lookup;
50
import org.openide.util.LookupEvent;
50
import org.openide.util.LookupEvent;
51
import org.openide.util.LookupListener;
51
import org.openide.util.LookupListener;
52
import org.openide.util.TopologicalSortException;
52
import org.openide.util.Utilities;
53
import org.openide.util.Utilities;
53
54
54
/** Test the module manager as well as the Module class.
55
/** Test the module manager as well as the Module class.
Lines 1018-1023 Link Here
1018
            assertEquals(4, toEnable.size());
1019
            assertEquals(4, toEnable.size());
1019
            assertTrue(toEnable.get(0) != m2);
1020
            assertTrue(toEnable.get(0) != m2);
1020
            assertTrue(toEnable.get(0) != m3);
1021
            assertTrue(toEnable.get(0) != m3);
1022
        } finally {
1023
            mgr.mutexPrivileged().exitWriteAccess();
1024
        }
1025
    }
1026
    
1027
    public void testSimpleProvNeeds() throws Exception {
1028
        FakeModuleInstaller installer = new FakeModuleInstaller();
1029
        FakeEvents ev = new FakeEvents();
1030
        ModuleManager mgr = new ModuleManager(installer, ev);
1031
        mgr.mutexPrivileged().enterWriteAccess();
1032
        try {
1033
            Module m1 = mgr.create(new File(jars, "prov-foo-depends-needs_foo.jar"), null, false, false, false);
1034
            Module m2 = mgr.create(new File(jars, "needs-foo.jar"), null, false, false, false);
1035
            assertEquals(Collections.singletonList("foo"), Arrays.asList(m1.getProvides()));
1036
            assertEquals(Collections.EMPTY_LIST, Arrays.asList(m2.getProvides()));
1037
            assertEquals(1, m1.getDependencies().size());
1038
            assertEquals(Dependency.create(Dependency.TYPE_NEEDS, "foo"), m2.getDependencies());
1039
            Map<String,Module> modulesByName = new HashMap<String,Module>();
1040
            modulesByName.put(m1.getCodeNameBase(), m1);
1041
            modulesByName.put(m2.getCodeNameBase(), m2);
1042
            Map<String,Set<Module>> providersOf = new HashMap<String,Set<Module>>();
1043
            providersOf.put("foo", Collections.singleton(m1));
1044
            List<Module> m1m2 = Arrays.asList(new Module[] {m1, m2});
1045
            List<Module> m2m1 = Arrays.asList(new Module[] {m2, m1});
1046
            Map<Module,List<Module>> deps = Util.moduleDependencies(m1m2, modulesByName, providersOf);
1047
            assertEquals(Collections.singletonList(m2), deps.get(m1));
1048
/*            assertEquals(Collections.singletonList(m1), deps.get(m2));
1049
            
1050
            try {
1051
                Utilities.topologicalSort(m1m2, deps);
1052
            } catch (TopologicalSortException ex) {
1053
                Set[] arr = ex.unsortableSets();
1054
                assertEquals("One unsortable set", 1, arr.length);
1055
                assertEquals("It contains two elements", 2, arr[0].size());
1056
                assertTrue("m1 is there", arr[0].contains(m1));
1057
                assertTrue("m2 is there", arr[0].contains(m2));
1058
            }*/
1059
            Set<Module> m1PlusM2 = new HashSet<Module>();
1060
            m1PlusM2.add(m1);
1061
            m1PlusM2.add(m2);
1062
            List<Module> toEnable = mgr.simulateEnable(m1PlusM2);
1063
            assertEquals("correct result of simulateEnable", Arrays.asList(new Module[] {m2, m1}), toEnable);
1064
            toEnable = mgr.simulateEnable(Collections.singleton(m1));
1065
            assertEquals("correct result of simulateEnable #2", Arrays.asList(new Module[] {m2, m1}), toEnable);
1066
            toEnable = mgr.simulateEnable(Collections.singleton(m2));
1067
            assertEquals("correct result of simulateEnable #3", Arrays.asList(new Module[] {m2, m1}), toEnable);
1068
            mgr.enable(m1PlusM2);
1069
            assertEquals(Arrays.asList(new String[] {
1070
                "prepare",
1071
                "prepare",
1072
                "load"
1073
            }), installer.actions);
1074
            assertEquals(Arrays.asList(new Object[] {
1075
                m2,
1076
                m1,
1077
                Arrays.asList(new Module[] {m2, m1})
1078
            }), installer.args);
1079
            Class testclazz = Class.forName("org.prov_foo.Clazz", true, m1.getClassLoader());
1080
            try {
1081
                Class.forName("org.prov_foo.Clazz", true, m2.getClassLoader());
1082
                fail("Should not be able to access classes due to prov-req deps only");
1083
            } catch (ClassNotFoundException cnfe) {
1084
                // OK, good.
1085
            }
1086
            installer.clear();
1087
            List<Module> toDisable = mgr.simulateDisable(Collections.singleton(m1));
1088
            assertEquals("correct result of simulateDisable", Arrays.asList(new Module[] {m2, m1}), toDisable);
1089
            toDisable = mgr.simulateDisable(m1PlusM2);
1090
            assertEquals("correct result of simulateDisable #2", Arrays.asList(new Module[] {m2, m1}), toDisable);
1091
            mgr.disable(m1PlusM2);
1092
            assertFalse(m1.isEnabled());
1093
            assertFalse(m2.isEnabled());
1094
            assertEquals(Arrays.asList(new String[] {
1095
                "unload",
1096
                "dispose",
1097
                "dispose"
1098
            }), installer.actions);
1099
            assertEquals(Arrays.asList(new Object[] {
1100
                Arrays.asList(new Module[] {m2, m1}),
1101
                m2,
1102
                m1
1103
            }), installer.args);
1021
        } finally {
1104
        } finally {
1022
            mgr.mutexPrivileged().exitWriteAccess();
1105
            mgr.mutexPrivileged().exitWriteAccess();
1023
        }
1106
        }
(-)core/startup/test/unit/src/org/netbeans/core/startup/build.xml (+5 lines)
Lines 152-157 Link Here
152
        <jar jarfile="jars/dep-on-relvertest-3-4.jar" manifest="jars/dep-on-relvertest-3-4.mf"/>
152
        <jar jarfile="jars/dep-on-relvertest-3-4.jar" manifest="jars/dep-on-relvertest-3-4.mf"/>
153
        <jar jarfile="jars/dep-on-relvertest-some.jar" manifest="jars/dep-on-relvertest-some.mf"/>
153
        <jar jarfile="jars/dep-on-relvertest-some.jar" manifest="jars/dep-on-relvertest-some.mf"/>
154
        <jar jarfile="jars/depends-on-simple-module-2.jar" manifest="jars/depends-on-simple-module-2.mf"/>
154
        <jar jarfile="jars/depends-on-simple-module-2.jar" manifest="jars/depends-on-simple-module-2.mf"/>
155
        <jar jarfile="jars/needs-foo.jar" manifest="jars/needs-foo.mf"/>
156
        <antcall target="create-jar">
157
            <param name="name" value="prov-foo-depends-needs_foo"/>
158
            <param name="sourcedir" value="jars/prov-foo"/>
159
        </antcall>
155
        <antcall target="create-jar">
160
        <antcall target="create-jar">
156
            <param name="name" value="api-mod-export-all"/>
161
            <param name="name" value="api-mod-export-all"/>
157
            <param name="sourcedir" value="jars/exposes-api"/>
162
            <param name="sourcedir" value="jars/exposes-api"/>
(-)core/startup/test/unit/src/org/netbeans/core/startup/jars/needs-foo.mf (+4 lines)
Added Link Here
1
Manifest-Version: 1.0
2
OpenIDE-Module: needs_foo
3
OpenIDE-Module-Name: Needs foo
4
OpenIDE-Module-Needs: foo
(-)core/startup/test/unit/src/org/netbeans/core/startup/jars/prov-foo-depends-needs_foo.mf (+5 lines)
Added Link Here
1
Manifest-Version: 1.0
2
OpenIDE-Module: prov_foo
3
OpenIDE-Module-Name: Provides foo a Depends on Needs_Foo
4
OpenIDE-Module-Provides: foo
5
OpenIDE-Module-Module-Dependencies: needs_foo

Return to bug 34699