diff --git a/src/main/java/org/springframework/data/gemfire/DataPolicyConverter.java b/src/main/java/org/springframework/data/gemfire/DataPolicyConverter.java index 4b84645c..db587979 100644 --- a/src/main/java/org/springframework/data/gemfire/DataPolicyConverter.java +++ b/src/main/java/org/springframework/data/gemfire/DataPolicyConverter.java @@ -13,6 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + package org.springframework.data.gemfire; import org.springframework.core.convert.converter.Converter; @@ -24,54 +25,50 @@ import com.gemstone.gemfire.cache.DataPolicy; * */ public class DataPolicyConverter implements Converter { - private static enum Policy { - EMPTY, DEFAULT, NORMAL, PERSISTENT_PARTITION, PERSISTENT_REPLICATE, PRELOADED, REPLICATE; - public DataPolicy toDataPolicy() { - DataPolicy dataPolicy = null; - switch (this) { - case EMPTY: - dataPolicy = DataPolicy.EMPTY; - break; - case DEFAULT: - dataPolicy = DataPolicy.DEFAULT; - break; - case NORMAL: - dataPolicy = DataPolicy.NORMAL; - break; - case PERSISTENT_PARTITION: - dataPolicy = DataPolicy.PERSISTENT_PARTITION; - break; - case PERSISTENT_REPLICATE: - dataPolicy = DataPolicy.PERSISTENT_REPLICATE; - break; - case PRELOADED: - dataPolicy = DataPolicy.PRELOADED; - break; - case REPLICATE: - dataPolicy = DataPolicy.REPLICATE; - break; - } - return dataPolicy; + + static enum Policy { + DEFAULT, EMPTY, NORMAL, PRELOADED, PARTITION, PERSISTENT_PARTITION, REPLICATE, PERSISTENT_REPLICATE; + + private static String toUpperCase(String value) { + return (value == null ? null : value.toUpperCase()); } public static Policy getValue(String value) { - Policy policy = null; try { - policy = valueOf(value); + return valueOf(toUpperCase(value)); } catch (Exception e) { + return null; } - return policy; } - }; + + public DataPolicy toDataPolicy() { + switch (this) { + case EMPTY: + return DataPolicy.EMPTY; + case NORMAL: + return DataPolicy.NORMAL; + case PRELOADED: + return DataPolicy.PRELOADED; + case PARTITION : + return DataPolicy.PARTITION; + case PERSISTENT_PARTITION: + return DataPolicy.PERSISTENT_PARTITION; + case REPLICATE: + return DataPolicy.REPLICATE; + case PERSISTENT_REPLICATE: + return DataPolicy.PERSISTENT_REPLICATE; + case DEFAULT: + default: + return DataPolicy.DEFAULT; + } + } + } @Override - public DataPolicy convert(String source) { - if (source == null) { - return null; - } - source = source.toUpperCase(); - return Policy.getValue(source) == null ? null : Policy.getValue(source).toDataPolicy(); + public DataPolicy convert(String policyValue) { + Policy policy = Policy.getValue(policyValue); + return (policy == null ? null : policy.toDataPolicy()); } } diff --git a/src/main/java/org/springframework/data/gemfire/RegionFactoryBean.java b/src/main/java/org/springframework/data/gemfire/RegionFactoryBean.java index ceaea032..aa971267 100644 --- a/src/main/java/org/springframework/data/gemfire/RegionFactoryBean.java +++ b/src/main/java/org/springframework/data/gemfire/RegionFactoryBean.java @@ -195,21 +195,27 @@ public class RegionFactoryBean extends RegionLookupFactoryBean imple * @param dataPolicy requested data policy */ protected void resolveDataPolicy(RegionFactory regionFactory, Boolean persistent, String dataPolicy) { - if (dataPolicy == null) { - if (isPersistent()) { - regionFactory.setDataPolicy(DataPolicy.PERSISTENT_REPLICATE); - } else { - regionFactory.setDataPolicy(DataPolicy.DEFAULT); - } - return; + if (dataPolicy != null) { + regionFactory.setDataPolicy(convertAndValidate(dataPolicy)); + } + else { + regionFactory.setDataPolicy(isPersistent() ? DataPolicy.PERSISTENT_REPLICATE : DataPolicy.DEFAULT); + } + } + + private DataPolicy convertAndValidate(final String dataPolicy) { + final DataPolicy dataPolicyType = new DataPolicyConverter().convert(dataPolicy); + + Assert.notNull(dataPolicyType, String.format("Data policy %1$s is invalid", dataPolicy)); + + if (dataPolicyType.withPersistence()) { + // NOTE isNotPersistent means the user explicitly set the persistent attribute for the Region to false, + // and this conflicts with the Data Policy (via the that was set by the user, which indicates persistence. + Assert.isTrue(!isNotPersistent(), String.format("Data policy %1$s is invalid when persistent is false", + dataPolicy)); } - DataPolicy dp = new DataPolicyConverter().convert(dataPolicy); - Assert.notNull(dp, "Data policy " + dataPolicy + " is invalid"); - if (dp.withPersistence()) { - Assert.isTrue(!isNotPersistent(), "Data policy " + dataPolicy + " is invalid when persistent is false"); - } - regionFactory.setDataPolicy(dp); + return dataPolicyType; } @SuppressWarnings("unchecked") @@ -343,7 +349,7 @@ public class RegionFactoryBean extends RegionLookupFactoryBean imple /** * Sets the dataPolicy as a String. Required to support property * placeholders - * @param dataPolicy the dataPolicy name (NORMAL, PRELOADED, etc) + * @param dataPolicyName the dataPolicy name (NORMAL, PRELOADED, etc) */ public void setDataPolicy(String dataPolicyName) { this.dataPolicy = dataPolicyName; diff --git a/src/test/java/org/springframework/data/gemfire/DataPolicyConverterTest.java b/src/test/java/org/springframework/data/gemfire/DataPolicyConverterTest.java index c0a6b054..c9fe3d69 100644 --- a/src/test/java/org/springframework/data/gemfire/DataPolicyConverterTest.java +++ b/src/test/java/org/springframework/data/gemfire/DataPolicyConverterTest.java @@ -27,11 +27,39 @@ import com.gemstone.gemfire.cache.DataPolicy; * */ public class DataPolicyConverterTest { - DataPolicyConverter converter = new DataPolicyConverter(); + + private final DataPolicyConverter converter = new DataPolicyConverter(); + + protected int getDataPolicyEnumerationSize() { + for (byte ordinal = 0; true; ordinal++) { + try { + DataPolicy.fromOrdinal(ordinal); + } + catch (Exception e) { + return ordinal; + } + } + } @Test - public void test() { + public void testPolicyToDataPolicy() { + // exclude DEFAULT + assertEquals(getDataPolicyEnumerationSize(), DataPolicyConverter.Policy.values().length - 1); + assertEquals(DataPolicy.EMPTY, DataPolicyConverter.Policy.EMPTY.toDataPolicy()); + assertEquals(DataPolicy.NORMAL, DataPolicyConverter.Policy.NORMAL.toDataPolicy()); + assertEquals(DataPolicy.PRELOADED, DataPolicyConverter.Policy.PRELOADED.toDataPolicy()); + assertEquals(DataPolicy.PARTITION, DataPolicyConverter.Policy.PARTITION.toDataPolicy()); + assertEquals(DataPolicy.PERSISTENT_PARTITION, DataPolicyConverter.Policy.PERSISTENT_PARTITION.toDataPolicy()); + assertEquals(DataPolicy.REPLICATE, DataPolicyConverter.Policy.REPLICATE.toDataPolicy()); + assertEquals(DataPolicy.PERSISTENT_REPLICATE, DataPolicyConverter.Policy.PERSISTENT_REPLICATE.toDataPolicy()); + assertEquals(DataPolicy.DEFAULT, DataPolicyConverter.Policy.DEFAULT.toDataPolicy()); + } + + @Test + public void testConvert() { assertEquals(DataPolicy.EMPTY, converter.convert("empty")); + assertEquals(DataPolicy.PARTITION, converter.convert("Partition")); + assertEquals(DataPolicy.PERSISTENT_REPLICATE, converter.convert("PERSISTENT_REPLICATE")); assertNull(converter.convert("invalid")); assertNull(converter.convert(null)); }