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/05 23:15:50 UTC
[geode] branch develop updated: GEODE-5971: JaxbService should be
able to unmarshall older namespace xml (#2951)
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 ad3a082 GEODE-5971: JaxbService should be able to unmarshall older namespace xml (#2951)
ad3a082 is described below
commit ad3a08295cca7c15c1350f52af4c3436e2da9e4c
Author: jinmeiliao <ji...@pivotal.io>
AuthorDate: Wed Dec 5 15:15:40 2018 -0800
GEODE-5971: JaxbService should be able to unmarshall older namespace xml (#2951)
---
.../geode/cache/configuration/CacheConfig.java | 5 ++-
.../apache/geode/internal/config/JAXBService.java | 16 +++++++-
.../geode/internal/config/NameSpaceFilter.java | 43 ++++++++++++++++++++++
.../geode/internal/config/VersionAdapter.java | 30 +++++++++++++++
.../geode/internal/config/JAXBServiceTest.java | 31 ++++++++++++++++
5 files changed, 122 insertions(+), 3 deletions(-)
diff --git a/geode-core/src/main/java/org/apache/geode/cache/configuration/CacheConfig.java b/geode-core/src/main/java/org/apache/geode/cache/configuration/CacheConfig.java
index c1c59f8..ec23dac 100644
--- a/geode-core/src/main/java/org/apache/geode/cache/configuration/CacheConfig.java
+++ b/geode-core/src/main/java/org/apache/geode/cache/configuration/CacheConfig.java
@@ -31,13 +31,13 @@ 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 javax.xml.bind.annotation.adapters.CollapsedStringAdapter;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
import org.w3c.dom.Element;
import org.apache.geode.annotations.Experimental;
import org.apache.geode.cache.Region;
+import org.apache.geode.internal.config.VersionAdapter;
/**
@@ -328,12 +328,13 @@ public class CacheConfig {
@XmlAttribute(name = "search-timeout")
protected String searchTimeout;
@XmlAttribute(name = "version", required = true)
- @XmlJavaTypeAdapter(CollapsedStringAdapter.class)
+ @XmlJavaTypeAdapter(VersionAdapter.class)
protected String version;
public CacheConfig() {}
public CacheConfig(String version) {
+
this.version = version;
}
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 9f3af69..6927d2f 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
@@ -28,11 +28,15 @@ import javax.xml.XMLConstants;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;
+import javax.xml.transform.sax.SAXSource;
import javax.xml.validation.Schema;
import javax.xml.validation.SchemaFactory;
import org.apache.commons.lang3.StringUtils;
+import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
+import org.xml.sax.XMLReader;
+import org.xml.sax.helpers.XMLReaderFactory;
import org.apache.geode.cache.configuration.XSDRootElement;
import org.apache.geode.internal.ClassPathLoader;
@@ -93,9 +97,19 @@ public class JAXBService {
public <T> T unMarshall(String xml) {
try {
- return (T) unmarshaller.unmarshal(new StringReader(xml));
+ 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);
+
+ return (T) unmarshaller.unmarshal(source);
} catch (Exception e) {
throw new RuntimeException(e.getMessage(), e);
}
}
+
+
}
diff --git a/geode-core/src/main/java/org/apache/geode/internal/config/NameSpaceFilter.java b/geode-core/src/main/java/org/apache/geode/internal/config/NameSpaceFilter.java
new file mode 100644
index 0000000..a31546b
--- /dev/null
+++ b/geode-core/src/main/java/org/apache/geode/internal/config/NameSpaceFilter.java
@@ -0,0 +1,43 @@
+/*
+ * 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.config;
+
+import org.xml.sax.Attributes;
+import org.xml.sax.SAXException;
+import org.xml.sax.helpers.XMLFilterImpl;
+
+import org.apache.geode.internal.cache.xmlcache.CacheXml;
+
+public class NameSpaceFilter extends XMLFilterImpl {
+
+ @Override
+ public void startDocument() throws SAXException {
+ super.startDocument();
+ }
+
+ /**
+ * be able to handle no namespace or older namespace
+ */
+ @Override
+ public void startElement(String uri, String localName, String qName,
+ Attributes atts) throws SAXException {
+ if ("".equals(uri) || CacheXml.GEMFIRE_NAMESPACE.equals(uri)) {
+ uri = CacheXml.GEODE_NAMESPACE;
+ }
+ super.startElement(uri, localName, qName, atts);
+ }
+
+}
diff --git a/geode-core/src/main/java/org/apache/geode/internal/config/VersionAdapter.java b/geode-core/src/main/java/org/apache/geode/internal/config/VersionAdapter.java
new file mode 100644
index 0000000..15fd53c
--- /dev/null
+++ b/geode-core/src/main/java/org/apache/geode/internal/config/VersionAdapter.java
@@ -0,0 +1,30 @@
+/*
+ * 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.config;
+
+import javax.xml.bind.annotation.adapters.XmlAdapter;
+
+public class VersionAdapter extends XmlAdapter<String, String> {
+ @Override
+ public String unmarshal(String v) throws Exception {
+ return "1.0";
+ }
+
+ @Override
+ public String marshal(String v) throws Exception {
+ return v;
+ }
+}
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 311022a..67f0807 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
@@ -153,6 +153,37 @@ public class JAXBServiceTest {
assertThat(elements.get(0)).isInstanceOf(ElementOne.class);
}
+ @Test
+ public void marshalOlderNameSpace() {
+ String xml =
+ "<cache xsi:schemaLocation=\"http://schema.pivotal.io/gemfire/cache http://schema.pivotal.io/gemfire/cache/cache-8.1.xsd\"\n"
+ +
+ " version=\"8.1\"\n" +
+ " xmlns=\"http://schema.pivotal.io/gemfire/cache\"\n" +
+ " xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">\n" +
+ " <region name=\"one\">\n" +
+ " <region-attributes scope=\"distributed-ack\" data-policy=\"replicate\"/>\n" +
+ " </region>\n" +
+ "</cache>";
+
+ CacheConfig cacheConfig = service2.unMarshall(xml);
+ assertThat(cacheConfig.getRegions()).hasSize(1);
+ assertThat(cacheConfig.getRegions().get(0).getName()).isEqualTo("one");
+ }
+
+ @Test
+ public void marshallNoNameSpace() {
+ String xml = "<cache version=\"1.0\">\n" +
+ " <region name=\"one\">\n" +
+ " <region-attributes scope=\"distributed-ack\" data-policy=\"replicate\"/>\n" +
+ " </region>\n" +
+ "</cache>";
+
+ CacheConfig cacheConfig = service2.unMarshall(xml);
+ assertThat(cacheConfig.getRegions()).hasSize(1);
+ assertThat(cacheConfig.getRegions().get(0).getName()).isEqualTo("one");
+ }
+
public static void setBasicValues(CacheConfig cache) {
cache.setCopyOnRead(true);
CacheConfig.GatewayReceiver receiver = new CacheConfig.GatewayReceiver();