/**
* Copyright (c) 2016 Couchbase, Inc. All rights reserved.
* <p/>
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a copy of the License at
* <p/>
* http://www.apache.org/licenses/LICENSE-2.0
* <p/>
* Unless required by applicable law or agreed to in writing, software distributed under the
* License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
* either express or implied. See the License for the specific language governing permissions
* and limitations under the License.
*/
package com.couchbase.lite.mockserver;
import com.couchbase.lite.Manager;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import okhttp3.mockwebserver.MockResponse;
import okio.Buffer;
import okio.BufferedSink;
import okio.GzipSink;
import okio.Okio;
/*
Generate mock changes feed, eg:
{
"results":[
{
"seq":1,
"id":"doc1-1402588904847",
"changes":[
{
"rev":"1-d57b1bc60eb9273c3349d932e15f9949"
}
]
},
{
"seq":2,
"id":"doc2-1402588904847",
"changes":[
{
"rev":"1-d57b1bc60eb9273c3349d932e15f9949"
}
]
}
],
"last_seq":2
}
*/
public class MockChangesFeed {
private List<MockChangedDoc> mockChangedDocs;
public MockChangesFeed() {
mockChangedDocs = new ArrayList<MockChangedDoc>();
}
public void add(MockChangedDoc mockChangedDoc) {
mockChangedDocs.add(mockChangedDoc);
}
private int getHighestSeq() {
if (mockChangedDocs.size() == 0) {
return -1;
}
// just assume they were added in the right order,
// so get the last one and use that
int indexLast = mockChangedDocs.size() - 1;
MockChangedDoc lastDoc = mockChangedDocs.get(indexLast);
return lastDoc.getSeq();
}
private Map<String, Object> generateChangesMap() {
Map<String, Object> changesMap = new HashMap<String, Object>();
int highestSeq = getHighestSeq();
if (highestSeq > 0) {
changesMap.put("last_seq", highestSeq);
}
List results = new ArrayList();
for (MockChangedDoc mockChangedDoc : mockChangedDocs) {
results.add(mockChangedDoc.exportAsMap());
}
changesMap.put("results", results);
return changesMap;
}
private String generateChangesBody() {
Map changesMap = generateChangesMap();
try {
return Manager.getObjectMapper().writeValueAsString(changesMap);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
public MockResponse generateMockResponse() {
return generateMockResponse(false);
}
public MockResponse generateMockResponse(boolean gzip) {
MockResponse mockResponse = new MockResponse();
if (gzip) {
mockResponse.setBody(gzip(generateChangesBody()));
mockResponse.addHeader("Content-Encoding: gzip");
} else {
mockResponse.setBody(generateChangesBody());
}
MockHelper.set200OKJson(mockResponse);
return mockResponse;
}
private Buffer gzip(String data) {
Buffer result = new Buffer();
BufferedSink sink = null;
try {
sink = Okio.buffer(new GzipSink(result));
sink.writeUtf8(data);
} catch (IOException e) {
throw new RuntimeException(e);
} finally {
if (sink != null)
try {
sink.close();
} catch (IOException e) {
}
}
return result;
}
public static class MockChangedDoc {
private int seq;
private String docId;
private List<String> changedRevIds;
public MockChangedDoc() {
}
public MockChangedDoc(MockDocumentGet.MockDocument mockDocument) {
this();
this.seq = mockDocument.getDocSeq();
this.docId = mockDocument.getDocId();
this.changedRevIds = Arrays.asList(mockDocument.getDocRev());
}
public MockChangedDoc setSeq(int seq) {
this.seq = seq;
return this;
}
public MockChangedDoc setDocId(String docId) {
this.docId = docId;
return this;
}
public MockChangedDoc setChangedRevIds(List<String> changedRevIds) {
this.changedRevIds = changedRevIds;
return this;
}
public int getSeq() {
return seq;
}
public String getDocId() {
return docId;
}
public List<String> getChangedRevIds() {
return changedRevIds;
}
/**
* Export as a map
*
* @return map, eg {"seq":2,"id":"doc2","changes":[{"rev":"1-5e38"}]}
*/
public Map<String, Object> exportAsMap() {
Map<String, Object> exported = new HashMap<String, Object>();
exported.put("seq", getSeq());
exported.put("id", getDocId());
List changes = new ArrayList();
for (String changeRevId : changedRevIds) {
Map<String, Object> revIdMap = new HashMap<String, Object>();
revIdMap.put("rev", changeRevId);
changes.add(revIdMap);
}
exported.put("changes", changes);
return exported;
}
}
}