This is an automated email from the ASF dual-hosted git repository.
dschneider pushed a commit to branch feature/GEODE-6291
in repository https://gitbox.apache.org/repos/asf/geode.git
The following commit(s) were added to refs/heads/feature/GEODE-6291 by this
push:
new 1fcae0f added field-mapping subelement to region-mapping in xsd
1fcae0f is described below
commit 1fcae0f21c5945bad0f3d6160a882015395e07d1
Author: Darrel Schneider <[email protected]>
AuthorDate: Fri Jan 18 15:31:13 2019 -0800
added field-mapping subelement to region-mapping in xsd
---
.../geode/connectors/jdbc/internal/SqlHandler.java | 4 +-
.../jdbc/internal/SqlToPdxInstanceCreator.java | 2 +-
.../jdbc/internal/cli/CreateMappingCommand.java | 4 +-
.../jdbc/internal/configuration/FieldMapping.java | 122 ++++++++++++
.../jdbc/internal/configuration/RegionMapping.java | 209 +++++++++++++--------
.../connectors/jdbc/internal/xml/ElementType.java | 21 +++
.../xml/JdbcConnectorServiceXmlParser.java | 5 +-
.../geode.apache.org/schema/jdbc/jdbc-1.0.xsd | 14 ++
.../jdbc/internal/RegionMappingTest.java | 147 +++------------
.../connectors/jdbc/internal/SqlHandlerTest.java | 58 +++---
.../jdbc/internal/SqlToPdxInstanceCreatorTest.java | 48 ++---
.../jdbc/internal/xml/ElementTypeTest.java | 46 ++++-
12 files changed, 423 insertions(+), 257 deletions(-)
diff --git
a/geode-connectors/src/main/java/org/apache/geode/connectors/jdbc/internal/SqlHandler.java
b/geode-connectors/src/main/java/org/apache/geode/connectors/jdbc/internal/SqlHandler.java
index 799fd95..7185b6c 100644
---
a/geode-connectors/src/main/java/org/apache/geode/connectors/jdbc/internal/SqlHandler.java
+++
b/geode-connectors/src/main/java/org/apache/geode/connectors/jdbc/internal/SqlHandler.java
@@ -273,7 +273,7 @@ public class SqlHandler {
+ keyColumnNames.size() + " fields but has " + fieldNames.size() +
" fields.");
}
for (String fieldName : fieldNames) {
- String columnName = regionMapping.getColumnNameForField(fieldName,
tableMetaData);
+ String columnName = regionMapping.getColumnNameForField(fieldName);
if (!keyColumnNames.contains(columnName)) {
throw new JdbcConnectorException("The key \"" + key + "\" has the
field \"" + fieldName
+ "\" which does not match any of the key columns: " +
keyColumnNames);
@@ -290,7 +290,7 @@ public class SqlHandler {
RegionMapping regionMapping, PdxInstance value) {
List<ColumnData> result = new ArrayList<>();
for (String fieldName : value.getFieldNames()) {
- String columnName = regionMapping.getColumnNameForField(fieldName,
tableMetaData);
+ String columnName = regionMapping.getColumnNameForField(fieldName);
if (tableMetaData.getKeyColumnNames().contains(columnName)) {
continue;
}
diff --git
a/geode-connectors/src/main/java/org/apache/geode/connectors/jdbc/internal/SqlToPdxInstanceCreator.java
b/geode-connectors/src/main/java/org/apache/geode/connectors/jdbc/internal/SqlToPdxInstanceCreator.java
index aa4f3ae..335dd85 100644
---
a/geode-connectors/src/main/java/org/apache/geode/connectors/jdbc/internal/SqlToPdxInstanceCreator.java
+++
b/geode-connectors/src/main/java/org/apache/geode/connectors/jdbc/internal/SqlToPdxInstanceCreator.java
@@ -55,7 +55,7 @@ class SqlToPdxInstanceCreator {
final int columnCount = metaData.getColumnCount();
for (int i = 1; i <= columnCount; i++) {
String columnName = metaData.getColumnName(i);
- String fieldName = regionMapping.getFieldNameForColumn(columnName,
typeRegistry);
+ String fieldName = regionMapping.getFieldNameForColumn(columnName);
FieldType fieldType = getFieldType(typeRegistry, fieldName);
writeField(columnName, i, fieldName, fieldType);
}
diff --git
a/geode-connectors/src/main/java/org/apache/geode/connectors/jdbc/internal/cli/CreateMappingCommand.java
b/geode-connectors/src/main/java/org/apache/geode/connectors/jdbc/internal/cli/CreateMappingCommand.java
index e3764a5..1f9d475 100644
---
a/geode-connectors/src/main/java/org/apache/geode/connectors/jdbc/internal/cli/CreateMappingCommand.java
+++
b/geode-connectors/src/main/java/org/apache/geode/connectors/jdbc/internal/cli/CreateMappingCommand.java
@@ -134,8 +134,8 @@ public class CreateMappingCommand extends SingleGfshCommand
{
// The field mapping will have the following:
// 1. pdx field name
// 2. pdx field type (an instance of org.apache.geode.pdx.FieldType)
- // 3. sql column name
- // 4. sql column type (an instance of java.sql.JDBCType)
+ // 3. jdbc column name
+ // 4. jdbc column type (an instance of java.sql.JDBCType)
// action
Object[] arguments = new Object[] {mapping, synchronous};
diff --git
a/geode-connectors/src/main/java/org/apache/geode/connectors/jdbc/internal/configuration/FieldMapping.java
b/geode-connectors/src/main/java/org/apache/geode/connectors/jdbc/internal/configuration/FieldMapping.java
new file mode 100644
index 0000000..3b633c4
--- /dev/null
+++
b/geode-connectors/src/main/java/org/apache/geode/connectors/jdbc/internal/configuration/FieldMapping.java
@@ -0,0 +1,122 @@
+/*
+ * 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.connectors.jdbc.internal.configuration;
+
+import java.io.Serializable;
+
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlAttribute;
+
+@SuppressWarnings("serial")
+@XmlAccessorType(XmlAccessType.FIELD)
+public class FieldMapping implements Serializable {
+ @Override
+ public String toString() {
+ return "FieldMapping [pdxName=" + pdxName + ", pdxType=" + pdxType + ",
jdbcName=" + jdbcName
+ + ", jdbcType=" + jdbcType + "]";
+ }
+
+ @XmlAttribute(name = "pdx-name")
+ private String pdxName;
+ @XmlAttribute(name = "pdx-type")
+ private String pdxType;
+ @XmlAttribute(name = "jdbc-name")
+ private String jdbcName;
+ @XmlAttribute(name = "jdbc-type")
+ private String jdbcType;
+
+ public FieldMapping() {}
+
+ public FieldMapping(String pdxName, String pdxType, String jdbcName, String
jdbcType) {
+ this.pdxName = pdxName;
+ this.pdxType = pdxType;
+ this.jdbcName = jdbcName;
+ this.jdbcType = jdbcType;
+ }
+
+ public String getPdxName() {
+ return pdxName;
+ }
+
+ public void setPdxName(String value) {
+ this.pdxName = value;
+ }
+
+ public String getJdbcName() {
+ return jdbcName;
+ }
+
+ public void setJdbcName(String value) {
+ this.jdbcName = value;
+ }
+
+ @Override
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((jdbcName == null) ? 0 : jdbcName.hashCode());
+ result = prime * result + ((jdbcType == null) ? 0 : jdbcType.hashCode());
+ result = prime * result + ((pdxName == null) ? 0 : pdxName.hashCode());
+ result = prime * result + ((pdxType == null) ? 0 : pdxType.hashCode());
+ return result;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj) {
+ return true;
+ }
+ if (obj == null) {
+ return false;
+ }
+ if (getClass() != obj.getClass()) {
+ return false;
+ }
+ FieldMapping other = (FieldMapping) obj;
+ if (jdbcName == null) {
+ if (other.jdbcName != null) {
+ return false;
+ }
+ } else if (!jdbcName.equals(other.jdbcName)) {
+ return false;
+ }
+ if (jdbcType == null) {
+ if (other.jdbcType != null) {
+ return false;
+ }
+ } else if (!jdbcType.equals(other.jdbcType)) {
+ return false;
+ }
+ if (pdxName == null) {
+ if (other.pdxName != null) {
+ return false;
+ }
+ } else if (!pdxName.equals(other.pdxName)) {
+ return false;
+ }
+ if (pdxType == null) {
+ if (other.pdxType != null) {
+ return false;
+ }
+ } else if (!pdxType.equals(other.pdxType)) {
+ return false;
+ }
+ return true;
+ }
+
+}
diff --git
a/geode-connectors/src/main/java/org/apache/geode/connectors/jdbc/internal/configuration/RegionMapping.java
b/geode-connectors/src/main/java/org/apache/geode/connectors/jdbc/internal/configuration/RegionMapping.java
index cc668df..f80606a 100644
---
a/geode-connectors/src/main/java/org/apache/geode/connectors/jdbc/internal/configuration/RegionMapping.java
+++
b/geode-connectors/src/main/java/org/apache/geode/connectors/jdbc/internal/configuration/RegionMapping.java
@@ -14,14 +14,15 @@
*/
package org.apache.geode.connectors.jdbc.internal.configuration;
-import java.util.HashSet;
+import java.util.ArrayList;
+import java.util.HashMap;
import java.util.List;
-import java.util.Set;
-import java.util.stream.Collectors;
+import java.util.Map;
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.XmlTransient;
import javax.xml.bind.annotation.XmlType;
@@ -30,9 +31,6 @@ import org.apache.geode.annotations.Experimental;
import org.apache.geode.cache.configuration.CacheElement;
import org.apache.geode.cache.configuration.XSDRootElement;
import org.apache.geode.connectors.jdbc.JdbcConnectorException;
-import org.apache.geode.connectors.jdbc.internal.TableMetaDataView;
-import org.apache.geode.pdx.internal.PdxType;
-import org.apache.geode.pdx.internal.TypeRegistry;
/**
* <p>
@@ -45,6 +43,20 @@ import org.apache.geode.pdx.internal.TypeRegistry;
* <complexType>
* <complexContent>
* <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+ * <sequence>
+ * <element name="field-mapping" maxOccurs="unbounded"
minOccurs="0">
+ * <complexType>
+ * <simpleContent>
+ * <extension
base="<http://www.w3.org/2001/XMLSchema>string">
+ * <attribute name="pdx-name"
type="{http://www.w3.org/2001/XMLSchema}string" />
+ * <attribute name="pdx-type"
type="{http://www.w3.org/2001/XMLSchema}string" />
+ * <attribute name="jdbc-name"
type="{http://www.w3.org/2001/XMLSchema}string" />
+ * <attribute name="jdbc-type"
type="{http://www.w3.org/2001/XMLSchema}string" />
+ * </extension>
+ * </simpleContent>
+ * </complexType>
+ * </element>
+ * </sequence>
* <attribute name="data-source"
type="{http://www.w3.org/2001/XMLSchema}string" />
* <attribute name="table"
type="{http://www.w3.org/2001/XMLSchema}string" />
* <attribute name="pdx-name"
type="{http://www.w3.org/2001/XMLSchema}string" />
@@ -59,12 +71,18 @@ import org.apache.geode.pdx.internal.TypeRegistry;
*/
@Experimental
@XmlAccessorType(XmlAccessType.FIELD)
-@XmlType(name = "")
+@XmlType(name = "", propOrder = {"fieldMapping"})
@XmlRootElement(name = "mapping", namespace =
"http://geode.apache.org/schema/jdbc")
@XSDRootElement(namespace = "http://geode.apache.org/schema/jdbc",
schemaLocation = "http://geode.apache.org/schema/jdbc/jdbc-1.0.xsd")
public class RegionMapping implements CacheElement {
+ @XmlElement(name = "field-mapping", namespace =
"http://geode.apache.org/schema/jdbc")
+ protected final List<FieldMapping> fieldMappings = new ArrayList<>();
+ @XmlTransient
+ private final Map<String, FieldMapping> pdxToFieldMappings = new HashMap<>();
+ @XmlTransient
+ private final Map<String, FieldMapping> jdbcToFieldMappings = new
HashMap<>();
@XmlAttribute(name = "data-source")
protected String dataSourceName;
@XmlAttribute(name = "table")
@@ -152,88 +170,117 @@ public class RegionMapping implements CacheElement {
return tableName;
}
- public String getColumnNameForField(String fieldName, TableMetaDataView
tableMetaDataView) {
- Set<String> columnNames = tableMetaDataView.getColumnNames();
- if (columnNames.contains(fieldName)) {
- return fieldName;
- }
-
- List<String> ignoreCaseMatch = columnNames.stream().filter(c ->
c.equalsIgnoreCase(fieldName))
- .collect(Collectors.toList());
- if (ignoreCaseMatch.size() > 1) {
- throw new JdbcConnectorException(
- "The SQL table has at least two columns that match the PDX field: "
+ fieldName);
- }
-
- if (ignoreCaseMatch.size() == 1) {
- return ignoreCaseMatch.get(0);
- }
-
- // there is no match either in the configured mapping or the table columns
- return fieldName;
+ public void addFieldMapping(FieldMapping value) {
+ this.fieldMappings.add(value);
+ this.pdxToFieldMappings.put(value.getPdxName(), value);
+ this.jdbcToFieldMappings.put(value.getJdbcName(), value);
}
- public String getFieldNameForColumn(String columnName, TypeRegistry
typeRegistry) {
- Set<PdxType> pdxTypes = getPdxTypesForClassName(typeRegistry);
- String fieldName = findExactMatch(columnName, pdxTypes);
- if (fieldName == null) {
- fieldName = findCaseInsensitiveMatch(columnName, pdxTypes);
- }
- return fieldName;
+ public FieldMapping getFieldMappingByPdxName(String pdxName) {
+ return this.pdxToFieldMappings.get(pdxName);
}
- private Set<PdxType> getPdxTypesForClassName(TypeRegistry typeRegistry) {
- Set<PdxType> pdxTypes = typeRegistry.getPdxTypesForClassName(getPdxName());
- if (pdxTypes.isEmpty()) {
- throw new JdbcConnectorException(
- "The class " + getPdxName() + " has not been pdx serialized.");
- }
- return pdxTypes;
+ public FieldMapping getFieldMappingByJdbcName(String jdbcName) {
+ return this.jdbcToFieldMappings.get(jdbcName);
}
- /**
- * Given a column name and a set of pdx types, find the field name in those
types that match,
- * ignoring case, the column name.
- *
- * @return the matching field name or null if no match
- * @throws JdbcConnectorException if no fields match
- * @throws JdbcConnectorException if more than one field matches
- */
- private String findCaseInsensitiveMatch(String columnName, Set<PdxType>
pdxTypes) {
- HashSet<String> matchingFieldNames = new HashSet<>();
- for (PdxType pdxType : pdxTypes) {
- for (String existingFieldName : pdxType.getFieldNames()) {
- if (existingFieldName.equalsIgnoreCase(columnName)) {
- matchingFieldNames.add(existingFieldName);
- }
- }
- }
- if (matchingFieldNames.isEmpty()) {
- throw new JdbcConnectorException("The class " + getPdxName()
- + " does not have a field that matches the column " + columnName);
- } else if (matchingFieldNames.size() > 1) {
- throw new JdbcConnectorException(
- "Could not determine what pdx field to use for the column name " +
columnName
- + " because the pdx fields " + matchingFieldNames + " all match
it.");
+ public String getColumnNameForField(String fieldName) {
+ FieldMapping fieldMapping = getFieldMappingByPdxName(fieldName);
+ if (fieldMapping != null) {
+ return fieldMapping.getJdbcName();
}
- return matchingFieldNames.iterator().next();
+ throw new JdbcConnectorException(
+ "A field mapping for the pdx field \"" + fieldName + "\" does not
exist.");
+ // TODO use this code when we create the field mapping
+ // Set<String> columnNames = tableMetaDataView.getColumnNames();
+ // if (columnNames.contains(fieldName)) {
+ // return fieldName;
+ // }
+ //
+ // List<String> ignoreCaseMatch = columnNames.stream().filter(c ->
+ // c.equalsIgnoreCase(fieldName))
+ // .collect(Collectors.toList());
+ // if (ignoreCaseMatch.size() > 1) {
+ // throw new JdbcConnectorException(
+ // "The SQL table has at least two columns that match the PDX field: " +
fieldName);
+ // }
+ //
+ // if (ignoreCaseMatch.size() == 1) {
+ // return ignoreCaseMatch.get(0);
+ // }
+ //
+ // // there is no match either in the configured mapping or the table
columns
+ // return fieldName;
}
- /**
- * Given a column name, search the given pdxTypes for a field whose name
exactly matches the
- * column name.
- *
- * @return the matching field name or null if no match
- */
- private String findExactMatch(String columnName, Set<PdxType> pdxTypes) {
- for (PdxType pdxType : pdxTypes) {
- if (pdxType.getPdxField(columnName) != null) {
- return columnName;
- }
+ public String getFieldNameForColumn(String columnName) {
+ FieldMapping fieldMapping = getFieldMappingByJdbcName(columnName);
+ if (fieldMapping != null) {
+ return fieldMapping.getPdxName();
}
- return null;
+ throw new JdbcConnectorException(
+ "A field mapping for the column \"" + columnName + "\" does not
exist.");
+ // TODO use the following code when we create the mapping
+ // Set<PdxType> pdxTypes = getPdxTypesForClassName(typeRegistry);
+ // String fieldName = findExactMatch(columnName, pdxTypes);
+ // if (fieldName == null) {
+ // fieldName = findCaseInsensitiveMatch(columnName, pdxTypes);
+ // }
+ // return fieldName;
}
+ // private Set<PdxType> getPdxTypesForClassName(TypeRegistry typeRegistry) {
+ // Set<PdxType> pdxTypes =
typeRegistry.getPdxTypesForClassName(getPdxName());
+ // if (pdxTypes.isEmpty()) {
+ // throw new JdbcConnectorException(
+ // "The class " + getPdxName() + " has not been pdx serialized.");
+ // }
+ // return pdxTypes;
+ // }
+
+ // /**
+ // * Given a column name and a set of pdx types, find the field name in
those types that match,
+ // * ignoring case, the column name.
+ // *
+ // * @return the matching field name or null if no match
+ // * @throws JdbcConnectorException if no fields match
+ // * @throws JdbcConnectorException if more than one field matches
+ // */
+ // private String findCaseInsensitiveMatch(String columnName, Set<PdxType>
pdxTypes) {
+ // HashSet<String> matchingFieldNames = new HashSet<>();
+ // for (PdxType pdxType : pdxTypes) {
+ // for (String existingFieldName : pdxType.getFieldNames()) {
+ // if (existingFieldName.equalsIgnoreCase(columnName)) {
+ // matchingFieldNames.add(existingFieldName);
+ // }
+ // }
+ // }
+ // if (matchingFieldNames.isEmpty()) {
+ // throw new JdbcConnectorException("The class " + getPdxName()
+ // + " does not have a field that matches the column " + columnName);
+ // } else if (matchingFieldNames.size() > 1) {
+ // throw new JdbcConnectorException(
+ // "Could not determine what pdx field to use for the column name " +
columnName
+ // + " because the pdx fields " + matchingFieldNames + " all match it.");
+ // }
+ // return matchingFieldNames.iterator().next();
+ // }
+ //
+ // /**
+ // * Given a column name, search the given pdxTypes for a field whose name
exactly matches the
+ // * column name.
+ // *
+ // * @return the matching field name or null if no match
+ // */
+ // private String findExactMatch(String columnName, Set<PdxType> pdxTypes) {
+ // for (PdxType pdxType : pdxTypes) {
+ // if (pdxType.getPdxField(columnName) != null) {
+ // return columnName;
+ // }
+ // }
+ // return null;
+ // }
+
@Override
public boolean equals(Object o) {
if (this == o) {
@@ -251,11 +298,12 @@ public class RegionMapping implements CacheElement {
&& isEqual(dataSourceName, that.dataSourceName)
&& isEqual(ids, that.ids)
&& isEqual(catalog, that.catalog)
- && isEqual(schema, that.schema);
+ && isEqual(schema, that.schema)
+ && isEqual(fieldMappings, that.fieldMappings);
}
- private static boolean isEqual(String s1, String s2) {
- return s1 != null ? s1.equals(s2) : s2 == null;
+ private static boolean isEqual(Object o1, Object o2) {
+ return o1 != null ? o1.equals(o2) : o2 == null;
}
@Override
@@ -280,6 +328,7 @@ public class RegionMapping implements CacheElement {
+ ", ids='" + ids + '\''
+ ", catalog='" + catalog + '\''
+ ", schema='" + schema + '\''
+ + ", fieldMapping='" + fieldMappings + '\''
+ '}';
}
diff --git
a/geode-connectors/src/main/java/org/apache/geode/connectors/jdbc/internal/xml/ElementType.java
b/geode-connectors/src/main/java/org/apache/geode/connectors/jdbc/internal/xml/ElementType.java
index c4316ca..2f16ba1 100644
---
a/geode-connectors/src/main/java/org/apache/geode/connectors/jdbc/internal/xml/ElementType.java
+++
b/geode-connectors/src/main/java/org/apache/geode/connectors/jdbc/internal/xml/ElementType.java
@@ -19,6 +19,7 @@ import java.util.Stack;
import org.xml.sax.Attributes;
import org.apache.geode.cache.CacheXmlException;
+import org.apache.geode.connectors.jdbc.internal.configuration.FieldMapping;
import org.apache.geode.connectors.jdbc.internal.configuration.RegionMapping;
import org.apache.geode.internal.cache.xmlcache.RegionCreation;
@@ -49,6 +50,26 @@ public enum ElementType {
RegionCreation regionCreation = (RegionCreation) stack.peek();
regionCreation.getExtensionPoint().addExtension(new
RegionMappingConfiguration(mapping));
}
+ },
+
+ FIELD_MAPPING("field-mapping") {
+ @Override
+ void startElement(Stack<Object> stack, Attributes attributes) {
+ if (!(stack.peek() instanceof RegionMapping)) {
+ throw new CacheXmlException(
+ "<jdbc:field-mapping> elements must occur within <jdbc:mapping>
elements");
+ }
+ RegionMapping mapping = (RegionMapping) stack.peek();
+ String pdxName =
attributes.getValue(JdbcConnectorServiceXmlParser.PDX_NAME);
+ String pdxType =
attributes.getValue(JdbcConnectorServiceXmlParser.PDX_TYPE);
+ String jdbcName =
attributes.getValue(JdbcConnectorServiceXmlParser.JDBC_NAME);
+ String jdbcType =
attributes.getValue(JdbcConnectorServiceXmlParser.JDBC_TYPE);
+ FieldMapping fieldMapping = new FieldMapping(pdxName, pdxType, jdbcName,
jdbcType);
+ mapping.addFieldMapping(fieldMapping);
+ }
+
+ @Override
+ void endElement(Stack<Object> stack) {}
};
private String typeName;
diff --git
a/geode-connectors/src/main/java/org/apache/geode/connectors/jdbc/internal/xml/JdbcConnectorServiceXmlParser.java
b/geode-connectors/src/main/java/org/apache/geode/connectors/jdbc/internal/xml/JdbcConnectorServiceXmlParser.java
index 900c012..b4feb98 100644
---
a/geode-connectors/src/main/java/org/apache/geode/connectors/jdbc/internal/xml/JdbcConnectorServiceXmlParser.java
+++
b/geode-connectors/src/main/java/org/apache/geode/connectors/jdbc/internal/xml/JdbcConnectorServiceXmlParser.java
@@ -23,10 +23,13 @@ public class JdbcConnectorServiceXmlParser extends
AbstractXmlParser {
public static final String NAMESPACE = "http://geode.apache.org/schema/jdbc";
static final String DATA_SOURCE = "data-source";
static final String TABLE = "table";
- static final String PDX_NAME = "pdx-name";
static final String IDS = "ids";
static final String CATALOG = "catalog";
static final String SCHEMA = "schema";
+ static final String PDX_NAME = "pdx-name";
+ static final String PDX_TYPE = "pdx-type";
+ static final String JDBC_NAME = "jdbc-name";
+ static final String JDBC_TYPE = "jdbc-type";
@Override
public String getNamespaceUri() {
diff --git
a/geode-connectors/src/main/resources/META-INF/schemas/geode.apache.org/schema/jdbc/jdbc-1.0.xsd
b/geode-connectors/src/main/resources/META-INF/schemas/geode.apache.org/schema/jdbc/jdbc-1.0.xsd
index 366fb81..7cdfbfe 100644
---
a/geode-connectors/src/main/resources/META-INF/schemas/geode.apache.org/schema/jdbc/jdbc-1.0.xsd
+++
b/geode-connectors/src/main/resources/META-INF/schemas/geode.apache.org/schema/jdbc/jdbc-1.0.xsd
@@ -40,6 +40,20 @@ XML schema for JDBC Connector Service in Geode.
</xsd:annotation>
<xsd:element name="mapping">
<xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="field-mapping" maxOccurs="unbounded"
minOccurs="0">
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="xsd:string">
+ <xsd:attribute type="xsd:string"
name="pdx-name" use="required"/>
+ <xsd:attribute type="xsd:string"
name="pdx-type" use="required"/>
+ <xsd:attribute type="xsd:string"
name="jdbc-name" use="required"/>
+ <xsd:attribute type="xsd:string"
name="jdbc-type" use="required"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:sequence>
<xsd:attribute type="xsd:string" name="data-source"
use="required"/>
<xsd:attribute type="xsd:string" name="table" use="optional"/>
<xsd:attribute type="xsd:string" name="pdx-name"
use="required"/>
diff --git
a/geode-connectors/src/test/java/org/apache/geode/connectors/jdbc/internal/RegionMappingTest.java
b/geode-connectors/src/test/java/org/apache/geode/connectors/jdbc/internal/RegionMappingTest.java
index cd29c4b..f9954a7 100644
---
a/geode-connectors/src/test/java/org/apache/geode/connectors/jdbc/internal/RegionMappingTest.java
+++
b/geode-connectors/src/test/java/org/apache/geode/connectors/jdbc/internal/RegionMappingTest.java
@@ -15,12 +15,6 @@
package org.apache.geode.connectors.jdbc.internal;
import static org.assertj.core.api.Assertions.assertThat;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.when;
-
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.HashSet;
import org.junit.Before;
import org.junit.Rule;
@@ -28,10 +22,8 @@ import org.junit.Test;
import org.junit.rules.ExpectedException;
import org.apache.geode.connectors.jdbc.JdbcConnectorException;
+import org.apache.geode.connectors.jdbc.internal.configuration.FieldMapping;
import org.apache.geode.connectors.jdbc.internal.configuration.RegionMapping;
-import org.apache.geode.pdx.internal.PdxField;
-import org.apache.geode.pdx.internal.PdxType;
-import org.apache.geode.pdx.internal.TypeRegistry;
public class RegionMappingTest {
@@ -60,8 +52,6 @@ public class RegionMappingTest {
assertThat(mapping.getIds()).isNull();
assertThat(mapping.getCatalog()).isNull();
assertThat(mapping.getSchema()).isNull();
- assertThat(mapping.getColumnNameForField("fieldName",
mock(TableMetaDataView.class)))
- .isEqualTo("fieldName");
}
@Test
@@ -117,133 +107,43 @@ public class RegionMappingTest {
}
@Test
- public void returnsColumnNameIfFieldNotMapped() {
- mapping = new RegionMapping(null, "pdxClassName", null, null, null, null,
null);
-
- String columnName = mapping.getColumnNameForField(fieldName1,
mock(TableMetaDataView.class));
-
- assertThat(columnName).isEqualTo(fieldName1);
- }
-
- @Test
- public void
returnsColumnNameFromTableMetaDataIfFieldNotMappedAndMetaDataMatchesWithCaseDiffering()
{
- String metaDataColumnName = fieldName1.toUpperCase();
+ public void getColumnNameForFieldThrowsIfFieldNotMapped() {
mapping = new RegionMapping(null, "pdxClassName", null, null, null, null,
null);
- TableMetaDataView tableMetaDataView = mock(TableMetaDataView.class);
-
when(tableMetaDataView.getColumnNames()).thenReturn(Collections.singleton(metaDataColumnName));
-
- assertThat(mapping.getColumnNameForField(fieldName1, tableMetaDataView))
- .isEqualTo(metaDataColumnName);
- }
-
- @Test
- public void
returnsColumnNameFromTableMetaDataIfFieldNotMappedAndMetaDataMatchesExactly() {
- String metaDataColumnName = fieldName1;
- mapping = new RegionMapping(null, "pdxClassName", null, null, null, null,
null);
- TableMetaDataView tableMetaDataView = mock(TableMetaDataView.class);
-
when(tableMetaDataView.getColumnNames()).thenReturn(Collections.singleton(metaDataColumnName));
-
- assertThat(mapping.getColumnNameForField(fieldName1, tableMetaDataView))
- .isEqualTo(metaDataColumnName);
- }
-
- @Test
- public void returnsColumnNameIfFieldNotMappedAndNotInMetaData() {
- mapping = new RegionMapping(null, "pdxClassName", null, null, null, null,
null);
- TableMetaDataView tableMetaDataView = mock(TableMetaDataView.class);
-
when(tableMetaDataView.getColumnNames()).thenReturn(Collections.singleton("does
not match"));
-
- assertThat(mapping.getColumnNameForField(fieldName1,
tableMetaDataView)).isEqualTo(fieldName1);
- }
-
- @Test
- public void getColumnNameForFieldThrowsIfTwoColumnsMatchField() {
- mapping = new RegionMapping(null, "pdxClassName", null, null, null, null,
null);
-
- TableMetaDataView tableMetaDataView = mock(TableMetaDataView.class);
- HashSet<String> columnNames =
- new HashSet<>(Arrays.asList(fieldName1.toUpperCase(),
fieldName1.toLowerCase()));
- when(tableMetaDataView.getColumnNames()).thenReturn(columnNames);
-
expectedException.expect(JdbcConnectorException.class);
expectedException
- .expectMessage("The SQL table has at least two columns that match the
PDX field: myField1");
- mapping.getColumnNameForField(fieldName1, tableMetaDataView);
+ .expectMessage("A field mapping for the pdx field \"" + fieldName1 +
"\" does not exist.");
+ mapping.getColumnNameForField(fieldName1);
}
@Test
- public void throwsIfColumnNotMappedAndPdxClassNameDoesNotExist() {
+ public void getFieldNameForColumnThrowsIfColumnNotMapped() {
mapping = new RegionMapping(null, "pdxClassName", null, null, null, null,
null);
- TypeRegistry typeRegistry = mock(TypeRegistry.class);
-
when(typeRegistry.getPdxTypesForClassName("pdxClassName")).thenReturn(Collections.emptySet());
- expectedException.expect(JdbcConnectorException.class);
- expectedException.expectMessage("The class pdxClassName has not been pdx
serialized.");
-
- mapping.getFieldNameForColumn("columnName", typeRegistry);
- }
-
- @Test
- public void
throwsIfColumnNotMappedAndPdxClassNameDoesExistButHasNoMatchingFields() {
- String pdxClassName = "pdxClassName";
- String columnName = "columnName";
- mapping = new RegionMapping(null, pdxClassName, null, null, null, null,
null);
- TypeRegistry typeRegistry = mock(TypeRegistry.class);
- HashSet<PdxType> pdxTypes = new
HashSet<>(Arrays.asList(mock(PdxType.class)));
-
when(typeRegistry.getPdxTypesForClassName(pdxClassName)).thenReturn(pdxTypes);
expectedException.expect(JdbcConnectorException.class);
- expectedException.expectMessage("The class " + pdxClassName
- + " does not have a field that matches the column " + columnName);
+ expectedException
+ .expectMessage("A field mapping for the column \"columnName\" does not
exist.");
- mapping.getFieldNameForColumn(columnName, typeRegistry);
+ mapping.getFieldNameForColumn("columnName");
}
@Test
- public void
throwsIfColumnNotMappedAndPdxClassNameDoesExistButHasMoreThanOneMatchingFields()
{
+ public void getFieldNameForColumnReturnsFieldNameIfMapped() {
String pdxClassName = "pdxClassName";
String columnName = "columnName";
mapping = new RegionMapping(null, pdxClassName, null, null, null, null,
null);
- TypeRegistry typeRegistry = mock(TypeRegistry.class);
- PdxType pdxType = mock(PdxType.class);
- when(pdxType.getFieldNames())
- .thenReturn(Arrays.asList(columnName.toLowerCase(),
columnName.toUpperCase()));
- HashSet<PdxType> pdxTypes = new HashSet<>(Arrays.asList(pdxType));
-
when(typeRegistry.getPdxTypesForClassName(pdxClassName)).thenReturn(pdxTypes);
- expectedException.expect(JdbcConnectorException.class);
- expectedException.expectMessage(
- "Could not determine what pdx field to use for the column name " +
columnName);
+ mapping.addFieldMapping(new FieldMapping(pdxClassName, null, columnName,
null));
- mapping.getFieldNameForColumn(columnName, typeRegistry);
+
assertThat(mapping.getFieldNameForColumn(columnName)).isEqualTo(pdxClassName);
}
@Test
- public void
returnsIfColumnNotMappedAndPdxClassNameDoesExistAndHasOneFieldThatInexactlyMatches()
{
+ public void getColumnNameForFieldReturnsColumnNameIfMapped() {
String pdxClassName = "pdxClassName";
String columnName = "columnName";
mapping = new RegionMapping(null, pdxClassName, null, null, null, null,
null);
- TypeRegistry typeRegistry = mock(TypeRegistry.class);
- PdxType pdxType = mock(PdxType.class);
- when(pdxType.getFieldNames())
- .thenReturn(Arrays.asList("someOtherField", columnName.toUpperCase()));
- HashSet<PdxType> pdxTypes = new HashSet<>(Arrays.asList(pdxType));
-
when(typeRegistry.getPdxTypesForClassName(pdxClassName)).thenReturn(pdxTypes);
-
- assertThat(mapping.getFieldNameForColumn(columnName, typeRegistry))
- .isEqualTo(columnName.toUpperCase());
- }
+ mapping.addFieldMapping(new FieldMapping(pdxClassName, null, columnName,
null));
- @Test
- public void
returnsIfColumnNotMappedAndPdxClassNameDoesExistAndHasOneFieldThatExactlyMatches()
{
- String pdxClassName = "pdxClassName";
- String columnName = "columnName";
- mapping = new RegionMapping(null, pdxClassName, null, null, null, null,
null);
- TypeRegistry typeRegistry = mock(TypeRegistry.class);
- PdxType pdxType = mock(PdxType.class);
- when(pdxType.getPdxField(columnName)).thenReturn(mock(PdxField.class));
- HashSet<PdxType> pdxTypes = new HashSet<>(Arrays.asList(pdxType));
-
when(typeRegistry.getPdxTypesForClassName(pdxClassName)).thenReturn(pdxTypes);
-
- assertThat(mapping.getFieldNameForColumn(columnName,
typeRegistry)).isEqualTo(columnName);
+
assertThat(mapping.getColumnNameForField(pdxClassName)).isEqualTo(columnName);
}
@Test
@@ -255,7 +155,6 @@ public class RegionMappingTest {
assertThat(rm1).isEqualTo(rm2);
}
-
@Test
public void verifyTwoInstancesThatAreEqualHaveSameHashCode() {
RegionMapping rm1 = new RegionMapping("regionName",
@@ -271,11 +170,12 @@ public class RegionMappingTest {
public void verifyToStringGivenAllAttributes() {
RegionMapping rm = new RegionMapping("regionName", "pdxClassName",
"tableName",
"dataSourceName", "ids", "catalog", "schema");
+ rm.addFieldMapping(new FieldMapping("pdxName", "pdxType", "jdbcName",
"jdbcType"));
String result = rm.toString();
assertThat(result).isEqualTo(
- "RegionMapping{regionName='regionName', pdxName='pdxClassName',
tableName='tableName', dataSourceName='dataSourceName', ids='ids',
catalog='catalog', schema='schema'}");
+ "RegionMapping{regionName='regionName', pdxName='pdxClassName',
tableName='tableName', dataSourceName='dataSourceName', ids='ids',
catalog='catalog', schema='schema', fieldMapping='[FieldMapping
[pdxName=pdxName, pdxType=pdxType, jdbcName=jdbcName, jdbcType=jdbcType]]'}");
}
@Test
@@ -286,7 +186,7 @@ public class RegionMappingTest {
String result = rm.toString();
assertThat(result).isEqualTo(
- "RegionMapping{regionName='regionName', pdxName='pdxClassName',
tableName='null', dataSourceName='dataSourceName', ids='null', catalog='null',
schema='null'}");
+ "RegionMapping{regionName='regionName', pdxName='pdxClassName',
tableName='null', dataSourceName='dataSourceName', ids='null', catalog='null',
schema='null', fieldMapping='[]'}");
}
@Test
@@ -381,4 +281,17 @@ public class RegionMappingTest {
assertThat(result).isFalse();
}
+ @Test
+ public void verifyMappingWithDifferentFieldMappingsAreNotEqual() {
+ RegionMapping rm1 =
+ new RegionMapping(null, "pdxClassName", null, null, null, null, null);
+ rm1.addFieldMapping(new FieldMapping("myPdxName", "myPdxType",
"myJdbcName", "myJdbcType"));
+ RegionMapping rm2 =
+ new RegionMapping(null, "pdxClassName", null, null, null, null, null);
+ rm2.addFieldMapping(
+ new FieldMapping("myPdxName", "myPdxType", "myJdbcName",
"myOtherJdbcType"));
+ boolean result = rm1.equals(rm2);
+ assertThat(result).isFalse();
+ }
+
}
diff --git
a/geode-connectors/src/test/java/org/apache/geode/connectors/jdbc/internal/SqlHandlerTest.java
b/geode-connectors/src/test/java/org/apache/geode/connectors/jdbc/internal/SqlHandlerTest.java
index ab6e282..53c1476 100644
---
a/geode-connectors/src/test/java/org/apache/geode/connectors/jdbc/internal/SqlHandlerTest.java
+++
b/geode-connectors/src/test/java/org/apache/geode/connectors/jdbc/internal/SqlHandlerTest.java
@@ -175,7 +175,7 @@ public class SqlHandlerTest {
public void writeWithCharField() throws Exception {
String fieldName = "fieldName";
Object fieldValue = 'S';
- when(regionMapping.getColumnNameForField(eq(fieldName),
any())).thenReturn(fieldName);
+
when(regionMapping.getColumnNameForField(eq(fieldName))).thenReturn(fieldName);
when(value.getFieldNames()).thenReturn(Arrays.asList(fieldName));
when(value.getField(fieldName)).thenReturn(fieldValue);
@@ -193,7 +193,7 @@ public class SqlHandlerTest {
String fieldName = "fieldName";
Object fieldValue = new Date();
when(tableMetaDataView.getColumnDataType(fieldName)).thenReturn(JDBCType.NULL);
- when(regionMapping.getColumnNameForField(eq(fieldName),
any())).thenReturn(fieldName);
+
when(regionMapping.getColumnNameForField(eq(fieldName))).thenReturn(fieldName);
when(value.getFieldNames()).thenReturn(Arrays.asList(fieldName));
when(value.getField(fieldName)).thenReturn(fieldValue);
@@ -213,7 +213,7 @@ public class SqlHandlerTest {
Object expectedValueWritten = new java.sql.Date(fieldValue.getTime());
JDBCType dataType = JDBCType.DATE;
when(tableMetaDataView.getColumnDataType(fieldName)).thenReturn(dataType);
- when(regionMapping.getColumnNameForField(eq(fieldName),
any())).thenReturn(fieldName);
+
when(regionMapping.getColumnNameForField(eq(fieldName))).thenReturn(fieldName);
when(value.getFieldNames()).thenReturn(Arrays.asList(fieldName));
when(value.getField(fieldName)).thenReturn(fieldValue);
@@ -233,7 +233,7 @@ public class SqlHandlerTest {
Object expectedValueWritten = new java.sql.Time(fieldValue.getTime());
JDBCType dataType = JDBCType.TIME;
when(tableMetaDataView.getColumnDataType(fieldName)).thenReturn(dataType);
- when(regionMapping.getColumnNameForField(eq(fieldName),
any())).thenReturn(fieldName);
+
when(regionMapping.getColumnNameForField(eq(fieldName))).thenReturn(fieldName);
when(value.getFieldNames()).thenReturn(Arrays.asList(fieldName));
when(value.getField(fieldName)).thenReturn(fieldValue);
@@ -253,7 +253,7 @@ public class SqlHandlerTest {
Object expectedValueWritten = new java.sql.Time(fieldValue.getTime());
JDBCType dataType = JDBCType.TIME_WITH_TIMEZONE;
when(tableMetaDataView.getColumnDataType(fieldName)).thenReturn(dataType);
- when(regionMapping.getColumnNameForField(eq(fieldName),
any())).thenReturn(fieldName);
+
when(regionMapping.getColumnNameForField(eq(fieldName))).thenReturn(fieldName);
when(value.getFieldNames()).thenReturn(Arrays.asList(fieldName));
when(value.getField(fieldName)).thenReturn(fieldValue);
@@ -273,7 +273,7 @@ public class SqlHandlerTest {
Object expectedValueWritten = new java.sql.Timestamp(fieldValue.getTime());
JDBCType dataType = JDBCType.TIMESTAMP;
when(tableMetaDataView.getColumnDataType(fieldName)).thenReturn(dataType);
- when(regionMapping.getColumnNameForField(eq(fieldName),
any())).thenReturn(fieldName);
+
when(regionMapping.getColumnNameForField(eq(fieldName))).thenReturn(fieldName);
when(value.getFieldNames()).thenReturn(Arrays.asList(fieldName));
when(value.getField(fieldName)).thenReturn(fieldValue);
@@ -293,7 +293,7 @@ public class SqlHandlerTest {
Object expectedValueWritten = new java.sql.Timestamp(fieldValue.getTime());
JDBCType dataType = JDBCType.TIMESTAMP_WITH_TIMEZONE;
when(tableMetaDataView.getColumnDataType(fieldName)).thenReturn(dataType);
- when(regionMapping.getColumnNameForField(eq(fieldName),
any())).thenReturn(fieldName);
+
when(regionMapping.getColumnNameForField(eq(fieldName))).thenReturn(fieldName);
when(value.getFieldNames()).thenReturn(Arrays.asList(fieldName));
when(value.getField(fieldName)).thenReturn(fieldValue);
@@ -310,7 +310,7 @@ public class SqlHandlerTest {
public void writeWithNonCharField() throws Exception {
String fieldName = "fieldName";
int fieldValue = 100;
- when(regionMapping.getColumnNameForField(eq(fieldName),
any())).thenReturn(fieldName);
+
when(regionMapping.getColumnNameForField(eq(fieldName))).thenReturn(fieldName);
when(value.getFieldNames()).thenReturn(Arrays.asList(fieldName));
when(value.getField(fieldName)).thenReturn(fieldValue);
@@ -328,7 +328,7 @@ public class SqlHandlerTest {
String fieldName = "fieldName";
Object fieldValue = null;
when(tableMetaDataView.getColumnDataType(fieldName)).thenReturn(JDBCType.NULL);
- when(regionMapping.getColumnNameForField(eq(fieldName),
any())).thenReturn(fieldName);
+
when(regionMapping.getColumnNameForField(eq(fieldName))).thenReturn(fieldName);
when(value.getFieldNames()).thenReturn(Arrays.asList(fieldName));
when(value.getField(fieldName)).thenReturn(fieldValue);
@@ -347,7 +347,7 @@ public class SqlHandlerTest {
Object fieldValue = null;
JDBCType dataType = JDBCType.VARCHAR;
when(tableMetaDataView.getColumnDataType(fieldName)).thenReturn(dataType);
- when(regionMapping.getColumnNameForField(eq(fieldName),
any())).thenReturn(fieldName);
+
when(regionMapping.getColumnNameForField(eq(fieldName))).thenReturn(fieldName);
when(value.getFieldNames()).thenReturn(Arrays.asList(fieldName));
when(value.getField(fieldName)).thenReturn(fieldValue);
@@ -381,8 +381,8 @@ public class SqlHandlerTest {
when(compositeKey.getField("fieldOne")).thenReturn(compositeKeyFieldValueOne);
when(compositeKey.getField("fieldTwo")).thenReturn(compositeKeyFieldValueTwo);
when(tableMetaDataView.getKeyColumnNames()).thenReturn(Arrays.asList("fieldOne",
"fieldTwo"));
- when(regionMapping.getColumnNameForField("fieldOne",
tableMetaDataView)).thenReturn("fieldOne");
- when(regionMapping.getColumnNameForField("fieldTwo",
tableMetaDataView)).thenReturn("fieldTwo");
+
when(regionMapping.getColumnNameForField("fieldOne")).thenReturn("fieldOne");
+
when(regionMapping.getColumnNameForField("fieldTwo")).thenReturn("fieldTwo");
handler.write(region, Operation.CREATE, compositeKey, value);
@@ -414,8 +414,8 @@ public class SqlHandlerTest {
when(compositeKey.getField("fieldOne")).thenReturn(compositeKeyFieldValueOne);
when(compositeKey.getField("fieldTwo")).thenReturn(compositeKeyFieldValueTwo);
when(tableMetaDataView.getKeyColumnNames()).thenReturn(Arrays.asList("fieldOne",
"fieldTwo"));
- when(regionMapping.getColumnNameForField("fieldOne",
tableMetaDataView)).thenReturn("fieldOne");
- when(regionMapping.getColumnNameForField("fieldTwo",
tableMetaDataView)).thenReturn("fieldTwo");
+
when(regionMapping.getColumnNameForField("fieldOne")).thenReturn("fieldOne");
+
when(regionMapping.getColumnNameForField("fieldTwo")).thenReturn("fieldTwo");
handler.write(region, Operation.UPDATE, compositeKey, value);
@@ -447,8 +447,8 @@ public class SqlHandlerTest {
when(destroyKey.getField("fieldOne")).thenReturn(destroyKeyFieldValueOne);
when(destroyKey.getField("fieldTwo")).thenReturn(destroyKeyFieldValueTwo);
when(tableMetaDataView.getKeyColumnNames()).thenReturn(Arrays.asList("fieldOne",
"fieldTwo"));
- when(regionMapping.getColumnNameForField("fieldOne",
tableMetaDataView)).thenReturn("fieldOne");
- when(regionMapping.getColumnNameForField("fieldTwo",
tableMetaDataView)).thenReturn("fieldTwo");
+
when(regionMapping.getColumnNameForField("fieldOne")).thenReturn("fieldOne");
+
when(regionMapping.getColumnNameForField("fieldTwo")).thenReturn("fieldTwo");
handler.write(region, Operation.DESTROY, destroyKey, value);
@@ -596,8 +596,8 @@ public class SqlHandlerTest {
when(compositeKey.getField("fieldOne")).thenReturn(compositeKeyFieldValueOne);
when(compositeKey.getField("fieldTwo")).thenReturn(compositeKeyFieldValueTwo);
when(tableMetaDataView.getKeyColumnNames()).thenReturn(Arrays.asList("fieldOne",
"fieldTwo"));
- when(regionMapping.getColumnNameForField("fieldOne",
tableMetaDataView)).thenReturn("fieldOne");
- when(regionMapping.getColumnNameForField("fieldTwo",
tableMetaDataView)).thenReturn("fieldTwo");
+
when(regionMapping.getColumnNameForField("fieldOne")).thenReturn("fieldOne");
+
when(regionMapping.getColumnNameForField("fieldTwo")).thenReturn("fieldTwo");
EntryColumnData entryColumnData =
handler.getEntryColumnData(tableMetaDataView, regionMapping,
compositeKey, value,
@@ -618,8 +618,8 @@ public class SqlHandlerTest {
when(compositeKey.isDeserializable()).thenReturn(false);
when(compositeKey.getFieldNames()).thenReturn(Arrays.asList("fieldOne"));
when(tableMetaDataView.getKeyColumnNames()).thenReturn(Arrays.asList("fieldOne",
"fieldTwo"));
- when(regionMapping.getColumnNameForField("fieldOne",
tableMetaDataView)).thenReturn("fieldOne");
- when(regionMapping.getColumnNameForField("fieldTwo",
tableMetaDataView)).thenReturn("fieldTwo");
+
when(regionMapping.getColumnNameForField("fieldOne")).thenReturn("fieldOne");
+
when(regionMapping.getColumnNameForField("fieldTwo")).thenReturn("fieldTwo");
thrown.expect(JdbcConnectorException.class);
thrown.expectMessage(
"The key \"" + compositeKey + "\" should have 2 fields but has 1
fields.");
@@ -638,8 +638,8 @@ public class SqlHandlerTest {
when(compositeKey.getField("fieldOne")).thenReturn(compositeKeyFieldValueOne);
when(compositeKey.getField("fieldTwoWrong")).thenReturn(compositeKeyFieldValueTwo);
when(tableMetaDataView.getKeyColumnNames()).thenReturn(Arrays.asList("fieldOne",
"fieldTwo"));
- when(regionMapping.getColumnNameForField("fieldOne",
tableMetaDataView)).thenReturn("fieldOne");
- when(regionMapping.getColumnNameForField("fieldTwo",
tableMetaDataView)).thenReturn("fieldTwo");
+
when(regionMapping.getColumnNameForField("fieldOne")).thenReturn("fieldOne");
+
when(regionMapping.getColumnNameForField("fieldTwo")).thenReturn("fieldTwo");
thrown.expect(JdbcConnectorException.class);
thrown.expectMessage("The key \"" + compositeKey
+ "\" has the field \"fieldTwoWrong\" which does not match any of the
key columns: [fieldOne, fieldTwo]");
@@ -660,8 +660,8 @@ public class SqlHandlerTest {
private void testGetEntryColumnDataForCreateOrUpdate(Operation operation) {
String nonKeyColumn = "otherColumn";
- when(regionMapping.getColumnNameForField(eq(KEY_COLUMN),
any())).thenReturn(KEY_COLUMN);
- when(regionMapping.getColumnNameForField(eq(nonKeyColumn),
any())).thenReturn(nonKeyColumn);
+
when(regionMapping.getColumnNameForField(eq(KEY_COLUMN))).thenReturn(KEY_COLUMN);
+
when(regionMapping.getColumnNameForField(eq(nonKeyColumn))).thenReturn(nonKeyColumn);
when(value.getFieldNames()).thenReturn(Arrays.asList(KEY_COLUMN,
nonKeyColumn));
EntryColumnData entryColumnData =
@@ -695,10 +695,10 @@ public class SqlHandlerTest {
when(compositeKey.getField("fieldOne")).thenReturn(compositeKeyFieldValueOne);
when(compositeKey.getField("fieldTwo")).thenReturn(compositeKeyFieldValueTwo);
when(tableMetaDataView.getKeyColumnNames()).thenReturn(Arrays.asList("fieldOne",
"fieldTwo"));
- when(regionMapping.getColumnNameForField("fieldOne",
tableMetaDataView)).thenReturn("fieldOne");
- when(regionMapping.getColumnNameForField("fieldTwo",
tableMetaDataView)).thenReturn("fieldTwo");
+
when(regionMapping.getColumnNameForField("fieldOne")).thenReturn("fieldOne");
+
when(regionMapping.getColumnNameForField("fieldTwo")).thenReturn("fieldTwo");
String nonKeyColumn = "otherColumn";
- when(regionMapping.getColumnNameForField(eq(nonKeyColumn),
any())).thenReturn(nonKeyColumn);
+
when(regionMapping.getColumnNameForField(eq(nonKeyColumn))).thenReturn(nonKeyColumn);
when(value.getFieldNames()).thenReturn(Arrays.asList("fieldOne",
"fieldTwo", nonKeyColumn));
EntryColumnData entryColumnData =
@@ -726,8 +726,8 @@ public class SqlHandlerTest {
when(compositeKey.getField("fieldOne")).thenReturn(compositeKeyFieldValueOne);
when(compositeKey.getField("fieldTwo")).thenReturn(compositeKeyFieldValueTwo);
when(tableMetaDataView.getKeyColumnNames()).thenReturn(Arrays.asList("fieldOne",
"fieldTwo"));
- when(regionMapping.getColumnNameForField("fieldOne",
tableMetaDataView)).thenReturn("fieldOne");
- when(regionMapping.getColumnNameForField("fieldTwo",
tableMetaDataView)).thenReturn("fieldTwo");
+
when(regionMapping.getColumnNameForField("fieldOne")).thenReturn("fieldOne");
+
when(regionMapping.getColumnNameForField("fieldTwo")).thenReturn("fieldTwo");
EntryColumnData entryColumnData =
handler.getEntryColumnData(tableMetaDataView, regionMapping,
compositeKey, value,
diff --git
a/geode-connectors/src/test/java/org/apache/geode/connectors/jdbc/internal/SqlToPdxInstanceCreatorTest.java
b/geode-connectors/src/test/java/org/apache/geode/connectors/jdbc/internal/SqlToPdxInstanceCreatorTest.java
index 8178db3..97fc4d0 100644
---
a/geode-connectors/src/test/java/org/apache/geode/connectors/jdbc/internal/SqlToPdxInstanceCreatorTest.java
+++
b/geode-connectors/src/test/java/org/apache/geode/connectors/jdbc/internal/SqlToPdxInstanceCreatorTest.java
@@ -105,9 +105,9 @@ public class SqlToPdxInstanceCreatorTest {
setupResultSetForTwoObjectColumns(resultSet);
when(resultSet.next()).thenReturn(true).thenReturn(false);
PdxInstanceFactory factory = mock(PdxInstanceFactory.class);
- when(regionMapping.getFieldNameForColumn(eq(COLUMN_NAME_1), any()))
+ when(regionMapping.getFieldNameForColumn(eq(COLUMN_NAME_1)))
.thenReturn(PDX_FIELD_NAME_1);
- when(regionMapping.getFieldNameForColumn(eq(COLUMN_NAME_2), any()))
+ when(regionMapping.getFieldNameForColumn(eq(COLUMN_NAME_2)))
.thenReturn(PDX_FIELD_NAME_2);
tableMetaDataView = mock(TableMetaDataView.class);
when(tableMetaDataView.getKeyColumnNames()).thenReturn(Arrays.asList(COLUMN_NAME_1));
@@ -139,9 +139,9 @@ public class SqlToPdxInstanceCreatorTest {
String pdxClassName = "myPdxClassName";
when(cache.createPdxInstanceFactory(pdxClassName)).thenReturn(factory);
when(cache.createPdxInstanceFactory(anyString(),
anyBoolean())).thenReturn(factory);
- when(regionMapping.getFieldNameForColumn(eq(COLUMN_NAME_1), any()))
+ when(regionMapping.getFieldNameForColumn(eq(COLUMN_NAME_1)))
.thenReturn(PDX_FIELD_NAME_1);
- when(regionMapping.getFieldNameForColumn(eq(COLUMN_NAME_2), any()))
+ when(regionMapping.getFieldNameForColumn(eq(COLUMN_NAME_2)))
.thenReturn(PDX_FIELD_NAME_2);
TypeRegistry pdxTypeRegistry = mock(TypeRegistry.class);
when(cache.getPdxRegistry()).thenReturn(pdxTypeRegistry);
@@ -167,7 +167,7 @@ public class SqlToPdxInstanceCreatorTest {
when(resultSet.next()).thenReturn(true).thenReturn(false);
PdxInstanceFactory factory = mock(PdxInstanceFactory.class);
String fieldName1 = "pdxFieldName1";
- when(regionMapping.getFieldNameForColumn(eq(COLUMN_NAME_1),
any())).thenReturn(fieldName1);
+
when(regionMapping.getFieldNameForColumn(eq(COLUMN_NAME_1))).thenReturn(fieldName1);
TypeRegistry pdxTypeRegistry = mock(TypeRegistry.class);
when(cache.getPdxRegistry()).thenReturn(pdxTypeRegistry);
String pdxClassName = "myPdxClassName";
@@ -191,7 +191,7 @@ public class SqlToPdxInstanceCreatorTest {
setupResultSet(resultSet, fieldType);
when(resultSet.next()).thenReturn(true).thenReturn(false);
PdxInstanceFactory factory = setupPdxInstanceFactory(fieldType);
- when(regionMapping.getFieldNameForColumn(eq(COLUMN_NAME_1), any()))
+ when(regionMapping.getFieldNameForColumn(eq(COLUMN_NAME_1)))
.thenReturn(PDX_FIELD_NAME_1);
when(tableMetaDataView.getColumnDataType(any())).thenReturn(JDBCType.NULL);
@@ -213,7 +213,7 @@ public class SqlToPdxInstanceCreatorTest {
setupResultSet(resultSet, fieldType, null);
when(resultSet.next()).thenReturn(true).thenReturn(false);
PdxInstanceFactory factory = setupPdxInstanceFactory(fieldType);
- when(regionMapping.getFieldNameForColumn(eq(COLUMN_NAME_1), any()))
+ when(regionMapping.getFieldNameForColumn(eq(COLUMN_NAME_1)))
.thenReturn(PDX_FIELD_NAME_1);
when(tableMetaDataView.getColumnDataType(any())).thenReturn(JDBCType.NULL);
@@ -234,7 +234,7 @@ public class SqlToPdxInstanceCreatorTest {
when(resultSet.getString(1)).thenReturn("");
when(resultSet.next()).thenReturn(true).thenReturn(false);
PdxInstanceFactory factory = setupPdxInstanceFactory(fieldType);
- when(regionMapping.getFieldNameForColumn(eq(COLUMN_NAME_1), any()))
+ when(regionMapping.getFieldNameForColumn(eq(COLUMN_NAME_1)))
.thenReturn(PDX_FIELD_NAME_1);
createPdxInstance();
@@ -256,7 +256,7 @@ public class SqlToPdxInstanceCreatorTest {
when(resultSet.getDate(1)).thenReturn(sqlDate);
when(resultSet.next()).thenReturn(true).thenReturn(false);
PdxInstanceFactory factory = setupPdxInstanceFactory(fieldType);
- when(regionMapping.getFieldNameForColumn(eq(COLUMN_NAME_1), any()))
+ when(regionMapping.getFieldNameForColumn(eq(COLUMN_NAME_1)))
.thenReturn(PDX_FIELD_NAME_1);
createPdxInstance();
@@ -280,7 +280,7 @@ public class SqlToPdxInstanceCreatorTest {
when(resultSet.getBlob(1)).thenReturn(blob);
when(resultSet.next()).thenReturn(true).thenReturn(false);
PdxInstanceFactory factory = setupPdxInstanceFactory(fieldType);
- when(regionMapping.getFieldNameForColumn(eq(COLUMN_NAME_1), any()))
+ when(regionMapping.getFieldNameForColumn(eq(COLUMN_NAME_1)))
.thenReturn(PDX_FIELD_NAME_1);
createPdxInstance();
@@ -302,7 +302,7 @@ public class SqlToPdxInstanceCreatorTest {
when(resultSet.getBlob(1)).thenReturn(blob);
when(resultSet.next()).thenReturn(true).thenReturn(false);
PdxInstanceFactory factory = setupPdxInstanceFactory(fieldType);
- when(regionMapping.getFieldNameForColumn(eq(COLUMN_NAME_1), any()))
+ when(regionMapping.getFieldNameForColumn(eq(COLUMN_NAME_1)))
.thenReturn(PDX_FIELD_NAME_1);
createPdxInstance();
@@ -324,7 +324,7 @@ public class SqlToPdxInstanceCreatorTest {
when(resultSet.getBlob(1)).thenReturn(blob);
when(resultSet.next()).thenReturn(true).thenReturn(false);
PdxInstanceFactory factory = setupPdxInstanceFactory(fieldType);
- when(regionMapping.getFieldNameForColumn(eq(COLUMN_NAME_1), any()))
+ when(regionMapping.getFieldNameForColumn(eq(COLUMN_NAME_1)))
.thenReturn(PDX_FIELD_NAME_1);
thrown.expect(JdbcConnectorException.class);
thrown.expectMessage("Blob of length 2147483648 is too big to be converted
to a byte array.");
@@ -347,7 +347,7 @@ public class SqlToPdxInstanceCreatorTest {
when(resultSet.getBlob(1)).thenReturn(blob);
when(resultSet.next()).thenReturn(true).thenReturn(false);
PdxInstanceFactory factory = setupPdxInstanceFactory(fieldType);
- when(regionMapping.getFieldNameForColumn(eq(COLUMN_NAME_1), any()))
+ when(regionMapping.getFieldNameForColumn(eq(COLUMN_NAME_1)))
.thenReturn(PDX_FIELD_NAME_1);
createPdxInstance();
@@ -369,7 +369,7 @@ public class SqlToPdxInstanceCreatorTest {
when(resultSet.getTime(1)).thenReturn(sqlTime);
when(resultSet.next()).thenReturn(true).thenReturn(false);
PdxInstanceFactory factory = setupPdxInstanceFactory(fieldType);
- when(regionMapping.getFieldNameForColumn(eq(COLUMN_NAME_1), any()))
+ when(regionMapping.getFieldNameForColumn(eq(COLUMN_NAME_1)))
.thenReturn(PDX_FIELD_NAME_1);
createPdxInstance();
@@ -391,7 +391,7 @@ public class SqlToPdxInstanceCreatorTest {
when(resultSet.getTimestamp(1)).thenReturn(sqlTimestamp);
when(resultSet.next()).thenReturn(true).thenReturn(false);
PdxInstanceFactory factory = setupPdxInstanceFactory(fieldType);
- when(regionMapping.getFieldNameForColumn(eq(COLUMN_NAME_1), any()))
+ when(regionMapping.getFieldNameForColumn(eq(COLUMN_NAME_1)))
.thenReturn(PDX_FIELD_NAME_1);
createPdxInstance();
@@ -412,7 +412,7 @@ public class SqlToPdxInstanceCreatorTest {
when(resultSet.getObject(1)).thenReturn(sqlDate);
when(resultSet.next()).thenReturn(true).thenReturn(false);
PdxInstanceFactory factory = setupPdxInstanceFactory(fieldType);
- when(regionMapping.getFieldNameForColumn(eq(COLUMN_NAME_1), any()))
+ when(regionMapping.getFieldNameForColumn(eq(COLUMN_NAME_1)))
.thenReturn(PDX_FIELD_NAME_1);
createPdxInstance();
@@ -432,7 +432,7 @@ public class SqlToPdxInstanceCreatorTest {
when(resultSet.getObject(1)).thenReturn(expectedValue);
when(resultSet.next()).thenReturn(true).thenReturn(false);
PdxInstanceFactory factory = setupPdxInstanceFactory(fieldType);
- when(regionMapping.getFieldNameForColumn(eq(COLUMN_NAME_1), any()))
+ when(regionMapping.getFieldNameForColumn(eq(COLUMN_NAME_1)))
.thenReturn(PDX_FIELD_NAME_1);
createPdxInstance();
@@ -453,7 +453,7 @@ public class SqlToPdxInstanceCreatorTest {
when(resultSet.getObject(1)).thenReturn(sqlTime);
when(resultSet.next()).thenReturn(true).thenReturn(false);
PdxInstanceFactory factory = setupPdxInstanceFactory(fieldType);
- when(regionMapping.getFieldNameForColumn(eq(COLUMN_NAME_1), any()))
+ when(regionMapping.getFieldNameForColumn(eq(COLUMN_NAME_1)))
.thenReturn(PDX_FIELD_NAME_1);
createPdxInstance();
@@ -474,7 +474,7 @@ public class SqlToPdxInstanceCreatorTest {
when(resultSet.getObject(1)).thenReturn(sqlTimestamp);
when(resultSet.next()).thenReturn(true).thenReturn(false);
PdxInstanceFactory factory = setupPdxInstanceFactory(fieldType);
- when(regionMapping.getFieldNameForColumn(eq(COLUMN_NAME_1), any()))
+ when(regionMapping.getFieldNameForColumn(eq(COLUMN_NAME_1)))
.thenReturn(PDX_FIELD_NAME_1);
createPdxInstance();
@@ -491,9 +491,9 @@ public class SqlToPdxInstanceCreatorTest {
setupPdxInstanceFactory(fieldType);
setupResultSetForObject(resultSet, returnValue);
when(resultSet.next()).thenReturn(true).thenReturn(false);
- when(regionMapping.getFieldNameForColumn(eq(COLUMN_NAME_1), any()))
+ when(regionMapping.getFieldNameForColumn(eq(COLUMN_NAME_1)))
.thenReturn(PDX_FIELD_NAME_1);
- when(regionMapping.getFieldNameForColumn(eq(COLUMN_NAME_2), any()))
+ when(regionMapping.getFieldNameForColumn(eq(COLUMN_NAME_2)))
.thenReturn(PDX_FIELD_NAME_2);
thrown.expect(JdbcConnectorException.class);
thrown.expectMessage("Could not convert ");
@@ -517,7 +517,7 @@ public class SqlToPdxInstanceCreatorTest {
PdxField pdxField = mock(PdxField.class);
when(pdxField.getFieldType()).thenReturn(FieldType.OBJECT);
when(pdxType.getPdxField(PDX_FIELD_NAME_1)).thenReturn(pdxField);
- when(regionMapping.getFieldNameForColumn(eq(COLUMN_NAME_1), any()))
+ when(regionMapping.getFieldNameForColumn(eq(COLUMN_NAME_1)))
.thenReturn(PDX_FIELD_NAME_1);
thrown.expect(JdbcConnectorException.class);
thrown.expectMessage("Multiple rows returned for query: ");
@@ -538,7 +538,7 @@ public class SqlToPdxInstanceCreatorTest {
when(regionMapping.getPdxName()).thenReturn(pdxClassName);
when(pdxTypeRegistry.getPdxTypeForField(PDX_FIELD_NAME_1,
pdxClassName)).thenReturn(pdxType);
when(pdxType.getPdxField(PDX_FIELD_NAME_1)).thenReturn(null);
- when(regionMapping.getFieldNameForColumn(eq(COLUMN_NAME_1), any()))
+ when(regionMapping.getFieldNameForColumn(eq(COLUMN_NAME_1)))
.thenReturn(PDX_FIELD_NAME_1);
thrown.expect(JdbcConnectorException.class);
thrown.expectMessage("Could not find PdxType");
@@ -557,7 +557,7 @@ public class SqlToPdxInstanceCreatorTest {
when(cache.getPdxRegistry()).thenReturn(pdxTypeRegistry);
when(regionMapping.getPdxName()).thenReturn(pdxClassName);
when(pdxTypeRegistry.getPdxTypeForField(PDX_FIELD_NAME_1,
pdxClassName)).thenReturn(null);
- when(regionMapping.getFieldNameForColumn(eq(COLUMN_NAME_1), any()))
+ when(regionMapping.getFieldNameForColumn(eq(COLUMN_NAME_1)))
.thenReturn(PDX_FIELD_NAME_1);
thrown.expect(JdbcConnectorException.class);
thrown.expectMessage("Could not find PdxType");
diff --git
a/geode-connectors/src/test/java/org/apache/geode/connectors/jdbc/internal/xml/ElementTypeTest.java
b/geode-connectors/src/test/java/org/apache/geode/connectors/jdbc/internal/xml/ElementTypeTest.java
index a7c8bf0..9928940 100644
---
a/geode-connectors/src/test/java/org/apache/geode/connectors/jdbc/internal/xml/ElementTypeTest.java
+++
b/geode-connectors/src/test/java/org/apache/geode/connectors/jdbc/internal/xml/ElementTypeTest.java
@@ -14,17 +14,21 @@
*/
package org.apache.geode.connectors.jdbc.internal.xml;
-
+import static
org.apache.geode.connectors.jdbc.internal.xml.ElementType.FIELD_MAPPING;
import static
org.apache.geode.connectors.jdbc.internal.xml.ElementType.JDBC_MAPPING;
import static
org.apache.geode.connectors.jdbc.internal.xml.JdbcConnectorServiceXmlParser.CATALOG;
import static
org.apache.geode.connectors.jdbc.internal.xml.JdbcConnectorServiceXmlParser.DATA_SOURCE;
import static
org.apache.geode.connectors.jdbc.internal.xml.JdbcConnectorServiceXmlParser.IDS;
+import static
org.apache.geode.connectors.jdbc.internal.xml.JdbcConnectorServiceXmlParser.JDBC_NAME;
+import static
org.apache.geode.connectors.jdbc.internal.xml.JdbcConnectorServiceXmlParser.JDBC_TYPE;
import static
org.apache.geode.connectors.jdbc.internal.xml.JdbcConnectorServiceXmlParser.PDX_NAME;
+import static
org.apache.geode.connectors.jdbc.internal.xml.JdbcConnectorServiceXmlParser.PDX_TYPE;
import static
org.apache.geode.connectors.jdbc.internal.xml.JdbcConnectorServiceXmlParser.SCHEMA;
import static
org.apache.geode.connectors.jdbc.internal.xml.JdbcConnectorServiceXmlParser.TABLE;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatThrownBy;
import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verifyZeroInteractions;
import static org.mockito.Mockito.when;
import java.util.Stack;
@@ -35,6 +39,7 @@ import org.xml.sax.Attributes;
import org.apache.geode.cache.CacheXmlException;
import org.apache.geode.cache.Region;
+import org.apache.geode.connectors.jdbc.internal.configuration.FieldMapping;
import org.apache.geode.connectors.jdbc.internal.configuration.RegionMapping;
import org.apache.geode.internal.cache.extension.ExtensionPoint;
import org.apache.geode.internal.cache.xmlcache.RegionCreation;
@@ -104,4 +109,43 @@ public class ElementTypeTest {
assertThat(stack.size()).isEqualTo(1);
}
+
+ @Test
+ public void startElementFieldMappingThrowsWithoutRegionMapping() {
+ stack.push(new Object());
+
+ assertThatThrownBy(() -> FIELD_MAPPING.startElement(stack, attributes))
+ .isInstanceOf(CacheXmlException.class)
+ .hasMessage("<jdbc:field-mapping> elements must occur within
<jdbc:mapping> elements");
+ }
+
+ @Test
+ public void startElementFieldMapping() {
+ RegionMapping mapping = new RegionMapping();
+ stack.push(mapping);
+ when(attributes.getValue(PDX_NAME)).thenReturn("myPdxName");
+ when(attributes.getValue(PDX_TYPE)).thenReturn("myPdxType");
+ when(attributes.getValue(JDBC_NAME)).thenReturn("myJdbcName");
+ when(attributes.getValue(JDBC_TYPE)).thenReturn("myJdbcType");
+ FieldMapping expected = new FieldMapping("myPdxName", "myPdxType",
"myJdbcName", "myJdbcType");
+
+ ElementType.FIELD_MAPPING.startElement(stack, attributes);
+
+ RegionMapping mapping1 = (RegionMapping) stack.pop();
+
assertThat(mapping1.getColumnNameForField("myPdxName")).isEqualTo("myJdbcName");
+
assertThat(mapping1.getFieldNameForColumn("myJdbcName")).isEqualTo("myPdxName");
+
assertThat(mapping1.getFieldMappingByJdbcName("myJdbcName")).isEqualTo(expected);
+
assertThat(mapping1.getFieldMappingByPdxName("myPdxName")).isEqualTo(expected);
+ }
+
+ @Test
+ public void endElementFieldMapping() {
+ RegionMapping mapping = mock(RegionMapping.class);
+ stack.push(mapping);
+
+ ElementType.FIELD_MAPPING.endElement(stack);
+
+ assertThat(stack.size()).isEqualTo(1);
+ verifyZeroInteractions(mapping);
+ }
}