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 201695
Collapse All | Expand All

(-)a/core.netigso/test/unit/src/org/netbeans/core/netigso/NetigsoOSGiCanDependTest.java (+17 lines)
Lines 45-54 Link Here
45
import java.io.File;
45
import java.io.File;
46
import java.util.Arrays;
46
import java.util.Arrays;
47
import java.util.HashSet;
47
import java.util.HashSet;
48
import java.util.List;
48
import org.netbeans.MockEvents;
49
import org.netbeans.MockEvents;
49
import org.netbeans.MockModuleInstaller;
50
import org.netbeans.MockModuleInstaller;
50
import org.netbeans.Module;
51
import org.netbeans.Module;
51
import org.netbeans.ModuleManager;
52
import org.netbeans.ModuleManager;
53
import org.openide.modules.Dependency;
52
54
53
/**
55
/**
54
 *
56
 *
Lines 77-82 Link Here
77
            File j2 = changeManifest(new File(jars, "depends-on-simple-module.jar"), mfBar);
79
            File j2 = changeManifest(new File(jars, "depends-on-simple-module.jar"), mfBar);
78
            Module m1 = mgr.create(j1, null, false, false, false);
80
            Module m1 = mgr.create(j1, null, false, false, false);
79
            Module m2 = mgr.create(j2, null, false, false, false);
81
            Module m2 = mgr.create(j2, null, false, false, false);
82
            assertProvidesRequires(m2, "org.bar", "org.foo");
80
            HashSet<Module> b = new HashSet<Module>(Arrays.asList(m1, m2));
83
            HashSet<Module> b = new HashSet<Module>(Arrays.asList(m1, m2));
81
            mgr.enable(b);
84
            mgr.enable(b);
82
            both = b;
85
            both = b;
Lines 93-96 Link Here
93
        }
96
        }
94
    }
97
    }
95
98
99
    private static void assertProvidesRequires(Module m, String provides, String requires) {
100
        List<String> p = Arrays.asList(m.getProvides());
101
        assertTrue("Bundles provide their packages: " + p, p.contains(provides));
102
        
103
        for (Dependency d : m.getDependencies()) {
104
            if (d.getType() == Dependency.TYPE_RECOMMENDS) {
105
                if (requires.equals(d.getName())) {
106
                    return;
107
                }
108
            }
109
        }
110
        fail("Module " + m + " does not require " + requires);
111
    }
112
96
}
113
}
(-)a/core.netigso/test/unit/src/org/netbeans/core/netigso/NetigsoOSGiCanRequestTest.java (+21 lines)
Lines 45-54 Link Here
45
import java.io.File;
45
import java.io.File;
46
import java.util.Arrays;
46
import java.util.Arrays;
47
import java.util.HashSet;
47
import java.util.HashSet;
48
import java.util.List;
48
import org.netbeans.MockEvents;
49
import org.netbeans.MockEvents;
49
import org.netbeans.MockModuleInstaller;
50
import org.netbeans.MockModuleInstaller;
50
import org.netbeans.Module;
51
import org.netbeans.Module;
51
import org.netbeans.ModuleManager;
52
import org.netbeans.ModuleManager;
53
import org.openide.modules.Dependency;
52
54
53
/**
55
/**
54
 *
56
 *
Lines 78-83 Link Here
78
            File j2 = changeManifest(new File(jars, "depends-on-simple-module.jar"), mfBar);
80
            File j2 = changeManifest(new File(jars, "depends-on-simple-module.jar"), mfBar);
79
            Module m1 = mgr.create(j1, null, false, false, false);
81
            Module m1 = mgr.create(j1, null, false, false, false);
80
            Module m2 = mgr.create(j2, null, false, false, false);
82
            Module m2 = mgr.create(j2, null, false, false, false);
83
            
84
            assertProvidesRequires(m2, "org.bar", "org.foo");
85
            
81
            HashSet<Module> b = new HashSet<Module>(Arrays.asList(m1, m2));
86
            HashSet<Module> b = new HashSet<Module>(Arrays.asList(m1, m2));
82
            mgr.enable(b);
87
            mgr.enable(b);
83
            both = b;
88
            both = b;
Lines 93-97 Link Here
93
            mgr.mutexPrivileged().exitWriteAccess();
98
            mgr.mutexPrivileged().exitWriteAccess();
94
        }
99
        }
95
    }
100
    }
101
    private static void assertProvidesRequires(Module m, String provides, String requires) {
102
        List<String> p = Arrays.asList(m.getProvides());
103
        assertTrue("Bundles provide their packages: " + p, p.contains(provides));
104
105
        for (Dependency d : m.getDependencies()) {
106
            if (d.getType() == Dependency.TYPE_RECOMMENDS) {
107
                if (!d.getName().startsWith("cnb.")) {
108
                    continue;
109
                }
110
                if (requires.equals(d.getName().substring(4))) {
111
                    return;
112
                }
113
            }
114
        }
115
        fail("Module " + m + " does not require " + requires);
116
    }
96
117
97
}
118
}
(-)a/o.n.bootstrap/nbproject/project.xml (-1 / +1 lines)
Lines 54-60 Link Here
54
                    <build-prerequisite/>
54
                    <build-prerequisite/>
55
                    <compile-dependency/>
55
                    <compile-dependency/>
56
                    <run-dependency>
56
                    <run-dependency>
57
                        <specification-version>7.25</specification-version>
57
                        <specification-version>7.30</specification-version>
58
                    </run-dependency>
58
                    </run-dependency>
59
                </dependency>
59
                </dependency>
60
                <dependency>
60
                <dependency>
(-)a/o.n.bootstrap/src/org/netbeans/ModuleData.java (-21 / +81 lines)
Lines 51-56 Link Here
51
import java.util.Collection;
51
import java.util.Collection;
52
import java.util.Collections;
52
import java.util.Collections;
53
import java.util.HashSet;
53
import java.util.HashSet;
54
import java.util.LinkedHashSet;
54
import java.util.List;
55
import java.util.List;
55
import java.util.Set;
56
import java.util.Set;
56
import java.util.StringTokenizer;
57
import java.util.StringTokenizer;
Lines 130-136 Link Here
130
            String bld = attr.getValue("OpenIDE-Module-Build-Version"); // NOI18N
131
            String bld = attr.getValue("OpenIDE-Module-Build-Version"); // NOI18N
131
            buildVersion = bld == null ? implVersion : bld;
132
            buildVersion = bld == null ? implVersion : bld;
132
            
133
            
133
            this.provides = computeProvides(forModule, attr, verifyCNBs);
134
            this.provides = computeProvides(forModule, attr, verifyCNBs, false);
134
135
135
            // Exports
136
            // Exports
136
            String exportsS = attr.getValue("OpenIDE-Module-Public-Packages"); // NOI18N
137
            String exportsS = attr.getValue("OpenIDE-Module-Public-Packages"); // NOI18N
Lines 237-244 Link Here
237
        this.buildVersion = bld == null ? implVersion : bld;
238
        this.buildVersion = bld == null ? implVersion : bld;
238
        this.friendNames = Collections.emptySet();
239
        this.friendNames = Collections.emptySet();
239
        this.publicPackages = null;
240
        this.publicPackages = null;
240
        this.provides = computeProvides(m, mf.getMainAttributes(), false);
241
        this.provides = computeProvides(m, mf.getMainAttributes(), false, true);
241
        this.dependencies = null;
242
        this.dependencies = computeImported(mf.getMainAttributes());
242
        this.coveredPackages = new HashSet<String>();
243
        this.coveredPackages = new HashSet<String>();
243
    }
244
    }
244
    
245
    
Lines 274-289 Link Here
274
        Module.PackageExport.write(dos, publicPackages);
275
        Module.PackageExport.write(dos, publicPackages);
275
    }
276
    }
276
277
277
    private String[] computeProvides(Module forModule, Attributes attr, boolean verifyCNBs) throws InvalidException, IllegalArgumentException {
278
    private Dependency[] computeImported(Attributes attr) {
278
        String[] arr;
279
        String pkgs = attr.getValue("Import-Package"); // NOI18N
280
        List<Dependency> arr = null;
281
        if (pkgs != null) {
282
            arr = new ArrayList<Dependency>();
283
            StringTokenizer tok = createTokenizer(pkgs); // NOI18N
284
            while (tok.hasMoreElements()) {
285
                String dep = beforeSemicolon(tok);
286
                arr.addAll(Dependency.create(Dependency.TYPE_RECOMMENDS, dep));
287
            }
288
        }
289
        String recomm = attr.getValue("Require-Bundle"); // NOI18N
290
        if (recomm != null) {
291
            if (arr == null) {
292
                arr = new ArrayList<Dependency>();
293
            }
294
            StringTokenizer tok = createTokenizer(recomm); // NOI18N
295
            while (tok.hasMoreElements()) {
296
                String dep = beforeSemicolon(tok);
297
                arr.addAll(Dependency.create(Dependency.TYPE_RECOMMENDS, "cnb." + dep)); // NOI18N
298
            }
299
        }
300
        return arr == null ? null : arr.toArray(new Dependency[0]);
301
    }
302
303
    private static StringTokenizer createTokenizer(String osgiDep) {
304
        for (;;) {
305
            int first = osgiDep.indexOf('"');
306
            if (first == -1) {
307
                break;
308
            }
309
            int second = osgiDep.indexOf('"', first + 1);
310
            if (second == -1) {
311
                break;
312
            }
313
            osgiDep = osgiDep.substring(0, first - 1) + osgiDep.substring(second + 1);
314
        }
315
        
316
        return new StringTokenizer(osgiDep, ",");
317
    }
318
319
    private static String beforeSemicolon(StringTokenizer tok) {
320
        String dep = tok.nextToken().trim();
321
        int semicolon = dep.indexOf(';');
322
        if (semicolon >= 0) {
323
            dep = dep.substring(0, semicolon);
324
        }
325
        return dep;
326
    }
327
    
328
    private String[] computeExported(boolean useOSGi, Collection<String> arr, Attributes attr) {
329
        if (!useOSGi) {
330
            return arr.toArray(ZERO_STRING_ARRAY);
331
        }
332
        String pkgs = attr.getValue("Export-Package"); // NOI18N
333
        if (pkgs == null) {
334
            return arr.toArray(ZERO_STRING_ARRAY);
335
        }
336
        StringTokenizer tok = createTokenizer(pkgs); // NOI18N
337
        while (tok.hasMoreElements()) {
338
            arr.add(beforeSemicolon(tok));
339
        }
340
        return arr.toArray(ZERO_STRING_ARRAY);
341
    }
342
    
343
    private String[] computeProvides(
344
        Module forModule, Attributes attr, boolean verifyCNBs, boolean useOSGi
345
    ) throws InvalidException, IllegalArgumentException {
346
        Set<String> arr = new LinkedHashSet<String>();
279
        // Token provides
347
        // Token provides
280
        String providesS = attr.getValue("OpenIDE-Module-Provides"); // NOI18N
348
        String providesS = attr.getValue("OpenIDE-Module-Provides"); // NOI18N
281
        if (providesS == null) {
349
        if (providesS != null) {
282
            arr = ZERO_STRING_ARRAY;
283
        } else {
284
            StringTokenizer tok = new StringTokenizer(providesS, ", "); // NOI18N
350
            StringTokenizer tok = new StringTokenizer(providesS, ", "); // NOI18N
285
            arr = new String[tok.countTokens()];
351
            int expCount = tok.countTokens();
286
            for (int i = 0; i < arr.length; i++) {
352
            while (tok.hasMoreTokens()) {
287
                String provide = tok.nextToken();
353
                String provide = tok.nextToken();
288
                if (provide.indexOf(',') != -1) {
354
                if (provide.indexOf(',') != -1) {
289
                    throw new InvalidException("Illegal code name syntax parsing OpenIDE-Module-Provides: " + provide); // NOI18N
355
                    throw new InvalidException("Illegal code name syntax parsing OpenIDE-Module-Provides: " + provide); // NOI18N
Lines 292-315 Link Here
292
                    Dependency.create(Dependency.TYPE_MODULE, provide);
358
                    Dependency.create(Dependency.TYPE_MODULE, provide);
293
                }
359
                }
294
                if (provide.lastIndexOf('/') != -1) throw new IllegalArgumentException("Illegal OpenIDE-Module-Provides: " + provide); // NOI18N
360
                if (provide.lastIndexOf('/') != -1) throw new IllegalArgumentException("Illegal OpenIDE-Module-Provides: " + provide); // NOI18N
295
                arr[i] = provide;
361
                arr.add(provide);
296
            }
362
            }
297
            if (new HashSet<String>(Arrays.asList(arr)).size() < arr.length) {
363
            if (arr.size() != expCount) {
298
                throw new IllegalArgumentException("Duplicate entries in OpenIDE-Module-Provides: " + providesS); // NOI18N
364
                throw new IllegalArgumentException("Duplicate entries in OpenIDE-Module-Provides: " + providesS); // NOI18N
299
            }
365
            }
300
        }
366
        }
301
        String[] additionalProvides = forModule.getManager().refineProvides (forModule);
367
        String[] additionalProvides = forModule.getManager().refineProvides (forModule);
302
        if (additionalProvides != null) {
368
        if (additionalProvides != null) {
303
            if (arr == null) {
369
            arr.addAll (Arrays.asList (additionalProvides));
304
                arr = additionalProvides;
305
            } else {
306
                ArrayList<String> l = new ArrayList<String> ();
307
                l.addAll (Arrays.asList (arr));
308
                l.addAll (Arrays.asList (additionalProvides));
309
                arr = l.toArray (arr);
310
            }
311
        }
370
        }
312
        return arr;
371
        arr.add("cnb." + getCodeNameBase()); // NOI18N
372
        return computeExported(useOSGi, arr, attr);
313
    }
373
    }
314
    
374
    
315
    /**
375
    /**
(-)a/o.n.bootstrap/test/unit/src/org/netbeans/ModuleManagerTest.java (-8 / +24 lines)
Lines 134-139 Link Here
134
            Module m1 = mgr.create(new File(jars, "simple-module.jar"), null, false, false, false);
134
            Module m1 = mgr.create(new File(jars, "simple-module.jar"), null, false, false, false);
135
            assertEquals("org.foo", m1.getCodeNameBase());
135
            assertEquals("org.foo", m1.getCodeNameBase());
136
            assertEquals("org.bar", m2.getCodeNameBase());
136
            assertEquals("org.bar", m2.getCodeNameBase());
137
            assertCnb(m1);
138
            assertCnb(m2);
137
            assertEquals(Collections.EMPTY_SET, m1.getDependencies());
139
            assertEquals(Collections.EMPTY_SET, m1.getDependencies());
138
            assertEquals(Dependency.create(Dependency.TYPE_MODULE, "org.foo/1"), m2.getDependencies());
140
            assertEquals(Dependency.create(Dependency.TYPE_MODULE, "org.foo/1"), m2.getDependencies());
139
            Map<String,Module> modulesByName = new HashMap<String,Module>();
141
            Map<String,Module> modulesByName = new HashMap<String,Module>();
Lines 902-909 Link Here
902
        try {
904
        try {
903
            Module m1 = mgr.create(new File(jars, "prov-foo.jar"), null, false, false, false);
905
            Module m1 = mgr.create(new File(jars, "prov-foo.jar"), null, false, false, false);
904
            Module m2 = mgr.create(new File(jars, "req-foo.jar"), null, false, false, false);
906
            Module m2 = mgr.create(new File(jars, "req-foo.jar"), null, false, false, false);
905
            assertEquals(Collections.singletonList("foo"), Arrays.asList(m1.getProvides()));
907
            assertEquals(Collections.singletonList("foo"), assertCnb(m1));
906
            assertEquals(Collections.EMPTY_LIST, Arrays.asList(m2.getProvides()));
908
            assertEquals(Collections.EMPTY_LIST, assertCnb(m2));
907
            assertEquals(Collections.EMPTY_SET, m1.getDependencies());
909
            assertEquals(Collections.EMPTY_SET, m1.getDependencies());
908
            assertEquals(Dependency.create(Dependency.TYPE_REQUIRES, "foo"), m2.getDependencies());
910
            assertEquals(Dependency.create(Dependency.TYPE_REQUIRES, "foo"), m2.getDependencies());
909
            Map<String,Module> modulesByName = new HashMap<String,Module>();
911
            Map<String,Module> modulesByName = new HashMap<String,Module>();
Lines 1134-1141 Link Here
1134
            } else {
1136
            } else {
1135
                m2 = mgr.create(new File(jars, "needs-foo.jar"), null, false, false, false);
1137
                m2 = mgr.create(new File(jars, "needs-foo.jar"), null, false, false, false);
1136
            }
1138
            }
1137
            assertEquals(Collections.singletonList("foo"), Arrays.asList(m1.getProvides()));
1139
            assertEquals(Collections.singletonList("foo"), assertCnb(m1));
1138
            assertEquals(Collections.EMPTY_LIST, Arrays.asList(m2.getProvides()));
1140
            assertEquals(Collections.EMPTY_LIST, assertCnb(m2));
1139
            assertEquals(1, m1.getDependencies().size());
1141
            assertEquals(1, m1.getDependencies().size());
1140
            int type = recommends ? Dependency.TYPE_RECOMMENDS : Dependency.TYPE_NEEDS;
1142
            int type = recommends ? Dependency.TYPE_RECOMMENDS : Dependency.TYPE_NEEDS;
1141
            assertEquals(Dependency.create(type, "foo"), m2.getDependencies());
1143
            assertEquals(Dependency.create(type, "foo"), m2.getDependencies());
Lines 1321-1328 Link Here
1321
"OpenIDE-Module-Recommends: foo\n";
1323
"OpenIDE-Module-Recommends: foo\n";
1322
                m3 = mgr.create(copyJar(m2.getJarFile(), manifest), null, false, false, false);
1324
                m3 = mgr.create(copyJar(m2.getJarFile(), manifest), null, false, false, false);
1323
            }
1325
            }
1324
            assertEquals(Collections.singletonList("foo"), Arrays.asList(m1.getProvides()));
1326
            assertEquals(Collections.singletonList("foo"), assertCnb(m1));
1325
            assertEquals(Collections.EMPTY_LIST, Arrays.asList(m2.getProvides()));
1327
            assertEquals(Collections.EMPTY_LIST, assertCnb(m2));
1326
            assertEquals(1, m1.getDependencies().size());
1328
            assertEquals(1, m1.getDependencies().size());
1327
            int type = recommends ? Dependency.TYPE_RECOMMENDS : Dependency.TYPE_NEEDS;
1329
            int type = recommends ? Dependency.TYPE_RECOMMENDS : Dependency.TYPE_NEEDS;
1328
            assertEquals(Dependency.create(type, "foo"), m2.getDependencies());
1330
            assertEquals(Dependency.create(type, "foo"), m2.getDependencies());
Lines 1401-1407 Link Here
1401
        mgr.mutexPrivileged().enterWriteAccess();
1403
        mgr.mutexPrivileged().enterWriteAccess();
1402
        try {
1404
        try {
1403
            Module m2 = mgr.create(new File(jars, "recommends-foo.jar"), null, false, false, false);
1405
            Module m2 = mgr.create(new File(jars, "recommends-foo.jar"), null, false, false, false);
1404
            assertEquals(Collections.EMPTY_LIST, Arrays.asList(m2.getProvides()));
1406
            assertEquals(Collections.EMPTY_LIST, assertCnb(m2));
1405
            assertEquals(Dependency.create(Dependency.TYPE_RECOMMENDS, "foo"), m2.getDependencies());
1407
            assertEquals(Dependency.create(Dependency.TYPE_RECOMMENDS, "foo"), m2.getDependencies());
1406
            Map<String,Module> modulesByName = new HashMap<String,Module>();
1408
            Map<String,Module> modulesByName = new HashMap<String,Module>();
1407
            modulesByName.put(m2.getCodeNameBase(), m2);
1409
            modulesByName.put(m2.getCodeNameBase(), m2);
Lines 1457-1463 Link Here
1457
        mgr.mutexPrivileged().enterWriteAccess();
1459
        mgr.mutexPrivileged().enterWriteAccess();
1458
        try {
1460
        try {
1459
            Module m2 = mgr.create(new File(jars, "recommends-foo.jar"), null, false, false, false);
1461
            Module m2 = mgr.create(new File(jars, "recommends-foo.jar"), null, false, false, false);
1460
            assertEquals(Collections.EMPTY_LIST, Arrays.asList(m2.getProvides()));
1462
            assertEquals(Collections.EMPTY_LIST, assertCnb(m2));
1461
            
1463
            
1462
            Module m1;
1464
            Module m1;
1463
            {
1465
            {
Lines 2717-2720 Link Here
2717
        return mgr.createFixed(new Manifest(new ByteArrayInputStream(manifest.getBytes())), null, ModuleManagerTest.class.getClassLoader());
2719
        return mgr.createFixed(new Manifest(new ByteArrayInputStream(manifest.getBytes())), null, ModuleManagerTest.class.getClassLoader());
2718
    }
2720
    }
2719
2721
2722
    private static Collection<String> assertCnb(Module m) {
2723
        String token = "cnb." + m.getCodeNameBase();
2724
        List<String> arr = new ArrayList<String>();
2725
        boolean ok = false;
2726
        for (String t : m.getProvides()) {
2727
            if (token.equals(t)) {
2728
                ok = true;
2729
            } else {
2730
                arr.add(t);
2731
            }
2732
        }
2733
        assertTrue(token + " is not among the list of provides of module " + m + " which is " + arr, ok);
2734
        return arr;
2735
    }
2720
}
2736
}
(-)a/openide.modules/apichanges.xml (+24 lines)
Lines 50-55 Link Here
50
  	<apidef name="modules">Modules API</apidef>
50
  	<apidef name="modules">Modules API</apidef>
51
  </apidefs>
51
  </apidefs>
52
<changes>
52
<changes>
53
    <change id="provide.cnb">
54
        <api name="modules"/>
55
        <summary>By default each module provides its code name base as a token</summary>
56
        <version major="7" minor="30"/>
57
        <date day="20" month="4" year="2012"/>
58
        <author login="jtulach"/>
59
        <compatibility addition="yes" binary="compatible" semantic="compatible" source="compatible">
60
            <p>
61
                Unless accidental clash in the name of the token with
62
                <code>cnb.</code> prefix, the change is compatible.
63
            </p>
64
        </compatibility>
65
        <description>
66
            <p>
67
                Each module provides by default a token composed from its
68
                code name base and fixed prefix:
69
                <code>"cnb." + <a href="@TOP@/org/openide/modules/ModuleInfo.html#getCodeNameBase()">getCodeNameBase()</a></code>
70
                from its <a href="@TOP@/org/openide/modules/ModuleInfo.html#getProvides()">getProvides()</a>
71
                method.
72
            </p>
73
        </description>
74
        <class package="org.openide.modules" name="ModuleInfo"/>
75
        <issue number="201695"/>
76
    </change>
53
    <change id="OnStartStop">
77
    <change id="OnStartStop">
54
        <api name="modules"/>
78
        <api name="modules"/>
55
        <summary><code>OnStart</code> and <code>OnStop</code></summary>
79
        <summary><code>OnStart</code> and <code>OnStop</code></summary>
(-)a/openide.modules/manifest.mf (-1 / +1 lines)
Lines 1-5 Link Here
1
Manifest-Version: 1.0
1
Manifest-Version: 1.0
2
OpenIDE-Module: org.openide.modules
2
OpenIDE-Module: org.openide.modules
3
OpenIDE-Module-Localizing-Bundle: org/openide/modules/Bundle.properties
3
OpenIDE-Module-Localizing-Bundle: org/openide/modules/Bundle.properties
4
OpenIDE-Module-Specification-Version: 7.29
4
OpenIDE-Module-Specification-Version: 7.30
5
5

Return to bug 201695