11/*
2- * Copyright © 2015, 2018 IBM Corp. All rights reserved.
2+ * Copyright © 2015, 2020 IBM Corp. All rights reserved.
33 *
44 * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file
55 * except in compliance with the License. You may obtain a copy of the License at
1616
1717import com .cloudant .client .api .views .ViewMultipleRequest ;
1818import com .cloudant .client .api .views .ViewResponse ;
19+ import com .cloudant .client .org .lightcouch .CouchDbException ;
1920import com .cloudant .http .Http ;
2021import com .cloudant .http .HttpConnection ;
2122import com .google .gson .JsonArray ;
2223import com .google .gson .JsonObject ;
2324
2425import java .io .IOException ;
26+ import java .net .HttpURLConnection ;
27+ import java .net .URI ;
2528import java .util .ArrayList ;
2629import java .util .Collections ;
2730import java .util .List ;
@@ -43,12 +46,22 @@ public List<ViewResponse<K, V>> getViewResponses() throws IOException {
4346 }
4447 JsonObject queryJson = new JsonObject ();
4548 queryJson .add ("queries" , queries );
49+ String requestBody = queryJson .toString ();
4650 //construct and execute the POST request
47- HttpConnection post = Http .POST (viewQueryParameters .getViewURIBuilder ().build (),
48- "application/json" );
49- post .setRequestBody (queryJson .toString ());
50- JsonObject jsonResponse = ViewRequester .executeRequestWithResponseAsJson
51- (viewQueryParameters , post );
51+ URI multiRequestUri = viewQueryParameters .getViewURIBuilder ().path ("queries" ).build ();
52+ JsonObject jsonResponse = null ;
53+ try {
54+ jsonResponse = performMultiRequest (multiRequestUri , viewQueryParameters , requestBody );
55+ } catch (CouchDbException e ) {
56+ if (e .getStatusCode () == HttpURLConnection .HTTP_INTERNAL_ERROR && "badmatch" .equals (e .getError ())) {
57+ // CouchDB versions prior to 2.2 don't support .../_view/{viewname}/queries
58+ // POST directly to view instead
59+ multiRequestUri = viewQueryParameters .getViewURIBuilder ().build ();
60+ jsonResponse = performMultiRequest (multiRequestUri , viewQueryParameters , requestBody );
61+ } else {
62+ throw e ;
63+ }
64+ }
5265 //loop the returned array creating the ViewResponse objects
5366 List <ViewResponse <K , V >> responses = new ArrayList <ViewResponse <K , V >>();
5467 JsonArray jsonResponses = jsonResponse .getAsJsonArray ("results" );
@@ -68,4 +81,13 @@ public List<ViewResponse<K, V>> getViewResponses() throws IOException {
6881 public void add (ViewQueryParameters <K , V > viewQueryParameters ) {
6982 requestParameters .add (viewQueryParameters );
7083 }
84+
85+ private JsonObject performMultiRequest (URI multiRequestUri ,
86+ ViewQueryParameters <K , V > viewQueryParameters ,
87+ String body ) throws CouchDbException , IOException {
88+ //construct and execute the POST request
89+ HttpConnection post = Http .POST (multiRequestUri , "application/json" );
90+ post .setRequestBody (body );
91+ return ViewRequester .executeRequestWithResponseAsJson (viewQueryParameters , post );
92+ }
7193}
0 commit comments