protected void findResource()

in bundle/core/src/main/java/org/apache/karaf/bundle/command/FindClass.java [59:149]


    protected void findResource() {
        Bundle[] bundles = bundleContext.getBundles();
        String path;
        String filter;
        int idx = className.lastIndexOf('.');
        if (idx >= 0) {
            path = className.substring(0, idx).replace('.', '/');
            if (path.isEmpty() || path.charAt(0) != '/') {
                path = "/" + path;
            }
            filter = className.substring(idx + 1) + ".class";
        } else {
            path = "/";
            filter = "*" + className + "*";
        }
        if (!verbose) {
            // old behavior
            for (Bundle bundle:bundles){
                BundleWiring wiring = bundle.adapt(BundleWiring.class);
                if (wiring != null){
                    Collection<String> resources = wiring.listResources(path, filter, BundleWiring.LISTRESOURCES_RECURSE);
                    if (resources.size() > 0){
                        String title = ShellUtil.getBundleName(bundle);
                        System.out.println("\n" + title);
                    }
                    for (String resource:resources){
                        System.out.println(resource);
                    }
                } else {
                    System.out.println("Bundle " + bundle.getBundleId() + " is not resolved.");
                }
            }
        } else {
            // more information
            for (Bundle bundle : bundles) {
                BundleWiring wiring = bundle.adapt(BundleWiring.class);
                if (wiring != null) {
                    // own content and attached fragments' content
                    List<URL> entries = wiring.findEntries(path, filter, BundleWiring.FINDENTRIES_RECURSE);
                    boolean hasEntries = entries != null && !entries.isEmpty();

                    // entries visible through wires
                    Collection<String> resources = wiring.listResources(path, filter, BundleWiring.LISTRESOURCES_RECURSE);
                    boolean hasResources = resources != null && !resources.isEmpty();

                    if (hasEntries || hasResources) {
                        String title = ShellUtil.getBundleName(bundle);
                        System.out.println("\n" + title);
                    }

                    if (hasEntries) {
                        System.out.println("  Resources from this bundle (and its fragments) content:");
                        for (URL entry : entries) {
                            System.out.println("    " + entry);
                        }
                    }
                    if (hasResources) {
                        Set<String> reqBundles = new LinkedHashSet<>();
                        Set<String> importedPackages = new LinkedHashSet<>();
                        for (BundleWire bw : wiring.getRequiredWires(null)) {
                            BundleCapability cap = bw.getCapability();
                            BundleRevision rcap = cap == null ? null : cap.getResource();
                            if (cap == null || rcap == null
                                    || rcap.getWiring() == null || rcap.getWiring().getBundle() == null) {
                                continue;
                            }
                            Collection<String> res = rcap.getWiring().listResources(path, filter, BundleWiring.LISTRESOURCES_RECURSE);
                            for (String r : res) {
                                if (cap.getNamespace().equals(BundleRevision.PACKAGE_NAMESPACE)) {
                                    importedPackages.add("    " + r + " (visible through " + BundleRevision.PACKAGE_NAMESPACE + " from " + ShellUtil.getBundleName(rcap.getWiring().getBundle()) + ")");
                                } else if (cap.getNamespace().equals(BundleRevision.BUNDLE_NAMESPACE)) {
                                    reqBundles.add("    " + r + " (visible through " + BundleRevision.BUNDLE_NAMESPACE + " from " + ShellUtil.getBundleName(rcap.getWiring().getBundle()) + ")");
                                }
                            }
                        }
                        if (!(importedPackages.isEmpty() && reqBundles.isEmpty())) {
                            System.out.println("  Resources from bundle or wired bundles:");
                            for (String v : importedPackages) {
                                System.out.println(v);
                            }
                            for (String v : reqBundles) {
                                System.out.println(v);
                            }
                        }
                    }
                } else {
                    System.out.println("Bundle " + bundle.getBundleId() + " is not resolved.");
                }
            }
        }
    }