Refactor toJson(:Region) to serialize the values from the Region using the AbstractObjectArrayToJsonConverter class and CacheUtils.collectValues(:Region) method.

This commit is contained in:
John Blum
2020-06-09 21:44:44 -07:00
parent 53dda1265b
commit e05c627e13
2 changed files with 18 additions and 100 deletions

View File

@@ -39,9 +39,8 @@ import org.springframework.data.gemfire.util.CollectionUtils;
import org.springframework.geode.data.AbstractCacheDataImporterExporter;
import org.springframework.geode.data.CacheDataExporter;
import org.springframework.geode.data.CacheDataImporter;
import org.springframework.geode.data.json.converter.AbstractObjectArrayToJsonConverter;
import org.springframework.geode.data.json.converter.JsonToPdxArrayConverter;
import org.springframework.geode.data.json.converter.ObjectToJsonConverter;
import org.springframework.geode.data.json.converter.support.JSONFormatterPdxToJsonConverter;
import org.springframework.geode.data.json.converter.support.JacksonJsonToPdxConverter;
import org.springframework.geode.pdx.PdxInstanceWrapper;
import org.springframework.geode.util.CacheUtils;
@@ -82,12 +81,8 @@ public class JsonCacheDataImporterExporter extends AbstractCacheDataImporterExpo
private static final int CONTENT_PREVIEW_LENGTH = 50;
private static final int DEFAULT_BUFFER_SIZE = 32768;
protected static final String ARRAY_BEGIN = "[";
protected static final String ARRAY_END = "]";
protected static final String AT_IDENTIFIER_FIELD_NAME = PdxInstanceWrapper.AT_IDENTIFIER_FIELD_NAME;
protected static final String CLASSPATH_RESOURCE_PREFIX = ResourceLoader.CLASSPATH_URL_PREFIX;
protected static final String COMMA_SPACE = ", ";
protected static final String EMPTY_STRING = "";
protected static final String FILESYSTEM_RESOURCE_PREFIX = "file://";
protected static final String ID_FIELD_NAME = PdxInstanceWrapper.ID_FIELD_NAME;
protected static final String NO_FIELD_NAME = "";
@@ -95,18 +90,13 @@ public class JsonCacheDataImporterExporter extends AbstractCacheDataImporterExpo
private JsonToPdxArrayConverter jsonToPdxArrayConverter = newJsonToPdxArrayConverter();
private ObjectToJsonConverter objectToJsonConverter = newObjectToJsonConverter();
private final RegionValuesToJsonConverter regionValuesToJsonConverter = new RegionValuesToJsonConverter();
// TODO configure via an SPI
private @NonNull JsonToPdxArrayConverter newJsonToPdxArrayConverter() {
return new JacksonJsonToPdxConverter();
}
// TODO configure via an SPI
private @NonNull ObjectToJsonConverter newObjectToJsonConverter() {
return new JSONFormatterPdxToJsonConverter();
}
/**
* Returns a reference to the configured {@link JsonToPdxArrayConverter}.
*
@@ -117,16 +107,6 @@ public class JsonCacheDataImporterExporter extends AbstractCacheDataImporterExpo
return this.jsonToPdxArrayConverter;
}
/**
* Gets a reference to the configured {@link ObjectToJsonConverter}.
*
* @return a reference to the configured {@link ObjectToJsonConverter}.
* @see org.springframework.geode.data.json.converter.ObjectToJsonConverter
*/
protected @NonNull ObjectToJsonConverter getObjectToJsonConverter() {
return this.objectToJsonConverter;
}
/**
* @inheritDoc
*/
@@ -394,56 +374,38 @@ public class JsonCacheDataImporterExporter extends AbstractCacheDataImporterExpo
return pdxInstance;
}
// TODO Replace implementation with AbstractObjectArrayToJsonConverter.convert(:Iterable) method.
/**
* Convert {@link Object values} contained in the {@link Region} to JSON.
* Convert {@link Object values} contained in the {@link Region} to {@link String JSON}.
*
* @param region {@link Region} to process; must not be {@literal null}.
* @return a JSON {@link String} containing the {@link Object values} from the given {@link Region}.
* @return {@link String JSON} containing the {@link Object values} from the given {@link Region}.
* @see org.apache.geode.cache.Region
* @see #toJson(Object)
*/
@SuppressWarnings("unchecked")
protected @NonNull String toJson(@NonNull Region region) {
Assert.notNull(region, "Region must not be null");
StringBuilder json = new StringBuilder(ARRAY_BEGIN);
boolean addComma = false;
for (Object value : CollectionUtils.nullSafeCollection(CacheUtils.collectValues(region))) {
json.append(addComma ? COMMA_SPACE : EMPTY_STRING);
json.append(toJson(value));
addComma = true;
}
json.append(ARRAY_END);
return json.toString();
return this.regionValuesToJsonConverter.convert(region);
}
/**
* Converts the given {@link Object} into JSON.
*
* @param source {@link Object} to convert into JSON.
* @return a {@link String} containing the JSON generated from the given {@link Object}.
* @see #getObjectToJsonConverter()
*/
protected @NonNull String toJson(@NonNull Object source) {
return getObjectToJsonConverter().convert(source);
}
/**
* Converts the array of {@link Byte#TYPE bytes} containing multiple JSON objects
* Converts the array of {@link Byte#TYPE bytes} containing multiple {@link String JSON} objects
* into an array of {@link PdxInstance PdxInstances}.
*
* @param json array of {@link Byte#TYPE bytes} containing the JSON to convert to PDX.
* @return an array of {@link PdxInstance PdxInstances} for each JSON object.
* @param json array of {@link Byte#TYPE bytes} containing the {@link String JSON} to convert to PDX.
* @return an array of {@link PdxInstance PdxInstances} for each {@link String JSON} object.
* @see org.apache.geode.pdx.PdxInstance
* @see #getJsonToPdxArrayConverter()
*/
protected @NonNull PdxInstance[] toPdxArray(@NonNull byte[] json) {
return getJsonToPdxArrayConverter().convert(json);
}
static class RegionValuesToJsonConverter extends AbstractObjectArrayToJsonConverter {
@NonNull <K, V> String convert(@NonNull Region<K, V> region) {
Assert.notNull(region, "Region must not be null");
return super.convert(CollectionUtils.nullSafeCollection(CacheUtils.collectValues(region)));
}
}
}

View File

@@ -55,7 +55,6 @@ import org.springframework.core.io.Resource;
import org.springframework.dao.DataAccessResourceFailureException;
import org.springframework.data.gemfire.util.ArrayUtils;
import org.springframework.geode.data.json.converter.JsonToPdxArrayConverter;
import org.springframework.geode.data.json.converter.ObjectToJsonConverter;
import example.app.crm.model.Customer;
import example.app.pos.model.LineItem;
@@ -829,33 +828,6 @@ public class JsonCacheDataImporterExporterUnitTests {
JsonCacheDataImporterExporter.FILESYSTEM_RESOURCE_PREFIX, System.getProperty("user.dir"), File.separator));
}
@Test
public void toJsonFromRegion() {
String jonDoeJson = "{ \"name\": \"Jon Doe\" }";
String janeDoeJson = "{ \"name\": \"Jane Doe\" }";
String pieDoeJson = "{ \"name\": \"Pie Doe\" }";
String expectedJson = String.format("[%1$s, %2$s, %3$s]", jonDoeJson, janeDoeJson, pieDoeJson);
Customer jonDoe = Customer.newCustomer(1L, "Jon Doe");
Customer janeDoe = Customer.newCustomer(2L, "Jane Doe");
Customer pieDoe = Customer.newCustomer(3L, "Pie Doe");
Region<?, ?> customers = mock(Region.class);
doReturn(Arrays.asList(jonDoe, janeDoe, pieDoe)).when(customers).values();
doReturn(jonDoeJson).when(this.importer).toJson(eq(jonDoe));
doReturn(janeDoeJson).when(this.importer).toJson(eq(janeDoe));
doReturn(pieDoeJson).when(this.importer).toJson(eq(pieDoe));
assertThat(this.importer.toJson(customers)).isEqualTo(expectedJson);
verify(this.importer, times(1)).toJson(eq(jonDoe));
verify(this.importer, times(1)).toJson(eq(janeDoe));
verify(this.importer, times(1)).toJson(eq(pieDoe));
verify(customers, times(1)).values();
}
@Test
public void toJsonFromEmptyRegion() {
@@ -881,22 +853,6 @@ public class JsonCacheDataImporterExporterUnitTests {
}
}
@Test
public void toJsonFromObjectCallsObjectToJsonConverter() {
String json = "{ \"name\": \"Jon Doe\" }";
ObjectToJsonConverter mockConverter = mock(ObjectToJsonConverter.class);
doReturn(mockConverter).when(this.importer).getObjectToJsonConverter();
doReturn(json).when(mockConverter).convert(eq("TEST"));
assertThat(this.importer.toJson("TEST")).isEqualTo(json);
verify(this.importer, times(1)).getObjectToJsonConverter();
verify(mockConverter, times(1)).convert(eq("TEST"));
}
@Test
public void toPdxArrayFromJsonCallsJsonToPdxArrayConverter() {