You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@geode.apache.org by ji...@apache.org on 2018/03/16 23:00:45 UTC

[geode] branch develop updated: GEODE-4384/3875: refactor create/destroy jndi binding commands to use CacheConfig objects (#1627)

This is an automated email from the ASF dual-hosted git repository.

jinmeiliao pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/geode.git


The following commit(s) were added to refs/heads/develop by this push:
     new ad77bde  GEODE-4384/3875: refactor create/destroy jndi binding commands to use CacheConfig objects (#1627)
ad77bde is described below

commit ad77bde78300797b6dd26bfcae9e0ce8ad6f1ad5
Author: jinmeiliao <ji...@pivotal.io>
AuthorDate: Fri Mar 16 16:00:41 2018 -0700

    GEODE-4384/3875: refactor create/destroy jndi binding commands to use CacheConfig objects (#1627)
    
    * GEODE-3875:  refactor create jndi binding
    * GEODE-4384: refactor destroy jndi binding
    
    * refactored xml manipulation using jaxb
    * Eliminate the need for RegionElement
---
 .../internal/ClusterConfigurationService.java      |  12 +-
 .../internal/cache/configuration/CacheElement.java |   4 +-
 .../cache/configuration/JndiBindingsType.java      |  27 ++-
 .../internal/cache/configuration/RegionConfig.java |   6 +-
 .../cache/configuration/RegionElement.java         |  23 ---
 .../internal/cache/xmlcache/CacheXmlGenerator.java |   9 +-
 .../internal/datasource/DataSourceFactory.java     |  11 +-
 .../apache/geode/internal/jndi/JNDIInvoker.java    |  13 +-
 .../cli/commands/CreateJndiBindingCommand.java     | 112 ++++-------
 .../cli/commands/DestroyJndiBindingCommand.java    |  52 ++---
 .../cli/converters/ConfigPropertyConverter.java    |  12 +-
 .../cli/functions/CreateJndiBindingFunction.java   |  48 ++++-
 .../cli/functions/JndiBindingConfiguration.java    | 217 ---------------------
 .../sanctioned-geode-core-serializables.txt        |   4 +-
 .../InternalClusterConfigurationServiceTest.java   |  13 +-
 .../datasource/AbstractPoolCacheJUnitTest.java     |  10 +-
 .../cli/commands/CreateJndiBindingCommandTest.java | 159 ++++-----------
 .../commands/DestroyJndiBindingCommandTest.java    | 135 +++----------
 .../converters/ConfigPropertyConverterTest.java    |   6 +-
 .../functions/CreateJndiBindingFunctionTest.java   |  26 ++-
 .../functions/DestroyJndiBindingFunctionTest.java  |  11 +-
 .../cli/functions/ListJndiBindingFunctionTest.java |  13 +-
 22 files changed, 278 insertions(+), 645 deletions(-)

diff --git a/geode-core/src/main/java/org/apache/geode/distributed/internal/ClusterConfigurationService.java b/geode-core/src/main/java/org/apache/geode/distributed/internal/ClusterConfigurationService.java
index 13ba45c..fe65e54 100644
--- a/geode-core/src/main/java/org/apache/geode/distributed/internal/ClusterConfigurationService.java
+++ b/geode-core/src/main/java/org/apache/geode/distributed/internal/ClusterConfigurationService.java
@@ -86,6 +86,7 @@ import org.apache.geode.distributed.internal.locks.DLockService;
 import org.apache.geode.internal.cache.InternalCache;
 import org.apache.geode.internal.cache.InternalRegionArguments;
 import org.apache.geode.internal.cache.configuration.CacheConfig;
+import org.apache.geode.internal.cache.configuration.CacheElement;
 import org.apache.geode.internal.cache.persistence.PersistentMemberID;
 import org.apache.geode.internal.cache.persistence.PersistentMemberManager;
 import org.apache.geode.internal.cache.persistence.PersistentMemberPattern;
@@ -844,7 +845,7 @@ public class ClusterConfigurationService {
     }
   }
 
-  private Marshaller getMarshaller(Class... additionBindClass) {
+  private Marshaller getMarshaller(Class<? extends CacheElement>... additionBindClass) {
     if (bindClasses.containsAll(Arrays.asList(additionBindClass))) {
       return marshaller;
     }
@@ -854,7 +855,7 @@ public class ClusterConfigurationService {
     return marshaller;
   }
 
-  private Unmarshaller getUnmarshaller(Class... additionBindClass) {
+  private Unmarshaller getUnmarshaller(Class<? extends CacheElement>... additionBindClass) {
     if (bindClasses.containsAll(Arrays.asList(additionBindClass))) {
       return unmarshaller;
     }
@@ -864,7 +865,8 @@ public class ClusterConfigurationService {
     return unmarshaller;
   }
 
-  public CacheConfig getCacheConfig(String group, Class... additionalBindClass) {
+  public CacheConfig getCacheConfig(String group,
+      Class<? extends CacheElement>... additionalBindClass) {
     return unMarshall(getConfiguration(group).getCacheXmlContent(), additionalBindClass);
   }
 
@@ -890,7 +892,7 @@ public class ClusterConfigurationService {
     return list.stream().filter(o -> o.getId().equals(id)).findFirst().orElse(null);
   }
 
-  String marshall(CacheConfig config, Class... additionalClass) {
+  String marshall(CacheConfig config, Class<? extends CacheElement>... additionalClass) {
     StringWriter sw = new StringWriter();
     try {
       getMarshaller(additionalClass).marshal(config, sw);
@@ -900,7 +902,7 @@ public class ClusterConfigurationService {
     return sw.toString();
   }
 
-  CacheConfig unMarshall(String xml, Class... additionalClass) {
+  CacheConfig unMarshall(String xml, Class<? extends CacheElement>... additionalClass) {
     try {
       return (CacheConfig) getUnmarshaller(additionalClass).unmarshal(new StringReader(xml));
     } catch (Exception e) {
diff --git a/geode-core/src/main/java/org/apache/geode/internal/cache/configuration/CacheElement.java b/geode-core/src/main/java/org/apache/geode/internal/cache/configuration/CacheElement.java
index 3c293e8..1b26d23 100644
--- a/geode-core/src/main/java/org/apache/geode/internal/cache/configuration/CacheElement.java
+++ b/geode-core/src/main/java/org/apache/geode/internal/cache/configuration/CacheElement.java
@@ -17,7 +17,9 @@
 
 package org.apache.geode.internal.cache.configuration;
 
+import java.io.Serializable;
+
 import org.apache.geode.lang.Identifiable;
 
-public interface CacheElement extends Identifiable<String> {
+public interface CacheElement extends Identifiable<String>, Serializable {
 }
diff --git a/geode-core/src/main/java/org/apache/geode/internal/cache/configuration/JndiBindingsType.java b/geode-core/src/main/java/org/apache/geode/internal/cache/configuration/JndiBindingsType.java
index 696fe98..afa54ea 100644
--- a/geode-core/src/main/java/org/apache/geode/internal/cache/configuration/JndiBindingsType.java
+++ b/geode-core/src/main/java/org/apache/geode/internal/cache/configuration/JndiBindingsType.java
@@ -198,7 +198,7 @@ public class JndiBindingsType {
    */
   @XmlAccessorType(XmlAccessType.FIELD)
   @XmlType(name = "", propOrder = {"configProperty"})
-  public static class JndiBinding {
+  public static class JndiBinding implements CacheElement {
 
     @XmlElement(name = "config-property", namespace = "http://geode.apache.org/schema/cache")
     protected List<JndiBindingsType.JndiBinding.ConfigProperty> configProperty;
@@ -623,6 +623,11 @@ public class JndiBindingsType {
       this.xaDatasourceClass = value;
     }
 
+    @Override
+    public String getId() {
+      return getJndiName();
+    }
+
 
     /**
      * <p>
@@ -662,6 +667,14 @@ public class JndiBindingsType {
           namespace = "http://geode.apache.org/schema/cache", required = true)
       protected String configPropertyValue;
 
+      public ConfigProperty() {};
+
+      public ConfigProperty(String name, String type, String value) {
+        this.configPropertyName = name;
+        this.configPropertyType = type;
+        this.configPropertyValue = value;
+      }
+
       /**
        * Gets the value of the configPropertyName property.
        *
@@ -670,7 +683,7 @@ public class JndiBindingsType {
        *         {@link String }
        *
        */
-      public String getConfigPropertyName() {
+      public String getName() {
         return configPropertyName;
       }
 
@@ -682,7 +695,7 @@ public class JndiBindingsType {
        *        {@link String }
        *
        */
-      public void setConfigPropertyName(String value) {
+      public void setName(String value) {
         this.configPropertyName = value;
       }
 
@@ -694,7 +707,7 @@ public class JndiBindingsType {
        *         {@link String }
        *
        */
-      public String getConfigPropertyType() {
+      public String getType() {
         return configPropertyType;
       }
 
@@ -706,7 +719,7 @@ public class JndiBindingsType {
        *        {@link String }
        *
        */
-      public void setConfigPropertyType(String value) {
+      public void setType(String value) {
         this.configPropertyType = value;
       }
 
@@ -718,7 +731,7 @@ public class JndiBindingsType {
        *         {@link String }
        *
        */
-      public String getConfigPropertyValue() {
+      public String getValue() {
         return configPropertyValue;
       }
 
@@ -730,7 +743,7 @@ public class JndiBindingsType {
        *        {@link String }
        *
        */
-      public void setConfigPropertyValue(String value) {
+      public void setValue(String value) {
         this.configPropertyValue = value;
       }
 
diff --git a/geode-core/src/main/java/org/apache/geode/internal/cache/configuration/RegionConfig.java b/geode-core/src/main/java/org/apache/geode/internal/cache/configuration/RegionConfig.java
index 8279432..614c673 100644
--- a/geode-core/src/main/java/org/apache/geode/internal/cache/configuration/RegionConfig.java
+++ b/geode-core/src/main/java/org/apache/geode/internal/cache/configuration/RegionConfig.java
@@ -156,7 +156,7 @@ public class RegionConfig {
   @XmlElement(namespace = "http://geode.apache.org/schema/cache")
   protected List<RegionConfig.Entry> entry;
   @XmlAnyElement(lax = true)
-  protected List<RegionElement> regionElements;
+  protected List<CacheElement> regionElements;
   @XmlElement(namespace = "http://geode.apache.org/schema/cache")
   protected List<RegionConfig> region;
   @XmlAttribute(name = "name", required = true)
@@ -274,11 +274,11 @@ public class RegionConfig {
    * <p>
    * Objects of the following type(s) are allowed in the list
    * {@link Element }
-   * {@link RegionElement }
+   * {@link CacheElement }
    *
    *
    */
-  public List<RegionElement> getCustomRegionElements() {
+  public List<CacheElement> getCustomRegionElements() {
     if (regionElements == null) {
       regionElements = new ArrayList<>();
     }
diff --git a/geode-core/src/main/java/org/apache/geode/internal/cache/configuration/RegionElement.java b/geode-core/src/main/java/org/apache/geode/internal/cache/configuration/RegionElement.java
deleted file mode 100644
index 69dcf50..0000000
--- a/geode-core/src/main/java/org/apache/geode/internal/cache/configuration/RegionElement.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.geode.internal.cache.configuration;
-
-import org.apache.geode.lang.Identifiable;
-
-public interface RegionElement extends Identifiable<String> {
-}
diff --git a/geode-core/src/main/java/org/apache/geode/internal/cache/xmlcache/CacheXmlGenerator.java b/geode-core/src/main/java/org/apache/geode/internal/cache/xmlcache/CacheXmlGenerator.java
index 670f740..1bdb64c 100644
--- a/geode-core/src/main/java/org/apache/geode/internal/cache/xmlcache/CacheXmlGenerator.java
+++ b/geode-core/src/main/java/org/apache/geode/internal/cache/xmlcache/CacheXmlGenerator.java
@@ -14,9 +14,10 @@
  */
 package org.apache.geode.internal.cache.xmlcache;
 
-import static javax.xml.XMLConstants.*;
-import static org.apache.geode.internal.cache.xmlcache.XmlGeneratorUtils.*;
-import static org.apache.geode.management.internal.configuration.utils.XmlConstants.*;
+import static javax.xml.XMLConstants.W3C_XML_SCHEMA_INSTANCE_NS_URI;
+import static org.apache.geode.internal.cache.xmlcache.XmlGeneratorUtils.addAttribute;
+import static org.apache.geode.management.internal.configuration.utils.XmlConstants.W3C_XML_SCHEMA_INSTANCE_ATTRIBUTE_SCHEMA_LOCATION;
+import static org.apache.geode.management.internal.configuration.utils.XmlConstants.W3C_XML_SCHEMA_INSTANCE_PREFIX;
 
 import java.io.File;
 import java.io.FileWriter;
@@ -53,7 +54,6 @@ import org.xml.sax.SAXException;
 import org.xml.sax.SAXNotRecognizedException;
 import org.xml.sax.SAXNotSupportedException;
 import org.xml.sax.XMLReader;
-import org.xml.sax.ext.LexicalHandler;
 import org.xml.sax.helpers.AttributesImpl;
 
 import org.apache.geode.InternalGemFireException;
@@ -93,7 +93,6 @@ import org.apache.geode.cache.client.ClientRegionShortcut;
 import org.apache.geode.cache.client.Pool;
 import org.apache.geode.cache.client.PoolFactory;
 import org.apache.geode.cache.client.PoolManager;
-import org.apache.geode.cache.client.internal.InternalClientCache;
 import org.apache.geode.cache.client.internal.PoolImpl;
 import org.apache.geode.cache.execute.Function;
 import org.apache.geode.cache.execute.FunctionService;
diff --git a/geode-core/src/main/java/org/apache/geode/internal/datasource/DataSourceFactory.java b/geode-core/src/main/java/org/apache/geode/internal/datasource/DataSourceFactory.java
index 4bec4d6..a634af9 100644
--- a/geode-core/src/main/java/org/apache/geode/internal/datasource/DataSourceFactory.java
+++ b/geode-core/src/main/java/org/apache/geode/internal/datasource/DataSourceFactory.java
@@ -62,8 +62,7 @@ public class DataSourceFactory {
    * @throws DataSourceCreateException
    * @return ??
    */
-  public static DataSource getSimpleDataSource(Map configMap, List props)
-      throws DataSourceCreateException {
+  public static DataSource getSimpleDataSource(Map configMap) throws DataSourceCreateException {
     ConfiguredDataSourceProperties configs = createDataSourceProperties(configMap);
     if (configs.getJDBCDriver() == null) {
       logger.error(LocalizedMessage.create(
@@ -101,8 +100,8 @@ public class DataSourceFactory {
    * @return javax.sql.DataSource
    * @throws DataSourceCreateException
    */
-  public static ClientConnectionFactoryWrapper getManagedDataSource(Map configMap, List props)
-      throws DataSourceCreateException {
+  public static ClientConnectionFactoryWrapper getManagedDataSource(Map configMap,
+      List<ConfigProperty> props) throws DataSourceCreateException {
     Object cf = null;
     ManagedConnectionFactory mcf = null;
     ConfiguredDataSourceProperties configs = createDataSourceProperties(configMap);
@@ -155,7 +154,7 @@ public class DataSourceFactory {
    * @throws DataSourceCreateException
    * @return ???
    */
-  public static DataSource getPooledDataSource(Map configMap, List props)
+  public static DataSource getPooledDataSource(Map configMap, List<ConfigProperty> props)
       throws DataSourceCreateException {
     ConfiguredDataSourceProperties configs = createDataSourceProperties(configMap);
     String connpoolClassName = configs.getConnectionPoolDSClass();
@@ -190,7 +189,7 @@ public class DataSourceFactory {
    * @throws DataSourceCreateException
    * @return ???
    */
-  public static DataSource getTranxDataSource(Map configMap, List props)
+  public static DataSource getTranxDataSource(Map configMap, List<ConfigProperty> props)
       throws DataSourceCreateException {
     ConfiguredDataSourceProperties configs = createDataSourceProperties(configMap);
     String xaClassName = configs.getXADSClass();
diff --git a/geode-core/src/main/java/org/apache/geode/internal/jndi/JNDIInvoker.java b/geode-core/src/main/java/org/apache/geode/internal/jndi/JNDIInvoker.java
index 6efb2a8..c51558f 100644
--- a/geode-core/src/main/java/org/apache/geode/internal/jndi/JNDIInvoker.java
+++ b/geode-core/src/main/java/org/apache/geode/internal/jndi/JNDIInvoker.java
@@ -22,7 +22,13 @@ import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 
-import javax.naming.*;
+import javax.naming.Binding;
+import javax.naming.Context;
+import javax.naming.InitialContext;
+import javax.naming.NameNotFoundException;
+import javax.naming.NamingEnumeration;
+import javax.naming.NamingException;
+import javax.naming.NoInitialContextException;
 import javax.transaction.SystemException;
 import javax.transaction.TransactionManager;
 
@@ -32,6 +38,7 @@ import org.apache.geode.i18n.LogWriterI18n;
 import org.apache.geode.internal.ClassPathLoader;
 import org.apache.geode.internal.datasource.AbstractDataSource;
 import org.apache.geode.internal.datasource.ClientConnectionFactoryWrapper;
+import org.apache.geode.internal.datasource.ConfigProperty;
 import org.apache.geode.internal.datasource.DataSourceCreateException;
 import org.apache.geode.internal.datasource.DataSourceFactory;
 import org.apache.geode.internal.i18n.LocalizedStrings;
@@ -310,7 +317,7 @@ public class JNDIInvoker {
    *
    * @param map contains Datasource configuration properties.
    */
-  public static void mapDatasource(Map map, List props) {
+  public static void mapDatasource(Map map, List<ConfigProperty> props) {
     String value = (String) map.get("type");
     String jndiName = "";
     LogWriterI18n writer = TransactionUtils.getLogWriterI18n();
@@ -330,7 +337,7 @@ public class JNDIInvoker {
         if (writer.fineEnabled())
           writer.fine("Bound java:/" + jndiName + " to Context");
       } else if (value.equals("SimpleDataSource")) {
-        ds = DataSourceFactory.getSimpleDataSource(map, props);
+        ds = DataSourceFactory.getSimpleDataSource(map);
         ctx.rebind("java:/" + jndiName, ds);
         dataSourceList.add(ds);
         if (writer.fineEnabled())
diff --git a/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/CreateJndiBindingCommand.java b/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/CreateJndiBindingCommand.java
index bccff97..9d6d7da 100644
--- a/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/CreateJndiBindingCommand.java
+++ b/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/CreateJndiBindingCommand.java
@@ -16,37 +16,27 @@ package org.apache.geode.management.internal.cli.commands;
 
 import static org.apache.geode.management.internal.cli.result.ResultBuilder.buildResult;
 
-import java.io.IOException;
 import java.util.Arrays;
 import java.util.List;
+import java.util.Objects;
 import java.util.Set;
 
-import javax.xml.parsers.ParserConfigurationException;
-import javax.xml.transform.TransformerException;
-
 import org.apache.logging.log4j.Logger;
 import org.springframework.shell.core.annotation.CliCommand;
 import org.springframework.shell.core.annotation.CliOption;
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-import org.xml.sax.SAXException;
 
 import org.apache.geode.distributed.DistributedMember;
 import org.apache.geode.distributed.internal.ClusterConfigurationService;
-import org.apache.geode.internal.datasource.ConfigProperty;
+import org.apache.geode.internal.cache.configuration.CacheConfig;
+import org.apache.geode.internal.cache.configuration.JndiBindingsType;
 import org.apache.geode.internal.logging.LogService;
 import org.apache.geode.management.cli.CliMetaData;
 import org.apache.geode.management.cli.Result;
 import org.apache.geode.management.internal.cli.exceptions.EntityExistsException;
 import org.apache.geode.management.internal.cli.functions.CliFunctionResult;
 import org.apache.geode.management.internal.cli.functions.CreateJndiBindingFunction;
-import org.apache.geode.management.internal.cli.functions.JndiBindingConfiguration;
 import org.apache.geode.management.internal.cli.i18n.CliStrings;
 import org.apache.geode.management.internal.cli.result.ResultBuilder;
-import org.apache.geode.management.internal.configuration.domain.Configuration;
-import org.apache.geode.management.internal.configuration.utils.XmlUtils;
 import org.apache.geode.management.internal.security.ResourceOperation;
 import org.apache.geode.security.ResourcePermission;
 
@@ -128,48 +118,51 @@ public class CreateJndiBindingCommand extends GfshCommand {
       @CliOption(key = MAX_POOL_SIZE, help = MAX_POOL_SIZE__HELP) Integer maxPoolSize,
       @CliOption(key = PASSWORD, help = PASSWORD__HELP) String password,
       @CliOption(key = TRANSACTION_TYPE, help = TRANSACTION_TYPE__HELP) String transactionType,
-      @CliOption(key = TYPE, mandatory = true,
-          help = TYPE__HELP) JndiBindingConfiguration.DATASOURCE_TYPE type,
+      @CliOption(key = TYPE, mandatory = true, help = TYPE__HELP) DATASOURCE_TYPE type,
       @CliOption(key = USERNAME, help = USERNAME__HELP) String username,
       @CliOption(key = XA_DATASOURCE_CLASS, help = XA_DATASOURCE_CLASS__HELP) String xaDataSource,
       @CliOption(key = CliStrings.IFNOTEXISTS, help = IFNOTEXISTS__HELP,
           specifiedDefaultValue = "true", unspecifiedDefaultValue = "false") boolean ifNotExists,
       @CliOption(key = DATASOURCE_CONFIG_PROPERTIES, optionContext = "splittingRegex=,(?![^{]*\\})",
-          help = DATASOURCE_CONFIG_PROPERTIES_HELP) ConfigProperty[] dsConfigProperties)
-      throws IOException, SAXException, ParserConfigurationException, TransformerException {
+          help = DATASOURCE_CONFIG_PROPERTIES_HELP) JndiBindingsType.JndiBinding.ConfigProperty[] dsConfigProperties) {
 
-    JndiBindingConfiguration configuration = new JndiBindingConfiguration();
-    configuration.setBlockingTimeout(blockingTimeout);
-    configuration.setConnectionPoolDatasource(connectionPooledDatasource);
+    JndiBindingsType.JndiBinding configuration = new JndiBindingsType.JndiBinding();
+    configuration.setBlockingTimeoutSeconds(Objects.toString(blockingTimeout, null));
+    configuration.setConnPooledDatasourceClass(connectionPooledDatasource);
     configuration.setConnectionUrl(connectionUrl);
-    configuration.setIdleTimeout(idleTimeout);
-    configuration.setInitPoolSize(initPoolSize);
-    configuration.setJdbcDriver(jdbcDriver);
+    configuration.setIdleTimeoutSeconds(Objects.toString(idleTimeout, null));
+    configuration.setInitPoolSize(Objects.toString(initPoolSize, null));
+    configuration.setJdbcDriverClass(jdbcDriver);
     configuration.setJndiName(jndiName);
-    configuration.setLoginTimeout(loginTimeout);
-    configuration.setManagedConnFactory(managedConnFactory);
-    configuration.setMaxPoolSize(maxPoolSize);
+    configuration.setLoginTimeoutSeconds(Objects.toString(loginTimeout, null));
+    configuration.setManagedConnFactoryClass(managedConnFactory);
+    configuration.setMaxPoolSize(Objects.toString(maxPoolSize, null));
     configuration.setPassword(password);
     configuration.setTransactionType(transactionType);
-    configuration.setType(type);
-    configuration.setUsername(username);
-    configuration.setXaDatasource(xaDataSource);
+    configuration.setType(type.getType());
+    configuration.setUserName(username);
+    configuration.setXaDatasourceClass(xaDataSource);
     if (dsConfigProperties != null && dsConfigProperties.length > 0)
-      configuration.setDatasourceConfigurations(Arrays.asList(dsConfigProperties));
+      configuration.getConfigProperty().addAll(Arrays.asList(dsConfigProperties));
 
     Result result;
     boolean persisted = false;
     ClusterConfigurationService service = getSharedConfiguration();
 
     if (service != null) {
-      Element existingBinding =
-          service.getXmlElement("cluster", "jndi-binding", "jndi-name", jndiName);
-      if (existingBinding != null) {
+      CacheConfig cacheConfig = service.getCacheConfig("cluster");
+      JndiBindingsType.JndiBinding existing =
+          service.findElement(cacheConfig.getJndiBindings(), jndiName);
+      if (existing != null) {
         throw new EntityExistsException(
             CliStrings.format("Jndi binding with jndi-name \"{0}\" already exists.", jndiName),
             ifNotExists);
       }
-      updateXml(configuration);
+
+      service.updateCacheConfig("cluster", config -> {
+        config.getJndiBindings().add(configuration);
+        return config;
+      });
       persisted = true;
     }
 
@@ -193,51 +186,24 @@ public class CreateJndiBindingCommand extends GfshCommand {
     return result;
   }
 
-  void updateXml(JndiBindingConfiguration configuration)
-      throws TransformerException, IOException, SAXException, ParserConfigurationException {
-    // cluster group config should always be present
-    Configuration config = getSharedConfiguration().getConfiguration("cluster");
-
-    Document document = XmlUtils.createDocumentFromXml(config.getCacheXmlContent());
-    Node cacheNode = document.getElementsByTagName("cache").item(0);
+  public enum DATASOURCE_TYPE {
+    MANAGED("ManagedDataSource"),
+    SIMPLE("SimpleDataSource"),
+    POOLED("PooledDataSource"),
+    XAPOOLED("XAPooledDataSource");
 
-    NodeList jndiBindingsNode = document.getElementsByTagName("jndi-bindings");
+    private final String type;
 
-    if (jndiBindingsNode == null || jndiBindingsNode.getLength() == 0) {
-      Element jndiBindings = document.createElement("jndi-bindings");
-      cacheNode.appendChild(jndiBindings);
+    DATASOURCE_TYPE(String type) {
+      this.type = type;
     }
 
-    Element jndiBinding = document.createElement("jndi-binding");
-    jndiBindingsNode.item(0).appendChild(jndiBinding);
-
-    for (Object key : configuration.getParamsAsMap().keySet()) {
-      if (configuration.getParamsAsMap().get(key) != null)
-        jndiBinding.setAttribute(key.toString(),
-            configuration.getParamsAsMap().get(key).toString());
+    public String getType() {
+      return this.type;
     }
 
-    for (ConfigProperty configProperty : configuration.getDatasourceConfigurations()) {
-      Element configPropertyElement = document.createElement("config-property");
-      jndiBinding.appendChild(configPropertyElement);
-
-      Node configPropertyName = document.createElement("config-property-name");
-      configPropertyName.setTextContent(configProperty.getName());
-
-      Node configPropertyType = document.createElement("config-property-type");
-      configPropertyType.setTextContent(configProperty.getType());
-
-      Node configPropertyValue = document.createElement("config-property-value");
-      configPropertyValue.setTextContent(configProperty.getValue());
-
-      configPropertyElement.appendChild(configPropertyName);
-      configPropertyElement.appendChild(configPropertyType);
-      configPropertyElement.appendChild(configPropertyValue);
+    public String getName() {
+      return name();
     }
-
-    String newXml = XmlUtils.prettyXml(document.getFirstChild());
-    config.setCacheXmlContent(newXml);
-
-    getSharedConfiguration().getConfigurationRegion().put("cluster", config);
   }
 }
diff --git a/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/DestroyJndiBindingCommand.java b/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/DestroyJndiBindingCommand.java
index ab9b8b7..dd62e58 100644
--- a/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/DestroyJndiBindingCommand.java
+++ b/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/DestroyJndiBindingCommand.java
@@ -25,13 +25,11 @@ import javax.xml.transform.TransformerException;
 
 import org.springframework.shell.core.annotation.CliCommand;
 import org.springframework.shell.core.annotation.CliOption;
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-import org.w3c.dom.NodeList;
 import org.xml.sax.SAXException;
 
 import org.apache.geode.distributed.DistributedMember;
 import org.apache.geode.distributed.internal.ClusterConfigurationService;
+import org.apache.geode.internal.cache.configuration.JndiBindingsType;
 import org.apache.geode.management.cli.CliMetaData;
 import org.apache.geode.management.cli.Result;
 import org.apache.geode.management.internal.cli.exceptions.EntityNotFoundException;
@@ -39,8 +37,6 @@ import org.apache.geode.management.internal.cli.functions.CliFunctionResult;
 import org.apache.geode.management.internal.cli.functions.DestroyJndiBindingFunction;
 import org.apache.geode.management.internal.cli.i18n.CliStrings;
 import org.apache.geode.management.internal.cli.result.ResultBuilder;
-import org.apache.geode.management.internal.configuration.domain.Configuration;
-import org.apache.geode.management.internal.configuration.utils.XmlUtils;
 import org.apache.geode.management.internal.security.ResourceOperation;
 import org.apache.geode.security.ResourcePermission;
 
@@ -67,14 +63,17 @@ public class DestroyJndiBindingCommand extends GfshCommand {
     boolean persisted = false;
     ClusterConfigurationService service = getSharedConfiguration();
     if (service != null) {
-      Element existingBinding =
-          service.getXmlElement("cluster", "jndi-binding", "jndi-name", jndiName);
-      if (existingBinding == null) {
-        throw new EntityNotFoundException(
-            CliStrings.format("Jndi binding with jndi-name \"{0}\" does not exist.", jndiName),
-            ifExists);
-      }
-      removeJndiBindingFromXml(jndiName);
+      service.updateCacheConfig("cluster", cc -> {
+        List<JndiBindingsType.JndiBinding> bindings = cc.getJndiBindings();
+        JndiBindingsType.JndiBinding binding = service.findElement(bindings, jndiName);
+        if (binding == null) {
+          throw new EntityNotFoundException(
+              CliStrings.format("Jndi binding with jndi-name \"{0}\" does not exist.", jndiName),
+              ifExists);
+        }
+        bindings.remove(binding);
+        return cc;
+      });
       persisted = true;
     }
 
@@ -95,31 +94,4 @@ public class DestroyJndiBindingCommand extends GfshCommand {
     result.setCommandPersisted(persisted);
     return result;
   }
-
-  void removeJndiBindingFromXml(String jndiName)
-      throws TransformerException, IOException, SAXException, ParserConfigurationException {
-    // cluster group config should always be present
-    Configuration config = getSharedConfiguration().getConfiguration("cluster");
-
-    Document document = XmlUtils.createDocumentFromXml(config.getCacheXmlContent());
-    NodeList jndiBindings = document.getElementsByTagName("jndi-binding");
-
-    boolean updatedXml = false;
-    if (jndiBindings != null && jndiBindings.getLength() > 0) {
-      for (int i = 0; i < jndiBindings.getLength(); i++) {
-        Element eachBinding = (Element) jndiBindings.item(i);
-        if (eachBinding.getAttribute("jndi-name").equals(jndiName)) {
-          eachBinding.getParentNode().removeChild(eachBinding);
-          updatedXml = true;
-        }
-      }
-    }
-
-    if (updatedXml) {
-      String newXml = XmlUtils.prettyXml(document.getFirstChild());
-      config.setCacheXmlContent(newXml);
-
-      getSharedConfiguration().getConfigurationRegion().put("cluster", config);
-    }
-  }
 }
diff --git a/geode-core/src/main/java/org/apache/geode/management/internal/cli/converters/ConfigPropertyConverter.java b/geode-core/src/main/java/org/apache/geode/management/internal/cli/converters/ConfigPropertyConverter.java
index 1f8219c..3a86580 100644
--- a/geode-core/src/main/java/org/apache/geode/management/internal/cli/converters/ConfigPropertyConverter.java
+++ b/geode-core/src/main/java/org/apache/geode/management/internal/cli/converters/ConfigPropertyConverter.java
@@ -23,13 +23,14 @@ import org.springframework.shell.core.Completion;
 import org.springframework.shell.core.Converter;
 import org.springframework.shell.core.MethodTarget;
 
-import org.apache.geode.internal.datasource.ConfigProperty;
+import org.apache.geode.internal.cache.configuration.JndiBindingsType;
 
 /***
  * Added converter to enable auto-completion for index-type
  *
  */
-public class ConfigPropertyConverter implements Converter<ConfigProperty> {
+public class ConfigPropertyConverter
+    implements Converter<JndiBindingsType.JndiBinding.ConfigProperty> {
 
   private static ObjectMapper mapper = new ObjectMapper();
   static {
@@ -38,13 +39,14 @@ public class ConfigPropertyConverter implements Converter<ConfigProperty> {
 
   @Override
   public boolean supports(Class<?> type, String optionContext) {
-    return ConfigProperty.class.isAssignableFrom(type);
+    return JndiBindingsType.JndiBinding.ConfigProperty.class.isAssignableFrom(type);
   }
 
   @Override
-  public ConfigProperty convertFromText(String value, Class<?> targetType, String optionContext) {
+  public JndiBindingsType.JndiBinding.ConfigProperty convertFromText(String value,
+      Class<?> targetType, String optionContext) {
     try {
-      return mapper.readValue(value, ConfigProperty.class);
+      return mapper.readValue(value, JndiBindingsType.JndiBinding.ConfigProperty.class);
     } catch (IOException e) {
       throw new IllegalArgumentException("invalid json: " + value);
     }
diff --git a/geode-core/src/main/java/org/apache/geode/management/internal/cli/functions/CreateJndiBindingFunction.java b/geode-core/src/main/java/org/apache/geode/management/internal/cli/functions/CreateJndiBindingFunction.java
index 133acf7..1e7302e 100644
--- a/geode-core/src/main/java/org/apache/geode/management/internal/cli/functions/CreateJndiBindingFunction.java
+++ b/geode-core/src/main/java/org/apache/geode/management/internal/cli/functions/CreateJndiBindingFunction.java
@@ -14,25 +14,63 @@
  */
 package org.apache.geode.management.internal.cli.functions;
 
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
 import org.apache.geode.cache.execute.FunctionContext;
 import org.apache.geode.cache.execute.ResultSender;
+import org.apache.geode.internal.cache.configuration.JndiBindingsType;
 import org.apache.geode.internal.cache.execute.InternalFunction;
+import org.apache.geode.internal.datasource.ConfigProperty;
 import org.apache.geode.internal.jndi.JNDIInvoker;
 import org.apache.geode.management.internal.cli.i18n.CliStrings;
 
-public class CreateJndiBindingFunction implements InternalFunction<JndiBindingConfiguration> {
+public class CreateJndiBindingFunction implements InternalFunction<JndiBindingsType.JndiBinding> {
 
   static final String RESULT_MESSAGE =
       "Initiated jndi binding \"{0}\" on \"{1}\". See server logs to verify.";
 
   @Override
-  public void execute(FunctionContext<JndiBindingConfiguration> context) {
+  public void execute(FunctionContext<JndiBindingsType.JndiBinding> context) {
     ResultSender<Object> resultSender = context.getResultSender();
-    JndiBindingConfiguration configuration = context.getArguments();
-    JNDIInvoker.mapDatasource(configuration.getParamsAsMap(),
-        configuration.getDatasourceConfigurations());
+    JndiBindingsType.JndiBinding configuration = context.getArguments();
+    JNDIInvoker.mapDatasource(getParamsAsMap(configuration),
+        convert(configuration.getConfigProperty()));
 
     resultSender.lastResult(new CliFunctionResult(context.getMemberName(), true,
         CliStrings.format(RESULT_MESSAGE, configuration.getJndiName(), context.getMemberName())));
   }
+
+  static Map getParamsAsMap(JndiBindingsType.JndiBinding binding) {
+    Map params = new HashMap();
+    params.put("blocking-timeout-seconds", binding.getBlockingTimeoutSeconds());
+    params.put("conn-pooled-datasource-class", binding.getConnPooledDatasourceClass());
+    params.put("connection-url", binding.getConnectionUrl());
+    params.put("idle-timeout-seconds", binding.getIdleTimeoutSeconds());
+    params.put("init-pool-size", binding.getInitPoolSize());
+    params.put("jdbc-driver-class", binding.getJdbcDriverClass());
+    params.put("jndi-name", binding.getJndiName());
+    params.put("login-timeout-seconds", binding.getLoginTimeoutSeconds());
+    params.put("managed-conn-factory-class", binding.getManagedConnFactoryClass());
+    params.put("max-pool-size", binding.getMaxPoolSize());
+    params.put("password", binding.getPassword());
+    params.put("transaction-type", binding.getTransactionType());
+    params.put("type", binding.getType());
+    params.put("user-name", binding.getUserName());
+    params.put("xa-datasource-class", binding.getXaDatasourceClass());
+    return params;
+  }
+
+  static List<ConfigProperty> convert(
+      List<JndiBindingsType.JndiBinding.ConfigProperty> properties) {
+    return properties.stream().map(p -> {
+      ConfigProperty prop = new ConfigProperty();
+      prop.setName(p.getName());
+      prop.setType(p.getType());
+      prop.setValue(p.getValue());
+      return prop;
+    }).collect(Collectors.toList());
+  }
 }
diff --git a/geode-core/src/main/java/org/apache/geode/management/internal/cli/functions/JndiBindingConfiguration.java b/geode-core/src/main/java/org/apache/geode/management/internal/cli/functions/JndiBindingConfiguration.java
deleted file mode 100644
index 316ca74..0000000
--- a/geode-core/src/main/java/org/apache/geode/management/internal/cli/functions/JndiBindingConfiguration.java
+++ /dev/null
@@ -1,217 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more contributor license
- * agreements. See the NOTICE file distributed with this work for additional information regarding
- * copyright ownership. The ASF licenses this file to You 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
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software distributed under the License
- * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
- * or implied. See the License for the specific language governing permissions and limitations under
- * the License.
- */
-package org.apache.geode.management.internal.cli.functions;
-
-import java.io.Serializable;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import org.apache.geode.internal.datasource.ConfigProperty;
-
-public class JndiBindingConfiguration implements Serializable {
-
-  public enum DATASOURCE_TYPE {
-    MANAGED("ManagedDataSource"),
-    SIMPLE("SimpleDataSource"),
-    POOLED("PooledDataSource"),
-    XAPOOLED("XAPooledDataSource");
-
-    private final String type;
-
-    DATASOURCE_TYPE(String type) {
-      this.type = type;
-    }
-
-    public String getType() {
-      return this.type;
-    }
-
-    public String getName() {
-      return name();
-    }
-  }
-
-  private Integer blockingTimeout;
-  private String connectionPoolDatasource;
-  private String connectionUrl;
-  private Integer idleTimeout;
-  private Integer initPoolSize;
-  private String jdbcDriver;
-  private String jndiName;
-  private Integer loginTimeout;
-  private String managedConnFactory;
-  private Integer maxPoolSize;
-  private String password;
-  private String transactionType;
-  private DATASOURCE_TYPE type;
-  private String username;
-  private String xaDatasource;
-
-  private List<ConfigProperty> datasourceConfigurations;
-
-  public JndiBindingConfiguration() {
-    datasourceConfigurations = new ArrayList<>();
-  }
-
-  public Integer getBlockingTimeout() {
-    return blockingTimeout;
-  }
-
-  public void setBlockingTimeout(Integer blockingTimeout) {
-    this.blockingTimeout = blockingTimeout;
-  }
-
-  public String getConnectionPoolDatasource() {
-    return connectionPoolDatasource;
-  }
-
-  public void setConnectionPoolDatasource(String connectionPoolDatasource) {
-    this.connectionPoolDatasource = connectionPoolDatasource;
-  }
-
-  public String getConnectionUrl() {
-    return connectionUrl;
-  }
-
-  public void setConnectionUrl(String connectionUrl) {
-    this.connectionUrl = connectionUrl;
-  }
-
-  public Integer getIdleTimeout() {
-    return idleTimeout;
-  }
-
-  public void setIdleTimeout(Integer idleTimeout) {
-    this.idleTimeout = idleTimeout;
-  }
-
-  public Integer getInitPoolSize() {
-    return initPoolSize;
-  }
-
-  public void setInitPoolSize(Integer initPoolSize) {
-    this.initPoolSize = initPoolSize;
-  }
-
-  public String getJdbcDriver() {
-    return jdbcDriver;
-  }
-
-  public void setJdbcDriver(String jdbcDriver) {
-    this.jdbcDriver = jdbcDriver;
-  }
-
-  public String getJndiName() {
-    return jndiName;
-  }
-
-  public void setJndiName(String jndiName) {
-    this.jndiName = jndiName;
-  }
-
-  public Integer getLoginTimeout() {
-    return loginTimeout;
-  }
-
-  public void setLoginTimeout(Integer loginTimeout) {
-    this.loginTimeout = loginTimeout;
-  }
-
-  public String getManagedConnFactory() {
-    return managedConnFactory;
-  }
-
-  public void setManagedConnFactory(String managedConnFactory) {
-    this.managedConnFactory = managedConnFactory;
-  }
-
-  public Integer getMaxPoolSize() {
-    return maxPoolSize;
-  }
-
-  public void setMaxPoolSize(Integer maxPoolSize) {
-    this.maxPoolSize = maxPoolSize;
-  }
-
-  public String getPassword() {
-    return password;
-  }
-
-  public void setPassword(String password) {
-    this.password = password;
-  }
-
-  public String getTransactionType() {
-    return transactionType;
-  }
-
-  public void setTransactionType(String transactionType) {
-    this.transactionType = transactionType;
-  }
-
-  public DATASOURCE_TYPE getType() {
-    return type;
-  }
-
-  public void setType(DATASOURCE_TYPE type) {
-    this.type = type;
-  }
-
-  public String getUsername() {
-    return username;
-  }
-
-  public void setUsername(String username) {
-    this.username = username;
-  }
-
-  public String getXaDatasource() {
-    return xaDatasource;
-  }
-
-  public void setXaDatasource(String xaDatasource) {
-    this.xaDatasource = xaDatasource;
-  }
-
-  public List<ConfigProperty> getDatasourceConfigurations() {
-    return datasourceConfigurations;
-  }
-
-  public void setDatasourceConfigurations(List<ConfigProperty> dsConfigurations) {
-    this.datasourceConfigurations = dsConfigurations;
-  }
-
-  public Map getParamsAsMap() {
-    Map params = new HashMap();
-    params.put("blocking-timeout-seconds", getBlockingTimeout());
-    params.put("conn-pooled-datasource-class", getConnectionPoolDatasource());
-    params.put("connection-url", getConnectionUrl());
-    params.put("idle-timeout-seconds", getIdleTimeout());
-    params.put("init-pool-size", getInitPoolSize());
-    params.put("jdbc-driver-class", getJdbcDriver());
-    params.put("jndi-name", getJndiName());
-    params.put("login-timeout-seconds", getLoginTimeout());
-    params.put("managed-conn-factory-class", getManagedConnFactory());
-    params.put("max-pool-size", getMaxPoolSize());
-    params.put("password", getPassword());
-    params.put("transaction-type", getTransactionType());
-    params.put("type", getType().getType());
-    params.put("user-name", getUsername());
-    params.put("xa-datasource-class", getXaDatasource());
-    return params;
-  }
-}
diff --git a/geode-core/src/main/resources/org/apache/geode/internal/sanctioned-geode-core-serializables.txt b/geode-core/src/main/resources/org/apache/geode/internal/sanctioned-geode-core-serializables.txt
index 8a6410e..ea35091 100644
--- a/geode-core/src/main/resources/org/apache/geode/internal/sanctioned-geode-core-serializables.txt
+++ b/geode-core/src/main/resources/org/apache/geode/internal/sanctioned-geode-core-serializables.txt
@@ -293,6 +293,7 @@ org/apache/geode/internal/cache/TXCommitMessage$CommitExceptionCollectingExcepti
 org/apache/geode/internal/cache/TXCommitMessage$RegionCommitList,true,-8910813949027683641
 org/apache/geode/internal/cache/configuration/EnumActionDestroyOverflow,false,value:java/lang/String
 org/apache/geode/internal/cache/configuration/EnumReadableWritable,false,value:java/lang/String
+org/apache/geode/internal/cache/configuration/JndiBindingsType$JndiBinding,false,blockingTimeoutSeconds:java/lang/String,configProperty:java/util/List,connPooledDatasourceClass:java/lang/String,connectionUrl:java/lang/String,idleTimeoutSeconds:java/lang/String,initPoolSize:java/lang/String,jdbcDriverClass:java/lang/String,jndiName:java/lang/String,loginTimeoutSeconds:java/lang/String,managedConnFactoryClass:java/lang/String,maxPoolSize:java/lang/String,password:java/lang/String,transacti [...]
 org/apache/geode/internal/cache/configuration/RegionAttributesDataPolicy,false,value:java/lang/String
 org/apache/geode/internal/cache/configuration/RegionAttributesIndexUpdateType,false,value:java/lang/String
 org/apache/geode/internal/cache/configuration/RegionAttributesMirrorType,false,value:java/lang/String
@@ -479,6 +480,7 @@ org/apache/geode/management/internal/beans/QueryDataFunction$QueryDataFunctionRe
 org/apache/geode/management/internal/beans/stats/StatType,false
 org/apache/geode/management/internal/cli/AbstractCliAroundInterceptor$Response,false,text:java/lang/String
 org/apache/geode/management/internal/cli/CliUtil$DeflaterInflaterData,true,1104813333595216795,data:byte[],dataLength:int
+org/apache/geode/management/internal/cli/commands/CreateJndiBindingCommand$DATASOURCE_TYPE,false,type:java/lang/String
 org/apache/geode/management/internal/cli/domain/AsyncEventQueueDetails,true,1,batchSize:int,diskStoreName:java/lang/String,id:java/lang/String,listener:java/lang/String,listenerProperties:java/util/Properties,maxQueueMemory:int,persistent:boolean
 org/apache/geode/management/internal/cli/domain/CacheServerInfo,true,1,bindAddress:java/lang/String,isRunning:boolean,port:int
 org/apache/geode/management/internal/cli/domain/ClassName,true,1,className:java/lang/String,initProperties:java/util/Properties
@@ -551,8 +553,6 @@ org/apache/geode/management/internal/cli/functions/GetRegionsFunction,true,1
 org/apache/geode/management/internal/cli/functions/GetStackTracesFunction,true,1
 org/apache/geode/management/internal/cli/functions/GetSubscriptionQueueSizeFunction,true,1
 org/apache/geode/management/internal/cli/functions/ImportDataFunction,true,1
-org/apache/geode/management/internal/cli/functions/JndiBindingConfiguration,false,blockingTimeout:java/lang/Integer,connectionPoolDatasource:java/lang/String,connectionUrl:java/lang/String,datasourceConfigurations:java/util/List,idleTimeout:java/lang/Integer,initPoolSize:java/lang/Integer,jdbcDriver:java/lang/String,jndiName:java/lang/String,loginTimeout:java/lang/Integer,managedConnFactory:java/lang/String,maxPoolSize:java/lang/Integer,password:java/lang/String,transactionType:java/lang [...]
-org/apache/geode/management/internal/cli/functions/JndiBindingConfiguration$DATASOURCE_TYPE,false,type:java/lang/String
 org/apache/geode/management/internal/cli/functions/ListAsyncEventQueuesFunction,true,1
 org/apache/geode/management/internal/cli/functions/ListDeployedFunction,true,1
 org/apache/geode/management/internal/cli/functions/ListDiskStoresFunction,false
diff --git a/geode-core/src/test/java/org/apache/geode/distributed/internal/InternalClusterConfigurationServiceTest.java b/geode-core/src/test/java/org/apache/geode/distributed/internal/InternalClusterConfigurationServiceTest.java
index a409885..df8cf9b 100644
--- a/geode-core/src/test/java/org/apache/geode/distributed/internal/InternalClusterConfigurationServiceTest.java
+++ b/geode-core/src/test/java/org/apache/geode/distributed/internal/InternalClusterConfigurationServiceTest.java
@@ -26,9 +26,7 @@ import static org.mockito.Mockito.spy;
 
 import javax.xml.bind.annotation.XmlAccessType;
 import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlElementDecl;
 import javax.xml.bind.annotation.XmlRootElement;
-import javax.xml.bind.annotation.XmlSchema;
 import javax.xml.bind.annotation.XmlType;
 
 import org.junit.Before;
@@ -40,7 +38,6 @@ import org.apache.geode.internal.cache.configuration.CacheConfig;
 import org.apache.geode.internal.cache.configuration.CacheElement;
 import org.apache.geode.internal.cache.configuration.JndiBindingsType;
 import org.apache.geode.internal.cache.configuration.RegionConfig;
-import org.apache.geode.internal.cache.configuration.RegionElement;
 import org.apache.geode.management.internal.configuration.domain.Configuration;
 import org.apache.geode.test.junit.categories.UnitTest;
 
@@ -151,19 +148,23 @@ public class InternalClusterConfigurationServiceTest {
       jndiBinding.setJndiName("jndiOne");
       jndiBinding.setJdbcDriverClass("com.sun.ABC");
       jndiBinding.setType("SimpleDataSource");
+      jndiBinding.getConfigProperty()
+          .add(new JndiBindingsType.JndiBinding.ConfigProperty("test", "test", "test"));
       cacheConfig.getJndiBindings().add(jndiBinding);
       return cacheConfig;
     });
 
     assertThat(configuration.getCacheXmlContent()).containsOnlyOnce("</jndi-bindings>");
     assertThat(configuration.getCacheXmlContent()).contains(
-        "<jndi-binding jdbc-driver-class=\"com.sun.ABC\" jndi-name=\"jndiOne\" type=\"SimpleDataSource\"/>");
+        "<jndi-binding jdbc-driver-class=\"com.sun.ABC\" jndi-name=\"jndiOne\" type=\"SimpleDataSource\">");
+    assertThat(configuration.getCacheXmlContent())
+        .contains("config-property-name>test</config-property-name>");
   }
 
   @XmlAccessorType(XmlAccessType.FIELD)
   @XmlType(name = "", propOrder = {"id", "value"})
   @XmlRootElement(name = "custom-one", namespace = "http://geode.apache.org/schema/CustomOne")
-  public static class ElementOne implements CacheElement, RegionElement {
+  public static class ElementOne implements CacheElement {
     private String id;
     private String value;
 
@@ -193,7 +194,7 @@ public class InternalClusterConfigurationServiceTest {
   @XmlAccessorType(XmlAccessType.FIELD)
   @XmlType(name = "", propOrder = {"id", "value"})
   @XmlRootElement(name = "custom-two", namespace = "http://geode.apache.org/schema/CustomTwo")
-  public static class ElementTwo implements CacheElement, RegionElement {
+  public static class ElementTwo implements CacheElement {
     private String id;
     private String value;
 
diff --git a/geode-core/src/test/java/org/apache/geode/internal/datasource/AbstractPoolCacheJUnitTest.java b/geode-core/src/test/java/org/apache/geode/internal/datasource/AbstractPoolCacheJUnitTest.java
index 7c8dfa4..ce41b9e 100644
--- a/geode-core/src/test/java/org/apache/geode/internal/datasource/AbstractPoolCacheJUnitTest.java
+++ b/geode-core/src/test/java/org/apache/geode/internal/datasource/AbstractPoolCacheJUnitTest.java
@@ -19,8 +19,12 @@
  */
 package org.apache.geode.internal.datasource;
 
-import static org.apache.geode.distributed.ConfigurationProperties.*;
-import static org.junit.Assert.*;
+import static org.apache.geode.distributed.ConfigurationProperties.CACHE_XML_FILE;
+import static org.apache.geode.distributed.ConfigurationProperties.LOCATORS;
+import static org.apache.geode.distributed.ConfigurationProperties.LOG_LEVEL;
+import static org.apache.geode.distributed.ConfigurationProperties.MCAST_PORT;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.fail;
 
 import java.sql.Connection;
 import java.util.ArrayList;
@@ -171,7 +175,7 @@ public class AbstractPoolCacheJUnitTest {
     props.add(new ConfigProperty("databaseName", "newDB", "java.lang.String"));
 
     GemFireBasicDataSource gbds =
-        (GemFireBasicDataSource) DataSourceFactory.getSimpleDataSource(map, props);
+        (GemFireBasicDataSource) DataSourceFactory.getSimpleDataSource(map);
     map.put("xa-datasource-class", "org.apache.derby.jdbc.EmbeddedXADataSource");
 
     map.put("connection-url", "jdbc:derby:newDB;create=true");
diff --git a/geode-core/src/test/java/org/apache/geode/management/internal/cli/commands/CreateJndiBindingCommandTest.java b/geode-core/src/test/java/org/apache/geode/management/internal/cli/commands/CreateJndiBindingCommandTest.java
index f8401f1..19b3854 100644
--- a/geode-core/src/test/java/org/apache/geode/management/internal/cli/commands/CreateJndiBindingCommandTest.java
+++ b/geode-core/src/test/java/org/apache/geode/management/internal/cli/commands/CreateJndiBindingCommandTest.java
@@ -16,7 +16,6 @@ package org.apache.geode.management.internal.cli.commands;
 
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.Mockito.doNothing;
 import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.spy;
@@ -25,7 +24,6 @@ import static org.mockito.Mockito.verify;
 
 import java.io.IOException;
 import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.Collections;
 import java.util.HashSet;
 import java.util.List;
@@ -39,22 +37,16 @@ import org.junit.ClassRule;
 import org.junit.Test;
 import org.junit.experimental.categories.Category;
 import org.mockito.ArgumentCaptor;
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
 import org.xml.sax.SAXException;
 
-import org.apache.geode.cache.Region;
 import org.apache.geode.distributed.DistributedMember;
 import org.apache.geode.distributed.internal.ClusterConfigurationService;
 import org.apache.geode.internal.cache.InternalCache;
-import org.apache.geode.internal.datasource.ConfigProperty;
+import org.apache.geode.internal.cache.configuration.CacheConfig;
+import org.apache.geode.internal.cache.configuration.JndiBindingsType;
 import org.apache.geode.management.internal.cli.GfshParseResult;
 import org.apache.geode.management.internal.cli.functions.CliFunctionResult;
 import org.apache.geode.management.internal.cli.functions.CreateJndiBindingFunction;
-import org.apache.geode.management.internal.cli.functions.JndiBindingConfiguration;
-import org.apache.geode.management.internal.configuration.domain.Configuration;
-import org.apache.geode.management.internal.configuration.utils.XmlUtils;
 import org.apache.geode.test.junit.categories.UnitTest;
 import org.apache.geode.test.junit.rules.GfshParserRule;
 
@@ -95,8 +87,9 @@ public class CreateJndiBindingCommandTest {
         + " --type=SIMPLE --name=name --jdbc-driver-class=driver --connection-url=url "
         + "--datasource-config-properties={'name':'name1','type':'type1','value':'value1'},{'name':'name2','type':'type2','value':'value2'}");
 
-    ConfigProperty[] configProperties =
-        (ConfigProperty[]) result.getParamValue("datasource-config-properties");
+    JndiBindingsType.JndiBinding.ConfigProperty[] configProperties =
+        (JndiBindingsType.JndiBinding.ConfigProperty[]) result
+            .getParamValue("datasource-config-properties");
     assertThat(configProperties).hasSize(2);
     assertThat(configProperties[0].getValue()).isEqualTo("value1");
     assertThat(configProperties[1].getValue()).isEqualTo("value2");
@@ -106,10 +99,12 @@ public class CreateJndiBindingCommandTest {
   public void returnsErrorIfBindingAlreadyExistsAndIfUnspecified()
       throws ParserConfigurationException, SAXException, IOException {
     ClusterConfigurationService clusterConfigService = mock(ClusterConfigurationService.class);
-    Element existingBinding = mock(Element.class);
+    CacheConfig cacheConfig = mock(CacheConfig.class);
+    JndiBindingsType.JndiBinding existingBinding = mock(JndiBindingsType.JndiBinding.class);
 
     doReturn(clusterConfigService).when(command).getSharedConfiguration();
-    doReturn(existingBinding).when(clusterConfigService).getXmlElement(any(), any(), any(), any());
+    doReturn(cacheConfig).when(clusterConfigService).getCacheConfig(any());
+    doReturn(existingBinding).when(clusterConfigService).findElement(any(), any());
 
     gfsh.executeAndAssertThat(command,
         COMMAND + " --type=SIMPLE --name=name --jdbc-driver-class=driver --connection-url=url")
@@ -120,10 +115,12 @@ public class CreateJndiBindingCommandTest {
   public void skipsIfBindingAlreadyExistsAndIfSpecified()
       throws ParserConfigurationException, SAXException, IOException {
     ClusterConfigurationService clusterConfigService = mock(ClusterConfigurationService.class);
-    Element existingBinding = mock(Element.class);
+    CacheConfig cacheConfig = mock(CacheConfig.class);
+    JndiBindingsType.JndiBinding existingBinding = mock(JndiBindingsType.JndiBinding.class);
 
     doReturn(clusterConfigService).when(command).getSharedConfiguration();
-    doReturn(existingBinding).when(clusterConfigService).getXmlElement(any(), any(), any(), any());
+    doReturn(cacheConfig).when(clusterConfigService).getCacheConfig(any());
+    doReturn(existingBinding).when(clusterConfigService).findElement(any(), any());
 
     gfsh.executeAndAssertThat(command,
         COMMAND
@@ -135,10 +132,12 @@ public class CreateJndiBindingCommandTest {
   public void skipsIfBindingAlreadyExistsAndIfSpecifiedTrue()
       throws ParserConfigurationException, SAXException, IOException {
     ClusterConfigurationService clusterConfigService = mock(ClusterConfigurationService.class);
-    Element existingBinding = mock(Element.class);
+    CacheConfig cacheConfig = mock(CacheConfig.class);
+    JndiBindingsType.JndiBinding existingBinding = mock(JndiBindingsType.JndiBinding.class);
 
     doReturn(clusterConfigService).when(command).getSharedConfiguration();
-    doReturn(existingBinding).when(clusterConfigService).getXmlElement(any(), any(), any(), any());
+    doReturn(cacheConfig).when(clusterConfigService).getCacheConfig(any());
+    doReturn(existingBinding).when(clusterConfigService).findElement(any(), any());
 
     gfsh.executeAndAssertThat(command,
         COMMAND
@@ -147,13 +146,14 @@ public class CreateJndiBindingCommandTest {
   }
 
   @Test
-  public void returnsErrorIfBindingAlreadyExistsAndIfSpecifiedFalse()
-      throws ParserConfigurationException, SAXException, IOException {
+  public void returnsErrorIfBindingAlreadyExistsAndIfSpecifiedFalse() {
     ClusterConfigurationService clusterConfigService = mock(ClusterConfigurationService.class);
-    Element existingBinding = mock(Element.class);
+    CacheConfig cacheConfig = mock(CacheConfig.class);
+    JndiBindingsType.JndiBinding existingBinding = mock(JndiBindingsType.JndiBinding.class);
 
     doReturn(clusterConfigService).when(command).getSharedConfiguration();
-    doReturn(existingBinding).when(clusterConfigService).getXmlElement(any(), any(), any(), any());
+    doReturn(cacheConfig).when(clusterConfigService).getCacheConfig(any());
+    doReturn(existingBinding).when(clusterConfigService).findElement(any(), any());
 
     gfsh.executeAndAssertThat(command,
         COMMAND
@@ -162,87 +162,10 @@ public class CreateJndiBindingCommandTest {
   }
 
   @Test
-  public void updateXmlShouldClusterConfigurationWithJndiConfiguration()
-      throws IOException, ParserConfigurationException, SAXException, TransformerException {
-    Configuration clusterConfig = new Configuration("cluster");
-    ClusterConfigurationService clusterConfigService = mock(ClusterConfigurationService.class);
-    Region configRegion = mock(Region.class);
-
-    doReturn(configRegion).when(clusterConfigService).getConfigurationRegion();
-    doReturn(null).when(configRegion).put(any(), any());
-    doReturn(clusterConfig).when(clusterConfigService).getConfiguration("cluster");
-    doReturn(Collections.emptySet()).when(command).findMembers(any(), any());
-    doReturn(clusterConfigService).when(command).getSharedConfiguration();
-
-    JndiBindingConfiguration jndi = new JndiBindingConfiguration();
-    jndi.setBlockingTimeout(60);
-    jndi.setConnectionUrl("URL");
-    jndi.setConnectionPoolDatasource("org.datasource");
-    jndi.setMaxPoolSize(10);
-    jndi.setManagedConnFactory("connFactory");
-    jndi.setLoginTimeout(100);
-    jndi.setJndiName("jndi1");
-    jndi.setJdbcDriver("driver");
-    jndi.setUsername("user1");
-    jndi.setIdleTimeout(50);
-    jndi.setInitPoolSize(5);
-    jndi.setPassword("p@ssw0rd");
-    jndi.setTransactionType("txntype");
-    jndi.setType(JndiBindingConfiguration.DATASOURCE_TYPE.SIMPLE);
-    jndi.setXaDatasource("xaDS");
-    ConfigProperty prop = new ConfigProperty("somename", "somevalue", "sometype");
-    jndi.setDatasourceConfigurations(Arrays.asList(new ConfigProperty[] {prop}));
-    command.updateXml(jndi);
-
-    Document document = XmlUtils.createDocumentFromXml(clusterConfig.getCacheXmlContent());
-    assertThat(document).isNotNull();
-    assertThat(document.getElementsByTagName("jndi-bindings").item(0)).isNotNull();
-    Element jndiElement = (Element) document.getElementsByTagName("jndi-binding").item(0);
-    assertThat(jndiElement).isNotNull();
-    assertThat(jndiElement.getParentNode().getNodeName()).isEqualTo("jndi-bindings");
-    assertThat(jndiElement.getAttribute("blocking-timeout-seconds")).isEqualTo("60");
-    assertThat(jndiElement.getAttribute("conn-pooled-datasource-class"))
-        .isEqualTo("org.datasource");
-    assertThat(jndiElement.getAttribute("connection-url")).isEqualTo("URL");
-    assertThat(jndiElement.getAttribute("idle-timeout-seconds")).isEqualTo("50");
-    assertThat(jndiElement.getAttribute("init-pool-size")).isEqualTo("5");
-    assertThat(jndiElement.getAttribute("jdbc-driver-class")).isEqualTo("driver");
-    assertThat(jndiElement.getAttribute("jndi-name")).isEqualTo("jndi1");
-    assertThat(jndiElement.getAttribute("login-timeout-seconds")).isEqualTo("100");
-    assertThat(jndiElement.getAttribute("managed-conn-factory-class")).isEqualTo("connFactory");
-    assertThat(jndiElement.getAttribute("max-pool-size")).isEqualTo("10");
-    assertThat(jndiElement.getAttribute("password")).isEqualTo("p@ssw0rd");
-    assertThat(jndiElement.getAttribute("transaction-type")).isEqualTo("txntype");
-    assertThat(jndiElement.getAttribute("type")).isEqualTo("SimpleDataSource");
-    assertThat(jndiElement.getAttribute("user-name")).isEqualTo("user1");
-    assertThat(jndiElement.getAttribute("xa-datasource-class")).isEqualTo("xaDS");
-
-    Node configProperty = document.getElementsByTagName("config-property").item(0);
-    assertThat(configProperty.getParentNode().getNodeName()).isEqualTo("jndi-binding");
-
-    Node nameProperty = document.getElementsByTagName("config-property-name").item(0);
-    assertThat(nameProperty).isNotNull();
-    assertThat(nameProperty.getParentNode().getNodeName()).isEqualTo("config-property");
-    assertThat(nameProperty.getTextContent()).isEqualTo("somename");
-    Node typeProperty = document.getElementsByTagName("config-property-type").item(0);
-    assertThat(typeProperty).isNotNull();
-    assertThat(nameProperty.getParentNode().getNodeName()).isEqualTo("config-property");
-    assertThat(typeProperty.getTextContent()).isEqualTo("sometype");
-    Node valueProperty = document.getElementsByTagName("config-property-value").item(0);
-    assertThat(valueProperty).isNotNull();
-    assertThat(nameProperty.getParentNode().getNodeName()).isEqualTo("config-property");
-    assertThat(valueProperty.getTextContent()).isEqualTo("somevalue");
-
-    verify(configRegion, times(1)).put("cluster", clusterConfig);
-  }
-
-  @Test
-  public void whenNoMembersFoundAndNoClusterConfigServiceRunningThenError()
-      throws IOException, ParserConfigurationException, SAXException, TransformerException {
+  public void whenNoMembersFoundAndNoClusterConfigServiceRunningThenError() {
 
     doReturn(Collections.emptySet()).when(command).findMembers(any(), any());
     doReturn(null).when(command).getSharedConfiguration();
-    doNothing().when(command).updateXml(any());
 
     gfsh.executeAndAssertThat(command,
         COMMAND + " --type=SIMPLE --name=name --jdbc-driver-class=driver --connection-url=url")
@@ -250,14 +173,14 @@ public class CreateJndiBindingCommandTest {
   }
 
   @Test
-  public void whenNoMembersFoundAndClusterConfigRunningThenUpdateClusterConfig()
-      throws IOException, ParserConfigurationException, SAXException, TransformerException {
+  public void whenNoMembersFoundAndClusterConfigRunningThenUpdateClusterConfig() {
     ClusterConfigurationService clusterConfigService = mock(ClusterConfigurationService.class);
+    CacheConfig cacheConfig = mock(CacheConfig.class);
 
     doReturn(Collections.emptySet()).when(command).findMembers(any(), any());
-    doReturn(null).when(clusterConfigService).getXmlElement(any(), any(), any(), any());
     doReturn(clusterConfigService).when(command).getSharedConfiguration();
-    doNothing().when(command).updateXml(any());
+    doReturn(cacheConfig).when(clusterConfigService).getCacheConfig(any());
+    doReturn(null).when(clusterConfigService).findElement(any(), any());
 
     gfsh.executeAndAssertThat(command,
         COMMAND + " --type=SIMPLE --name=name --jdbc-driver-class=driver --connection-url=url")
@@ -266,12 +189,11 @@ public class CreateJndiBindingCommandTest {
             "No members found. Cluster configuration is updated with jndi-binding \\\"name\\\".")
         .hasNoFailToPersistError();
 
-    verify(command, times(1)).updateXml(any());
+    verify(clusterConfigService).updateCacheConfig(any(), any());
   }
 
   @Test
-  public void whenMembersFoundAndNoClusterConfigRunningThenOnlyInvokeFunction()
-      throws IOException, ParserConfigurationException, SAXException, TransformerException {
+  public void whenMembersFoundAndNoClusterConfigRunningThenOnlyInvokeFunction() {
     Set<DistributedMember> members = new HashSet<>();
     members.add(mock(DistributedMember.class));
 
@@ -291,12 +213,10 @@ public class CreateJndiBindingCommandTest {
         .tableHasColumnOnlyWithValues("Status",
             "Tried creating jndi binding \"name\" on \"server1\"");
 
-    verify(command, times(0)).updateXml(any());
-
     ArgumentCaptor<CreateJndiBindingFunction> function =
         ArgumentCaptor.forClass(CreateJndiBindingFunction.class);
-    ArgumentCaptor<JndiBindingConfiguration> jndiConfig =
-        ArgumentCaptor.forClass(JndiBindingConfiguration.class);
+    ArgumentCaptor<JndiBindingsType.JndiBinding> jndiConfig =
+        ArgumentCaptor.forClass(JndiBindingsType.JndiBinding.class);
     ArgumentCaptor<Set<DistributedMember>> targetMembers = ArgumentCaptor.forClass(Set.class);
     verify(command, times(1)).executeAndGetFunctionResult(function.capture(), jndiConfig.capture(),
         targetMembers.capture());
@@ -304,8 +224,7 @@ public class CreateJndiBindingCommandTest {
     assertThat(function.getValue()).isInstanceOf(CreateJndiBindingFunction.class);
     assertThat(jndiConfig.getValue()).isNotNull();
     assertThat(jndiConfig.getValue().getJndiName()).isEqualTo("name");
-    assertThat(jndiConfig.getValue().getDatasourceConfigurations().get(0).getName())
-        .isEqualTo("name1");
+    assertThat(jndiConfig.getValue().getConfigProperty().get(0).getName()).isEqualTo("name1");
     assertThat(targetMembers.getValue()).isEqualTo(members);
   }
 
@@ -320,12 +239,13 @@ public class CreateJndiBindingCommandTest {
     List<CliFunctionResult> results = new ArrayList<>();
     results.add(result);
     ClusterConfigurationService clusterConfigService = mock(ClusterConfigurationService.class);
+    CacheConfig cacheConfig = mock(CacheConfig.class);
 
     doReturn(members).when(command).findMembers(any(), any());
-    doReturn(null).when(clusterConfigService).getXmlElement(any(), any(), any(), any());
     doReturn(clusterConfigService).when(command).getSharedConfiguration();
-    doNothing().when(command).updateXml(any());
     doReturn(results).when(command).executeAndGetFunctionResult(any(), any(), any());
+    doReturn(cacheConfig).when(clusterConfigService).getCacheConfig(any());
+    doReturn(null).when(clusterConfigService).findElement(any(), any());
 
     gfsh.executeAndAssertThat(command,
         COMMAND
@@ -334,12 +254,12 @@ public class CreateJndiBindingCommandTest {
         .tableHasColumnOnlyWithValues("Status",
             "Tried creating jndi binding \"name\" on \"server1\"");
 
-    verify(command, times(1)).updateXml(any());
+    verify(clusterConfigService).updateCacheConfig(any(), any());
 
     ArgumentCaptor<CreateJndiBindingFunction> function =
         ArgumentCaptor.forClass(CreateJndiBindingFunction.class);
-    ArgumentCaptor<JndiBindingConfiguration> jndiConfig =
-        ArgumentCaptor.forClass(JndiBindingConfiguration.class);
+    ArgumentCaptor<JndiBindingsType.JndiBinding> jndiConfig =
+        ArgumentCaptor.forClass(JndiBindingsType.JndiBinding.class);
     ArgumentCaptor<Set<DistributedMember>> targetMembers = ArgumentCaptor.forClass(Set.class);
     verify(command, times(1)).executeAndGetFunctionResult(function.capture(), jndiConfig.capture(),
         targetMembers.capture());
@@ -347,8 +267,7 @@ public class CreateJndiBindingCommandTest {
     assertThat(function.getValue()).isInstanceOf(CreateJndiBindingFunction.class);
     assertThat(jndiConfig.getValue()).isNotNull();
     assertThat(jndiConfig.getValue().getJndiName()).isEqualTo("name");
-    assertThat(jndiConfig.getValue().getDatasourceConfigurations().get(0).getName())
-        .isEqualTo("name1");
+    assertThat(jndiConfig.getValue().getConfigProperty().get(0).getName()).isEqualTo("name1");
     assertThat(targetMembers.getValue()).isEqualTo(members);
   }
 }
diff --git a/geode-core/src/test/java/org/apache/geode/management/internal/cli/commands/DestroyJndiBindingCommandTest.java b/geode-core/src/test/java/org/apache/geode/management/internal/cli/commands/DestroyJndiBindingCommandTest.java
index faae121..f95df2e 100644
--- a/geode-core/src/test/java/org/apache/geode/management/internal/cli/commands/DestroyJndiBindingCommandTest.java
+++ b/geode-core/src/test/java/org/apache/geode/management/internal/cli/commands/DestroyJndiBindingCommandTest.java
@@ -16,46 +16,36 @@ package org.apache.geode.management.internal.cli.commands;
 
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.Mockito.doNothing;
+import static org.mockito.Mockito.doCallRealMethod;
 import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.spy;
 import static org.mockito.Mockito.times;
 import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
 
-import java.io.IOException;
 import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.Collections;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
 
-import javax.xml.parsers.ParserConfigurationException;
-import javax.xml.transform.TransformerException;
-
 import org.junit.Before;
 import org.junit.ClassRule;
 import org.junit.Test;
 import org.junit.experimental.categories.Category;
 import org.mockito.ArgumentCaptor;
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.xml.sax.SAXException;
 
 import org.apache.geode.cache.Region;
 import org.apache.geode.distributed.DistributedMember;
 import org.apache.geode.distributed.internal.ClusterConfigurationService;
 import org.apache.geode.internal.cache.InternalCache;
-import org.apache.geode.internal.datasource.ConfigProperty;
-import org.apache.geode.management.internal.cli.GfshParseResult;
+import org.apache.geode.internal.cache.configuration.CacheConfig;
+import org.apache.geode.internal.cache.configuration.JndiBindingsType;
 import org.apache.geode.management.internal.cli.functions.CliFunctionResult;
 import org.apache.geode.management.internal.cli.functions.CreateJndiBindingFunction;
 import org.apache.geode.management.internal.cli.functions.DestroyJndiBindingFunction;
-import org.apache.geode.management.internal.cli.functions.JndiBindingConfiguration;
 import org.apache.geode.management.internal.configuration.domain.Configuration;
-import org.apache.geode.management.internal.configuration.utils.XmlUtils;
 import org.apache.geode.test.junit.categories.UnitTest;
 import org.apache.geode.test.junit.rules.GfshParserRule;
 
@@ -67,6 +57,8 @@ public class DestroyJndiBindingCommandTest {
 
   private DestroyJndiBindingCommand command;
   private InternalCache cache;
+  private CacheConfig cacheConfig;
+  private ClusterConfigurationService ccService;
 
   private static String COMMAND = "destroy jndi-binding ";
 
@@ -75,6 +67,13 @@ public class DestroyJndiBindingCommandTest {
     cache = mock(InternalCache.class);
     command = spy(DestroyJndiBindingCommand.class);
     doReturn(cache).when(command).getCache();
+    cacheConfig = mock(CacheConfig.class);
+    ccService = mock(ClusterConfigurationService.class);
+    doReturn(ccService).when(command).getSharedConfiguration();
+    when(ccService.getCacheConfig(any())).thenReturn(cacheConfig);
+    doCallRealMethod().when(ccService).updateCacheConfig(any(), any());
+    when(ccService.getConfigurationRegion()).thenReturn(mock(Region.class));
+    when(ccService.getConfiguration(any())).thenReturn(mock(Configuration.class));
   }
 
   @Test
@@ -83,126 +82,57 @@ public class DestroyJndiBindingCommandTest {
   }
 
   @Test
-  public void returnsErrorIfBindingDoesNotExistAndIfExistsUnspecified()
-      throws ParserConfigurationException, SAXException, IOException {
-    ClusterConfigurationService clusterConfigService = mock(ClusterConfigurationService.class);
-    doReturn(clusterConfigService).when(command).getSharedConfiguration();
-    doReturn(null).when(clusterConfigService).getXmlElement(any(), any(), any(), any());
+  public void returnsErrorIfBindingDoesNotExistAndIfExistsUnspecified() {
+    when(ccService.findElement(any(), any())).thenReturn(null);
     gfsh.executeAndAssertThat(command, COMMAND + " --name=name").statusIsError()
         .containsOutput("does not exist.");
   }
 
   @Test
-  public void skipsIfBindingDoesNotExistAndIfExistsSpecified()
-      throws ParserConfigurationException, SAXException, IOException {
-    ClusterConfigurationService clusterConfigService = mock(ClusterConfigurationService.class);
-    doReturn(clusterConfigService).when(command).getSharedConfiguration();
-    doReturn(null).when(clusterConfigService).getXmlElement(any(), any(), any(), any());
+  public void skipsIfBindingDoesNotExistAndIfExistsSpecified() {
+    when(ccService.findElement(any(), any())).thenReturn(null);
     gfsh.executeAndAssertThat(command, COMMAND + " --name=name --if-exists").statusIsSuccess()
         .containsOutput("does not exist.");
   }
 
   @Test
-  public void skipsIfBindingDoesNotExistAndIfExistsSpecifiedTrue()
-      throws ParserConfigurationException, SAXException, IOException {
-    ClusterConfigurationService clusterConfigService = mock(ClusterConfigurationService.class);
-    doReturn(clusterConfigService).when(command).getSharedConfiguration();
-    doReturn(null).when(clusterConfigService).getXmlElement(any(), any(), any(), any());
+  public void skipsIfBindingDoesNotExistAndIfExistsSpecifiedTrue() {
+    when(ccService.findElement(any(), any())).thenReturn(null);
     gfsh.executeAndAssertThat(command, COMMAND + " --name=name --if-exists=true").statusIsSuccess()
         .containsOutput("does not exist.");
   }
 
   @Test
-  public void returnsErrorIfBindingDoesNotExistAndIfExistsSpecifiedFalse()
-      throws ParserConfigurationException, SAXException, IOException {
-    ClusterConfigurationService clusterConfigService = mock(ClusterConfigurationService.class);
-    doReturn(clusterConfigService).when(command).getSharedConfiguration();
-    doReturn(null).when(clusterConfigService).getXmlElement(any(), any(), any(), any());
+  public void returnsErrorIfBindingDoesNotExistAndIfExistsSpecifiedFalse() {
+    when(ccService.findElement(any(), any())).thenReturn(null);
     gfsh.executeAndAssertThat(command, COMMAND + " --name=name --if-exists=false").statusIsError()
         .containsOutput("does not exist.");
   }
 
   @Test
-  public void removeJndiBindingFromXmlShouldRemoveBindingFromClusterConfiguration()
-      throws IOException, ParserConfigurationException, SAXException, TransformerException {
-    ClusterConfigurationService clusterConfigService = mock(ClusterConfigurationService.class);
-    Region configRegion = mock(Region.class);
-
-    Configuration clusterConfig = new Configuration("cluster");
-    String xml = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>"
-        + "<cache xmlns=\"http://geode.apache.org/schema/cache\" "
-        + "xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" "
-        + "copy-on-read=\"false\" is-server=\"false\" lock-lease=\"120\" "
-        + "lock-timeout=\"60\" search-timeout=\"300\" version=\"1.0\" "
-        + "xsi:schemaLocation=\"http://geode.apache.org/schema/cache "
-        + "http://geode.apache.org/schema/cache/cache-1.0.xsd\">" + "<jndi-bindings>"
-        + "<jndi-binding jndi-name=\"jndi1\" type=\"SimpleDataSource\"/>"
-        + "<jndi-binding jndi-name=\"jndi2\" type=\"SimpleDataSource\"/>"
-        + "</jndi-bindings></cache>";
-    clusterConfig.setCacheXmlContent(xml);
-
-    doReturn(configRegion).when(clusterConfigService).getConfigurationRegion();
-    doReturn(null).when(configRegion).put(any(), any());
-    doReturn(clusterConfig).when(clusterConfigService).getConfiguration("cluster");
-    doReturn(Collections.emptySet()).when(command).findMembers(any(), any());
-    doReturn(clusterConfigService).when(command).getSharedConfiguration();
-
-    command.removeJndiBindingFromXml("jndi1");
-    assertThat(clusterConfig.getCacheXmlContent()).doesNotContain("jndi1");
-    assertThat(clusterConfig.getCacheXmlContent()).contains("jndi2");
-    verify(configRegion, times(1)).put("cluster", clusterConfig);
-  }
-
-  @Test
-  public void removeJndiBindingFromXmlIsNoOpWhenNoBindingFoundInClusterConfiguration()
-      throws IOException, ParserConfigurationException, SAXException, TransformerException {
-    ClusterConfigurationService clusterConfigService = mock(ClusterConfigurationService.class);
-    Region configRegion = mock(Region.class);
-    Configuration clusterConfig = new Configuration("cluster");
-
-    doReturn(configRegion).when(clusterConfigService).getConfigurationRegion();
-    doReturn(null).when(configRegion).put(any(), any());
-    doReturn(clusterConfig).when(clusterConfigService).getConfiguration("cluster");
-    doReturn(Collections.emptySet()).when(command).findMembers(any(), any());
-    doReturn(clusterConfigService).when(command).getSharedConfiguration();
-
-    command.removeJndiBindingFromXml("jndi1");
-    verify(configRegion, times(0)).put("cluster", clusterConfig);
-  }
-
-  @Test
-  public void whenNoMembersFoundAndNoClusterConfigServiceRunningThenError()
-      throws IOException, ParserConfigurationException, SAXException, TransformerException {
+  public void whenNoMembersFoundAndNoClusterConfigServiceRunningThenError() {
     doReturn(Collections.emptySet()).when(command).findMembers(any(), any());
     doReturn(null).when(command).getSharedConfiguration();
-    doNothing().when(command).removeJndiBindingFromXml(any());
 
     gfsh.executeAndAssertThat(command, COMMAND + " --name=name").statusIsSuccess()
         .containsOutput("No members found").hasFailToPersistError();
   }
 
   @Test
-  public void whenNoMembersFoundAndClusterConfigRunningThenUpdateClusterConfig()
-      throws IOException, ParserConfigurationException, SAXException, TransformerException {
-    ClusterConfigurationService clusterConfigService = mock(ClusterConfigurationService.class);
-    Element existingBinding = mock(Element.class);
-
+  public void whenNoMembersFoundAndClusterConfigRunningThenUpdateClusterConfig() {
     doReturn(Collections.emptySet()).when(command).findMembers(any(), any());
-    doReturn(existingBinding).when(clusterConfigService).getXmlElement(any(), any(), any(), any());
-    doReturn(clusterConfigService).when(command).getSharedConfiguration();
-    doNothing().when(command).removeJndiBindingFromXml(any());
+    when(ccService.findElement(any(), any())).thenReturn(mock(JndiBindingsType.JndiBinding.class));
 
     gfsh.executeAndAssertThat(command, COMMAND + " --name=name").statusIsSuccess()
         .containsOutput(
             "No members found. Jndi-binding \\\"name\\\" is removed from cluster configuration.")
         .hasNoFailToPersistError();
 
-    verify(command, times(1)).removeJndiBindingFromXml(any());
+    verify(ccService).updateCacheConfig(any(), any());
   }
 
   @Test
-  public void whenMembersFoundAndNoClusterConfigRunningThenOnlyInvokeFunction()
-      throws IOException, ParserConfigurationException, SAXException, TransformerException {
+  public void whenMembersFoundAndNoClusterConfigRunningThenOnlyInvokeFunction() {
     Set<DistributedMember> members = new HashSet<>();
     members.add(mock(DistributedMember.class));
 
@@ -219,7 +149,7 @@ public class DestroyJndiBindingCommandTest {
         .tableHasColumnOnlyWithValues("Member", "server1")
         .tableHasColumnOnlyWithValues("Status", "Jndi binding \"name\" destroyed on \"server1\"");
 
-    verify(command, times(0)).removeJndiBindingFromXml(any());
+    verify(ccService, times(0)).updateCacheConfig(any(), any());
 
     ArgumentCaptor<DestroyJndiBindingFunction> function =
         ArgumentCaptor.forClass(DestroyJndiBindingFunction.class);
@@ -235,8 +165,7 @@ public class DestroyJndiBindingCommandTest {
   }
 
   @Test
-  public void whenMembersFoundAndClusterConfigRunningThenUpdateClusterConfigAndInvokeFunction()
-      throws IOException, ParserConfigurationException, SAXException, TransformerException {
+  public void whenMembersFoundAndClusterConfigRunningThenUpdateClusterConfigAndInvokeFunction() {
     Set<DistributedMember> members = new HashSet<>();
     members.add(mock(DistributedMember.class));
 
@@ -244,21 +173,15 @@ public class DestroyJndiBindingCommandTest {
         new CliFunctionResult("server1", true, "Jndi binding \"name\" destroyed on \"server1\"");
     List<CliFunctionResult> results = new ArrayList<>();
     results.add(result);
-    ClusterConfigurationService clusterConfigService = mock(ClusterConfigurationService.class);
-    Element existingBinding = mock(Element.class);
 
     doReturn(members).when(command).findMembers(any(), any());
-    doReturn(existingBinding).when(clusterConfigService).getXmlElement(any(), any(), any(), any());
-    doReturn(clusterConfigService).when(command).getSharedConfiguration();
-    doNothing().when(command).removeJndiBindingFromXml(any());
     doReturn(results).when(command).executeAndGetFunctionResult(any(), any(), any());
+    when(ccService.findElement(any(), any())).thenReturn(mock(JndiBindingsType.JndiBinding.class));
 
     gfsh.executeAndAssertThat(command, COMMAND + " --name=name").statusIsSuccess()
         .tableHasColumnOnlyWithValues("Member", "server1")
         .tableHasColumnOnlyWithValues("Status", "Jndi binding \"name\" destroyed on \"server1\"");
 
-    verify(command, times(1)).removeJndiBindingFromXml(any());
-
     ArgumentCaptor<CreateJndiBindingFunction> function =
         ArgumentCaptor.forClass(CreateJndiBindingFunction.class);
     ArgumentCaptor<String> jndiName = ArgumentCaptor.forClass(String.class);
diff --git a/geode-core/src/test/java/org/apache/geode/management/internal/cli/converters/ConfigPropertyConverterTest.java b/geode-core/src/test/java/org/apache/geode/management/internal/cli/converters/ConfigPropertyConverterTest.java
index a32d3a6..d4797dc 100644
--- a/geode-core/src/test/java/org/apache/geode/management/internal/cli/converters/ConfigPropertyConverterTest.java
+++ b/geode-core/src/test/java/org/apache/geode/management/internal/cli/converters/ConfigPropertyConverterTest.java
@@ -21,7 +21,7 @@ import org.junit.Before;
 import org.junit.Test;
 import org.junit.experimental.categories.Category;
 
-import org.apache.geode.internal.datasource.ConfigProperty;
+import org.apache.geode.internal.cache.configuration.JndiBindingsType;
 import org.apache.geode.test.junit.categories.UnitTest;
 
 
@@ -37,7 +37,7 @@ public class ConfigPropertyConverterTest {
 
   @Test
   public void validJson() {
-    ConfigProperty configProperty =
+    JndiBindingsType.JndiBinding.ConfigProperty configProperty =
         converter.convertFromText("{'name':'name','type':'type','value':'value'}", null, null);
     assertThat(configProperty.getName()).isEqualTo("name");
     assertThat(configProperty.getType()).isEqualTo("type");
@@ -59,7 +59,7 @@ public class ConfigPropertyConverterTest {
 
   @Test
   public void validWhenTypeMissing() {
-    ConfigProperty configProperty =
+    JndiBindingsType.JndiBinding.ConfigProperty configProperty =
         converter.convertFromText("{'name':'name','value':'value'}", null, null);
     assertThat(configProperty.getName()).isEqualTo("name");
     assertThat(configProperty.getType()).isNull();
diff --git a/geode-core/src/test/java/org/apache/geode/management/internal/cli/functions/CreateJndiBindingFunctionTest.java b/geode-core/src/test/java/org/apache/geode/management/internal/cli/functions/CreateJndiBindingFunctionTest.java
index 4679e56..d179e5e 100644
--- a/geode-core/src/test/java/org/apache/geode/management/internal/cli/functions/CreateJndiBindingFunctionTest.java
+++ b/geode-core/src/test/java/org/apache/geode/management/internal/cli/functions/CreateJndiBindingFunctionTest.java
@@ -21,6 +21,8 @@ import static org.mockito.Mockito.spy;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
+import java.util.Collections;
+import java.util.List;
 import java.util.Map;
 import java.util.logging.Level;
 
@@ -34,15 +36,18 @@ import org.mockito.ArgumentCaptor;
 import org.apache.geode.cache.execute.FunctionContext;
 import org.apache.geode.cache.execute.ResultSender;
 import org.apache.geode.distributed.DistributedSystem;
+import org.apache.geode.internal.cache.configuration.JndiBindingsType;
+import org.apache.geode.internal.datasource.ConfigProperty;
 import org.apache.geode.internal.jndi.JNDIInvoker;
 import org.apache.geode.internal.logging.LocalLogWriter;
+import org.apache.geode.management.internal.cli.commands.CreateJndiBindingCommand;
 import org.apache.geode.test.junit.categories.IntegrationTest;
 
 @Category(IntegrationTest.class)
 public class CreateJndiBindingFunctionTest {
 
   private CreateJndiBindingFunction createBindingFunction;
-  private FunctionContext<JndiBindingConfiguration> context;
+  private FunctionContext<JndiBindingsType.JndiBinding> context;
   private DistributedSystem distributedSystem;
   private ResultSender resultSender;
   private ArgumentCaptor<CliFunctionResult> resultCaptor;
@@ -62,10 +67,10 @@ public class CreateJndiBindingFunctionTest {
 
   @Test
   public void createJndiBindingIsSuccessful() throws Exception {
-    JndiBindingConfiguration config = new JndiBindingConfiguration();
+    JndiBindingsType.JndiBinding config = new JndiBindingsType.JndiBinding();
     config.setJndiName("jndi1");
-    config.setType(JndiBindingConfiguration.DATASOURCE_TYPE.SIMPLE);
-    config.setJdbcDriver("org.apache.derby.jdbc.EmbeddedDriver");
+    config.setType(CreateJndiBindingCommand.DATASOURCE_TYPE.SIMPLE.getType());
+    config.setJdbcDriverClass("org.apache.derby.jdbc.EmbeddedDriver");
     config.setConnectionUrl("jdbc:derby:newDB;create=true");
     when(context.getArguments()).thenReturn(config);
     when(context.getMemberName()).thenReturn("mock-member");
@@ -84,4 +89,17 @@ public class CreateJndiBindingFunctionTest {
         "java:TransactionManager");
   }
 
+  @Test
+  public void convert() {
+    JndiBindingsType.JndiBinding.ConfigProperty propA =
+        new JndiBindingsType.JndiBinding.ConfigProperty("name", "type", "value");
+
+    List<ConfigProperty> converted =
+        CreateJndiBindingFunction.convert(Collections.singletonList(propA));
+    assertThat(converted).hasSize(1);
+    ConfigProperty propB = converted.get(0);
+    assertThat(propB.getName()).isEqualTo("name");
+    assertThat(propB.getType()).isEqualTo("type");
+    assertThat(propB.getValue()).isEqualTo("value");
+  }
 }
diff --git a/geode-core/src/test/java/org/apache/geode/management/internal/cli/functions/DestroyJndiBindingFunctionTest.java b/geode-core/src/test/java/org/apache/geode/management/internal/cli/functions/DestroyJndiBindingFunctionTest.java
index 42f369f..d55ce21 100644
--- a/geode-core/src/test/java/org/apache/geode/management/internal/cli/functions/DestroyJndiBindingFunctionTest.java
+++ b/geode-core/src/test/java/org/apache/geode/management/internal/cli/functions/DestroyJndiBindingFunctionTest.java
@@ -31,8 +31,10 @@ import org.mockito.ArgumentCaptor;
 import org.apache.geode.cache.execute.FunctionContext;
 import org.apache.geode.cache.execute.ResultSender;
 import org.apache.geode.distributed.DistributedSystem;
+import org.apache.geode.internal.cache.configuration.JndiBindingsType;
 import org.apache.geode.internal.jndi.JNDIInvoker;
 import org.apache.geode.internal.logging.LocalLogWriter;
+import org.apache.geode.management.internal.cli.commands.CreateJndiBindingCommand;
 import org.apache.geode.test.junit.categories.IntegrationTest;
 
 @Category(IntegrationTest.class)
@@ -57,12 +59,13 @@ public class DestroyJndiBindingFunctionTest {
 
     JNDIInvoker.mapTransactions(distributedSystem);
 
-    JndiBindingConfiguration config = new JndiBindingConfiguration();
+    JndiBindingsType.JndiBinding config = new JndiBindingsType.JndiBinding();
     config.setJndiName("jndi1");
-    config.setType(JndiBindingConfiguration.DATASOURCE_TYPE.SIMPLE);
-    config.setJdbcDriver("org.apache.derby.jdbc.EmbeddedDriver");
+    config.setType(CreateJndiBindingCommand.DATASOURCE_TYPE.SIMPLE.getType());
+    config.setJdbcDriverClass("org.apache.derby.jdbc.EmbeddedDriver");
     config.setConnectionUrl("jdbc:derby:newDB;create=true");
-    JNDIInvoker.mapDatasource(config.getParamsAsMap(), config.getDatasourceConfigurations());
+    JNDIInvoker.mapDatasource(CreateJndiBindingFunction.getParamsAsMap(config),
+        CreateJndiBindingFunction.convert(config.getConfigProperty()));
   }
 
   @Test
diff --git a/geode-core/src/test/java/org/apache/geode/management/internal/cli/functions/ListJndiBindingFunctionTest.java b/geode-core/src/test/java/org/apache/geode/management/internal/cli/functions/ListJndiBindingFunctionTest.java
index 4a13fd8..158cc8c 100644
--- a/geode-core/src/test/java/org/apache/geode/management/internal/cli/functions/ListJndiBindingFunctionTest.java
+++ b/geode-core/src/test/java/org/apache/geode/management/internal/cli/functions/ListJndiBindingFunctionTest.java
@@ -31,8 +31,10 @@ import org.mockito.ArgumentCaptor;
 import org.apache.geode.cache.execute.FunctionContext;
 import org.apache.geode.cache.execute.ResultSender;
 import org.apache.geode.distributed.DistributedSystem;
+import org.apache.geode.internal.cache.configuration.JndiBindingsType;
 import org.apache.geode.internal.jndi.JNDIInvoker;
 import org.apache.geode.internal.logging.LocalLogWriter;
+import org.apache.geode.management.internal.cli.commands.CreateJndiBindingCommand;
 import org.apache.geode.test.junit.categories.IntegrationTest;
 
 @Category(IntegrationTest.class)
@@ -56,12 +58,15 @@ public class ListJndiBindingFunctionTest {
 
     JNDIInvoker.mapTransactions(distributedSystem);
 
-    JndiBindingConfiguration config = new JndiBindingConfiguration();
+    JndiBindingsType.JndiBinding config = new JndiBindingsType.JndiBinding();
     config.setJndiName("jndi1");
-    config.setType(JndiBindingConfiguration.DATASOURCE_TYPE.SIMPLE);
-    config.setJdbcDriver("org.apache.derby.jdbc.EmbeddedDriver");
+    config.setType(CreateJndiBindingCommand.DATASOURCE_TYPE.SIMPLE.getType());
+    config.setJdbcDriverClass("org.apache.derby.jdbc.EmbeddedDriver");
     config.setConnectionUrl("jdbc:derby:newDB;create=true");
-    JNDIInvoker.mapDatasource(config.getParamsAsMap(), config.getDatasourceConfigurations());
+    config.getConfigProperty()
+        .add(new JndiBindingsType.JndiBinding.ConfigProperty("test", "test", "test"));
+    JNDIInvoker.mapDatasource(CreateJndiBindingFunction.getParamsAsMap(config),
+        CreateJndiBindingFunction.convert(config.getConfigProperty()));
   }
 
   @Test

-- 
To stop receiving notification emails like this one, please contact
jinmeiliao@apache.org.