Skip to content

Commit

Permalink
Refactored: moved field handling from UpgradeOrderDecider to Upgrader…
Browse files Browse the repository at this point in the history
…Invoker
  • Loading branch information
luontola committed Nov 1, 2012
1 parent 9b404ad commit 32017ac
Show file tree
Hide file tree
Showing 4 changed files with 55 additions and 51 deletions.
45 changes: 4 additions & 41 deletions src/main/java/fi/solita/jsonmigraine/UpgradeOrderDecider.java
Expand Up @@ -5,7 +5,7 @@
package fi.solita.jsonmigraine;

import org.codehaus.jackson.JsonNode;
import org.codehaus.jackson.node.*;
import org.codehaus.jackson.node.ObjectNode;

import java.util.List;

Expand Down Expand Up @@ -36,53 +36,16 @@ public JsonNode upgrade(JsonNode data, DataVersions from, HowToUpgrade how) {
while (dataVersion < latestVersion) {

if (fieldName == null) {
data = upgradeWholeObject(data, dataVersion, upgrader);
data = invoker.upgrade(data, dataVersion, upgrader);
} else if (dataType.isArray()) {
data = upgradeArrayField((ObjectNode) data, fieldName, dataVersion, upgrader);
data = invoker.upgradeArrayField((ObjectNode) data, fieldName, dataVersion, upgrader);
} else {
data = upgradeField((ObjectNode) data, fieldName, dataVersion, upgrader);
data = invoker.upgradeField((ObjectNode) data, fieldName, dataVersion, upgrader);
}

dataVersion++;
}
}
return data;
}

private ObjectNode upgradeField(ObjectNode container, String fieldName, int dataVersion, Upgrader upgrader) {
JsonNode original = container.get(fieldName);
try {
JsonNode upgraded = upgradeWholeObject(original, dataVersion, upgrader);
container.put(fieldName, upgraded);
} catch (ValueRemovedException e) {
container.remove(fieldName);
}
return container;
}

private JsonNode upgradeArrayField(ObjectNode container, String fieldName, int dataVersion, Upgrader upgrader) {
JsonNode original = container.get(fieldName);
if (!original.isNull()) {
JsonNode upgraded = upgradeArray((ArrayNode) original, dataVersion, upgrader);
container.put(fieldName, upgraded);
}
return container;
}

private ArrayNode upgradeArray(ArrayNode values, int dataVersion, Upgrader upgrader) {
ArrayNode results = JsonNodeFactory.instance.arrayNode();
for (JsonNode original : values) {
try {
JsonNode upgraded = upgradeWholeObject(original, dataVersion, upgrader);
results.add(upgraded);
} catch (ValueRemovedException e) {
// removed; don't add to results
}
}
return results;
}

private JsonNode upgradeWholeObject(JsonNode data, int dataVersion, Upgrader upgrader) {
return invoker.upgradeWholeObject(data, dataVersion, upgrader);
}
}
7 changes: 6 additions & 1 deletion src/main/java/fi/solita/jsonmigraine/UpgraderInvoker.java
Expand Up @@ -5,8 +5,13 @@
package fi.solita.jsonmigraine;

import org.codehaus.jackson.JsonNode;
import org.codehaus.jackson.node.ObjectNode;

public interface UpgraderInvoker {

JsonNode upgradeWholeObject(JsonNode data, int dataVersion, Upgrader upgrader);
JsonNode upgrade(JsonNode data, int dataVersion, Upgrader upgrader);

ObjectNode upgradeField(ObjectNode container, String fieldName, int dataVersion, Upgrader upgrader);

JsonNode upgradeArrayField(ObjectNode container, String fieldName, int dataVersion, Upgrader upgrader);
}
38 changes: 37 additions & 1 deletion src/main/java/fi/solita/jsonmigraine/UpgraderInvokerImpl.java
Expand Up @@ -5,11 +5,47 @@
package fi.solita.jsonmigraine;

import org.codehaus.jackson.JsonNode;
import org.codehaus.jackson.node.*;

public class UpgraderInvokerImpl implements UpgraderInvoker {

@Override
public JsonNode upgradeWholeObject(JsonNode data, int dataVersion, Upgrader upgrader) {
public JsonNode upgrade(JsonNode data, int dataVersion, Upgrader upgrader) {
return upgrader.upgrade(data, dataVersion);
}

@Override
public ObjectNode upgradeField(ObjectNode container, String fieldName, int dataVersion, Upgrader upgrader) {
JsonNode original = container.get(fieldName);
try {
JsonNode upgraded = upgrader.upgrade(original, dataVersion);
container.put(fieldName, upgraded);
} catch (ValueRemovedException e) {
container.remove(fieldName);
}
return container;
}

@Override
public JsonNode upgradeArrayField(ObjectNode container, String fieldName, int dataVersion, Upgrader upgrader) {
JsonNode original = container.get(fieldName);
if (!original.isNull()) {
JsonNode upgraded = upgradeArray((ArrayNode) original, dataVersion, upgrader);
container.put(fieldName, upgraded);
}
return container;
}

private ArrayNode upgradeArray(ArrayNode values, int dataVersion, Upgrader upgrader) {
ArrayNode results = JsonNodeFactory.instance.arrayNode();
for (JsonNode original : values) {
try {
JsonNode upgraded = upgrader.upgrade(original, dataVersion);
results.add(upgraded);
} catch (ValueRemovedException e) {
// removed; don't add to results
}
}
return results;
}
}
Expand Up @@ -44,7 +44,7 @@ public void upgrades_old_versions_using_the_upgrader() {

upgrade();

inOrder.verify(invoker).upgradeWholeObject(any(JsonNode.class), eq(dataVersion), eq(upgrader));
inOrder.verify(invoker).upgrade(any(JsonNode.class), eq(dataVersion), eq(upgrader));
verifyNoMoreInteractions(invoker);
}

Expand All @@ -54,9 +54,9 @@ public void upgrades_one_version_at_a_time_until_fully_upgraded() {

upgrade();

inOrder.verify(invoker).upgradeWholeObject(any(JsonNode.class), eq(LATEST_VERSION - 3), eq(upgrader));
inOrder.verify(invoker).upgradeWholeObject(any(JsonNode.class), eq(LATEST_VERSION - 2), eq(upgrader));
inOrder.verify(invoker).upgradeWholeObject(any(JsonNode.class), eq(LATEST_VERSION - 1), eq(upgrader));
inOrder.verify(invoker).upgrade(any(JsonNode.class), eq(LATEST_VERSION - 3), eq(upgrader));
inOrder.verify(invoker).upgrade(any(JsonNode.class), eq(LATEST_VERSION - 2), eq(upgrader));
inOrder.verify(invoker).upgrade(any(JsonNode.class), eq(LATEST_VERSION - 1), eq(upgrader));
verifyNoMoreInteractions(invoker);
}

Expand Down Expand Up @@ -102,10 +102,10 @@ public void upgrades_the_first_step_fully_before_following_steps() {
.add(new UpgradeStep(Second.class));
data = sut.upgrade(data, from, how);

inOrder.verify(invoker).upgradeWholeObject(any(JsonNode.class), eq(FIRST_VERSION - 2), eq(firstUpgrader));
inOrder.verify(invoker).upgradeWholeObject(any(JsonNode.class), eq(FIRST_VERSION - 1), eq(firstUpgrader));
inOrder.verify(invoker).upgradeWholeObject(any(JsonNode.class), eq(SECOND_VERSION - 2), eq(secondUpgrader));
inOrder.verify(invoker).upgradeWholeObject(any(JsonNode.class), eq(SECOND_VERSION - 1), eq(secondUpgrader));
inOrder.verify(invoker).upgrade(any(JsonNode.class), eq(FIRST_VERSION - 2), eq(firstUpgrader));
inOrder.verify(invoker).upgrade(any(JsonNode.class), eq(FIRST_VERSION - 1), eq(firstUpgrader));
inOrder.verify(invoker).upgrade(any(JsonNode.class), eq(SECOND_VERSION - 2), eq(secondUpgrader));
inOrder.verify(invoker).upgrade(any(JsonNode.class), eq(SECOND_VERSION - 1), eq(secondUpgrader));
verifyNoMoreInteractions(invoker);
}

Expand Down

0 comments on commit 32017ac

Please sign in to comment.