in src/main/java/org/apache/sling/feature/analyser/task/impl/CheckBundlesForConnect.java [50:113]
public void execute(final AnalyserTaskContext ctx) {
final Map<String, List<Artifact>> packageMap = new HashMap<>();
for (final BundleDescriptor bd : ctx.getFeatureDescriptor().getBundleDescriptors()) {
if (bd.getManifest() != null) {
final String cp = bd.getManifest().getMainAttributes().getValue(Constants.BUNDLE_CLASSPATH);
String[] jars = null;
if (cp != null) {
jars = cp.split(",");
ctx.reportArtifactWarning(bd.getArtifact().getId(), "Found bundle classpath in : " + cp);
}
final Set<String> packages = new HashSet<>();
try (final JarInputStream jis = new JarInputStream(bd.getArtifactFile().openStream())) {
JarEntry entry;
while ((entry = jis.getNextJarEntry()) != null) {
if (entry.getName().endsWith(".class")) {
final int lastPos = entry.getName().lastIndexOf('/');
if (lastPos == -1) {
ctx.reportArtifactError(bd.getArtifact().getId(),"Bundle contains classes in the default package");
} else {
packages.add(entry.getName().substring(0, lastPos));
}
} else if (!entry.isDirectory() && jars != null) {
for (final String jar : jars) {
if (jar.equals(entry.getName())) {
final JarInputStream is = new JarInputStream(jis);
JarEntry inner;
while ((inner = is.getNextJarEntry()) != null) {
if (inner.getName().endsWith(".class")) {
final int lastPos = inner.getName().lastIndexOf('/');
if (lastPos == -1) {
ctx.reportArtifactError(bd.getArtifact().getId(),
"Bundle contains (embedded) classes in the default package");
} else {
packages.add(inner.getName().substring(0, lastPos));
}
}
is.closeEntry();
}
}
}
}
jis.closeEntry();
}
} catch (final IOException ioe) {
ctx.reportArtifactError(bd.getArtifact().getId(),"Unable to scan bundle: " + ioe.getMessage());
}
for (final String p : packages) {
List<Artifact> list = packageMap.get(p);
if (list == null) {
list = new ArrayList<>();
packageMap.put(p, list);
}
list.add(bd.getArtifact());
}
}
}
for (final Map.Entry<String, List<Artifact>> entry : packageMap.entrySet()) {
if (entry.getValue().size() > 1) {
ctx.reportWarning("Duplicate package " + entry.getKey() + " in " + entry.getValue());
}
}
}