You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by zr...@apache.org on 2019/02/19 09:56:43 UTC
[camel] branch master updated: CAMEL-13186:
camel-salesforce-maven-plugin addi...
This is an automated email from the ASF dual-hosted git repository.
zregvart pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/camel.git
The following commit(s) were added to refs/heads/master by this push:
new 961aa13 CAMEL-13186: camel-salesforce-maven-plugin addi...
961aa13 is described below
commit 961aa13e81ac07e5b04ec86fd79d60acfaa0ac19
Author: Przemyslaw <pr...@capgemini.com>
AuthorDate: Sun Feb 17 12:48:14 2019 +0100
CAMEL-13186: camel-salesforce-maven-plugin addi...
...tional customizations missing
Picklist/Multipicklists can be now exclusively enforced to be of type
String/enum.
Based on contribution by Przemyslaw Lenik <pr...@capgemini.com>
---
.../java/org/apache/camel/maven/GenerateMojo.java | 86 ++++++++-
.../org/apache/camel/maven/GenerateMojoTest.java | 194 +++++++++++++++++++++
2 files changed, 271 insertions(+), 9 deletions(-)
diff --git a/components/camel-salesforce/camel-salesforce-maven-plugin/src/main/java/org/apache/camel/maven/GenerateMojo.java b/components/camel-salesforce/camel-salesforce-maven-plugin/src/main/java/org/apache/camel/maven/GenerateMojo.java
index a55fbff..09ab5f2 100644
--- a/components/camel-salesforce/camel-salesforce-maven-plugin/src/main/java/org/apache/camel/maven/GenerateMojo.java
+++ b/components/camel-salesforce/camel-salesforce-maven-plugin/src/main/java/org/apache/camel/maven/GenerateMojo.java
@@ -39,6 +39,7 @@ import java.util.concurrent.atomic.AtomicInteger;
import java.util.function.BinaryOperator;
import java.util.function.Function;
import java.util.function.Supplier;
+import java.util.regex.Pattern;
import java.util.stream.Collectors;
import org.apache.camel.component.salesforce.api.dto.AbstractSObjectBase;
@@ -75,8 +76,8 @@ public class GenerateMojo extends AbstractSalesforceMojo {
return stack.peek();
}
- public String enumTypeName(final String name) {
- return (name.endsWith("__c") ? name.substring(0, name.length() - 3) : name) + "Enum";
+ public String enumTypeName(final String sObjectName, final String name) {
+ return sObjectName + "_" + (name.endsWith("__c") ? name.substring(0, name.length() - 3) : name) + "Enum";
}
public List<SObjectField> externalIdsOf(final String name) {
@@ -109,20 +110,34 @@ public class GenerateMojo extends AbstractSalesforceMojo {
// check if this is a picklist
if (isPicklist(field)) {
if (Boolean.TRUE.equals(useStringsForPicklists)) {
+ if (picklistsEnumToSObject.containsKey(description.getName())
+ && picklistsEnumToSObject.get(description.getName()).contains(field.getName())) {
+ return enumTypeName(description.getName(), field.getName());
+ }
+ return String.class.getName();
+ } else if (picklistsStringToSObject.containsKey(description.getName())
+ && picklistsStringToSObject.get(description.getName()).contains(field.getName())) {
return String.class.getName();
}
// use a pick list enum, which will be created after generating
// the SObject class
- return description.getName() + "_" + enumTypeName(field.getName());
+ return enumTypeName(description.getName(), field.getName());
} else if (isMultiSelectPicklist(field)) {
if (Boolean.TRUE.equals(useStringsForPicklists)) {
+ if (picklistsEnumToSObject.containsKey(description.getName())
+ && picklistsEnumToSObject.get(description.getName()).contains(field.getName())) {
+ return enumTypeName(description.getName(), field.getName()) + "[]";
+ }
+ return String.class.getName() + "[]";
+ } else if (picklistsStringToSObject.containsKey(description.getName())
+ && picklistsStringToSObject.get(description.getName()).contains(field.getName())) {
return String.class.getName() + "[]";
}
// use a pick list enum array, enum will be created after
// generating the SObject class
- return description.getName() + "_" + enumTypeName(field.getName()) + "[]";
+ return enumTypeName(description.getName(), field.getName()) + "[]";
} else {
// map field to Java type
final String soapType = field.getSoapType();
@@ -280,17 +295,19 @@ public class GenerateMojo extends AbstractSalesforceMojo {
private static final List<String> BLACKLISTED_PROPERTIES = Arrays.asList("PicklistValues", "ChildRelationships");
- private static final String JAVA_EXT = ".java";
+ private static final Pattern FIELD_DEFINITION_PATTERN = Pattern.compile("\\w+\\.{1}\\w+");
+ private static final String JAVA_EXT = ".java";
// used for velocity logging, to avoid creating velocity.log
private static final Logger LOG = Logger.getLogger(GenerateMojo.class.getName());
- private static final String MULTIPICKLIST = "multipicklist";
+ private static final String MULTIPICKLIST = "multipicklist";
private static final String PACKAGE_NAME_PATTERN = "(\\p{javaJavaIdentifierStart}\\p{javaJavaIdentifierPart}*\\.)+\\p{javaJavaIdentifierStart}\\p{javaJavaIdentifierPart}*";
private static final String PICKLIST = "picklist";
private static final String SOBJECT_LOOKUP_VM = "/sobject-lookup.vm";
private static final String SOBJECT_PICKLIST_VM = "/sobject-picklist.vm";
private static final String SOBJECT_POJO_OPTIONAL_VM = "/sobject-pojo-optional.vm";
+
private static final String SOBJECT_POJO_VM = "/sobject-pojo.vm";
private static final String SOBJECT_QUERY_RECORDS_OPTIONAL_VM = "/sobject-query-records-optional.vm";
@@ -327,6 +344,27 @@ public class GenerateMojo extends AbstractSalesforceMojo {
String packageName;
/**
+ * Names of specific picklist/multipicklist fields, which should be
+ * converted to Enum (default case) if property
+ * {@link this#useStringsForPicklists} is set to true. Format:
+ * SObjectApiName.FieldApiName (e.g. Account.DataSource)
+ */
+ @Parameter
+ String[] picklistToEnums;
+
+ /**
+ * Names of specific picklist/multipicklist fields, which should be
+ * converted to String if property {@link this#useStringsForPicklists} is
+ * set to false. Format: SObjectApiName.FieldApiName (e.g.
+ * Account.DataSource)
+ */
+ @Parameter
+ String[] picklistToStrings;
+
+ @Parameter(property = "camelSalesforce.useStringsForPicklists", defaultValue = "false")
+ Boolean useStringsForPicklists;
+
+ /**
* Exclude Salesforce SObjects that match pattern.
*/
@Parameter(property = "camelSalesforce.excludePattern")
@@ -344,16 +382,29 @@ public class GenerateMojo extends AbstractSalesforceMojo {
@Parameter
private String[] includes;
+ private final Map<String, Set<String>> picklistsEnumToSObject = new HashMap<>();
+
+ private final Map<String, Set<String>> picklistsStringToSObject = new HashMap<>();
+
private final Map<String, String> types = new HashMap<>(DEFAULT_TYPES);
@Parameter(property = "camelSalesforce.useOptionals", defaultValue = "false")
private boolean useOptionals;
- @Parameter(property = "camelSalesforce.useStringsForPicklists", defaultValue = "false")
- private Boolean useStringsForPicklists;
+ void parsePicklistToEnums() {
+ parsePicklistOverrideArgs(picklistToEnums, picklistsEnumToSObject);
+ }
+
+ void parsePicklistToStrings() {
+ parsePicklistOverrideArgs(picklistToStrings, picklistsStringToSObject);
+ }
void processDescription(final File pkgDir, final SObjectDescription description, final GeneratorUtility utility)
throws IOException {
+ useStringsForPicklists = useStringsForPicklists == null ? Boolean.FALSE : useStringsForPicklists;
+
+ parsePicklistToEnums();
+ parsePicklistToStrings();
// generate a source file for SObject
final VelocityContext context = new VelocityContext();
@@ -420,7 +471,7 @@ public class GenerateMojo extends AbstractSalesforceMojo {
// write required Enumerations for any picklists
for (final SObjectField field : description.getFields()) {
if (utility.isPicklist(field) || utility.isMultiSelectPicklist(field)) {
- final String enumName = description.getName() + "_" + utility.enumTypeName(field.getName());
+ final String enumName = utility.enumTypeName(description.getName(), field.getName());
final String enumFileName = enumName + JAVA_EXT;
final File enumFile = new File(pkgDir, enumFileName);
@@ -570,4 +621,21 @@ public class GenerateMojo extends AbstractSalesforceMojo {
return Collections.unmodifiableMap(lookupMap);
}
+
+ private static void parsePicklistOverrideArgs(final String[] picklists,
+ final Map<String, Set<String>> picklistsToSObject) {
+ if (picklists != null && picklists.length > 0) {
+ String[] strings;
+ for (final String picklist : picklists) {
+ if (!FIELD_DEFINITION_PATTERN.matcher(picklist).matches()) {
+ throw new IllegalArgumentException(
+ "Invalid format provided for picklistFieldToEnum value - allowed format SObjectName.FieldName");
+ }
+ strings = picklist.split("\\.");
+ picklistsToSObject.putIfAbsent(strings[0], new HashSet<>());
+ picklistsToSObject.get(strings[0]).add(strings[1]);
+ }
+ }
+ }
+
}
diff --git a/components/camel-salesforce/camel-salesforce-maven-plugin/src/test/java/org/apache/camel/maven/GenerateMojoTest.java b/components/camel-salesforce/camel-salesforce-maven-plugin/src/test/java/org/apache/camel/maven/GenerateMojoTest.java
new file mode 100644
index 0000000..c3dbcb7
--- /dev/null
+++ b/components/camel-salesforce/camel-salesforce-maven-plugin/src/test/java/org/apache/camel/maven/GenerateMojoTest.java
@@ -0,0 +1,194 @@
+/**
+ * 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.maven;
+
+import java.util.ArrayList;
+
+import org.apache.camel.component.salesforce.api.dto.SObjectDescription;
+import org.apache.camel.component.salesforce.api.dto.SObjectField;
+import org.junit.Test;
+
+import static org.hamcrest.CoreMatchers.endsWith;
+import static org.hamcrest.CoreMatchers.equalTo;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertThat;
+import static org.junit.Assert.assertTrue;
+
+public class GenerateMojoTest {
+
+ private static final String ACCOUNT = "Account";
+ private static final String CONTACT = "Contact";
+ private static final String MULTIPICKLIST = "multipicklist";
+ private static final String PICKLIST = "picklist";
+
+ private static final String PROPER_DEFAULT_MULTIPICKLIST_TYPE_ENDING = "Enum[]";
+ private static final String PROPER_DEFAULT_PICKLIST_TYPE_ENDING = "Enum";
+ private static final String PROPER_MULTIPICKLIST_TO_STRING_TYPE = String.class.getName() + "[]";
+ private static final String PROPER_PICKLIST_TO_STRING_TYPE = String.class.getName();
+
+ @Test
+ public void shouldParsePicklistsToObjects() {
+ // given
+ final int properCountExceptions = 0;
+ final GenerateMojo mojo = new GenerateMojo();
+ mojo.picklistToStrings = createValidPicklistToStrings();
+ mojo.picklistToEnums = createValidPicklistToEnums();
+
+ // when
+ int resultCountExceptions = 0;
+ try {
+ mojo.parsePicklistToEnums();
+ } catch (final IllegalArgumentException e) {
+ resultCountExceptions++;
+ }
+
+ try {
+ mojo.parsePicklistToStrings();
+ } catch (final IllegalArgumentException e) {
+ resultCountExceptions++;
+ }
+
+ // then
+ assertEquals(properCountExceptions, resultCountExceptions);
+ }
+
+ @Test
+ public void shouldParsePicklistsToObjectsFail() {
+ // given
+ final int properCountExceptions = 2;
+ final String[] invalidPicklistToStrings = new String[] {"Account,DataSource"};
+ final String[] invalidPicklistToEnums = new String[] {"Con-tact.Contact_Source_Information__c"};
+ final GenerateMojo mojo = new GenerateMojo();
+ mojo.picklistToStrings = invalidPicklistToStrings;
+ mojo.picklistToEnums = invalidPicklistToEnums;
+
+ // when
+ int resultCountExceptions = 0;
+ try {
+ mojo.parsePicklistToEnums();
+ } catch (final IllegalArgumentException e) {
+ resultCountExceptions++;
+ }
+
+ try {
+ mojo.parsePicklistToStrings();
+ } catch (final IllegalArgumentException e) {
+ resultCountExceptions++;
+ }
+
+ // then
+ assertEquals(properCountExceptions, resultCountExceptions);
+ }
+
+ @Test
+ public void shouldReturnStringOrEnumTypesDefaultEnumMode() {
+ // given
+ final String sObjectName = ACCOUNT;
+ final GenerateMojo mojo = new GenerateMojo();
+ mojo.picklistToStrings = new String[] {sObjectName + ".StandardPicklist",
+ sObjectName + ".Stringified_Custom_Picklist_Type__c"};
+ mojo.parsePicklistToStrings();
+ assertTrue(mojo.picklistToStrings != null && mojo.picklistToStrings.length > 1);
+
+ final SObjectDescription accountDescription = new SObjectDescription();
+ accountDescription.setName(ACCOUNT);
+ accountDescription.setFields(new ArrayList<>());
+
+ final SObjectField defaultPicklist = createField("Default_Picklist__c", PICKLIST);
+ final SObjectField defaultMultipicklist = createField("Default_Multipicklist__c", MULTIPICKLIST);
+ final SObjectField picklistToString = createField(
+ mojo.picklistToStrings[0].substring(mojo.picklistToStrings[0].indexOf('.') + 1), PICKLIST);
+ final SObjectField multipicklistToString = createField(
+ mojo.picklistToStrings[1].substring(mojo.picklistToStrings[1].indexOf('.') + 1), MULTIPICKLIST);
+ accountDescription.getFields().add(defaultPicklist);
+ accountDescription.getFields().add(defaultMultipicklist);
+ accountDescription.getFields().add(picklistToString);
+ accountDescription.getFields().add(multipicklistToString);
+
+ mojo.useStringsForPicklists = false;
+ final GenerateMojo.GeneratorUtility utility = mojo.new GeneratorUtility();
+
+ // when
+ final String resultDefaultPicklistType = utility.getFieldType(accountDescription, defaultPicklist);
+ final String resultDefaultMultipicklistType = utility.getFieldType(accountDescription, defaultMultipicklist);
+ final String resultPicklistToStringType = utility.getFieldType(accountDescription, picklistToString);
+ final String resultMultipicklistToStringType = utility.getFieldType(accountDescription, multipicklistToString);
+
+ // then
+ assertThat(resultDefaultPicklistType, endsWith(PROPER_DEFAULT_PICKLIST_TYPE_ENDING));
+ assertThat(resultDefaultMultipicklistType, endsWith(PROPER_DEFAULT_MULTIPICKLIST_TYPE_ENDING));
+ assertThat(resultPicklistToStringType, equalTo(PROPER_PICKLIST_TO_STRING_TYPE));
+ assertThat(resultMultipicklistToStringType, equalTo(PROPER_MULTIPICKLIST_TO_STRING_TYPE));
+ }
+
+ @Test
+ public void shouldReturnStringOrEnumTypesStringMode() {
+ // given
+ final String sObjectName = CONTACT;
+ final GenerateMojo mojo = new GenerateMojo();
+ mojo.picklistToEnums = new String[] {sObjectName + ".Enum_Contact_Source_Information__c",
+ sObjectName + ".Enum_Contract_Type__c"};
+ mojo.parsePicklistToEnums();
+
+ final SObjectDescription contactDescription = new SObjectDescription();
+ contactDescription.setName(sObjectName);
+ contactDescription.setFields(new ArrayList<>());
+
+ final SObjectField stringPicklist = createField("Nonspecific_Picklist__c", PICKLIST);
+ final SObjectField stringMultipicklist = createField("Nonspecific_Multipicklist__c", MULTIPICKLIST);
+ final SObjectField picklistToEnum = createField(
+ mojo.picklistToEnums[0].substring(mojo.picklistToEnums[0].indexOf('.') + 1), PICKLIST);
+ final SObjectField multipicklistToEnum = createField(
+ mojo.picklistToEnums[1].substring(mojo.picklistToEnums[1].indexOf('.') + 1), MULTIPICKLIST);
+ contactDescription.getFields().add(stringPicklist);
+ contactDescription.getFields().add(stringMultipicklist);
+ contactDescription.getFields().add(picklistToEnum);
+ contactDescription.getFields().add(multipicklistToEnum);
+
+ mojo.useStringsForPicklists = true;
+ final GenerateMojo.GeneratorUtility utility = mojo.new GeneratorUtility();
+
+ // when
+ final String resultStringPicklistType = utility.getFieldType(contactDescription, stringPicklist);
+ final String resultStringMultipicklistType = utility.getFieldType(contactDescription, stringMultipicklist);
+ final String resultPicklistToEnumType = utility.getFieldType(contactDescription, picklistToEnum);
+ final String resultMultipicklistToEnumType = utility.getFieldType(contactDescription, multipicklistToEnum);
+
+ // then
+ assertThat(resultPicklistToEnumType, endsWith(PROPER_DEFAULT_PICKLIST_TYPE_ENDING));
+ assertThat(resultMultipicklistToEnumType, endsWith(PROPER_DEFAULT_MULTIPICKLIST_TYPE_ENDING));
+ assertThat(resultStringPicklistType, equalTo(PROPER_PICKLIST_TO_STRING_TYPE));
+ assertThat(resultStringMultipicklistType, equalTo(PROPER_MULTIPICKLIST_TO_STRING_TYPE));
+ }
+
+ private static SObjectField createField(final String name, final String type) {
+ final SObjectField field = new SObjectField();
+ field.setName(name);
+ field.setType(type);
+ return field;
+ }
+
+ private static String[] createValidPicklistToEnums() {
+ return new String[] {CONTACT + ".Contact_Source_Information__c", CONTACT + ".Contract_Type__c",
+ CONTACT + ".Custom_Picklist_Type__c"};
+ }
+
+ private static String[] createValidPicklistToStrings() {
+ return new String[] {ACCOUNT + ".DataSource", ACCOUNT + ".Custom_Picklist_Type__c",
+ ACCOUNT + ".Other_Custom_Picklist_Type__c"};
+ }
+}