This is an automated email from the ASF dual-hosted git repository.
jeremyross pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/camel.git
The following commit(s) were added to refs/heads/main by this push:
new ab59c38 CAMEL-17125: camel-salesforce: Polymorphic queries
ab59c38 is described below
commit ab59c387d9b29317fe80efa177dc866a744de87e
Author: Jeremy Ross <[email protected]>
AuthorDate: Mon Oct 25 11:26:06 2021 -0500
CAMEL-17125: camel-salesforce: Polymorphic queries
Improve support for polymorphic relationships by deserializing relationship
fields in query results to type-specific subclass.
---
.../api/utils/AsNestedPropertyDeserializer.java | 69 +++
.../api/utils/AsNestedPropertyResolver.java | 45 ++
.../salesforce/RestApiIntegrationTest.java | 17 +-
.../salesforce/dto/generated/Line_Item__c.java | 36 ++
.../salesforce/dto/generated/RecordType.java | 188 ++++++++
.../component/salesforce/dto/generated/User.java | 24 +
.../camel-salesforce-maven-plugin/README.md | 10 +
.../src/main/resources/sobject-pojo.vm | 33 +-
.../src/test/resources/generated/Asset.java | 6 +-
.../resources/generated/Asset_LocalDateTime.java | 6 +-
.../src/test/resources/generated/Case.java | 6 +-
.../generated/ComplexCalculatedFormula.java | 6 +-
.../resources/generated/With_Reference__c.java | 66 ++-
.../src/test/resources/line_item.json | 487 ++++++++++++++++++++-
14 files changed, 965 insertions(+), 34 deletions(-)
diff --git
a/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/api/utils/AsNestedPropertyDeserializer.java
b/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/api/utils/AsNestedPropertyDeserializer.java
new file mode 100644
index 0000000..0a3e409
--- /dev/null
+++
b/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/api/utils/AsNestedPropertyDeserializer.java
@@ -0,0 +1,69 @@
+/*
+ * 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.utils;
+
+import java.io.IOException;
+
+import com.fasterxml.jackson.annotation.JsonTypeInfo;
+import com.fasterxml.jackson.core.JsonParser;
+import com.fasterxml.jackson.databind.BeanProperty;
+import com.fasterxml.jackson.databind.DeserializationContext;
+import com.fasterxml.jackson.databind.JavaType;
+import com.fasterxml.jackson.databind.JsonDeserializer;
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.jsontype.TypeDeserializer;
+import com.fasterxml.jackson.databind.jsontype.TypeIdResolver;
+import com.fasterxml.jackson.databind.jsontype.impl.AsPropertyTypeDeserializer;
+import com.fasterxml.jackson.databind.node.TreeTraversingParser;
+
+public class AsNestedPropertyDeserializer extends AsPropertyTypeDeserializer {
+
+ public AsNestedPropertyDeserializer(JavaType bt, TypeIdResolver idRes,
String typePropertyName, boolean typeIdVisible,
+ JavaType defaultImpl, JsonTypeInfo.As
inclusion) {
+ super(bt, idRes, typePropertyName, typeIdVisible, defaultImpl,
inclusion);
+ }
+
+ public AsNestedPropertyDeserializer(AsPropertyTypeDeserializer src,
BeanProperty property) {
+ super(src, property);
+ }
+
+ @Override
+ public TypeDeserializer forProperty(BeanProperty prop) {
+ return (prop == _property) ? this : new
AsNestedPropertyDeserializer(this, prop);
+ }
+
+ @Override
+ public Object deserializeTypedFromObject(JsonParser p,
DeserializationContext ctxt) throws IOException {
+ JsonNode originalNode = p.readValueAsTree();
+ JsonNode node = originalNode;
+ for (String property : _typePropertyName.split("\\.")) {
+ JsonNode nestedProperty = node.get(property);
+ if (nestedProperty == null) {
+ ctxt.reportInputMismatch(_property,
+ "Nested property not found in JSON: " +
_typePropertyName);
+ return null;
+ }
+ node = nestedProperty;
+ }
+ JsonDeserializer<Object> deser = _findDeserializer(ctxt,
node.asText());
+ JsonParser jsonParser = new TreeTraversingParser(originalNode,
p.getCodec());
+ if (jsonParser.getCurrentToken() == null) {
+ jsonParser.nextToken();
+ }
+ return deser.deserialize(jsonParser, ctxt);
+ }
+}
diff --git
a/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/api/utils/AsNestedPropertyResolver.java
b/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/api/utils/AsNestedPropertyResolver.java
new file mode 100644
index 0000000..faf4219
--- /dev/null
+++
b/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/api/utils/AsNestedPropertyResolver.java
@@ -0,0 +1,45 @@
+/*
+ * 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.utils;
+
+import java.util.Collection;
+
+import com.fasterxml.jackson.databind.DeserializationConfig;
+import com.fasterxml.jackson.databind.JavaType;
+import com.fasterxml.jackson.databind.jsontype.NamedType;
+import com.fasterxml.jackson.databind.jsontype.PolymorphicTypeValidator;
+import com.fasterxml.jackson.databind.jsontype.TypeDeserializer;
+import com.fasterxml.jackson.databind.jsontype.TypeIdResolver;
+import com.fasterxml.jackson.databind.jsontype.impl.StdTypeResolverBuilder;
+
+public class AsNestedPropertyResolver extends StdTypeResolverBuilder {
+
+ @Override
+ public TypeDeserializer buildTypeDeserializer(
+ DeserializationConfig config, JavaType baseType,
+ Collection<NamedType> subtypes) {
+
+ final PolymorphicTypeValidator subTypeValidator =
verifyBaseTypeValidity(config, baseType);
+
+ TypeIdResolver idResolver = idResolver(config, baseType,
subTypeValidator, subtypes,
+ false, true);
+
+ return new AsNestedPropertyDeserializer(
+ baseType, idResolver, _typeProperty, _typeIdVisible,
+ null, _includeAs);
+ }
+}
diff --git
a/components/camel-salesforce/camel-salesforce-component/src/test/java/org/apache/camel/component/salesforce/RestApiIntegrationTest.java
b/components/camel-salesforce/camel-salesforce-component/src/test/java/org/apache/camel/component/salesforce/RestApiIntegrationTest.java
index 82708d7..362f88e 100644
---
a/components/camel-salesforce/camel-salesforce-component/src/test/java/org/apache/camel/component/salesforce/RestApiIntegrationTest.java
+++
b/components/camel-salesforce/camel-salesforce-component/src/test/java/org/apache/camel/component/salesforce/RestApiIntegrationTest.java
@@ -49,6 +49,7 @@ import
org.apache.camel.component.salesforce.dto.generated.QueryRecordsAccount;
import org.apache.camel.component.salesforce.dto.generated.QueryRecordsContact;
import
org.apache.camel.component.salesforce.dto.generated.QueryRecordsLine_Item__c;
import org.apache.camel.component.salesforce.dto.generated.Task;
+import org.apache.camel.component.salesforce.dto.generated.User;
import org.apache.camel.support.jsse.SSLContextParameters;
import org.eclipse.jetty.client.HttpClient;
import org.eclipse.jetty.client.api.ContentResponse;
@@ -141,6 +142,13 @@ public class RestApiIntegrationTest extends
AbstractSalesforceTestBase {
merchandiseId = merchandiseResult.getId();
}
+ private void createLineItem() {
+ Line_Item__c lineItem = new Line_Item__c();
+ final String lineItemId =
String.valueOf(TEST_LINE_ITEM_ID.incrementAndGet());
+ lineItem.setName(lineItemId);
+ CreateSObjectResult result =
template().requestBody("direct:createLineItem", lineItem,
CreateSObjectResult.class);
+ }
+
private void createAccountAndContact() {
final Account account = new Account();
account.setName("Child Test");
@@ -455,9 +463,16 @@ public class RestApiIntegrationTest extends
AbstractSalesforceTestBase {
@Test
public void testQuery() throws Exception {
+ createLineItem();
final QueryRecordsLine_Item__c queryRecords
= template().requestBody("direct:query", null,
QueryRecordsLine_Item__c.class);
assertNotNull(queryRecords);
+ // verify polymorphic query resulted in the correct type
+ assertEquals(User.class,
queryRecords.getRecords().get(0).getOwner().getClass());
+ final Line_Item__c lineItem = queryRecords.getRecords().get(0);
+ User user = (User) queryRecords.getRecords().get(0).getOwner();
+ assertNotNull(user.getUsername());
+ assertNotNull(lineItem.getRecordType());
}
@Test
@@ -735,7 +750,7 @@ public class RestApiIntegrationTest extends
AbstractSalesforceTestBase {
// testQuery
from("direct:query")
- .to("salesforce:query?sObjectQuery=SELECT name from
Line_Item__c&sObjectClass="
+ .to("salesforce:query?sObjectQuery=SELECT Id, name,
Typeof Owner WHEN User Then Username End, recordTypeId, RecordType.Name from
Line_Item__c&sObjectClass="
+ QueryRecordsLine_Item__c.class.getName() + "");
// testParentRelationshipQuery
diff --git
a/components/camel-salesforce/camel-salesforce-component/src/test/java/org/apache/camel/component/salesforce/dto/generated/Line_Item__c.java
b/components/camel-salesforce/camel-salesforce-component/src/test/java/org/apache/camel/component/salesforce/dto/generated/Line_Item__c.java
index a0639e0..62264eb 100644
---
a/components/camel-salesforce/camel-salesforce-component/src/test/java/org/apache/camel/component/salesforce/dto/generated/Line_Item__c.java
+++
b/components/camel-salesforce/camel-salesforce-component/src/test/java/org/apache/camel/component/salesforce/dto/generated/Line_Item__c.java
@@ -20,14 +20,37 @@ import java.util.ArrayList;
import java.util.List;
import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonSubTypes;
+import com.fasterxml.jackson.annotation.JsonTypeInfo;
+import com.fasterxml.jackson.databind.annotation.JsonTypeResolver;
import
org.apache.camel.component.salesforce.api.dto.AbstractDescribedSObjectBase;
+import org.apache.camel.component.salesforce.api.dto.AbstractSObjectBase;
import org.apache.camel.component.salesforce.api.dto.SObjectDescription;
import org.apache.camel.component.salesforce.api.dto.SObjectDescriptionUrls;
import org.apache.camel.component.salesforce.api.dto.SObjectField;
+import
org.apache.camel.component.salesforce.api.utils.AsNestedPropertyResolver;
//CHECKSTYLE:OFF
public class Line_Item__c extends AbstractDescribedSObjectBase {
+ @JsonTypeResolver(AsNestedPropertyResolver.class)
+ @JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include =
JsonTypeInfo.As.PROPERTY, property = "attributes.type",
+ defaultImpl = AbstractDescribedSObjectBase.class)
+ @JsonSubTypes({
+ @JsonSubTypes.Type(value = User.class, name = "User")
+ })
+ private AbstractSObjectBase Owner;
+
+ @JsonProperty("Owner")
+ public AbstractSObjectBase getOwner() {
+ return Owner;
+ }
+
+ @JsonProperty("Owner")
+ public void setOwner(AbstractSObjectBase owner) {
+ Owner = owner;
+ }
+
public Line_Item__c() {
getAttributes().setType("Line_Item__c");
}
@@ -70,6 +93,19 @@ public class Line_Item__c extends
AbstractDescribedSObjectBase {
this.Units_Sold__c = Units_Sold__c;
}
+ private RecordType RecordType;
+
+ @JsonProperty("RecordType")
+ public RecordType getRecordType() {
+ return this.RecordType;
+ }
+
+ @JsonProperty("RecordType")
+ public void setRecordType(RecordType RecordType) {
+ this.RecordType = RecordType;
+ }
+
+
@Override
public final SObjectDescription description() {
return DESCRIPTION;
diff --git
a/components/camel-salesforce/camel-salesforce-component/src/test/java/org/apache/camel/component/salesforce/dto/generated/RecordType.java
b/components/camel-salesforce/camel-salesforce-component/src/test/java/org/apache/camel/component/salesforce/dto/generated/RecordType.java
new file mode 100644
index 0000000..0292f6c
--- /dev/null
+++
b/components/camel-salesforce/camel-salesforce-component/src/test/java/org/apache/camel/component/salesforce/dto/generated/RecordType.java
@@ -0,0 +1,188 @@
+/*
+ * Salesforce DTO generated by camel-salesforce-maven-plugin.
+ */
+package org.apache.camel.component.salesforce.dto.generated;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.annotation.Generated;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import
org.apache.camel.component.salesforce.api.dto.AbstractDescribedSObjectBase;
+import org.apache.camel.component.salesforce.api.dto.SObjectDescription;
+import org.apache.camel.component.salesforce.api.dto.SObjectDescriptionUrls;
+import org.apache.camel.component.salesforce.api.dto.SObjectField;
+
+/**
+ * Salesforce DTO for SObject RecordType
+ */
+@Generated("org.apache.camel.maven.CamelSalesforceMojo")
+public class RecordType extends AbstractDescribedSObjectBase {
+
+ public RecordType() {
+ getAttributes().setType("RecordType");
+ }
+
+ private static final SObjectDescription DESCRIPTION =
createSObjectDescription();
+
+ private String DeveloperName;
+
+ @JsonProperty("DeveloperName")
+ public String getDeveloperName() {
+ return this.DeveloperName;
+ }
+
+ @JsonProperty("DeveloperName")
+ public void setDeveloperName(String DeveloperName) {
+ this.DeveloperName = DeveloperName;
+ }
+
+ private String NamespacePrefix;
+
+ @JsonProperty("NamespacePrefix")
+ public String getNamespacePrefix() {
+ return this.NamespacePrefix;
+ }
+
+ @JsonProperty("NamespacePrefix")
+ public void setNamespacePrefix(String NamespacePrefix) {
+ this.NamespacePrefix = NamespacePrefix;
+ }
+
+ private String Description;
+
+ @JsonProperty("Description")
+ public String getDescription() {
+ return this.Description;
+ }
+
+ @JsonProperty("Description")
+ public void setDescription(String Description) {
+ this.Description = Description;
+ }
+
+ private String BusinessProcessId;
+
+ @JsonProperty("BusinessProcessId")
+ public String getBusinessProcessId() {
+ return this.BusinessProcessId;
+ }
+
+ @JsonProperty("BusinessProcessId")
+ public void setBusinessProcessId(String BusinessProcessId) {
+ this.BusinessProcessId = BusinessProcessId;
+ }
+
+ private String SobjectType;
+
+ @JsonProperty("SobjectType")
+ public String getSobjectType() {
+ return this.SobjectType;
+ }
+
+ @JsonProperty("SobjectType")
+ public void setSobjectType(String SobjectType) {
+ this.SobjectType = SobjectType;
+ }
+
+ private Boolean IsActive;
+
+ @JsonProperty("IsActive")
+ public Boolean getIsActive() {
+ return this.IsActive;
+ }
+
+ @JsonProperty("IsActive")
+ public void setIsActive(Boolean IsActive) {
+ this.IsActive = IsActive;
+ }
+
+ private User CreatedBy;
+
+ @JsonProperty("CreatedBy")
+ public User getCreatedBy() {
+ return this.CreatedBy;
+ }
+
+ @JsonProperty("CreatedBy")
+ public void setCreatedBy(User CreatedBy) {
+ this.CreatedBy = CreatedBy;
+ }
+
+ private User LastModifiedBy;
+
+ @JsonProperty("LastModifiedBy")
+ public User getLastModifiedBy() {
+ return this.LastModifiedBy;
+ }
+
+ @JsonProperty("LastModifiedBy")
+ public void setLastModifiedBy(User LastModifiedBy) {
+ this.LastModifiedBy = LastModifiedBy;
+ }
+
+ @Override
+ public final SObjectDescription description() {
+ return DESCRIPTION;
+ }
+
+ private static SObjectDescription createSObjectDescription() {
+ final SObjectDescription description = new SObjectDescription();
+
+ final List<SObjectField> fields1 = new ArrayList<>();
+ description.setFields(fields1);
+
+ final SObjectField sObjectField1
+ = createField("Id", "Record Type ID", "id", "tns:ID", 18,
false, false, false, false, false, false, true);
+ fields1.add(sObjectField1);
+ final SObjectField sObjectField2
+ = createField("Name", "Name", "string", "xsd:string", 80,
false, false, true, false, false, false, true);
+ fields1.add(sObjectField2);
+ final SObjectField sObjectField3 = createField("DeveloperName",
"Record Type Name", "string", "xsd:string", 80, false,
+ false, false, false, false, false, false);
+ fields1.add(sObjectField3);
+ final SObjectField sObjectField4 = createField("NamespacePrefix",
"Namespace Prefix", "string", "xsd:string", 15, false,
+ true, false, false, false, false, false);
+ fields1.add(sObjectField4);
+ final SObjectField sObjectField5 = createField("Description",
"Description", "string", "xsd:string", 255, false, true,
+ false, false, false, false, false);
+ fields1.add(sObjectField5);
+ final SObjectField sObjectField6 = createField("BusinessProcessId",
"Business Process ID", "reference", "tns:ID", 18,
+ false, true, false, false, false, false, false);
+ fields1.add(sObjectField6);
+ final SObjectField sObjectField7 = createField("SobjectType", "SObject
Type Name", "picklist", "xsd:string", 40, false,
+ false, false, false, false, false, false);
+ fields1.add(sObjectField7);
+ final SObjectField sObjectField8 = createField("IsActive", "Active",
"boolean", "xsd:boolean", 0, false, false, false,
+ false, false, false, false);
+ fields1.add(sObjectField8);
+ final SObjectField sObjectField9 = createField("CreatedById", "Created
By ID", "reference", "tns:ID", 18, false, false,
+ false, false, false, false, false);
+ fields1.add(sObjectField9);
+ final SObjectField sObjectField10 = createField("CreatedDate",
"Created Date", "datetime", "xsd:dateTime", 0, false,
+ false, false, false, false, false, false);
+ fields1.add(sObjectField10);
+ final SObjectField sObjectField11 = createField("LastModifiedById",
"Last Modified By ID", "reference", "tns:ID", 18,
+ false, false, false, false, false, false, false);
+ fields1.add(sObjectField11);
+ final SObjectField sObjectField12 = createField("LastModifiedDate",
"Last Modified Date", "datetime", "xsd:dateTime", 0,
+ false, false, false, false, false, false, false);
+ fields1.add(sObjectField12);
+ final SObjectField sObjectField13 = createField("SystemModstamp",
"System Modstamp", "datetime", "xsd:dateTime", 0,
+ false, false, false, false, false, false, false);
+ fields1.add(sObjectField13);
+
+ description.setLabel("Record Type");
+ description.setLabelPlural("Record Types");
+ description.setName("RecordType");
+
+ final SObjectDescriptionUrls sObjectDescriptionUrls1 = new
SObjectDescriptionUrls();
+
sObjectDescriptionUrls1.setDescribe("/services/data/v50.0/sobjects/RecordType/describe");
+
sObjectDescriptionUrls1.setRowTemplate("/services/data/v50.0/sobjects/RecordType/{ID}");
+
sObjectDescriptionUrls1.setSobject("/services/data/v50.0/sobjects/RecordType");
+ description.setUrls(sObjectDescriptionUrls1);
+
+ return description;
+ }
+}
diff --git
a/components/camel-salesforce/camel-salesforce-component/src/test/java/org/apache/camel/component/salesforce/dto/generated/User.java
b/components/camel-salesforce/camel-salesforce-component/src/test/java/org/apache/camel/component/salesforce/dto/generated/User.java
new file mode 100644
index 0000000..9351ecb
--- /dev/null
+++
b/components/camel-salesforce/camel-salesforce-component/src/test/java/org/apache/camel/component/salesforce/dto/generated/User.java
@@ -0,0 +1,24 @@
+package org.apache.camel.component.salesforce.dto.generated;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import
org.apache.camel.component.salesforce.api.dto.AbstractDescribedSObjectBase;
+import org.apache.camel.component.salesforce.api.dto.SObjectDescription;
+
+public class User extends AbstractDescribedSObjectBase {
+
+ private String Username;
+
+ @JsonProperty("Username")
+ public String getUsername() {
+ return Username;
+ }
+
+ public void setUsername(String username) {
+ Username = username;
+ }
+
+ @Override
+ public final SObjectDescription description() {
+ return null;
+ }
+}
diff --git
a/components/camel-salesforce/camel-salesforce-maven-plugin/README.md
b/components/camel-salesforce/camel-salesforce-maven-plugin/README.md
index 9668457..b7a69bd 100644
--- a/components/camel-salesforce/camel-salesforce-maven-plugin/README.md
+++ b/components/camel-salesforce/camel-salesforce-maven-plugin/README.md
@@ -106,6 +106,16 @@ The plugin should be configured for the rest of the
properties, and can be execu
The generated DTOs use Jackson. All Salesforce field types are supported. Date
and time fields are mapped to java.time.ZonedDateTime, and picklist fields are
mapped to generated Java Enumerations.
+Relationship fields, e.g. `Contact.Account`, will be strongly typed if the
referenced SObject type is listed in `includes`. Otherwise, the type of the
reference object will be `AbstractDescribedSObjectBase`. Some useful but
non-obvious SObjects to include are `RecordType`, `User`, `Group`, and `Name`.
+
+[Polymorphic relationship
fields](https://developer.salesforce.com/docs/atlas.en-us.232.0.soql_sosl.meta/soql_sosl/sforce_api_calls_soql_relationships_and_polymorph_keys.htm)
will have the type `AbstractDescribedSObjectBase`, however at runtime, query
results
+will be serialized to the specific type if that type was in `includes` and a
DTO was generated for it. Note that
+the query must be written to return type-specific fields, e.g.:
+
+```
+SELECT Id, Name, Typeof Owner WHEN User Then FirstName, LastName, Username End
FROM Line_Item__c
+```
+
You can customize types, i.e. use java.time.LocalDateTime instead of the
default java.time.ZonedDateTime by specifying the `customTypes` property like:
```xml
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 e007a33..ffacb40 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
@@ -50,6 +50,10 @@ import
org.apache.camel.component.salesforce.api.dto.SObjectDescriptionUrls;
import org.apache.camel.component.salesforce.api.dto.SObjectField;
import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonSubTypes;
+import com.fasterxml.jackson.annotation.JsonTypeInfo;
+import com.fasterxml.jackson.databind.annotation.JsonTypeResolver;
+import
org.apache.camel.component.salesforce.api.utils.AsNestedPropertyResolver;
#if ( $hasMultiSelectPicklists )
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
@@ -105,19 +109,26 @@ public class $desc.Name extends
AbstractDescribedSObjectBase {
this.$propertyName = $propertyName;
}
-#if ( $field.type == "reference" && $utility.notNull($field.relationshipName)
- && $utility.hasDescription($field.getReferenceTo().get(0)) )## IS LOOKUP
$hasDescription
-#if ( $field.getReferenceTo().size() > 1)
+#end
+#if ( $field.type == "reference" && $utility.notNull($field.relationshipName)
)## IS LOOKUP $hasDescription
+#if ( $field.getReferenceTo().size() > 1 )
#set ( $propertyType = "AbstractDescribedSObjectBase")
-#set ( $needed = true )
-#else
+ @JsonTypeResolver(AsNestedPropertyResolver.class)
+ @JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include =
JsonTypeInfo.As.PROPERTY, property = "attributes.type",
+ defaultImpl = AbstractDescribedSObjectBase.class)
+ @JsonSubTypes({
+#foreach ( $sob in $field.getReferenceTo() )
+#if ($utility.hasDescription($sob))
+ @JsonSubTypes.Type(value = ${sob}.class, name = "$sob")#if(
$foreach.hasNext ),#end
+#end
+#end
+ })
+#elseif ( $sObjectNames.contains($field.getReferenceTo().get(0)) )
#set ( $propertyType = $field.getReferenceTo().get(0) )
-#set ( $needed = $sObjectNames.contains($field.getReferenceTo().get(0)) )
+#else
+#set ( $propertyType = "AbstractDescribedSObjectBase")
#end
-#if ( $needed )
-#set( $fieldName = $field.getName() )
#set( $jsonPropertyName = $field.relationshipName )
-#set( $lookupObjectType = $reference )
private $propertyType $jsonPropertyName;
@JsonProperty("${jsonPropertyName}")
@@ -129,10 +140,8 @@ public class $desc.Name extends
AbstractDescribedSObjectBase {
public void set${jsonPropertyName}($propertyType $jsonPropertyName) {
this.${jsonPropertyName} = $jsonPropertyName;
}
-#end
#end## END IS LOOKUP
-#end
-#end ##foreach field
+#end##foreach field
#foreach ( $rel in $desc.childRelationships )
#set ( $hasDescription = $sObjectNames.contains($rel.childSObject) )
#if ( $utility.notNull($rel.relationshipName) && $hasDescription )
diff --git
a/components/camel-salesforce/camel-salesforce-maven-plugin/src/test/resources/generated/Asset.java
b/components/camel-salesforce/camel-salesforce-maven-plugin/src/test/resources/generated/Asset.java
index 50ee1bf..792160c 100644
---
a/components/camel-salesforce/camel-salesforce-maven-plugin/src/test/resources/generated/Asset.java
+++
b/components/camel-salesforce/camel-salesforce-maven-plugin/src/test/resources/generated/Asset.java
@@ -19,6 +19,10 @@ import
org.apache.camel.component.salesforce.api.dto.SObjectDescriptionUrls;
import org.apache.camel.component.salesforce.api.dto.SObjectField;
import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonSubTypes;
+import com.fasterxml.jackson.annotation.JsonTypeInfo;
+import com.fasterxml.jackson.databind.annotation.JsonTypeResolver;
+import
org.apache.camel.component.salesforce.api.utils.AsNestedPropertyResolver;
/**
* Salesforce DTO for SObject Asset
@@ -68,7 +72,7 @@ public class Asset extends AbstractDescribedSObjectBase {
this.time = time;
}
-
+
@Override
public final SObjectDescription description() {
return DESCRIPTION;
diff --git
a/components/camel-salesforce/camel-salesforce-maven-plugin/src/test/resources/generated/Asset_LocalDateTime.java
b/components/camel-salesforce/camel-salesforce-maven-plugin/src/test/resources/generated/Asset_LocalDateTime.java
index 5dbb088..ac13bfb 100644
---
a/components/camel-salesforce/camel-salesforce-maven-plugin/src/test/resources/generated/Asset_LocalDateTime.java
+++
b/components/camel-salesforce/camel-salesforce-maven-plugin/src/test/resources/generated/Asset_LocalDateTime.java
@@ -19,6 +19,10 @@ import
org.apache.camel.component.salesforce.api.dto.SObjectDescriptionUrls;
import org.apache.camel.component.salesforce.api.dto.SObjectField;
import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonSubTypes;
+import com.fasterxml.jackson.annotation.JsonTypeInfo;
+import com.fasterxml.jackson.databind.annotation.JsonTypeResolver;
+import
org.apache.camel.component.salesforce.api.utils.AsNestedPropertyResolver;
/**
* Salesforce DTO for SObject Asset
@@ -68,7 +72,7 @@ public class Asset extends AbstractDescribedSObjectBase {
this.time = time;
}
-
+
@Override
public final SObjectDescription description() {
return DESCRIPTION;
diff --git
a/components/camel-salesforce/camel-salesforce-maven-plugin/src/test/resources/generated/Case.java
b/components/camel-salesforce/camel-salesforce-maven-plugin/src/test/resources/generated/Case.java
index 74c0ce1..38040ae 100644
---
a/components/camel-salesforce/camel-salesforce-maven-plugin/src/test/resources/generated/Case.java
+++
b/components/camel-salesforce/camel-salesforce-maven-plugin/src/test/resources/generated/Case.java
@@ -19,6 +19,10 @@ import
org.apache.camel.component.salesforce.api.dto.SObjectDescriptionUrls;
import org.apache.camel.component.salesforce.api.dto.SObjectField;
import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonSubTypes;
+import com.fasterxml.jackson.annotation.JsonTypeInfo;
+import com.fasterxml.jackson.databind.annotation.JsonTypeResolver;
+import
org.apache.camel.component.salesforce.api.utils.AsNestedPropertyResolver;
/**
* Salesforce DTO for SObject Case
@@ -80,7 +84,7 @@ public class Case extends AbstractDescribedSObjectBase {
this.PickListValueOverride = PickListValueOverride;
}
-
+
@Override
public final SObjectDescription description() {
return DESCRIPTION;
diff --git
a/components/camel-salesforce/camel-salesforce-maven-plugin/src/test/resources/generated/ComplexCalculatedFormula.java
b/components/camel-salesforce/camel-salesforce-maven-plugin/src/test/resources/generated/ComplexCalculatedFormula.java
index 17a6e97..ce0414e 100644
---
a/components/camel-salesforce/camel-salesforce-maven-plugin/src/test/resources/generated/ComplexCalculatedFormula.java
+++
b/components/camel-salesforce/camel-salesforce-maven-plugin/src/test/resources/generated/ComplexCalculatedFormula.java
@@ -19,6 +19,10 @@ import
org.apache.camel.component.salesforce.api.dto.SObjectDescriptionUrls;
import org.apache.camel.component.salesforce.api.dto.SObjectField;
import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonSubTypes;
+import com.fasterxml.jackson.annotation.JsonTypeInfo;
+import com.fasterxml.jackson.databind.annotation.JsonTypeResolver;
+import
org.apache.camel.component.salesforce.api.utils.AsNestedPropertyResolver;
/**
* Salesforce DTO for SObject ComplexCalculatedFormula
@@ -44,7 +48,7 @@ public class ComplexCalculatedFormula extends
AbstractDescribedSObjectBase {
this.ComplexCalculatedFormula = ComplexCalculatedFormula;
}
-
+
@Override
public final SObjectDescription description() {
return DESCRIPTION;
diff --git
a/components/camel-salesforce/camel-salesforce-maven-plugin/src/test/resources/generated/With_Reference__c.java
b/components/camel-salesforce/camel-salesforce-maven-plugin/src/test/resources/generated/With_Reference__c.java
index fddbaa7..735bda2 100644
---
a/components/camel-salesforce/camel-salesforce-maven-plugin/src/test/resources/generated/With_Reference__c.java
+++
b/components/camel-salesforce/camel-salesforce-maven-plugin/src/test/resources/generated/With_Reference__c.java
@@ -19,6 +19,10 @@ import
org.apache.camel.component.salesforce.api.dto.SObjectDescriptionUrls;
import org.apache.camel.component.salesforce.api.dto.SObjectField;
import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonSubTypes;
+import com.fasterxml.jackson.annotation.JsonTypeInfo;
+import com.fasterxml.jackson.databind.annotation.JsonTypeResolver;
+import
org.apache.camel.component.salesforce.api.utils.AsNestedPropertyResolver;
/**
* Salesforce DTO for SObject With_Reference__c
@@ -32,6 +36,44 @@ public class With_Reference__c extends
AbstractDescribedSObjectBase {
private static final SObjectDescription DESCRIPTION =
createSObjectDescription();
+ @JsonTypeResolver(AsNestedPropertyResolver.class)
+ @JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include =
JsonTypeInfo.As.PROPERTY, property = "attributes.type",
+ defaultImpl = AbstractDescribedSObjectBase.class)
+ @JsonSubTypes({
+ })
+ private AbstractDescribedSObjectBase Owner;
+
+ @JsonProperty("Owner")
+ public AbstractDescribedSObjectBase getOwner() {
+ return this.Owner;
+ }
+
+ @JsonProperty("Owner")
+ public void setOwner(AbstractDescribedSObjectBase Owner) {
+ this.Owner = Owner;
+ }
+ private AbstractDescribedSObjectBase CreatedBy;
+
+ @JsonProperty("CreatedBy")
+ public AbstractDescribedSObjectBase getCreatedBy() {
+ return this.CreatedBy;
+ }
+
+ @JsonProperty("CreatedBy")
+ public void setCreatedBy(AbstractDescribedSObjectBase CreatedBy) {
+ this.CreatedBy = CreatedBy;
+ }
+ private AbstractDescribedSObjectBase LastModifiedBy;
+
+ @JsonProperty("LastModifiedBy")
+ public AbstractDescribedSObjectBase getLastModifiedBy() {
+ return this.LastModifiedBy;
+ }
+
+ @JsonProperty("LastModifiedBy")
+ public void setLastModifiedBy(AbstractDescribedSObjectBase LastModifiedBy)
{
+ this.LastModifiedBy = LastModifiedBy;
+ }
private String account_ref__c;
@JsonProperty("account_ref__c")
@@ -67,6 +109,17 @@ public class With_Reference__c extends
AbstractDescribedSObjectBase {
this.ProductId__c = ProductId__c;
}
+ private AbstractDescribedSObjectBase ProductId__r;
+
+ @JsonProperty("ProductId__r")
+ public AbstractDescribedSObjectBase getProductId__r() {
+ return this.ProductId__r;
+ }
+
+ @JsonProperty("ProductId__r")
+ public void setProductId__r(AbstractDescribedSObjectBase ProductId__r) {
+ this.ProductId__r = ProductId__r;
+ }
private String External__c;
@JsonProperty("External__c")
@@ -79,7 +132,18 @@ public class With_Reference__c extends
AbstractDescribedSObjectBase {
this.External__c = External__c;
}
-
+ private AbstractDescribedSObjectBase External__r;
+
+ @JsonProperty("External__r")
+ public AbstractDescribedSObjectBase getExternal__r() {
+ return this.External__r;
+ }
+
+ @JsonProperty("External__r")
+ public void setExternal__r(AbstractDescribedSObjectBase External__r) {
+ this.External__r = External__r;
+ }
+
@Override
public final SObjectDescription description() {
return DESCRIPTION;
diff --git
a/components/camel-salesforce/camel-salesforce-maven-plugin/src/test/resources/line_item.json
b/components/camel-salesforce/camel-salesforce-maven-plugin/src/test/resources/line_item.json
index 9b0c3a9..d2bac99 100644
---
a/components/camel-salesforce/camel-salesforce-maven-plugin/src/test/resources/line_item.json
+++
b/components/camel-salesforce/camel-salesforce-maven-plugin/src/test/resources/line_item.json
@@ -1,6 +1,8 @@
{
"actionOverrides": [],
"activateable": false,
+ "associateEntityType": null,
+ "associateParentEntity": null,
"childRelationships": [
{
"cascadeDelete": true,
@@ -43,6 +45,16 @@
"restrictedDelete": false
},
{
+ "cascadeDelete": false,
+ "childSObject": "ContactRequest",
+ "deprecatedAndHidden": false,
+ "field": "WhatId",
+ "junctionIdListNames": [],
+ "junctionReferenceTo": [],
+ "relationshipName": "ContactRequests",
+ "restrictedDelete": false
+ },
+ {
"cascadeDelete": true,
"childSObject": "ContentDistribution",
"deprecatedAndHidden": false,
@@ -84,12 +96,12 @@
},
{
"cascadeDelete": false,
- "childSObject": "EmailMessage",
+ "childSObject": "EmailMessageChangeEvent",
"deprecatedAndHidden": false,
"field": "RelatedToId",
"junctionIdListNames": [],
"junctionReferenceTo": [],
- "relationshipName": "Emails",
+ "relationshipName": null,
"restrictedDelete": false
},
{
@@ -104,6 +116,26 @@
},
{
"cascadeDelete": false,
+ "childSObject": "EventChangeEvent",
+ "deprecatedAndHidden": false,
+ "field": "WhatId",
+ "junctionIdListNames": [],
+ "junctionReferenceTo": [],
+ "relationshipName": null,
+ "restrictedDelete": false
+ },
+ {
+ "cascadeDelete": false,
+ "childSObject": "EventRelationChangeEvent",
+ "deprecatedAndHidden": false,
+ "field": "RelationId",
+ "junctionIdListNames": [],
+ "junctionReferenceTo": [],
+ "relationshipName": null,
+ "restrictedDelete": false
+ },
+ {
+ "cascadeDelete": false,
"childSObject": "FeedComment",
"deprecatedAndHidden": false,
"field": "ParentId",
@@ -124,6 +156,156 @@
},
{
"cascadeDelete": false,
+ "childSObject": "FinanceBalanceSnapshot",
+ "deprecatedAndHidden": false,
+ "field": "LegalEntityId",
+ "junctionIdListNames": [],
+ "junctionReferenceTo": [],
+ "relationshipName": "FinanceBalanceSnapshots",
+ "restrictedDelete": false
+ },
+ {
+ "cascadeDelete": false,
+ "childSObject": "FinanceBalanceSnapshot",
+ "deprecatedAndHidden": false,
+ "field": "ReferenceEntityId",
+ "junctionIdListNames": [],
+ "junctionReferenceTo": [],
+ "relationshipName": "FinanceBalanceSnapshots",
+ "restrictedDelete": false
+ },
+ {
+ "cascadeDelete": false,
+ "childSObject": "FinanceBalanceSnapshotChangeEvent",
+ "deprecatedAndHidden": false,
+ "field": "LegalEntityId",
+ "junctionIdListNames": [],
+ "junctionReferenceTo": [],
+ "relationshipName": null,
+ "restrictedDelete": false
+ },
+ {
+ "cascadeDelete": false,
+ "childSObject": "FinanceBalanceSnapshotChangeEvent",
+ "deprecatedAndHidden": false,
+ "field": "ReferenceEntityId",
+ "junctionIdListNames": [],
+ "junctionReferenceTo": [],
+ "relationshipName": null,
+ "restrictedDelete": false
+ },
+ {
+ "cascadeDelete": false,
+ "childSObject": "FinanceTransaction",
+ "deprecatedAndHidden": false,
+ "field": "DestinationEntityId",
+ "junctionIdListNames": [],
+ "junctionReferenceTo": [],
+ "relationshipName": "DestinationFinanceTransactions",
+ "restrictedDelete": false
+ },
+ {
+ "cascadeDelete": false,
+ "childSObject": "FinanceTransaction",
+ "deprecatedAndHidden": false,
+ "field": "LegalEntityId",
+ "junctionIdListNames": [],
+ "junctionReferenceTo": [],
+ "relationshipName": "FinanceTransactions",
+ "restrictedDelete": false
+ },
+ {
+ "cascadeDelete": false,
+ "childSObject": "FinanceTransaction",
+ "deprecatedAndHidden": false,
+ "field": "ParentReferenceEntityId",
+ "junctionIdListNames": [],
+ "junctionReferenceTo": [],
+ "relationshipName": "ParentFinanceTransactions",
+ "restrictedDelete": false
+ },
+ {
+ "cascadeDelete": false,
+ "childSObject": "FinanceTransaction",
+ "deprecatedAndHidden": false,
+ "field": "ReferenceEntityId",
+ "junctionIdListNames": [],
+ "junctionReferenceTo": [],
+ "relationshipName": "FinanceTransactions",
+ "restrictedDelete": false
+ },
+ {
+ "cascadeDelete": false,
+ "childSObject": "FinanceTransaction",
+ "deprecatedAndHidden": false,
+ "field": "SourceEntityId",
+ "junctionIdListNames": [],
+ "junctionReferenceTo": [],
+ "relationshipName": "SourceFinanceTransactions",
+ "restrictedDelete": false
+ },
+ {
+ "cascadeDelete": false,
+ "childSObject": "FinanceTransactionChangeEvent",
+ "deprecatedAndHidden": false,
+ "field": "DestinationEntityId",
+ "junctionIdListNames": [],
+ "junctionReferenceTo": [],
+ "relationshipName": null,
+ "restrictedDelete": false
+ },
+ {
+ "cascadeDelete": false,
+ "childSObject": "FinanceTransactionChangeEvent",
+ "deprecatedAndHidden": false,
+ "field": "LegalEntityId",
+ "junctionIdListNames": [],
+ "junctionReferenceTo": [],
+ "relationshipName": null,
+ "restrictedDelete": false
+ },
+ {
+ "cascadeDelete": false,
+ "childSObject": "FinanceTransactionChangeEvent",
+ "deprecatedAndHidden": false,
+ "field": "ParentReferenceEntityId",
+ "junctionIdListNames": [],
+ "junctionReferenceTo": [],
+ "relationshipName": null,
+ "restrictedDelete": false
+ },
+ {
+ "cascadeDelete": false,
+ "childSObject": "FinanceTransactionChangeEvent",
+ "deprecatedAndHidden": false,
+ "field": "ReferenceEntityId",
+ "junctionIdListNames": [],
+ "junctionReferenceTo": [],
+ "relationshipName": null,
+ "restrictedDelete": false
+ },
+ {
+ "cascadeDelete": false,
+ "childSObject": "FinanceTransactionChangeEvent",
+ "deprecatedAndHidden": false,
+ "field": "SourceEntityId",
+ "junctionIdListNames": [],
+ "junctionReferenceTo": [],
+ "relationshipName": null,
+ "restrictedDelete": false
+ },
+ {
+ "cascadeDelete": false,
+ "childSObject": "FlowExecutionErrorEvent",
+ "deprecatedAndHidden": false,
+ "field": "ContextRecordId",
+ "junctionIdListNames": [],
+ "junctionReferenceTo": [],
+ "relationshipName": null,
+ "restrictedDelete": false
+ },
+ {
+ "cascadeDelete": false,
"childSObject": "FlowRecordRelation",
"deprecatedAndHidden": false,
"field": "RelatedRecordId",
@@ -134,6 +316,16 @@
},
{
"cascadeDelete": true,
+ "childSObject": "Line_Item__Share",
+ "deprecatedAndHidden": false,
+ "field": "ParentId",
+ "junctionIdListNames": [],
+ "junctionReferenceTo": [],
+ "relationshipName": "Shares",
+ "restrictedDelete": false
+ },
+ {
+ "cascadeDelete": true,
"childSObject": "Note",
"deprecatedAndHidden": false,
"field": "ParentId",
@@ -154,6 +346,26 @@
},
{
"cascadeDelete": true,
+ "childSObject": "ProcessException",
+ "deprecatedAndHidden": false,
+ "field": "AttachedToId",
+ "junctionIdListNames": [],
+ "junctionReferenceTo": [],
+ "relationshipName": "ProcessExceptions",
+ "restrictedDelete": false
+ },
+ {
+ "cascadeDelete": false,
+ "childSObject": "ProcessExceptionEvent",
+ "deprecatedAndHidden": false,
+ "field": "AttachedToId",
+ "junctionIdListNames": [],
+ "junctionReferenceTo": [],
+ "relationshipName": null,
+ "restrictedDelete": false
+ },
+ {
+ "cascadeDelete": true,
"childSObject": "ProcessInstance",
"deprecatedAndHidden": false,
"field": "TargetObjectId",
@@ -183,6 +395,26 @@
"restrictedDelete": false
},
{
+ "cascadeDelete": false,
+ "childSObject": "RecordActionHistory",
+ "deprecatedAndHidden": false,
+ "field": "ParentRecordId",
+ "junctionIdListNames": [],
+ "junctionReferenceTo": [],
+ "relationshipName": "RecordActionHistories",
+ "restrictedDelete": false
+ },
+ {
+ "cascadeDelete": false,
+ "childSObject": "TaskChangeEvent",
+ "deprecatedAndHidden": false,
+ "field": "WhatId",
+ "junctionIdListNames": [],
+ "junctionReferenceTo": [],
+ "relationshipName": null,
+ "restrictedDelete": false
+ },
+ {
"cascadeDelete": true,
"childSObject": "TopicAssignment",
"deprecatedAndHidden": false,
@@ -197,12 +429,17 @@
"createable": true,
"custom": true,
"customSetting": false,
+ "deepCloneable": false,
+ "defaultImplementation": null,
"deletable": true,
"deprecatedAndHidden": false,
+ "extendedBy": null,
+ "extendsInterfaces": null,
"feedEnabled": false,
"fields": [
{
"aggregatable": true,
+ "aiPredictionField": false,
"autoNumber": false,
"byteLength": 18,
"calculated": false,
@@ -225,6 +462,7 @@
"extraTypeInfo": null,
"filterable": true,
"filteredLookupInfo": null,
+ "formulaTreatNullNumberAsZero": false,
"groupable": true,
"highScaleNumber": false,
"htmlFormatted": false,
@@ -260,6 +498,7 @@
},
{
"aggregatable": true,
+ "aiPredictionField": false,
"autoNumber": false,
"byteLength": 18,
"calculated": false,
@@ -282,6 +521,7 @@
"extraTypeInfo": null,
"filterable": true,
"filteredLookupInfo": null,
+ "formulaTreatNullNumberAsZero": false,
"groupable": true,
"highScaleNumber": false,
"htmlFormatted": false,
@@ -320,6 +560,7 @@
},
{
"aggregatable": false,
+ "aiPredictionField": false,
"autoNumber": false,
"byteLength": 0,
"calculated": false,
@@ -342,6 +583,7 @@
"extraTypeInfo": null,
"filterable": true,
"filteredLookupInfo": null,
+ "formulaTreatNullNumberAsZero": false,
"groupable": true,
"highScaleNumber": false,
"htmlFormatted": false,
@@ -377,6 +619,7 @@
},
{
"aggregatable": true,
+ "aiPredictionField": false,
"autoNumber": false,
"byteLength": 240,
"calculated": false,
@@ -399,6 +642,7 @@
"extraTypeInfo": null,
"filterable": true,
"filteredLookupInfo": null,
+ "formulaTreatNullNumberAsZero": false,
"groupable": true,
"highScaleNumber": false,
"htmlFormatted": false,
@@ -434,6 +678,68 @@
},
{
"aggregatable": true,
+ "aiPredictionField": false,
+ "autoNumber": false,
+ "byteLength": 18,
+ "calculated": false,
+ "calculatedFormula": null,
+ "cascadeDelete": false,
+ "caseSensitive": false,
+ "compoundFieldName": null,
+ "controllerName": null,
+ "createable": true,
+ "custom": false,
+ "defaultValue": null,
+ "defaultValueFormula": null,
+ "defaultedOnCreate": false,
+ "dependentPicklist": false,
+ "deprecatedAndHidden": false,
+ "digits": 0,
+ "displayLocationInDecimal": false,
+ "encrypted": false,
+ "externalId": false,
+ "extraTypeInfo": null,
+ "filterable": true,
+ "filteredLookupInfo": null,
+ "formulaTreatNullNumberAsZero": false,
+ "groupable": true,
+ "highScaleNumber": false,
+ "htmlFormatted": false,
+ "idLookup": false,
+ "inlineHelpText": null,
+ "label": "Record Type ID",
+ "length": 18,
+ "mask": null,
+ "maskType": null,
+ "name": "RecordTypeId",
+ "nameField": false,
+ "namePointing": false,
+ "nillable": true,
+ "permissionable": false,
+ "picklistValues": [],
+ "polymorphicForeignKey": false,
+ "precision": 0,
+ "queryByDistance": false,
+ "referenceTargetField": null,
+ "referenceTo": [
+ "RecordType"
+ ],
+ "relationshipName": "RecordType",
+ "relationshipOrder": null,
+ "restrictedDelete": false,
+ "restrictedPicklist": false,
+ "scale": 0,
+ "searchPrefilterable": false,
+ "soapType": "tns:ID",
+ "sortable": true,
+ "type": "reference",
+ "unique": false,
+ "updateable": true,
+ "writeRequiresMasterRead": false
+ },
+ {
+ "aggregatable": true,
+ "aiPredictionField": false,
"autoNumber": false,
"byteLength": 0,
"calculated": false,
@@ -456,6 +762,7 @@
"extraTypeInfo": null,
"filterable": true,
"filteredLookupInfo": null,
+ "formulaTreatNullNumberAsZero": false,
"groupable": false,
"highScaleNumber": false,
"htmlFormatted": false,
@@ -491,6 +798,7 @@
},
{
"aggregatable": true,
+ "aiPredictionField": false,
"autoNumber": false,
"byteLength": 18,
"calculated": false,
@@ -513,6 +821,7 @@
"extraTypeInfo": null,
"filterable": true,
"filteredLookupInfo": null,
+ "formulaTreatNullNumberAsZero": false,
"groupable": true,
"highScaleNumber": false,
"htmlFormatted": false,
@@ -550,6 +859,7 @@
},
{
"aggregatable": true,
+ "aiPredictionField": false,
"autoNumber": false,
"byteLength": 0,
"calculated": false,
@@ -572,6 +882,7 @@
"extraTypeInfo": null,
"filterable": true,
"filteredLookupInfo": null,
+ "formulaTreatNullNumberAsZero": false,
"groupable": false,
"highScaleNumber": false,
"htmlFormatted": false,
@@ -607,6 +918,7 @@
},
{
"aggregatable": true,
+ "aiPredictionField": false,
"autoNumber": false,
"byteLength": 18,
"calculated": false,
@@ -629,6 +941,7 @@
"extraTypeInfo": null,
"filterable": true,
"filteredLookupInfo": null,
+ "formulaTreatNullNumberAsZero": false,
"groupable": true,
"highScaleNumber": false,
"htmlFormatted": false,
@@ -666,6 +979,7 @@
},
{
"aggregatable": true,
+ "aiPredictionField": false,
"autoNumber": false,
"byteLength": 0,
"calculated": false,
@@ -688,6 +1002,7 @@
"extraTypeInfo": null,
"filterable": true,
"filteredLookupInfo": null,
+ "formulaTreatNullNumberAsZero": false,
"groupable": false,
"highScaleNumber": false,
"htmlFormatted": false,
@@ -723,6 +1038,125 @@
},
{
"aggregatable": true,
+ "aiPredictionField": false,
+ "autoNumber": false,
+ "byteLength": 0,
+ "calculated": false,
+ "calculatedFormula": null,
+ "cascadeDelete": false,
+ "caseSensitive": false,
+ "compoundFieldName": null,
+ "controllerName": null,
+ "createable": false,
+ "custom": false,
+ "defaultValue": null,
+ "defaultValueFormula": null,
+ "defaultedOnCreate": false,
+ "dependentPicklist": false,
+ "deprecatedAndHidden": false,
+ "digits": 0,
+ "displayLocationInDecimal": false,
+ "encrypted": false,
+ "externalId": false,
+ "extraTypeInfo": null,
+ "filterable": true,
+ "filteredLookupInfo": null,
+ "formulaTreatNullNumberAsZero": false,
+ "groupable": false,
+ "highScaleNumber": false,
+ "htmlFormatted": false,
+ "idLookup": false,
+ "inlineHelpText": null,
+ "label": "Last Viewed Date",
+ "length": 0,
+ "mask": null,
+ "maskType": null,
+ "name": "LastViewedDate",
+ "nameField": false,
+ "namePointing": false,
+ "nillable": true,
+ "permissionable": false,
+ "picklistValues": [],
+ "polymorphicForeignKey": false,
+ "precision": 0,
+ "queryByDistance": false,
+ "referenceTargetField": null,
+ "referenceTo": [],
+ "relationshipName": null,
+ "relationshipOrder": null,
+ "restrictedDelete": false,
+ "restrictedPicklist": false,
+ "scale": 0,
+ "searchPrefilterable": false,
+ "soapType": "xsd:dateTime",
+ "sortable": true,
+ "type": "datetime",
+ "unique": false,
+ "updateable": false,
+ "writeRequiresMasterRead": false
+ },
+ {
+ "aggregatable": true,
+ "aiPredictionField": false,
+ "autoNumber": false,
+ "byteLength": 0,
+ "calculated": false,
+ "calculatedFormula": null,
+ "cascadeDelete": false,
+ "caseSensitive": false,
+ "compoundFieldName": null,
+ "controllerName": null,
+ "createable": false,
+ "custom": false,
+ "defaultValue": null,
+ "defaultValueFormula": null,
+ "defaultedOnCreate": false,
+ "dependentPicklist": false,
+ "deprecatedAndHidden": false,
+ "digits": 0,
+ "displayLocationInDecimal": false,
+ "encrypted": false,
+ "externalId": false,
+ "extraTypeInfo": null,
+ "filterable": true,
+ "filteredLookupInfo": null,
+ "formulaTreatNullNumberAsZero": false,
+ "groupable": false,
+ "highScaleNumber": false,
+ "htmlFormatted": false,
+ "idLookup": false,
+ "inlineHelpText": null,
+ "label": "Last Referenced Date",
+ "length": 0,
+ "mask": null,
+ "maskType": null,
+ "name": "LastReferencedDate",
+ "nameField": false,
+ "namePointing": false,
+ "nillable": true,
+ "permissionable": false,
+ "picklistValues": [],
+ "polymorphicForeignKey": false,
+ "precision": 0,
+ "queryByDistance": false,
+ "referenceTargetField": null,
+ "referenceTo": [],
+ "relationshipName": null,
+ "relationshipOrder": null,
+ "restrictedDelete": false,
+ "restrictedPicklist": false,
+ "scale": 0,
+ "searchPrefilterable": false,
+ "soapType": "xsd:dateTime",
+ "sortable": true,
+ "type": "datetime",
+ "unique": false,
+ "updateable": false,
+ "writeRequiresMasterRead": false
+ },
+ {
+ "aggregatable": true,
+ "aiPredictionField": false,
"autoNumber": false,
"byteLength": 18,
"calculated": false,
@@ -745,6 +1179,7 @@
"extraTypeInfo": null,
"filterable": true,
"filteredLookupInfo": null,
+ "formulaTreatNullNumberAsZero": false,
"groupable": true,
"highScaleNumber": false,
"htmlFormatted": false,
@@ -782,6 +1217,7 @@
},
{
"aggregatable": true,
+ "aiPredictionField": false,
"autoNumber": false,
"byteLength": 0,
"calculated": false,
@@ -804,6 +1240,7 @@
"extraTypeInfo": null,
"filterable": true,
"filteredLookupInfo": null,
+ "formulaTreatNullNumberAsZero": false,
"groupable": false,
"highScaleNumber": false,
"htmlFormatted": false,
@@ -839,6 +1276,7 @@
},
{
"aggregatable": true,
+ "aiPredictionField": false,
"autoNumber": false,
"byteLength": 0,
"calculated": false,
@@ -861,6 +1299,7 @@
"extraTypeInfo": null,
"filterable": true,
"filteredLookupInfo": null,
+ "formulaTreatNullNumberAsZero": false,
"groupable": false,
"highScaleNumber": false,
"htmlFormatted": false,
@@ -896,15 +1335,18 @@
}
],
"hasSubtypes": false,
+ "implementedBy": null,
+ "implementsInterfaces": null,
+ "isInterface": false,
"isSubtype": false,
- "keyPrefix": "a02",
+ "keyPrefix": "a01",
"label": "Line Item",
"labelPlural": "Line Items",
"layoutable": true,
"listviewable": null,
"lookupLayoutable": null,
"mergeable": false,
- "mruEnabled": false,
+ "mruEnabled": true,
"name": "Line_Item__c",
"namedLayoutInfos": [],
"networkScopeFieldName": null,
@@ -914,11 +1356,24 @@
"active": true,
"available": true,
"defaultRecordTypeMapping": true,
+ "developerName": "Product",
+ "master": false,
+ "name": "Product",
+ "recordTypeId": "0124x000000ZFU7AAO",
+ "urls": {
+ "layout":
"/services/data/v50.0/sobjects/Line_Item__c/describe/layouts/0124x000000ZFU7AAO"
+ }
+ },
+ {
+ "active": true,
+ "available": true,
+ "defaultRecordTypeMapping": false,
+ "developerName": "Master",
"master": true,
"name": "Master",
"recordTypeId": "012000000000000AAA",
"urls": {
- "layout":
"/services/data/v42.0/sobjects/Line_Item__c/describe/layouts/012000000000000AAA"
+ "layout":
"/services/data/v50.0/sobjects/Line_Item__c/describe/layouts/012000000000000AAA"
}
}
],
@@ -926,6 +1381,7 @@
"retrieveable": true,
"searchLayoutable": true,
"searchable": true,
+ "sobjectDescribeOption": "FULL",
"supportedScopes": [
{
"label": "All line items",
@@ -952,16 +1408,15 @@
"undeletable": true,
"updateable": true,
"urls": {
- "compactLayouts":
"/services/data/v42.0/sobjects/Line_Item__c/describe/compactLayouts",
- "rowTemplate":
"/services/data/v42.0/sobjects/Line_Item__c/{ID}",
- "approvalLayouts":
"/services/data/v42.0/sobjects/Line_Item__c/describe/approvalLayouts",
- "uiDetailTemplate": "https://eu11.salesforce.com/{ID}",
- "uiEditTemplate": "https://eu11.salesforce.com/{ID}/e",
- "defaultValues":
"/services/data/v42.0/sobjects/Line_Item__c/defaultValues?recordTypeId&fields",
- "describe":
"/services/data/v42.0/sobjects/Line_Item__c/describe",
- "uiNewRecord": "https://eu11.salesforce.com/a02/e",
- "quickActions":
"/services/data/v42.0/sobjects/Line_Item__c/quickActions",
- "layouts":
"/services/data/v42.0/sobjects/Line_Item__c/describe/layouts",
- "sobject": "/services/data/v42.0/sobjects/Line_Item__c"
+ "compactLayouts":
"/services/data/v50.0/sobjects/Line_Item__c/describe/compactLayouts",
+ "rowTemplate":
"/services/data/v50.0/sobjects/Line_Item__c/{ID}",
+ "approvalLayouts":
"/services/data/v50.0/sobjects/Line_Item__c/describe/approvalLayouts",
+ "uiDetailTemplate":
"https://jeremy2-dev-ed.my.salesforce.com/{ID}",
+ "uiEditTemplate":
"https://jeremy2-dev-ed.my.salesforce.com/{ID}/e",
+ "describe":
"/services/data/v50.0/sobjects/Line_Item__c/describe",
+ "uiNewRecord": "https://jeremy2-dev-ed.my.salesforce.com/a01/e",
+ "quickActions":
"/services/data/v50.0/sobjects/Line_Item__c/quickActions",
+ "layouts":
"/services/data/v50.0/sobjects/Line_Item__c/describe/layouts",
+ "sobject": "/services/data/v50.0/sobjects/Line_Item__c"
}
}
\ No newline at end of file