Author: victortey
Date: 2012-06-14 23:34:09 -0700 (Thu, 14 Jun 2012)
New Revision: 38805
Modified:
trunk/modules/extension/app-schema/app-schema/src/main/java/org/geotools/data/complex/AttributeMapping.java
trunk/modules/extension/app-schema/app-schema/src/main/java/org/geotools/data/complex/DataAccessMappingFeatureIterator.java
trunk/modules/extension/app-schema/app-schema/src/main/java/org/geotools/data/complex/config/AppSchemaDataAccessConfigurator.java
trunk/modules/extension/app-schema/app-schema/src/main/java/org/geotools/data/complex/config/AttributeMapping.java
trunk/modules/extension/app-schema/app-schema/src/main/java/org/geotools/data/complex/config/XMLConfigDigester.java
trunk/modules/extension/app-schema/app-schema/src/test/resources/test-data/AppSchemaDataAccess.xsd
Log:
GEOT-3454: Geoserver app-schema: types that only have client properties attributes are always skipped
Modified: trunk/modules/extension/app-schema/app-schema/src/main/java/org/geotools/data/complex/AttributeMapping.java
===================================================================
--- trunk/modules/extension/app-schema/app-schema/src/main/java/org/geotools/data/complex/AttributeMapping.java 2012-06-14 03:42:35 UTC (rev 38804)
+++ trunk/modules/extension/app-schema/app-schema/src/main/java/org/geotools/data/complex/AttributeMapping.java 2012-06-15 06:34:09 UTC (rev 38805)
@@ -47,6 +47,8 @@
private boolean isMultiValued;
+ private boolean encodeIfEmpty;
+
private boolean isList;
/**
@@ -99,6 +101,10 @@
return isMultiValued;
}
+ public boolean encodeIfEmpty() {
+ return encodeIfEmpty;
+ }
+
public boolean isList() {
return isList;
}
@@ -155,6 +161,10 @@
this.instancePath = instancePath;
}
+ public void setEncodeIfEmpty(boolean encodeIfEmpty) {
+ this.encodeIfEmpty = encodeIfEmpty;
+ }
+
public void setList(boolean isList) {
this.isList = isList;
}
Modified: trunk/modules/extension/app-schema/app-schema/src/main/java/org/geotools/data/complex/DataAccessMappingFeatureIterator.java
===================================================================
--- trunk/modules/extension/app-schema/app-schema/src/main/java/org/geotools/data/complex/DataAccessMappingFeatureIterator.java 2012-06-14 03:42:35 UTC (rev 38804)
+++ trunk/modules/extension/app-schema/app-schema/src/main/java/org/geotools/data/complex/DataAccessMappingFeatureIterator.java 2012-06-15 06:34:09 UTC (rev 38805)
@@ -600,6 +600,9 @@
targetNodeType, false, sourceExpression);
setClientProperties(instance, source, clientPropsMappings);
+ }
+ if (instance != null && attMapping.encodeIfEmpty()) {
+ instance.getDescriptor().getUserData().put("encodeIfEmpty", attMapping.encodeIfEmpty());
}
return instance;
}
@@ -1022,7 +1025,7 @@
ArrayList values = new ArrayList<Property>();
for (Iterator i = target.getValue().iterator(); i.hasNext();) {
Property p = (Property) i.next();
- if (hasChild(p) || p.getDescriptor().getMinOccurs() > 0) {
+ if (hasChild(p) || p.getDescriptor().getMinOccurs() > 0 || getEncodeIfEmpty(p)) {
values.add(p);
}
}
@@ -1048,6 +1051,9 @@
if (hasChild((Property) o)) {
values.add(o);
result = true;
+ } else if (getEncodeIfEmpty((Property) o)) {
+ values.add(o);
+ result = true;
} else if (((Property) o).getDescriptor().getMinOccurs() > 0) {
if (((Property) o).getDescriptor().isNillable()) {
// add nil mandatory property
@@ -1217,4 +1223,13 @@
public void setListFilter(Filter filter) {
listFilter = filter;
}
+
+
+ private boolean getEncodeIfEmpty(Property p) {
+ Object o = ((p.getDescriptor()).getUserData().get("encodeIfEmpty"));
+ if (o == null) {
+ return false;
+ }
+ return (Boolean) o;
+ }
}
Modified: trunk/modules/extension/app-schema/app-schema/src/main/java/org/geotools/data/complex/config/AppSchemaDataAccessConfigurator.java
===================================================================
--- trunk/modules/extension/app-schema/app-schema/src/main/java/org/geotools/data/complex/config/AppSchemaDataAccessConfigurator.java 2012-06-14 03:42:35 UTC (rev 38804)
+++ trunk/modules/extension/app-schema/app-schema/src/main/java/org/geotools/data/complex/config/AppSchemaDataAccessConfigurator.java 2012-06-15 06:34:09 UTC (rev 38805)
@@ -406,6 +406,10 @@
if (attDto.isList()) {
attMapping.setList(true);
}
+
+ if (attDto.encodeIfEmpty()) {
+ attMapping.setEncodeIfEmpty(true);
+ }
/**
* Label and parent label are specific for web service backend
Modified: trunk/modules/extension/app-schema/app-schema/src/main/java/org/geotools/data/complex/config/AttributeMapping.java
===================================================================
--- trunk/modules/extension/app-schema/app-schema/src/main/java/org/geotools/data/complex/config/AttributeMapping.java 2012-06-14 03:42:35 UTC (rev 38804)
+++ trunk/modules/extension/app-schema/app-schema/src/main/java/org/geotools/data/complex/config/AttributeMapping.java 2012-06-15 06:34:09 UTC (rev 38805)
@@ -130,7 +130,14 @@
*/
private boolean isMultiple;
+
/**
+ * If <code>true</code>, indicates that one this attribute should be encode if it contains null
+ * or empty value.
+ */
+ private boolean encodeIfEmpty;
+
+ /**
* If <code>true</code>, indicates that this attribute corresponds to a list of values.
* This is similar to isMultiple, except the values are concatenated as a big String inside
* the attribute.
@@ -360,8 +367,37 @@
public void setMultiple(boolean isMultiple) {
this.isMultiple = isMultiple;
}
+
+ /**
+ * Returns whether this attribute should encode when empty;
+ *
+ * @return <code>true</code> encode when the value is empty, <code>false</code> otherwise.
+ */
+ public boolean encodeIfEmpty() {
+ return encodeIfEmpty;
+ }
/**
+ * Returns whether this attribute should encode when empty;
+ *
+ * @param encodeIfEmpty
+ * <code>true</code> encode when the value is empty, <code>false</code> otherwise.
+ */
+ public void setEncodeIfEmpty(boolean encodeIfEmpty) {
+ this.encodeIfEmpty = encodeIfEmpty;
+ }
+
+ /**
+ * Returns whether this attribute should encode when empty;
+ *
+ * @param encodeIfEmpty
+ * <code>true</code> encode when the value is empty, <code>false</code> otherwise.
+ */
+ public void setEncodeIfEmpty(String encodeIfEmpty) {
+ this.encodeIfEmpty = Boolean.valueOf(encodeIfEmpty).booleanValue();
+ }
+
+ /**
* Sets whether this attribute should be treated as a list valued property.
*
* @param isList
@@ -419,6 +455,8 @@
+ targetAttributePath
+ ", isMultiple: "
+ isMultiple
+ + ", encodeIfEmpty: "
+ + encodeIfEmpty
+ ((targetAttributeSchemaElement == null) ? ""
: (", target node: " + targetAttributeSchemaElement))
+ ((linkElement == null) ? "" : (", linkElement: " + linkElement))
Modified: trunk/modules/extension/app-schema/app-schema/src/main/java/org/geotools/data/complex/config/XMLConfigDigester.java
===================================================================
--- trunk/modules/extension/app-schema/app-schema/src/main/java/org/geotools/data/complex/config/XMLConfigDigester.java 2012-06-14 03:42:35 UTC (rev 38804)
+++ trunk/modules/extension/app-schema/app-schema/src/main/java/org/geotools/data/complex/config/XMLConfigDigester.java 2012-06-15 06:34:09 UTC (rev 38805)
@@ -223,6 +223,9 @@
digester.addCallMethod(attMap + "/isMultiple", "setMultiple", 1);
digester.addCallParam(attMap + "/isMultiple", 0);
+ digester.addCallMethod(attMap + "/encodeIfEmpty", "setEncodeIfEmpty", 1);
+ digester.addCallParam(attMap + "/encodeIfEmpty", 0);
+
digester.addCallMethod(attMap + "/isList", "setList", 1);
digester.addCallParam(attMap + "/isList", 0);
Modified: trunk/modules/extension/app-schema/app-schema/src/test/resources/test-data/AppSchemaDataAccess.xsd
===================================================================
--- trunk/modules/extension/app-schema/app-schema/src/test/resources/test-data/AppSchemaDataAccess.xsd 2012-06-14 03:42:35 UTC (rev 38804)
+++ trunk/modules/extension/app-schema/app-schema/src/test/resources/test-data/AppSchemaDataAccess.xsd 2012-06-15 06:34:09 UTC (rev 38805)
@@ -439,6 +439,13 @@
</documentation>
</annotation>
</element>
+ <element name="encodeIfEmpty" type="boolean" default="false" minOccurs="0">
+ <annotation>
+ <documentation>
+ <![CDATA[ Flag to determine whether to skip a attribute mapping if it is empty default to false]]>
+ </documentation>
+ </annotation>
+ </element>
<element name="isList" type="boolean" default="false" minOccurs="0">
<annotation>
<documentation>
|