You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by da...@apache.org on 2016/06/14 11:04:29 UTC
camel git commit: Fix multi select picklist fields
Repository: camel
Updated Branches:
refs/heads/master 47c95399f -> 7ea7d1b69
Fix multi select picklist fields
Signed-off-by: Sune Keller <ab...@almbrand.dk>
Project: http://git-wip-us.apache.org/repos/asf/camel/repo
Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/7ea7d1b6
Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/7ea7d1b6
Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/7ea7d1b6
Branch: refs/heads/master
Commit: 7ea7d1b691360f317b928feda89ea5d6a8ce859e
Parents: 47c9539
Author: Sune Keller <ab...@almbrand.dk>
Authored: Tue Jun 14 12:32:15 2016 +0200
Committer: Sune Keller <ab...@almbrand.dk>
Committed: Tue Jun 14 12:51:11 2016 +0200
----------------------------------------------------------------------
.../api/StringMultiSelectPicklistConverter.java | 84 ++++++++++++++++++++
.../StringMultiSelectPicklistDeserializer.java | 67 ++++++++++++++++
.../StringMultiSelectPicklistSerializer.java | 56 +++++++++++++
.../apache/camel/maven/CamelSalesforceMojo.java | 4 +-
.../src/main/resources/sobject-pojo.vm | 28 +++++--
5 files changed, 230 insertions(+), 9 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/camel/blob/7ea7d1b6/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/api/StringMultiSelectPicklistConverter.java
----------------------------------------------------------------------
diff --git a/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/api/StringMultiSelectPicklistConverter.java b/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/api/StringMultiSelectPicklistConverter.java
new file mode 100644
index 0000000..f56ee05
--- /dev/null
+++ b/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/api/StringMultiSelectPicklistConverter.java
@@ -0,0 +1,84 @@
+/**
+ * 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.camel.component.salesforce.api;
+
+import java.lang.reflect.Array;
+
+import com.thoughtworks.xstream.converters.ConversionException;
+import com.thoughtworks.xstream.converters.Converter;
+import com.thoughtworks.xstream.converters.MarshallingContext;
+import com.thoughtworks.xstream.converters.UnmarshallingContext;
+import com.thoughtworks.xstream.io.HierarchicalStreamReader;
+import com.thoughtworks.xstream.io.HierarchicalStreamWriter;
+
+/**
+ * XStream converter for handling MSPs mapped to String array fields.
+ */
+public class StringMultiSelectPicklistConverter implements Converter {
+
+ @Override
+ public void marshal(Object o, HierarchicalStreamWriter writer, MarshallingContext context) {
+ try {
+ final int length = Array.getLength(o);
+
+ // construct a string of form value1;value2;...
+ final StringBuilder buffer = new StringBuilder();
+ for (int i = 0; i < length; i++) {
+ buffer.append((String) o);
+ if (i < (length - 1)) {
+ buffer.append(';');
+ }
+ }
+ writer.setValue(buffer.toString());
+ } catch (Exception e) {
+ throw new ConversionException(
+ String.format("Exception writing pick list value %s of type %s: %s",
+ o, o.getClass().getName(), e.getMessage()), e);
+ }
+ }
+
+ @Override
+ public Object unmarshal(HierarchicalStreamReader reader, UnmarshallingContext context) {
+ final String listValue = reader.getValue();
+ final Class<?> requiredArrayType = context.getRequiredType();
+
+ try {
+ // parse the string of the form value1;value2;...
+ final String[] value = listValue.split(";");
+ final int length = value.length;
+ final String[] resultArray = new String[length];
+ for (int i = 0; i < length; i++) {
+ // use factory method to create object
+ resultArray[i] = value[i].trim();
+ Array.set(resultArray, i, value[i].trim());
+ }
+ return resultArray;
+ } catch (Exception e) {
+ throw new ConversionException(
+ String.format("Exception reading pick list value %s of type %s: %s",
+ listValue, requiredArrayType.getName(), e.getMessage()), e);
+ }
+ }
+
+ @Override
+ public boolean canConvert(Class aClass) {
+ // check whether the Class is an array, and whether the array element is a String
+ final Class<?> componentType = aClass.getComponentType();
+ return componentType != null && String.class == componentType;
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/camel/blob/7ea7d1b6/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/api/StringMultiSelectPicklistDeserializer.java
----------------------------------------------------------------------
diff --git a/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/api/StringMultiSelectPicklistDeserializer.java b/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/api/StringMultiSelectPicklistDeserializer.java
new file mode 100644
index 0000000..5fe86ae
--- /dev/null
+++ b/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/api/StringMultiSelectPicklistDeserializer.java
@@ -0,0 +1,67 @@
+/**
+ * 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.camel.component.salesforce.api;
+
+import java.io.IOException;
+import java.lang.reflect.Array;
+
+import org.codehaus.jackson.JsonParseException;
+import org.codehaus.jackson.JsonParser;
+import org.codehaus.jackson.map.BeanProperty;
+import org.codehaus.jackson.map.ContextualDeserializer;
+import org.codehaus.jackson.map.DeserializationConfig;
+import org.codehaus.jackson.map.DeserializationContext;
+import org.codehaus.jackson.map.JsonDeserializer;
+import org.codehaus.jackson.map.JsonMappingException;
+
+/**
+ * Jackson deserializer base class for reading ';' separated strings for MultiSelect pick-lists.
+ */
+public class StringMultiSelectPicklistDeserializer
+ extends JsonDeserializer<Object> implements ContextualDeserializer<Object> {
+
+ @Override
+ public Object deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException {
+
+ final String listValue = jp.getText();
+
+ try {
+ // parse the string of the form value1;value2;...
+ final String[] value = listValue.split(";");
+ final int length = value.length;
+ final Object resultArray = Array.newInstance(String.class, length);
+ for (int i = 0; i < length; i++) {
+ // use factory method to create object
+ Array.set(resultArray, i, value[i].trim());
+ }
+
+ return resultArray;
+ } catch (Exception e) {
+ throw new JsonParseException("Exception reading multi-select pick list value", jp.getCurrentLocation(), e);
+ }
+ }
+
+ @Override
+ public JsonDeserializer<Object> createContextual(DeserializationConfig config, BeanProperty property) throws JsonMappingException {
+ final Class<?> rawClass = property.getType().getRawClass();
+ final Class<?> componentType = rawClass.getComponentType();
+ if (componentType == null || componentType != String.class) {
+ throw new JsonMappingException("Pick list String array expected for " + rawClass);
+ }
+ return new StringMultiSelectPicklistDeserializer();
+ }
+}
http://git-wip-us.apache.org/repos/asf/camel/blob/7ea7d1b6/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/api/StringMultiSelectPicklistSerializer.java
----------------------------------------------------------------------
diff --git a/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/api/StringMultiSelectPicklistSerializer.java b/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/api/StringMultiSelectPicklistSerializer.java
new file mode 100644
index 0000000..a3b15e4
--- /dev/null
+++ b/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/api/StringMultiSelectPicklistSerializer.java
@@ -0,0 +1,56 @@
+/**
+ * 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.camel.component.salesforce.api;
+
+import java.io.IOException;
+import java.lang.reflect.Array;
+
+import org.codehaus.jackson.JsonGenerationException;
+import org.codehaus.jackson.JsonGenerator;
+import org.codehaus.jackson.map.JsonSerializer;
+import org.codehaus.jackson.map.SerializerProvider;
+
+/**
+ * Jackson Serializer for generating ';' separated strings for MultiSelect pick-lists.
+ */
+public class StringMultiSelectPicklistSerializer extends JsonSerializer<Object> {
+
+ @Override
+ public void serialize(Object value, JsonGenerator jgen, SerializerProvider provider) throws IOException {
+ try {
+
+ String[] a = (String[]) value;
+ final int length = a.length;
+
+ // construct a string of form value1;value2;...
+ final StringBuilder buffer = new StringBuilder();
+ for (int i = 0; i < length; i++) {
+ buffer.append((String) a[i].trim());
+ if (i < (length - 1)) {
+ buffer.append(';');
+ }
+ }
+
+ jgen.writeString(buffer.toString());
+
+ } catch (Exception e) {
+ throw new JsonGenerationException(
+ String.format("Exception writing pick list value %s of type %s: %s",
+ value, value.getClass().getName(), e.getMessage()), e);
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/camel/blob/7ea7d1b6/components/camel-salesforce/camel-salesforce-maven-plugin/src/main/java/org/apache/camel/maven/CamelSalesforceMojo.java
----------------------------------------------------------------------
diff --git a/components/camel-salesforce/camel-salesforce-maven-plugin/src/main/java/org/apache/camel/maven/CamelSalesforceMojo.java b/components/camel-salesforce/camel-salesforce-maven-plugin/src/main/java/org/apache/camel/maven/CamelSalesforceMojo.java
index c58e56a..5d3d40e 100644
--- a/components/camel-salesforce/camel-salesforce-maven-plugin/src/main/java/org/apache/camel/maven/CamelSalesforceMojo.java
+++ b/components/camel-salesforce/camel-salesforce-maven-plugin/src/main/java/org/apache/camel/maven/CamelSalesforceMojo.java
@@ -717,10 +717,10 @@ public class CamelSalesforceMojo extends AbstractMojo {
}
} else if (isMultiSelectPicklist(field)) {
if (useStringsForPicklists) {
- return description.getName() + "_" + enumTypeName(field.getName()) + "[]";
+ return String.class.getName() + "[]";
} else {
// use a pick list enum array, enum will be created after generating the SObject class
- return enumTypeName(field.getName()) + "[]";
+ return description.getName() + "_" + enumTypeName(field.getName()) + "[]";
}
} else {
// map field to Java type
http://git-wip-us.apache.org/repos/asf/camel/blob/7ea7d1b6/components/camel-salesforce/camel-salesforce-maven-plugin/src/main/resources/sobject-pojo.vm
----------------------------------------------------------------------
diff --git a/components/camel-salesforce/camel-salesforce-maven-plugin/src/main/resources/sobject-pojo.vm b/components/camel-salesforce/camel-salesforce-maven-plugin/src/main/resources/sobject-pojo.vm
index 438d7f5..6e1c47a 100644
--- a/components/camel-salesforce/camel-salesforce-maven-plugin/src/main/resources/sobject-pojo.vm
+++ b/components/camel-salesforce/camel-salesforce-maven-plugin/src/main/resources/sobject-pojo.vm
@@ -21,20 +21,22 @@
*/
package $packageName;
-#if ( !$useStringsForPicklists )
## add imports for XStreamConverter and PicklistEnumConverter if needed
#set ( $hasPicklists = $utility.hasPicklists($desc) )
#set ( $hasMultiSelectPicklists = $utility.hasMultiSelectPicklists($desc) )
-#end
import com.thoughtworks.xstream.annotations.XStreamAlias;
-#if ( !$useStringsForPicklists )
-#if ( $hasPicklists || $hasMultiSelectPicklists )
+#if ( ($hasPicklists && !$useStringsForPicklists) || $hasMultiSelectPicklists )
import com.thoughtworks.xstream.annotations.XStreamConverter;
#end
-#if ( $hasPicklists )
+#if ( $hasPicklists && !$useStringsForPicklists )
import org.apache.camel.component.salesforce.api.PicklistEnumConverter;
#end
#if ( $hasMultiSelectPicklists )
+#if ( $useStringsForPicklists )
+import org.apache.camel.component.salesforce.api.StringMultiSelectPicklistConverter;
+import org.apache.camel.component.salesforce.api.StringMultiSelectPicklistDeserializer;
+import org.apache.camel.component.salesforce.api.StringMultiSelectPicklistSerializer;
+#else
import org.apache.camel.component.salesforce.api.MultiSelectPicklistConverter;
import org.apache.camel.component.salesforce.api.MultiSelectPicklistDeserializer;
import org.apache.camel.component.salesforce.api.MultiSelectPicklistSerializer;
@@ -42,7 +44,7 @@ import org.apache.camel.component.salesforce.api.MultiSelectPicklistSerializer;
#end
import org.apache.camel.component.salesforce.api.dto.AbstractSObjectBase;
import org.codehaus.jackson.annotate.JsonProperty;
-#if ( !$useStringsForPicklists && $hasMultiSelectPicklists )
+#if ( $hasMultiSelectPicklists )
import org.codehaus.jackson.map.annotate.JsonDeserialize;
import org.codehaus.jackson.map.annotate.JsonSerialize;
#end
@@ -67,8 +69,12 @@ public class $desc.Name extends AbstractSObjectBase {
## add a converter annotation if needed
#if ( !$useStringsForPicklists && !$isMultiSelectPicklist && $utility.isPicklist($field) )
@XStreamConverter(PicklistEnumConverter.class)
-#elseif ( !$useStringsForPicklists && $isMultiSelectPicklist )
+#elseif ( $isMultiSelectPicklist )
+#if ( $useStringsForPicklists )
+ @XStreamConverter(StringMultiSelectPicklistConverter.class)
+#else
@XStreamConverter(MultiSelectPicklistConverter.class)
+#end
#else
## add an alias for blob field url if needed
#if ( $propertyName != $fieldName )
@@ -80,16 +86,24 @@ public class $desc.Name extends AbstractSObjectBase {
@JsonProperty("$fieldName")
#if ( $isMultiSelectPicklist )
+#if ( $useStringsForPicklists )
+ @JsonSerialize(using = StringMultiSelectPicklistSerializer.class)
+#else
@JsonSerialize(using = MultiSelectPicklistSerializer.class)
#end
+#end
public $fieldType get$propertyName() {
return this.$propertyName;
}
@JsonProperty("$fieldName")
#if ( $isMultiSelectPicklist )
+#if ( $useStringsForPicklists )
+ @JsonDeserialize(using = StringMultiSelectPicklistDeserializer.class)
+#else
@JsonDeserialize(using = MultiSelectPicklistDeserializer.class)
#end
+#end
public void set$propertyName($fieldType $propertyName) {
this.$propertyName = $propertyName;
}