diff --git a/CHANGES.md b/CHANGES.md index 33d80cf7e..27a7a3684 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,5 +1,6 @@ # Unreleased - [DEPRECATED] This library is now deprecated and will be EOL on Dec 31 2021. +- [FIXED] Type of `sinceSeq` can be also a `String` besides an `Integer`. # 2.19.2 (2021-04-07) - [NEW] Add migration guide to the newly supported cloudant-java-sdk (coordinates: com.ibm.cloud:cloudant). diff --git a/cloudant-client/src/main/java/com/cloudant/client/api/Replication.java b/cloudant-client/src/main/java/com/cloudant/client/api/Replication.java index e758708cb..a60d24a28 100644 --- a/cloudant-client/src/main/java/com/cloudant/client/api/Replication.java +++ b/cloudant-client/src/main/java/com/cloudant/client/api/Replication.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015 IBM Corp. All rights reserved. + * Copyright (c) 2015, 2021 IBM Corp. All rights reserved. * * 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 @@ -17,6 +17,7 @@ import com.cloudant.client.org.lightcouch.ReplicationResult; import com.cloudant.client.org.lightcouch.ReplicationResult.ReplicationHistory; import com.cloudant.client.org.lightcouch.Replicator; +import com.google.gson.JsonParser; import java.util.Map; @@ -172,13 +173,24 @@ public Replication createTarget(Boolean createTarget) { } /** - * Starts a replication since an update sequence. + * Create or modify a replication since an update sequence using a replication document. * * @param sinceSeq sequence number * @return this Replication instance to set more options or trigger the replication */ public Replication sinceSeq(Integer sinceSeq) { - this.replication = replication.sinceSeq(sinceSeq); + this.replication = replication.sinceSeq(new JsonParser().parse(sinceSeq.toString())); + return this; + } + + /** + * Create or modify a replication since an update sequence using a replication document. + * + * @param sinceSeq sequence string + * @return this Replication instance to set more options or trigger the replication + */ + public Replication sinceSeq(String sinceSeq) { + this.replication = replication.sinceSeq(new JsonParser().parse(sinceSeq)); return this; } diff --git a/cloudant-client/src/main/java/com/cloudant/client/api/Replicator.java b/cloudant-client/src/main/java/com/cloudant/client/api/Replicator.java index f2f897ffc..f844e57da 100644 --- a/cloudant-client/src/main/java/com/cloudant/client/api/Replicator.java +++ b/cloudant-client/src/main/java/com/cloudant/client/api/Replicator.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2019 IBM Corp. All rights reserved. + * Copyright (c) 2015, 2021 IBM Corp. All rights reserved. * * 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 @@ -18,6 +18,7 @@ import com.cloudant.client.org.lightcouch.Replication; import com.cloudant.client.org.lightcouch.ReplicatorDocument; import com.cloudant.client.org.lightcouch.Response; +import com.google.gson.JsonParser; import java.util.ArrayList; import java.util.List; @@ -221,8 +222,25 @@ public Replicator userCtxRoles(String... userCtxRoles) { return this; } + /** + * Create a transient replication since an update sequence. + * + * @param sinceSeq sequence number + * @return this Replicator instance to set more options or trigger the replication + */ public Replicator sinceSeq(Integer sinceSeq) { - this.replicator = replicator.sinceSeq(sinceSeq); + this.replicator = replicator.sinceSeq(new JsonParser().parse(sinceSeq.toString())); + return this; + } + + /** + * Create a transient replication since an update sequence. + * + * @param sinceSeq sequence string + * @return this Replicator instance to set more options or trigger the replication + */ + public Replicator sinceSeq(String sinceSeq) { + this.replicator = replicator.sinceSeq(new JsonParser().parse(sinceSeq)); return this; } diff --git a/cloudant-client/src/main/java/com/cloudant/client/api/model/ReplicatorDocument.java b/cloudant-client/src/main/java/com/cloudant/client/api/model/ReplicatorDocument.java index 4b0fddb39..4fb9adef9 100644 --- a/cloudant-client/src/main/java/com/cloudant/client/api/model/ReplicatorDocument.java +++ b/cloudant-client/src/main/java/com/cloudant/client/api/model/ReplicatorDocument.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015 IBM Corp. All rights reserved. + * Copyright (c) 2015, 2021 IBM Corp. All rights reserved. * * 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 @@ -16,7 +16,9 @@ import com.cloudant.client.org.lightcouch.Attachment; import com.cloudant.client.org.lightcouch.Replicator; +import com.google.gson.JsonElement; import com.google.gson.JsonObject; +import com.google.gson.JsonParser; import java.util.HashMap; import java.util.Map; @@ -228,11 +230,19 @@ public void setRetriesPerRequest(Integer retriesPerRequest) { } public Integer getSinceSeq() { - return replicatorDocument.getSinceSeq(); + return replicatorDocument.getSinceSeq().getAsInt(); + } + + public String getSinceSeqString() { + return replicatorDocument.getSinceSeq().getAsString(); } public void setSinceSeq(Integer sinceSeq) { - replicatorDocument.setSinceSeq(sinceSeq); + replicatorDocument.setSinceSeq(new JsonParser().parse(sinceSeq.toString())); + } + + public void setSinceSeq(String sinceSeq) { + replicatorDocument.setSinceSeq(new JsonParser().parse(sinceSeq)); } public void setSourceIamApiKey(String iamApiKey) { diff --git a/cloudant-client/src/main/java/com/cloudant/client/org/lightcouch/Replication.java b/cloudant-client/src/main/java/com/cloudant/client/org/lightcouch/Replication.java index 514f99465..a3f07de7a 100644 --- a/cloudant-client/src/main/java/com/cloudant/client/org/lightcouch/Replication.java +++ b/cloudant-client/src/main/java/com/cloudant/client/org/lightcouch/Replication.java @@ -1,6 +1,6 @@ /* * Copyright (C) 2011 lightcouch.org - * Copyright (c) 2015 IBM Corp. All rights reserved. + * Copyright (c) 2015, 2021 IBM Corp. All rights reserved. * * 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 @@ -19,6 +19,7 @@ import static com.cloudant.client.org.lightcouch.internal.CouchDbUtil.close; import com.cloudant.client.internal.DatabaseURIHelper; +import com.google.gson.JsonElement; import com.google.gson.JsonObject; import java.io.InputStream; @@ -77,7 +78,7 @@ public class Replication { private String[] docIds; private String proxy; private Boolean createTarget; - private Integer sinceSeq; + private JsonElement sinceSeq; // IAM private String sourceIamApiKey; @@ -177,7 +178,7 @@ public Replication createTarget(Boolean createTarget) { /** * Starts a replication since an update sequence. */ - public Replication sinceSeq(Integer sinceSeq) { + public Replication sinceSeq(JsonElement sinceSeq) { this.sinceSeq = sinceSeq; return this; } diff --git a/cloudant-client/src/main/java/com/cloudant/client/org/lightcouch/Replicator.java b/cloudant-client/src/main/java/com/cloudant/client/org/lightcouch/Replicator.java index a17e25841..fefcba689 100644 --- a/cloudant-client/src/main/java/com/cloudant/client/org/lightcouch/Replicator.java +++ b/cloudant-client/src/main/java/com/cloudant/client/org/lightcouch/Replicator.java @@ -1,6 +1,6 @@ /* * Copyright (C) 2011 lightcouch.org - * Copyright (c) 2015, 2019 IBM Corp. All rights reserved. + * Copyright (c) 2015, 2021 IBM Corp. All rights reserved. * * 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 @@ -274,7 +274,7 @@ public Replicator userCtxRoles(String... userCtxRoles) { return this; } - public Replicator sinceSeq(Integer sinceSeq) { + public Replicator sinceSeq(JsonElement sinceSeq) { replicatorDoc.setSinceSeq(sinceSeq); return this; } diff --git a/cloudant-client/src/main/java/com/cloudant/client/org/lightcouch/ReplicatorDocument.java b/cloudant-client/src/main/java/com/cloudant/client/org/lightcouch/ReplicatorDocument.java index 5507ae9d2..b98b74734 100644 --- a/cloudant-client/src/main/java/com/cloudant/client/org/lightcouch/ReplicatorDocument.java +++ b/cloudant-client/src/main/java/com/cloudant/client/org/lightcouch/ReplicatorDocument.java @@ -1,6 +1,6 @@ /* * Copyright (C) 2011 lightcouch.org - * Copyright (c) 2015, 2019 IBM Corp. All rights reserved. + * Copyright (c) 2015, 2021 IBM Corp. All rights reserved. * * 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 @@ -68,7 +68,7 @@ public class ReplicatorDocument extends Document { @SerializedName("user_ctx") private UserCtx userCtx; @SerializedName("since_seq") - private Integer sinceSeq; + private JsonElement sinceSeq; private JsonElement selector; public String getSource() { @@ -268,11 +268,11 @@ public void setRetriesPerRequest(Integer retriesPerRequest) { this.retriesPerRequest = retriesPerRequest; } - public Integer getSinceSeq() { + public JsonElement getSinceSeq() { return sinceSeq; } - public void setSinceSeq(Integer sinceSeq) { + public void setSinceSeq(JsonElement sinceSeq) { this.sinceSeq = sinceSeq; } diff --git a/cloudant-client/src/test/java/com/cloudant/tests/ReplicationTest.java b/cloudant-client/src/test/java/com/cloudant/tests/ReplicationTest.java index 72885a16b..aa6b5ff54 100644 --- a/cloudant-client/src/test/java/com/cloudant/tests/ReplicationTest.java +++ b/cloudant-client/src/test/java/com/cloudant/tests/ReplicationTest.java @@ -1,6 +1,6 @@ /* * Copyright (C) 2011 lightcouch.org - * Copyright © 2015, 2019 IBM Corp. All rights reserved. + * Copyright © 2015, 2021 IBM Corp. All rights reserved. * * 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 @@ -106,4 +106,39 @@ public void replication_conflict() throws Exception { //a conflict assertConflictsNotZero(db2); } + + @Test + public void replication_since_seq() throws Exception { + String seq = db1.changes().getChanges().getResults().get(2).getSeq(); + ReplicationResult result = db1Resource.appendReplicationAuth(account.replication() + .createTarget(true) + .source(db1URI) + .target(db2URI) + .sinceSeq(seq) + ) + .trigger(); + + assertTrue(result.isOk(), "The replication should complete ok"); + + List histories = result.getHistories(); + assertThat(histories.size(), not(0)); + } + + @Test + public void replication_last_seq() throws Exception { + String lastSeq = db1Resource.get().changes().getChanges().getLastSeq(); + + ReplicationResult result = db1Resource.appendReplicationAuth(account.replication() + .createTarget(true) + .source(db1URI) + .target(db2URI) + .sinceSeq(lastSeq) + ) + .trigger(); + + assertTrue(result.isOk(), "The replication should complete ok"); + + List histories = result.getHistories(); + assertThat(histories.size(), not(0)); + } } diff --git a/cloudant-client/src/test/java/com/cloudant/tests/ReplicatorTest.java b/cloudant-client/src/test/java/com/cloudant/tests/ReplicatorTest.java index 182fe0c63..354fe97cd 100644 --- a/cloudant-client/src/test/java/com/cloudant/tests/ReplicatorTest.java +++ b/cloudant-client/src/test/java/com/cloudant/tests/ReplicatorTest.java @@ -1,5 +1,5 @@ /* - * Copyright © 2015, 2019 IBM Corp. All rights reserved. + * Copyright © 2015, 2021 IBM Corp. All rights reserved. * * 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 @@ -131,4 +131,41 @@ public void replication_conflict() throws Exception { //a conflict assertConflictsNotZero(db2); } + + @Test + public void replicator_since_seq() throws Exception { + String seq = db1.changes().getChanges().getResults().get(2).getSeq(); + Response response = db1Resource.appendReplicatorAuth(account.replicator() + .replicatorDocId(repDocId) + .createTarget(true) + .source(db1URI) + .target(db2URI) + .sinceSeq(seq) + ) + .save(); + + // find and remove replicator doc + String state = Utils.waitForReplicatorToComplete(account, response.getId()); + assertTrue("completed".equalsIgnoreCase(state), "The replicator " + + "should reach completed state"); + } + + @Test + public void replicator_last_seq() throws Exception { + String lastSeq = db1Resource.get().changes().getChanges().getLastSeq(); + + Response response = db1Resource.appendReplicatorAuth(account.replicator() + .replicatorDocId(repDocId) + .createTarget(true) + .source(db1URI) + .target(db2URI) + .sinceSeq(lastSeq) + ) + .save(); + + // find and remove replicator doc + String state = Utils.waitForReplicatorToComplete(account, response.getId()); + assertTrue("completed".equalsIgnoreCase(state), "The replicator " + + "should reach completed state"); + } }