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/12/06 19:13:36 UTC

[geode] 03/03: GEODE-5971: create region still needs to fetch xml from server to get get extensions xml

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

commit 93ed36f9c9248261fdb7817da4e51f49849f876c
Author: Jinmei Liao <ji...@pivotal.io>
AuthorDate: Wed Dec 5 15:15:07 2018 -0800

    GEODE-5971: create region still needs to fetch xml from server to get get extensions xml
---
 .gitignore                                         |   1 -
 .../integrationTest/resources/assembly_content.txt |   7 +-
 .../InternalConfigurationPersistenceService.java   |   4 +
 .../apache/geode/internal/config/JAXBService.java  |  22 +-
 .../internal/cli/commands/CreateRegionCommand.java |  23 ++
 .../cli/functions/RegionCreateFunction.java        |  15 +-
 .../geode/internal/config/JAXBServiceTest.java     |  22 ++
 .../LuceneClusterConfigurationDUnitTest.java       |   4 +-
 .../cli/functions/LuceneCreateIndexFunction.java   |   4 +-
 .../lucene/management/configuration/Index.java     | 237 +++++++++++++++++++++
 .../management/configuration/package-info.java     |  22 ++
 .../sanctioned-geode-lucene-serializables.txt      |   1 +
 12 files changed, 346 insertions(+), 16 deletions(-)

diff --git a/.gitignore b/.gitignore
index 1525f4a..47d635b 100644
--- a/.gitignore
+++ b/.gitignore
@@ -28,7 +28,6 @@ out/
 *.orig
 geode-pulse/screenshots/
 /jpf.properties
-geode-assembly/assembly_content.txt
 
 .git-together
 bin/
diff --git a/geode-assembly/src/integrationTest/resources/assembly_content.txt b/geode-assembly/src/integrationTest/resources/assembly_content.txt
index f216ab3..2844d1e 100644
--- a/geode-assembly/src/integrationTest/resources/assembly_content.txt
+++ b/geode-assembly/src/integrationTest/resources/assembly_content.txt
@@ -388,6 +388,11 @@ javadoc/org/apache/geode/cache/lucene/LuceneServiceProvider.html
 javadoc/org/apache/geode/cache/lucene/PageableLuceneQueryResults.html
 javadoc/org/apache/geode/cache/lucene/management/LuceneIndexMetrics.html
 javadoc/org/apache/geode/cache/lucene/management/LuceneServiceMXBean.html
+javadoc/org/apache/geode/cache/lucene/management/configuration/Index.Field.html
+javadoc/org/apache/geode/cache/lucene/management/configuration/Index.html
+javadoc/org/apache/geode/cache/lucene/management/configuration/package-frame.html
+javadoc/org/apache/geode/cache/lucene/management/configuration/package-summary.html
+javadoc/org/apache/geode/cache/lucene/management/configuration/package-tree.html
 javadoc/org/apache/geode/cache/lucene/management/package-frame.html
 javadoc/org/apache/geode/cache/lucene/management/package-summary.html
 javadoc/org/apache/geode/cache/lucene/management/package-tree.html
@@ -957,4 +962,4 @@ tools/Modules/Apache_Geode_Modules-0.0.0-AppServer.zip
 tools/Modules/Apache_Geode_Modules-0.0.0-Tomcat.zip
 tools/Modules/Apache_Geode_Modules-0.0.0-tcServer.zip
 tools/Modules/Apache_Geode_Modules-0.0.0-tcServer30.zip
-tools/Pulse/geode-pulse-0.0.0.war
\ No newline at end of file
+tools/Pulse/geode-pulse-0.0.0.war
diff --git a/geode-core/src/main/java/org/apache/geode/distributed/internal/InternalConfigurationPersistenceService.java b/geode-core/src/main/java/org/apache/geode/distributed/internal/InternalConfigurationPersistenceService.java
index c86a969..f9f1169 100644
--- a/geode-core/src/main/java/org/apache/geode/distributed/internal/InternalConfigurationPersistenceService.java
+++ b/geode-core/src/main/java/org/apache/geode/distributed/internal/InternalConfigurationPersistenceService.java
@@ -156,6 +156,10 @@ public class InternalConfigurationPersistenceService implements ConfigurationPer
     jaxbService = new JAXBService(CacheConfig.class);
   }
 
+  public JAXBService getJaxbService() {
+    return jaxbService;
+  }
+
   public InternalConfigurationPersistenceService(InternalCache cache, Class<?>... xsdClasses)
       throws IOException {
     this.cache = cache;
diff --git a/geode-core/src/main/java/org/apache/geode/internal/config/JAXBService.java b/geode-core/src/main/java/org/apache/geode/internal/config/JAXBService.java
index 221e154..3ceb644 100644
--- a/geode-core/src/main/java/org/apache/geode/internal/config/JAXBService.java
+++ b/geode-core/src/main/java/org/apache/geode/internal/config/JAXBService.java
@@ -44,6 +44,7 @@ import org.apache.geode.internal.ClassPathLoader;
 public class JAXBService {
   Marshaller marshaller;
   Unmarshaller unmarshaller;
+  NameSpaceFilter nameSpaceFilter;
 
   public JAXBService(Class<?>... xsdRootClasses) {
     try {
@@ -63,6 +64,10 @@ public class JAXBService {
       }).filter(Objects::nonNull).collect(Collectors.joining(" "));
 
       marshaller.setProperty(Marshaller.JAXB_SCHEMA_LOCATION, schemas);
+      // use a custom Filter so that we can unmarshall older namespace or no namespace xml
+      XMLReader reader = XMLReaderFactory.createXMLReader();
+      nameSpaceFilter = new NameSpaceFilter();
+      nameSpaceFilter.setParent(reader);
     } catch (Exception e) {
       throw new RuntimeException(e.getMessage(), e);
     }
@@ -99,19 +104,20 @@ public class JAXBService {
 
   public <T> T unMarshall(String xml) {
     try {
-      InputSource is = new InputSource(new StringReader(xml));
-      XMLReader reader = XMLReaderFactory.createXMLReader();
-
-      // use a custom Filter so that we can unmarshall older namespace or no namespace xml
-      NameSpaceFilter filter = new NameSpaceFilter();
-      filter.setParent(reader);
-      SAXSource source = new SAXSource(filter, is);
-
+      SAXSource source = new SAXSource(nameSpaceFilter, new InputSource(new StringReader(xml)));
       return (T) unmarshaller.unmarshal(source);
     } catch (Exception e) {
       throw new RuntimeException(e.getMessage(), e);
     }
   }
 
+  public <T> T unMarshall(String xml, Class<T> klass) {
+    try {
+      SAXSource source = new SAXSource(nameSpaceFilter, new InputSource(new StringReader(xml)));
+      return unmarshaller.unmarshal(source, klass).getValue();
+    } catch (Exception e) {
+      throw new RuntimeException(e.getMessage(), e);
+    }
+  }
 
 }
diff --git a/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/CreateRegionCommand.java b/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/CreateRegionCommand.java
index 4686f01..888287d 100644
--- a/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/CreateRegionCommand.java
+++ b/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/CreateRegionCommand.java
@@ -40,9 +40,11 @@ import org.apache.geode.cache.Region;
 import org.apache.geode.cache.RegionAttributes;
 import org.apache.geode.cache.RegionShortcut;
 import org.apache.geode.cache.configuration.CacheConfig;
+import org.apache.geode.cache.configuration.CacheElement;
 import org.apache.geode.cache.configuration.RegionConfig;
 import org.apache.geode.cache.execute.ResultCollector;
 import org.apache.geode.distributed.DistributedMember;
+import org.apache.geode.distributed.internal.InternalConfigurationPersistenceService;
 import org.apache.geode.internal.cache.InternalCache;
 import org.apache.geode.internal.logging.LogService;
 import org.apache.geode.management.DistributedRegionMXBean;
@@ -442,9 +444,30 @@ public class CreateRegionCommand extends SingleGfshCommand {
         RegionCreateFunction.INSTANCE, functionArgs, membersToCreateRegionOn);
 
     ResultModel resultModel = ResultModel.createMemberStatusResult(regionCreateResults);
+    InternalConfigurationPersistenceService service =
+        (InternalConfigurationPersistenceService) getConfigurationPersistenceService();
+
+    if (service == null) {
+      return resultModel;
+    }
+
+    // otherwise, prepare the regionConfig for persistence
     if (resultModel.isSuccessful()) {
       verifyDistributedRegionMbean(cache, regionPath);
       RegionConfig config = (new RegionConfigFactory()).generate(functionArgs);
+      // the following is a temporary solution before lucene make the change to create region first
+      // before creating the lucene index.
+      // GEODE-3924
+      // we will need to get the xml returned from the server to find out any custom xml nested
+      // inside the region
+      String regionXml = (String) regionCreateResults.stream()
+          .filter(CliFunctionResult::isSuccessful)
+          .findFirst().get().getResultObject();
+      RegionConfig regionConfigFromServer =
+          service.getJaxbService().unMarshall(regionXml, RegionConfig.class);
+      List<CacheElement> extensions = regionConfigFromServer.getCustomRegionElements();
+      config.getCustomRegionElements().addAll(extensions);
+
       resultModel.setConfigObject(new CreateRegionResultConfig(config,
           functionArgs.getRegionPath()));
     }
diff --git a/geode-core/src/main/java/org/apache/geode/management/internal/cli/functions/RegionCreateFunction.java b/geode-core/src/main/java/org/apache/geode/management/internal/cli/functions/RegionCreateFunction.java
index 9dfa16d..26ed5a4 100644
--- a/geode-core/src/main/java/org/apache/geode/management/internal/cli/functions/RegionCreateFunction.java
+++ b/geode-core/src/main/java/org/apache/geode/management/internal/cli/functions/RegionCreateFunction.java
@@ -44,12 +44,14 @@ import org.apache.geode.compression.Compressor;
 import org.apache.geode.internal.ClassPathLoader;
 import org.apache.geode.internal.cache.InternalCache;
 import org.apache.geode.internal.cache.execute.InternalFunction;
+import org.apache.geode.internal.cache.xmlcache.CacheXml;
 import org.apache.geode.internal.logging.LogService;
 import org.apache.geode.management.internal.cli.CliUtil;
 import org.apache.geode.management.internal.cli.commands.RegionCommandsUtils;
 import org.apache.geode.management.internal.cli.domain.ClassName;
 import org.apache.geode.management.internal.cli.i18n.CliStrings;
 import org.apache.geode.management.internal.cli.util.RegionPath;
+import org.apache.geode.management.internal.configuration.domain.XmlEntity;
 
 /**
  *
@@ -93,9 +95,9 @@ public class RegionCreateFunction implements InternalFunction {
 
     try {
       Region<?, ?> createdRegion = createRegion(cache, regionCreateArgs);
-
+      XmlEntity xmlEntity = getXmlEntityForRegion(createdRegion);
       resultSender
-          .lastResult(new CliFunctionResult(memberNameOrId, CliFunctionResult.StatusState.OK,
+          .lastResult(new CliFunctionResult(memberNameOrId, xmlEntity.getXmlDefinition(),
               CliStrings.format(CliStrings.CREATE_REGION__MSG__REGION_0_CREATED_ON_1,
                   createdRegion.getFullPath(), memberNameOrId)));
     } catch (IllegalStateException e) {
@@ -124,6 +126,15 @@ public class RegionCreateFunction implements InternalFunction {
     }
   }
 
+  private XmlEntity getXmlEntityForRegion(Region<?, ?> region) {
+    Region<?, ?> curRegion = region;
+    while (curRegion != null && curRegion.getParentRegion() != null) {
+      curRegion = curRegion.getParentRegion();
+    }
+
+    return new XmlEntity(CacheXml.REGION, "name", curRegion.getName());
+  }
+
   private CliFunctionResult handleException(final String memberNameOrId, final String exceptionMsg,
       final Exception e) {
     if (e != null && logger.isDebugEnabled()) {
diff --git a/geode-core/src/test/java/org/apache/geode/internal/config/JAXBServiceTest.java b/geode-core/src/test/java/org/apache/geode/internal/config/JAXBServiceTest.java
index 67f0807..c39866a 100644
--- a/geode-core/src/test/java/org/apache/geode/internal/config/JAXBServiceTest.java
+++ b/geode-core/src/test/java/org/apache/geode/internal/config/JAXBServiceTest.java
@@ -137,6 +137,28 @@ public class JAXBServiceTest {
   }
 
   @Test
+  public void unmarshallPartialElement() {
+    String xml = "<region name=\"one\">\n"
+        + "        <region-attributes scope=\"distributed-ack\" data-policy=\"replicate\"/>\n"
+        + "    </region>";
+
+    RegionConfig config = service2.unMarshall(xml, RegionConfig.class);
+    assertThat(config.getName()).isEqualTo("one");
+  }
+
+  @Test
+  public void unmarshallAnyElement() {
+    String xml = "<region name=\"one\">\n"
+        + "        <region-attributes scope=\"distributed-ack\" data-policy=\"replicate\"/>\n"
+        + "        <custom:any xmlns:custom=\"http://geode.apache.org/schema/custom\" id=\"any\"/>"
+        + "    </region>";
+
+    RegionConfig config = service2.unMarshall(xml, RegionConfig.class);
+    assertThat(config.getName()).isEqualTo("one");
+    assertThat(config.getCustomRegionElements()).hasSize(1);
+  }
+
+  @Test
   public void unmarshallIgnoresUnknownProperties() {
     // say xml has a type attribute that is removed in the new version
     String existingXML = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n"
diff --git a/geode-lucene/src/distributedTest/java/org/apache/geode/cache/lucene/internal/configuration/LuceneClusterConfigurationDUnitTest.java b/geode-lucene/src/distributedTest/java/org/apache/geode/cache/lucene/internal/configuration/LuceneClusterConfigurationDUnitTest.java
index 98c7169..e05b15a 100644
--- a/geode-lucene/src/distributedTest/java/org/apache/geode/cache/lucene/internal/configuration/LuceneClusterConfigurationDUnitTest.java
+++ b/geode-lucene/src/distributedTest/java/org/apache/geode/cache/lucene/internal/configuration/LuceneClusterConfigurationDUnitTest.java
@@ -267,10 +267,10 @@ public class LuceneClusterConfigurationDUnitTest {
       Configuration config = sc.getConfiguration(ConfigurationPersistenceService.CLUSTER_CONFIG);
       String xmlContent = config.getCacheXmlContent();
       String luceneIndex0Config = "<" + LuceneXmlConstants.PREFIX + ":" + LuceneXmlConstants.INDEX
-          + " xmlns:lucene=\"" + LuceneXmlConstants.NAMESPACE + "\" " + LuceneXmlConstants.NAME
+          + " " + LuceneXmlConstants.NAME
           + "=\"" + INDEX_NAME + "0" + "\">";
       String luceneIndex1Config = "<" + LuceneXmlConstants.PREFIX + ":" + LuceneXmlConstants.INDEX
-          + " xmlns:lucene=\"" + LuceneXmlConstants.NAMESPACE + "\" " + LuceneXmlConstants.NAME
+          + " " + LuceneXmlConstants.NAME
           + "=\"" + INDEX_NAME + "1" + "\">";
       if (verifyIndexesExist) {
         assertThat(xmlContent).contains(luceneIndex0Config);
diff --git a/geode-lucene/src/main/java/org/apache/geode/cache/lucene/internal/cli/functions/LuceneCreateIndexFunction.java b/geode-lucene/src/main/java/org/apache/geode/cache/lucene/internal/cli/functions/LuceneCreateIndexFunction.java
index 4c2c3cd..e789ec0 100644
--- a/geode-lucene/src/main/java/org/apache/geode/cache/lucene/internal/cli/functions/LuceneCreateIndexFunction.java
+++ b/geode-lucene/src/main/java/org/apache/geode/cache/lucene/internal/cli/functions/LuceneCreateIndexFunction.java
@@ -103,7 +103,7 @@ public class LuceneCreateIndexFunction implements InternalFunction {
       if (LuceneServiceImpl.LUCENE_REINDEX) {
         indexFactory.create(indexName, regionPath, true);
         if (cache.getRegion(regionPath) != null) {
-          xmlEntity = getXmlEntity(indexName, regionPath);
+          xmlEntity = getXmlEntity(regionPath);
         }
       } else {
         indexFactory.create(indexName, regionPath, false);
@@ -117,7 +117,7 @@ public class LuceneCreateIndexFunction implements InternalFunction {
     }
   }
 
-  protected XmlEntity getXmlEntity(String indexName, String regionPath) {
+  protected XmlEntity getXmlEntity(String regionPath) {
     String regionName = StringUtils.stripStart(regionPath, "/");
     return new XmlEntity(CacheXml.REGION, "name", regionName);
   }
diff --git a/geode-lucene/src/main/java/org/apache/geode/cache/lucene/management/configuration/Index.java b/geode-lucene/src/main/java/org/apache/geode/cache/lucene/management/configuration/Index.java
new file mode 100644
index 0000000..b87ed42
--- /dev/null
+++ b/geode-lucene/src/main/java/org/apache/geode/cache/lucene/management/configuration/Index.java
@@ -0,0 +1,237 @@
+
+/*
+ * 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.cache.lucene.management.configuration;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlAttribute;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlRootElement;
+import javax.xml.bind.annotation.XmlType;
+
+import org.apache.geode.cache.configuration.CacheElement;
+import org.apache.geode.cache.configuration.DeclarableType;
+import org.apache.geode.cache.configuration.XSDRootElement;
+
+
+/**
+ * <p>
+ * Java class for anonymous complex type.
+ *
+ * <p>
+ * The following schema fragment specifies the expected content contained within this class.
+ *
+ * <pre>
+ * &lt;complexType>
+ *   &lt;complexContent>
+ *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+ *       &lt;sequence>
+ *         &lt;element name="field" maxOccurs="unbounded">
+ *           &lt;complexType>
+ *             &lt;complexContent>
+ *               &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+ *                 &lt;attribute name="name" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *                 &lt;attribute name="analyzer" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *               &lt;/restriction>
+ *             &lt;/complexContent>
+ *           &lt;/complexType>
+ *         &lt;/element>
+ *         &lt;element name="serializer" type="{http://geode.apache.org/schema/cache}declarable-type" minOccurs="0"/>
+ *       &lt;/sequence>
+ *       &lt;attribute name="name" type="{http://www.w3.org/2001/XMLSchema}string" />
+ *     &lt;/restriction>
+ *   &lt;/complexContent>
+ * &lt;/complexType>
+ * </pre>
+ *
+ *
+ */
+@XmlAccessorType(XmlAccessType.FIELD)
+@XmlType(name = "", propOrder = {
+    "field",
+    "serializer"
+})
+@XmlRootElement(name = "index", namespace = "http://geode.apache.org/schema/lucene")
+@XSDRootElement(namespace = "http://geode.apache.org/schema/lucene",
+    schemaLocation = "http://geode.apache.org/schema/lucene/lucene-1.0.xsd")
+public class Index implements CacheElement {
+  @XmlElement(namespace = "http://geode.apache.org/schema/lucene", required = true)
+  protected List<Index.Field> field;
+  @XmlElement(namespace = "http://geode.apache.org/schema/lucene")
+  protected DeclarableType serializer;
+  @XmlAttribute(name = "name")
+  protected String name;
+
+  /**
+   * Gets the value of the field property.
+   *
+   * <p>
+   * This accessor method returns a reference to the live list,
+   * not a snapshot. Therefore any modification you make to the
+   * returned list will be present inside the JAXB object.
+   * This is why there is not a <CODE>set</CODE> method for the field property.
+   *
+   * <p>
+   * For example, to add a new item, do as follows:
+   *
+   * <pre>
+   * getField().add(newItem);
+   * </pre>
+   *
+   *
+   * <p>
+   * Objects of the following type(s) are allowed in the list
+   * {@link Index.Field }
+   *
+   *
+   */
+  public List<Index.Field> getField() {
+    if (field == null) {
+      field = new ArrayList<Index.Field>();
+    }
+    return this.field;
+  }
+
+  /**
+   * Gets the value of the serializer property.
+   *
+   * possible object is
+   * {@link DeclarableType }
+   *
+   */
+  public DeclarableType getSerializer() {
+    return serializer;
+  }
+
+  /**
+   * Sets the value of the serializer property.
+   *
+   * allowed object is
+   * {@link DeclarableType }
+   *
+   */
+  public void setSerializer(DeclarableType value) {
+    this.serializer = value;
+  }
+
+  /**
+   * Gets the value of the name property.
+   *
+   * possible object is
+   * {@link String }
+   *
+   */
+  public String getName() {
+    return name;
+  }
+
+  /**
+   * Sets the value of the name property.
+   *
+   * allowed object is
+   * {@link String }
+   *
+   */
+  public void setName(String value) {
+    this.name = value;
+  }
+
+  @Override
+  public String getId() {
+    return getName();
+  }
+
+
+  /**
+   * <p>
+   * Java class for anonymous complex type.
+   *
+   * <p>
+   * The following schema fragment specifies the expected content contained within this class.
+   *
+   * <pre>
+   * &lt;complexType>
+   *   &lt;complexContent>
+   *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+   *       &lt;attribute name="name" type="{http://www.w3.org/2001/XMLSchema}string" />
+   *       &lt;attribute name="analyzer" type="{http://www.w3.org/2001/XMLSchema}string" />
+   *     &lt;/restriction>
+   *   &lt;/complexContent>
+   * &lt;/complexType>
+   * </pre>
+   *
+   *
+   */
+  @XmlAccessorType(XmlAccessType.FIELD)
+  @XmlType(name = "")
+  public static class Field {
+
+    @XmlAttribute(name = "name")
+    protected String name;
+    @XmlAttribute(name = "analyzer")
+    protected String analyzer;
+
+    /**
+     * Gets the value of the name property.
+     *
+     * possible object is
+     * {@link String }
+     *
+     */
+    public String getName() {
+      return name;
+    }
+
+    /**
+     * Sets the value of the name property.
+     *
+     * allowed object is
+     * {@link String }
+     *
+     */
+    public void setName(String value) {
+      this.name = value;
+    }
+
+    /**
+     * Gets the value of the analyzer property.
+     *
+     * possible object is
+     * {@link String }
+     *
+     */
+    public String getAnalyzer() {
+      return analyzer;
+    }
+
+    /**
+     * Sets the value of the analyzer property.
+     *
+     * allowed object is
+     * {@link String }
+     *
+     */
+    public void setAnalyzer(String value) {
+      this.analyzer = value;
+    }
+
+  }
+
+}
diff --git a/geode-lucene/src/main/java/org/apache/geode/cache/lucene/management/configuration/package-info.java b/geode-lucene/src/main/java/org/apache/geode/cache/lucene/management/configuration/package-info.java
new file mode 100644
index 0000000..2d2c0f1
--- /dev/null
+++ b/geode-lucene/src/main/java/org/apache/geode/cache/lucene/management/configuration/package-info.java
@@ -0,0 +1,22 @@
+/*
+ * 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.
+ */
+
+@XmlSchema(namespace = "http://geode.apache.org/schema/lucene",
+    xmlns = {@XmlNs(prefix = "lucene", namespaceURI = "http://geode.apache.org/schema/lucene")},
+    elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED)
+package org.apache.geode.cache.lucene.management.configuration;
+
+import javax.xml.bind.annotation.XmlNs;
+import javax.xml.bind.annotation.XmlSchema;
diff --git a/geode-lucene/src/main/resources/org/apache/geode/internal/sanctioned-geode-lucene-serializables.txt b/geode-lucene/src/main/resources/org/apache/geode/internal/sanctioned-geode-lucene-serializables.txt
index 4f0a2b2..491a993 100755
--- a/geode-lucene/src/main/resources/org/apache/geode/internal/sanctioned-geode-lucene-serializables.txt
+++ b/geode-lucene/src/main/resources/org/apache/geode/internal/sanctioned-geode-lucene-serializables.txt
@@ -2,6 +2,7 @@ org/apache/geode/cache/lucene/LuceneIndexDestroyedException,false,indexName:java
 org/apache/geode/cache/lucene/LuceneIndexExistsException,false,indexName:java/lang/String,regionPath:java/lang/String
 org/apache/geode/cache/lucene/LuceneIndexNotFoundException,false,indexName:java/lang/String,regionPath:java/lang/String
 org/apache/geode/cache/lucene/LuceneQueryException,false
+org/apache/geode/cache/lucene/management/configuration/Index,false,field:java/util/List,name:java/lang/String,serializer:org/apache/geode/cache/configuration/DeclarableType
 org/apache/geode/cache/lucene/internal/LuceneIndexCreationInProgressException,false
 org/apache/geode/cache/lucene/internal/cli/LuceneDestroyIndexInfo,false,definedDestroyOnly:boolean
 org/apache/geode/cache/lucene/internal/cli/LuceneFunctionSerializable,false,indexName:java/lang/String,regionPath:java/lang/String