public void execute()

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());
            }
        }
    }