From 80d33e5fa00fd8a0044460138e0c1a34b2227c8d Mon Sep 17 00:00:00 2001 From: John Blum Date: Sat, 11 Nov 2017 20:45:15 -0800 Subject: [PATCH] SGF-696 - Add support for invoking callbacks when loading snapshots. --- .../config/xml/SnapshotServiceParser.java | 1 + .../snapshot/SnapshotServiceFactoryBean.java | 27 ++++++-- .../config/spring-data-gemfire-2.1.xsd | 1 + .../SnapshotServiceFactoryBeanTest.java | 64 +++++++++++++------ 4 files changed, 69 insertions(+), 24 deletions(-) diff --git a/src/main/java/org/springframework/data/gemfire/config/xml/SnapshotServiceParser.java b/src/main/java/org/springframework/data/gemfire/config/xml/SnapshotServiceParser.java index 722f098a..dad9f869 100644 --- a/src/main/java/org/springframework/data/gemfire/config/xml/SnapshotServiceParser.java +++ b/src/main/java/org/springframework/data/gemfire/config/xml/SnapshotServiceParser.java @@ -97,6 +97,7 @@ class SnapshotServiceParser extends AbstractSingleBeanDefinitionParser { true)); } + ParsingUtils.setPropertyValue(snapshotMetadataElement, snapshotMetadataBuilder, "invokeCallbacks"); ParsingUtils.setPropertyValue(snapshotMetadataElement, snapshotMetadataBuilder, "parallel"); return snapshotMetadataBuilder.getBeanDefinition(); diff --git a/src/main/java/org/springframework/data/gemfire/snapshot/SnapshotServiceFactoryBean.java b/src/main/java/org/springframework/data/gemfire/snapshot/SnapshotServiceFactoryBean.java index 368ef736..811bc9f2 100644 --- a/src/main/java/org/springframework/data/gemfire/snapshot/SnapshotServiceFactoryBean.java +++ b/src/main/java/org/springframework/data/gemfire/snapshot/SnapshotServiceFactoryBean.java @@ -447,7 +447,9 @@ public class SnapshotServiceFactoryBean extends AbstractFactoryBeanSupport } protected SnapshotOptions createOptions(SnapshotMetadata metadata) { + return createOptions() + .invokeCallbacks(metadata.isInvokeCallbacks()) .setFilter(metadata.getFilter()) .setParallelMode(metadata.isParallel()); } @@ -531,9 +533,10 @@ public class SnapshotServiceFactoryBean extends AbstractFactoryBeanSupport } } - protected void logDebug(Throwable t, String message, Object... arguments) { + protected void logDebug(Throwable cause, String message, Object... arguments) { + if (log.isDebugEnabled()) { - log.debug(String.format(message, arguments), t); + log.debug(String.format(message, arguments), cause); } } @@ -740,11 +743,13 @@ public class SnapshotServiceFactoryBean extends AbstractFactoryBeanSupport */ public static class SnapshotMetadata { + protected static final boolean DEFAULT_INVOKE_CALLBACKS = false; protected static final boolean DEFAULT_PARALLEL = false; protected static final SnapshotFormat DEFAULT_SNAPSHOT_FORMAT = SnapshotFormat.GEMFIRE; - private boolean parallel; + private boolean invokeCallbacks = DEFAULT_INVOKE_CALLBACKS; + private boolean parallel = DEFAULT_PARALLEL; private final File location; @@ -793,6 +798,14 @@ public class SnapshotServiceFactoryBean extends AbstractFactoryBeanSupport return this.filter; } + public void setInvokeCallbacks(boolean invokeCallbacks) { + this.invokeCallbacks = invokeCallbacks; + } + + public boolean isInvokeCallbacks() { + return this.invokeCallbacks; + } + public void setParallel(boolean parallel) { this.parallel = parallel; } @@ -803,8 +816,11 @@ public class SnapshotServiceFactoryBean extends AbstractFactoryBeanSupport @Override public String toString() { - return String.format("{ @type = %1$s, location = %2$s, format = %3$s, filter = %4$s, parallel = %5$s }", - getClass().getName(), getLocation().getAbsolutePath(), getFormat(), getFilter(), isParallel()); + + return String.format( + "{ @type = %1$s, location = %2$s, format = %3$s, filter = %4$s, invokeCallbacks = %5$s, parallel = %6$s }", + getClass().getName(), getLocation().getAbsolutePath(), getFormat(), getFilter(), + isInvokeCallbacks(), isParallel()); } } @@ -828,6 +844,7 @@ public class SnapshotServiceFactoryBean extends AbstractFactoryBeanSupport } protected String getFileExtension(File file) { + String fileExtension = ""; if (nullSafeIsFile(file)) { diff --git a/src/main/resources/org/springframework/data/gemfire/config/spring-data-gemfire-2.1.xsd b/src/main/resources/org/springframework/data/gemfire/config/spring-data-gemfire-2.1.xsd index e810ea84..63b51daf 100644 --- a/src/main/resources/org/springframework/data/gemfire/config/spring-data-gemfire-2.1.xsd +++ b/src/main/resources/org/springframework/data/gemfire/config/spring-data-gemfire-2.1.xsd @@ -249,6 +249,7 @@ both in the same definition) is illegal. + diff --git a/src/test/java/org/springframework/data/gemfire/snapshot/SnapshotServiceFactoryBeanTest.java b/src/test/java/org/springframework/data/gemfire/snapshot/SnapshotServiceFactoryBeanTest.java index 234d3535..1249d2c6 100644 --- a/src/test/java/org/springframework/data/gemfire/snapshot/SnapshotServiceFactoryBeanTest.java +++ b/src/test/java/org/springframework/data/gemfire/snapshot/SnapshotServiceFactoryBeanTest.java @@ -107,24 +107,27 @@ public class SnapshotServiceFactoryBeanTest { } protected SnapshotMetadata newSnapshotMetadata(File location) { - return newSnapshotMetadata(location, null, false, SnapshotFormat.GEMFIRE); + return newSnapshotMetadata(location, null, false, false, SnapshotFormat.GEMFIRE); } - protected SnapshotMetadata newSnapshotMetadata(SnapshotFilter filter, boolean parallel) { - return newSnapshotMetadata(FileSystemUtils.WORKING_DIRECTORY, filter, parallel); + protected SnapshotMetadata newSnapshotMetadata(SnapshotFilter filter, + boolean invokeCallbacks, boolean parallel) { + + return newSnapshotMetadata(FileSystemUtils.WORKING_DIRECTORY, filter, invokeCallbacks, parallel); } protected SnapshotMetadata newSnapshotMetadata(File location, SnapshotFilter filter, - boolean parallel) { + boolean invokeCallbacks, boolean parallel) { - return newSnapshotMetadata(location, filter, parallel, SnapshotFormat.GEMFIRE); + return newSnapshotMetadata(location, filter, invokeCallbacks, parallel, SnapshotFormat.GEMFIRE); } protected SnapshotMetadata newSnapshotMetadata(File location, SnapshotFilter filter, - boolean parallel, SnapshotFormat format) { + boolean invokeCallbacks, boolean parallel, SnapshotFormat format) { SnapshotMetadata snapshotMetadata = new SnapshotMetadata<>(location, format, filter); + snapshotMetadata.setInvokeCallbacks(invokeCallbacks); snapshotMetadata.setParallel(parallel); return snapshotMetadata; @@ -722,14 +725,17 @@ public class SnapshotServiceFactoryBeanTest { when(mockCache.getSnapshotService()).thenReturn(mockCacheSnapshotService); when(mockCacheSnapshotService.createOptions()).thenReturn(mockSnapshotOptionsOne) .thenReturn(mockSnapshotOptionsTwo); + when(mockSnapshotOptionsOne.invokeCallbacks(anyBoolean())).thenReturn(mockSnapshotOptionsOne); when(mockSnapshotOptionsOne.setFilter(eq(mockSnapshotFilterOne))).thenReturn(mockSnapshotOptionsOne); when(mockSnapshotOptionsOne.setParallelMode(anyBoolean())).thenReturn(mockSnapshotOptionsOne); + when(mockSnapshotOptionsTwo.invokeCallbacks(anyBoolean())).thenReturn(mockSnapshotOptionsTwo); when(mockSnapshotOptionsTwo.setFilter(eq(mockSnapshotFilterTwo))).thenReturn(mockSnapshotOptionsTwo); when(mockSnapshotOptionsTwo.setParallelMode(anyBoolean())).thenReturn(mockSnapshotOptionsTwo); - SnapshotMetadata[] expectedImports = - toArray(newSnapshotMetadata(FileSystemUtils.USER_HOME, mockSnapshotFilterOne, true), - newSnapshotMetadata(mockSnapshotFilterTwo, false)); + SnapshotMetadata[] expectedImports = toArray( + newSnapshotMetadata(FileSystemUtils.USER_HOME, mockSnapshotFilterOne, false, true), + newSnapshotMetadata(mockSnapshotFilterTwo, true, false) + ); SnapshotServiceFactoryBean factoryBean = new SnapshotServiceFactoryBean(); @@ -756,8 +762,10 @@ public class SnapshotServiceFactoryBeanTest { verify(mockCacheSnapshotService, times(1)) .load(eq(FileSystemUtils.safeListFiles(FileSystemUtils.WORKING_DIRECTORY, FileSystemUtils.FileOnlyFilter.INSTANCE)), eq(SnapshotFormat.GEMFIRE), eq(mockSnapshotOptionsTwo)); + verify(mockSnapshotOptionsOne, times(1)).invokeCallbacks(eq(false)); verify(mockSnapshotOptionsOne, times(1)).setFilter(eq(mockSnapshotFilterOne)); verify(mockSnapshotOptionsOne, times(1)).setParallelMode(eq(true)); + verify(mockSnapshotOptionsTwo, times(1)).invokeCallbacks(eq(true)); verify(mockSnapshotOptionsTwo, times(1)).setFilter(eq(mockSnapshotFilterTwo)); verify(mockSnapshotOptionsTwo, times(1)).setParallelMode(eq(false)); } @@ -783,16 +791,19 @@ public class SnapshotServiceFactoryBeanTest { when(mockRegion.getSnapshotService()).thenReturn(mockRegionSnapshotService); when(mockRegionSnapshotService.createOptions()).thenReturn(mockSnapshotOptionsOne) .thenReturn(mockSnapshotOptionsTwo); + when(mockSnapshotOptionsOne.invokeCallbacks(anyBoolean())).thenReturn(mockSnapshotOptionsOne); when(mockSnapshotOptionsOne.setFilter(eq(mockSnapshotFilterOne))).thenReturn(mockSnapshotOptionsOne); when(mockSnapshotOptionsOne.setParallelMode(anyBoolean())).thenReturn(mockSnapshotOptionsOne); + when(mockSnapshotOptionsTwo.invokeCallbacks(anyBoolean())).thenReturn(mockSnapshotOptionsTwo); when(mockSnapshotOptionsTwo.setFilter(eq(mockSnapshotFilterTwo))).thenReturn(mockSnapshotOptionsTwo); when(mockSnapshotOptionsTwo.setParallelMode(anyBoolean())).thenReturn(mockSnapshotOptionsTwo); File snapshotDatTwo = mockFile("snapshot-2.dat"); - SnapshotMetadata[] expectedImports = - toArray(newSnapshotMetadata(snapshotDat, mockSnapshotFilterOne, true), - newSnapshotMetadata(snapshotDatTwo, mockSnapshotFilterTwo, false)); + SnapshotMetadata[] expectedImports = toArray( + newSnapshotMetadata(snapshotDat, mockSnapshotFilterOne, false, true), + newSnapshotMetadata(snapshotDatTwo, mockSnapshotFilterTwo, true, false) + ); SnapshotServiceFactoryBean factoryBean = new SnapshotServiceFactoryBean(); @@ -818,8 +829,10 @@ public class SnapshotServiceFactoryBeanTest { .load(eq(snapshotDat), eq(SnapshotFormat.GEMFIRE), eq(mockSnapshotOptionsOne)); verify(mockRegionSnapshotService, times(1)) .load(eq(snapshotDatTwo), eq(SnapshotFormat.GEMFIRE), eq(mockSnapshotOptionsTwo)); + verify(mockSnapshotOptionsOne, times(1)).invokeCallbacks(eq(false)); verify(mockSnapshotOptionsOne, times(1)).setFilter(eq(mockSnapshotFilterOne)); verify(mockSnapshotOptionsOne, times(1)).setParallelMode(eq(true)); + verify(mockSnapshotOptionsTwo, times(1)).invokeCallbacks(eq(true)); verify(mockSnapshotOptionsTwo, times(1)).setFilter(eq(mockSnapshotFilterTwo)); verify(mockSnapshotOptionsTwo, times(1)).setParallelMode(eq(false)); } @@ -841,14 +854,17 @@ public class SnapshotServiceFactoryBeanTest { when(mockCache.getSnapshotService()).thenReturn(mockCacheSnapshotService); when(mockCacheSnapshotService.createOptions()).thenReturn(mockSnapshotOptionsOne) .thenReturn(mockSnapshotOptionsTwo); + when(mockSnapshotOptionsOne.invokeCallbacks(anyBoolean())).thenReturn(mockSnapshotOptionsOne); when(mockSnapshotOptionsOne.setFilter(eq(mockSnapshotFilterOne))).thenReturn(mockSnapshotOptionsOne); when(mockSnapshotOptionsOne.setParallelMode(anyBoolean())).thenReturn(mockSnapshotOptionsOne); + when(mockSnapshotOptionsTwo.invokeCallbacks(anyBoolean())).thenReturn(mockSnapshotOptionsTwo); when(mockSnapshotOptionsTwo.setFilter(eq(mockSnapshotFilterTwo))).thenReturn(mockSnapshotOptionsTwo); when(mockSnapshotOptionsTwo.setParallelMode(anyBoolean())).thenReturn(mockSnapshotOptionsTwo); - SnapshotMetadata[] expectedExports = - toArray(newSnapshotMetadata(mockSnapshotFilterOne, true), - newSnapshotMetadata(mockSnapshotFilterTwo, false)); + SnapshotMetadata[] expectedExports = toArray( + newSnapshotMetadata(mockSnapshotFilterOne, false, true), + newSnapshotMetadata(mockSnapshotFilterTwo, true, false) + ); SnapshotServiceFactoryBean factoryBean = new SnapshotServiceFactoryBean(); @@ -867,8 +883,10 @@ public class SnapshotServiceFactoryBeanTest { eq(expectedExports[0].getFormat()), eq(mockSnapshotOptionsOne)); verify(mockCacheSnapshotService, times(1)).save(eq(expectedExports[1].getLocation()), eq(expectedExports[1].getFormat()), eq(mockSnapshotOptionsTwo)); + verify(mockSnapshotOptionsOne, times(1)).invokeCallbacks(eq(false)); verify(mockSnapshotOptionsOne, times(1)).setFilter(eq(mockSnapshotFilterOne)); verify(mockSnapshotOptionsOne, times(1)).setParallelMode(eq(true)); + verify(mockSnapshotOptionsTwo, times(1)).invokeCallbacks(eq(true)); verify(mockSnapshotOptionsTwo, times(1)).setFilter(eq(mockSnapshotFilterTwo)); verify(mockSnapshotOptionsTwo, times(1)).setParallelMode(eq(false)); } @@ -893,14 +911,17 @@ public class SnapshotServiceFactoryBeanTest { when(mockRegion.getSnapshotService()).thenReturn(mockRegionSnapshotService); when(mockRegionSnapshotService.createOptions()).thenReturn(mockSnapshotOptionsOne) .thenReturn(mockSnapshotOptionsTwo); + when(mockSnapshotOptionsOne.invokeCallbacks(anyBoolean())).thenReturn(mockSnapshotOptionsOne); when(mockSnapshotOptionsOne.setFilter(eq(mockSnapshotFilterOne))).thenReturn(mockSnapshotOptionsOne); when(mockSnapshotOptionsOne.setParallelMode(anyBoolean())).thenReturn(mockSnapshotOptionsOne); + when(mockSnapshotOptionsTwo.invokeCallbacks(anyBoolean())).thenReturn(mockSnapshotOptionsTwo); when(mockSnapshotOptionsTwo.setFilter(eq(mockSnapshotFilterTwo))).thenReturn(mockSnapshotOptionsTwo); when(mockSnapshotOptionsTwo.setParallelMode(anyBoolean())).thenReturn(mockSnapshotOptionsTwo); - SnapshotMetadata[] expectedExports = - toArray(newSnapshotMetadata(mockSnapshotFilterOne, true), - newSnapshotMetadata(mockSnapshotFilterTwo, false)); + SnapshotMetadata[] expectedExports = toArray( + newSnapshotMetadata(mockSnapshotFilterOne, false, true), + newSnapshotMetadata(mockSnapshotFilterTwo, true, false) + ); SnapshotServiceFactoryBean factoryBean = new SnapshotServiceFactoryBean(); @@ -920,19 +941,22 @@ public class SnapshotServiceFactoryBeanTest { eq(expectedExports[0].getFormat()), eq(mockSnapshotOptionsOne)); verify(mockRegionSnapshotService, times(1)).save(eq(expectedExports[1].getLocation()), eq(expectedExports[1].getFormat()), eq(mockSnapshotOptionsTwo)); + verify(mockSnapshotOptionsOne, times(1)).invokeCallbacks(eq(false)); verify(mockSnapshotOptionsOne, times(1)).setFilter(eq(mockSnapshotFilterOne)); verify(mockSnapshotOptionsOne, times(1)).setParallelMode(eq(true)); + verify(mockSnapshotOptionsTwo, times(1)).invokeCallbacks(eq(true)); verify(mockSnapshotOptionsTwo, times(1)).setFilter(eq(mockSnapshotFilterTwo)); verify(mockSnapshotOptionsTwo, times(1)).setParallelMode(eq(false)); } @Test - public void createOptionsWithParallelModeAndFilterOnSnapshotServiceAdapterSupport() { + public void createOptionsWithParallelModeInvokeCallbacksAndFilterOnSnapshotServiceAdapterSupport() { SnapshotFilter mockSnapshotFilter = mock(SnapshotFilter.class, "MockSnapshotFilter"); SnapshotOptions mockSnapshotOptions = mock(SnapshotOptions.class, "MockSnapshotOptions"); + when(mockSnapshotOptions.invokeCallbacks(anyBoolean())).thenReturn(mockSnapshotOptions); when(mockSnapshotOptions.setFilter(any(SnapshotFilter.class))).thenReturn(mockSnapshotOptions); when(mockSnapshotOptions.setParallelMode(anyBoolean())).thenReturn(mockSnapshotOptions); @@ -946,10 +970,12 @@ public class SnapshotServiceFactoryBeanTest { new SnapshotMetadata<>(mockFile("snapshot.gfd"), SnapshotMetadata.DEFAULT_SNAPSHOT_FORMAT, mockSnapshotFilter); + snapshotMetadata.setInvokeCallbacks(true); snapshotMetadata.setParallel(true); assertThat(snapshotService.createOptions(snapshotMetadata), is(equalTo(mockSnapshotOptions))); + verify(mockSnapshotOptions, times(1)).invokeCallbacks(eq(true)); verify(mockSnapshotOptions, times(1)).setFilter(eq(mockSnapshotFilter)); verify(mockSnapshotOptions, times(1)).setParallelMode(eq(true)); }