diff -r 1d9013023a29 core.netigso/test/unit/src/org/netbeans/core/netigso/NetigsoOSGiCanDependTest.java --- a/core.netigso/test/unit/src/org/netbeans/core/netigso/NetigsoOSGiCanDependTest.java Mon Apr 16 07:57:16 2012 +0200 +++ b/core.netigso/test/unit/src/org/netbeans/core/netigso/NetigsoOSGiCanDependTest.java Mon Apr 16 17:29:40 2012 +0200 @@ -45,10 +45,12 @@ import java.io.File; import java.util.Arrays; import java.util.HashSet; +import java.util.List; import org.netbeans.MockEvents; import org.netbeans.MockModuleInstaller; import org.netbeans.Module; import org.netbeans.ModuleManager; +import org.openide.modules.Dependency; /** * @@ -77,6 +79,7 @@ File j2 = changeManifest(new File(jars, "depends-on-simple-module.jar"), mfBar); Module m1 = mgr.create(j1, null, false, false, false); Module m2 = mgr.create(j2, null, false, false, false); + assertProvidesRequires(m2, "org.bar", "org.foo"); HashSet b = new HashSet(Arrays.asList(m1, m2)); mgr.enable(b); both = b; @@ -93,4 +96,18 @@ } } + private static void assertProvidesRequires(Module m, String provides, String requires) { + List p = Arrays.asList(m.getProvides()); + assertTrue("Bundles provide their packages: " + p, p.contains(provides)); + + for (Dependency d : m.getDependencies()) { + if (d.getType() == Dependency.TYPE_RECOMMENDS) { + if (requires.equals(d.getName())) { + return; + } + } + } + fail("Module " + m + " does not require " + requires); + } + } diff -r 1d9013023a29 core.netigso/test/unit/src/org/netbeans/core/netigso/NetigsoOSGiCanRequestTest.java --- a/core.netigso/test/unit/src/org/netbeans/core/netigso/NetigsoOSGiCanRequestTest.java Mon Apr 16 07:57:16 2012 +0200 +++ b/core.netigso/test/unit/src/org/netbeans/core/netigso/NetigsoOSGiCanRequestTest.java Mon Apr 16 17:29:40 2012 +0200 @@ -45,10 +45,12 @@ import java.io.File; import java.util.Arrays; import java.util.HashSet; +import java.util.List; import org.netbeans.MockEvents; import org.netbeans.MockModuleInstaller; import org.netbeans.Module; import org.netbeans.ModuleManager; +import org.openide.modules.Dependency; /** * @@ -78,6 +80,9 @@ File j2 = changeManifest(new File(jars, "depends-on-simple-module.jar"), mfBar); Module m1 = mgr.create(j1, null, false, false, false); Module m2 = mgr.create(j2, null, false, false, false); + + assertProvidesRequires(m2, "org.bar", "org.foo"); + HashSet b = new HashSet(Arrays.asList(m1, m2)); mgr.enable(b); both = b; @@ -93,5 +98,18 @@ mgr.mutexPrivileged().exitWriteAccess(); } } + private static void assertProvidesRequires(Module m, String provides, String requires) { + List p = Arrays.asList(m.getProvides()); + assertTrue("Bundles provide their packages: " + p, p.contains(provides)); + + for (Dependency d : m.getDependencies()) { + if (d.getType() == Dependency.TYPE_MODULE) { + if (requires.equals(d.getName())) { + return; + } + } + } + fail("Module " + m + " does not require " + requires); + } } diff -r 1d9013023a29 o.n.bootstrap/src/org/netbeans/ModuleData.java --- a/o.n.bootstrap/src/org/netbeans/ModuleData.java Mon Apr 16 07:57:16 2012 +0200 +++ b/o.n.bootstrap/src/org/netbeans/ModuleData.java Mon Apr 16 17:29:40 2012 +0200 @@ -130,7 +130,7 @@ String bld = attr.getValue("OpenIDE-Module-Build-Version"); // NOI18N buildVersion = bld == null ? implVersion : bld; - this.provides = computeProvides(forModule, attr, verifyCNBs); + this.provides = computeProvides(forModule, attr, verifyCNBs, false); // Exports String exportsS = attr.getValue("OpenIDE-Module-Public-Packages"); // NOI18N @@ -237,8 +237,8 @@ this.buildVersion = bld == null ? implVersion : bld; this.friendNames = Collections.emptySet(); this.publicPackages = null; - this.provides = computeProvides(m, mf.getMainAttributes(), false); - this.dependencies = null; + this.provides = computeProvides(m, mf.getMainAttributes(), false, true); + this.dependencies = computeImported(mf.getMainAttributes()); this.coveredPackages = new HashSet(); } @@ -274,7 +274,75 @@ Module.PackageExport.write(dos, publicPackages); } - private String[] computeProvides(Module forModule, Attributes attr, boolean verifyCNBs) throws InvalidException, IllegalArgumentException { + private Dependency[] computeImported(Attributes attr) { + String pkgs = attr.getValue("Import-Package"); // NOI18N + List arr = null; + if (pkgs != null) { + arr = new ArrayList(); + StringTokenizer tok = createTokenizer(pkgs); // NOI18N + while (tok.hasMoreElements()) { + String dep = beforeSemicolon(tok); + arr.addAll(Dependency.create(Dependency.TYPE_RECOMMENDS, dep)); + } + } + String recomm = attr.getValue("Require-Bundle"); // NOI18N + if (recomm != null) { + if (arr == null) { + arr = new ArrayList(); + } + StringTokenizer tok = createTokenizer(recomm); // NOI18N + while (tok.hasMoreElements()) { + String dep = beforeSemicolon(tok); + arr.addAll(Dependency.create(Dependency.TYPE_MODULE, dep)); + } + } + return arr == null ? null : arr.toArray(new Dependency[0]); + } + + private static StringTokenizer createTokenizer(String osgiDep) { + for (;;) { + int first = osgiDep.indexOf('"'); + if (first == -1) { + break; + } + int second = osgiDep.indexOf('"', first + 1); + if (second == -1) { + break; + } + osgiDep = osgiDep.substring(0, first - 1) + osgiDep.substring(second + 1); + } + + return new StringTokenizer(osgiDep, ","); + } + + private static String beforeSemicolon(StringTokenizer tok) { + String dep = tok.nextToken().trim(); + int semicolon = dep.indexOf(';'); + if (semicolon >= 0) { + dep = dep.substring(0, semicolon); + } + return dep; + } + + private String[] computeExported(boolean useOSGi, String[] addTo, Attributes attr) { + if (!useOSGi) { + return addTo; + } + String pkgs = attr.getValue("Export-Package"); // NOI18N + if (pkgs == null) { + return addTo; + } + List arr = new ArrayList(Arrays.asList(addTo)); + StringTokenizer tok = createTokenizer(pkgs); // NOI18N + while (tok.hasMoreElements()) { + arr.add(beforeSemicolon(tok)); + } + return arr.toArray(new String[0]); + } + + private String[] computeProvides( + Module forModule, Attributes attr, boolean verifyCNBs, boolean useOSGi + ) throws InvalidException, IllegalArgumentException { String[] arr; // Token provides String providesS = attr.getValue("OpenIDE-Module-Provides"); // NOI18N @@ -309,7 +377,7 @@ arr = l.toArray (arr); } } - return arr; + return computeExported(useOSGi, arr, attr); } /**