Search code examples
javaibm-cloudcloudant

List all attachments stored in cloudant with java


I'm developing a demo and I'm stuck with this. I want to list in a java web app all the attachments (PDFs for example), but a I am not able to retrieve and list them. I'm only able to retrieve common data (String, Ints). Is there a standard way to retrieve and show ? I been reading all the posts but nothing seems to work.

Here is where I add the vendor, with the attachment:

public void addVendor(final Vendor vendor, final InputStream inputStream, final long size, final String contentType)
    {
        final Database db = getDb();
        final int id = Integer.valueOf(vendor.get_id()) + 1;
        final Response r1 = db.saveAttachment(inputStream, vendor.getName() + ".txt", contentType, String.valueOf(id), null);
        vendor.setAttachment(r1);
        final Response r = db.post(vendor);

        System.out.println("Vendor created successfully. Id: " + r.getId() + ", rev: " + r.getRev());
        System.out.println("File created successfully. Id: " + r1.getId() + ", rev: " + r1.getRev());

    }

Here I where I try to retrive the data:

public List<Vendor> getAllVendors()
    {
        List<Vendor> Vendors = new ArrayList<Vendor>();
        final List<Vendor> vend2 = new ArrayList<Vendor>();

        //Get db
        final Database db = getDb();
        final InputStream s = null;
        //Get all documents
        Vendors = db.view("_all_docs").includeDocs(true).query(Vendor.class);

        final Database db1 = getDb();

          for (final Vendor vend : Vendors) { 

          final Response r1 = vend.getAttachment(); 

          final int id = Integer.valueOf(vend.get_id()) + 1;

         // Here I am look to the attachment with the _ID and _REV
          final InputStream in = db1.find(r1.getId(), r1.getRev()); vend.setInput(in); vend2.add(vend);

           }

        return Vendors;
    }

I this last code, I intended to create a new list with all my Vendor data plus the blob. When I add the vendor ( in the first part ) , I saved the " response " of the attachement in the vendor object, SO when I tried to retrive I have the data to work with ( _id and _rev ) .


Solution

  • I'm assuming you want to list all documents that contain attachments. If so, you can create a MapReduce view similar to this:

    function(doc) {
      if (doc._attachments) {
        emit(doc._id, null);
      }
    }
    

    You would then call the view using something like this to get a list of document ids of documents that contain attachments:

    GET /dbname/_design/designdocname/_view/docswithattachments
    

    The above GET request would look something like this in Java:

      List<Foo> list = db.view("designdocname/docswithattachments")
        .query(Foo.class);