<extensionManifest><groupId>org.apache.nifi</groupId><artifactId>nifi-salesforce-nar</artifactId><version>2.3.0</version><parentNar><groupId>org.apache.nifi</groupId><artifactId>nifi-standard-shared-nar</artifactId><version>2.3.0</version></parentNar><systemApiVersion>2.0.0</systemApiVersion><buildInfo><tag>rel/nifi-2.3.0</tag><branch>main</branch><revision>1</revision></buildInfo><extensions><extension><name>org.apache.nifi.processors.salesforce.PutSalesforceObject</name><type>PROCESSOR</type><description>Creates new records for the specified Salesforce sObject. The type of the Salesforce object must be set in the input flowfile's 'objectType' attribute. This processor cannot update existing records.</description><tags><tag>salesforce</tag><tag>sobject</tag><tag>put</tag></tags><properties><property><name>salesforce-url</name><displayName>Salesforce Instance URL</displayName><description>The URL of the Salesforce instance including the domain without additional path information, such as https://MyDomainName.my.salesforce.com</description><required>true</required><sensitive>false</sensitive><expressionLanguageSupported>true</expressionLanguageSupported><expressionLanguageScope>ENVIRONMENT</expressionLanguageScope><dynamicallyModifiesClasspath>false</dynamicallyModifiesClasspath><dynamic>false</dynamic></property><property><name>salesforce-api-version</name><displayName>API Version</displayName><description>The version number of the Salesforce REST API appended to the URL after the services/data path. See Salesforce documentation for supported versions</description><defaultValue>54.0</defaultValue><required>true</required><sensitive>false</sensitive><expressionLanguageSupported>true</expressionLanguageSupported><expressionLanguageScope>ENVIRONMENT</expressionLanguageScope><dynamicallyModifiesClasspath>false</dynamicallyModifiesClasspath><dynamic>false</dynamic></property><property><name>read-timeout</name><displayName>Read Timeout</displayName><description>Maximum time allowed for reading a response from the Salesforce REST API</description><defaultValue>15 s</defaultValue><required>true</required><sensitive>false</sensitive><expressionLanguageSupported>true</expressionLanguageSupported><expressionLanguageScope>ENVIRONMENT</expressionLanguageScope><dynamicallyModifiesClasspath>false</dynamicallyModifiesClasspath><dynamic>false</dynamic></property><property><name>oauth2-access-token-provider</name><displayName>OAuth2 Access Token Provider</displayName><description>Service providing OAuth2 Access Tokens for authenticating using the HTTP Authorization Header</description><controllerServiceDefinition><className>org.apache.nifi.oauth2.OAuth2AccessTokenProvider</className><groupId>org.apache.nifi</groupId><artifactId>nifi-standard-services-api-nar</artifactId><version>2.3.0</version></controllerServiceDefinition><required>true</required><sensitive>false</sensitive><expressionLanguageSupported>false</expressionLanguageSupported><expressionLanguageScope>NONE</expressionLanguageScope><dynamicallyModifiesClasspath>false</dynamicallyModifiesClasspath><dynamic>false</dynamic></property><property><name>record-reader</name><displayName>Record Reader</displayName><description>Specifies the Controller Service to use for parsing incoming data and determining the data's schema</description><controllerServiceDefinition><className>org.apache.nifi.serialization.RecordReaderFactory</className><groupId>org.apache.nifi</groupId><artifactId>nifi-standard-services-api-nar</artifactId><version>2.3.0</version></controllerServiceDefinition><required>true</required><sensitive>false</sensitive><expressionLanguageSupported>false</expressionLanguageSupported><expressionLanguageScope>NONE</expressionLanguageScope><dynamicallyModifiesClasspath>false</dynamicallyModifiesClasspath><dynamic>false</dynamic></property></properties><relationships><relationship><name>failure</name><description>For FlowFiles created as a result of an execution error.</description><autoTerminated>false</autoTerminated></relationship><relationship><name>success</name><description>For FlowFiles created as a result of a successful execution.</description><autoTerminated>false</autoTerminated></relationship></relationships><readsAttributes><readsAttribute><name>objectType</name><description>The Salesforce object type to upload records to. E.g. Account, Contact, Campaign.</description></readsAttribute></readsAttributes><writesAttributes><writesAttribute><name>error.message</name><description>The error message returned by Salesforce.</description></writesAttribute></writesAttributes><inputRequirement>INPUT_REQUIRED</inputRequirement><seeAlso><see>org.apache.nifi.processors.salesforce.QuerySalesforceObject</see></seeAlso></extension><extension><name>org.apache.nifi.processors.salesforce.QuerySalesforceObject</name><type>PROCESSOR</type><description>Retrieves records from a Salesforce sObject. Users can add arbitrary filter conditions by setting the 'Custom WHERE Condition' property. The processor can also run a custom query, although record processing is not supported in that case. Supports incremental retrieval: users can define a field in the 'Age Field' property that will be used to determine when the record was created. When this property is set the processor will retrieve new records. Incremental loading and record-based processing are only supported in property-based queries. It's also possible to define an initial cutoff value for the age, filtering out all older records even for the first run. In case of 'Property Based Query' this processor should run on the Primary Node only. FlowFile attribute 'record.count' indicates how many records were retrieved and written to the output. The processor can accept an optional input FlowFile and reference the FlowFile attributes in the query. When 'Include Deleted Records' is true, the processor will include deleted records (soft-deletes) in the results by using the 'queryAll' API. The 'IsDeleted' field will be automatically included in the results when querying deleted records.</description><tags><tag>salesforce</tag><tag>sobject</tag><tag>soql</tag><tag>query</tag></tags><properties><property><name>salesforce-url</name><displayName>Salesforce Instance URL</displayName><description>The URL of the Salesforce instance including the domain without additional path information, such as https://MyDomainName.my.salesforce.com</description><required>true</required><sensitive>false</sensitive><expressionLanguageSupported>true</expressionLanguageSupported><expressionLanguageScope>ENVIRONMENT</expressionLanguageScope><dynamicallyModifiesClasspath>false</dynamicallyModifiesClasspath><dynamic>false</dynamic></property><property><name>salesforce-api-version</name><displayName>API Version</displayName><description>The version number of the Salesforce REST API appended to the URL after the services/data path. See Salesforce documentation for supported versions</description><defaultValue>54.0</defaultValue><required>true</required><sensitive>false</sensitive><expressionLanguageSupported>true</expressionLanguageSupported><expressionLanguageScope>ENVIRONMENT</expressionLanguageScope><dynamicallyModifiesClasspath>false</dynamicallyModifiesClasspath><dynamic>false</dynamic></property><property><name>query-type</name><displayName>Query Type</displayName><description>Choose to provide the query by parameters or a full custom query.</description><defaultValue>property-based-query</defaultValue><allowableValues><allowableValue><displayName>Property Based Query</displayName><value>property-based-query</value><description>Provide query by properties.</description></allowableValue><allowableValue><displayName>Custom Query</displayName><value>custom-query</value><description>Provide custom SOQL query.</description></allowableValue></allowableValues><required>true</required><sensitive>false</sensitive><expressionLanguageSupported>false</expressionLanguageSupported><expressionLanguageScope>NONE</expressionLanguageScope><dynamicallyModifiesClasspath>false</dynamicallyModifiesClasspath><dynamic>false</dynamic></property><property><name>custom-soql-query</name><displayName>Custom SOQL Query</displayName><description>Specify the SOQL query to run.</description><required>true</required><sensitive>false</sensitive><expressionLanguageSupported>true</expressionLanguageSupported><expressionLanguageScope>FLOWFILE_ATTRIBUTES</expressionLanguageScope><dynamicallyModifiesClasspath>false</dynamicallyModifiesClasspath><dynamic>false</dynamic><dependencies><dependency><propertyName>query-type</propertyName><propertyDisplayName>Query Type</propertyDisplayName><dependentValues><dependentValue>custom-query</dependentValue></dependentValues></dependency></dependencies></property><property><name>sobject-name</name><displayName>sObject Name</displayName><description>The Salesforce sObject to be queried</description><required>true</required><sensitive>false</sensitive><expressionLanguageSupported>true</expressionLanguageSupported><expressionLanguageScope>ENVIRONMENT</expressionLanguageScope><dynamicallyModifiesClasspath>false</dynamicallyModifiesClasspath><dynamic>false</dynamic><dependencies><dependency><propertyName>query-type</propertyName><propertyDisplayName>Query Type</propertyDisplayName><dependentValues><dependentValue>property-based-query</dependentValue></dependentValues></dependency></dependencies></property><property><name>field-names</name><displayName>Field Names</displayName><description>Comma-separated list of field names requested from the sObject to be queried. When this field is left empty, all fields are queried.</description><required>false</required><sensitive>false</sensitive><expressionLanguageSupported>true</expressionLanguageSupported><expressionLanguageScope>ENVIRONMENT</expressionLanguageScope><dynamicallyModifiesClasspath>false</dynamicallyModifiesClasspath><dynamic>false</dynamic><dependencies><dependency><propertyName>query-type</propertyName><propertyDisplayName>Query Type</propertyDisplayName><dependentValues><dependentValue>property-based-query</dependentValue></dependentValues></dependency></dependencies></property><property><name>record-writer</name><displayName>Record Writer</displayName><description>Service used for writing records returned from the Salesforce REST API</description><controllerServiceDefinition><className>org.apache.nifi.serialization.RecordSetWriterFactory</className><groupId>org.apache.nifi</groupId><artifactId>nifi-standard-services-api-nar</artifactId><version>2.3.0</version></controllerServiceDefinition><required>true</required><sensitive>false</sensitive><expressionLanguageSupported>false</expressionLanguageSupported><expressionLanguageScope>NONE</expressionLanguageScope><dynamicallyModifiesClasspath>false</dynamicallyModifiesClasspath><dynamic>false</dynamic><dependencies><dependency><propertyName>query-type</propertyName><propertyDisplayName>Query Type</propertyDisplayName><dependentValues><dependentValue>property-based-query</dependentValue></dependentValues></dependency></dependencies></property><property><name>age-field</name><displayName>Age Field</displayName><description>The name of a TIMESTAMP field that will be used to filter records using a bounded time window.The processor will return only those records with a timestamp value newer than the timestamp recorded after the last processor run.</description><required>false</required><sensitive>false</sensitive><expressionLanguageSupported>true</expressionLanguageSupported><expressionLanguageScope>ENVIRONMENT</expressionLanguageScope><dynamicallyModifiesClasspath>false</dynamicallyModifiesClasspath><dynamic>false</dynamic><dependencies><dependency><propertyName>query-type</propertyName><propertyDisplayName>Query Type</propertyDisplayName><dependentValues><dependentValue>property-based-query</dependentValue></dependentValues></dependency></dependencies></property><property><name>initial-age-filter</name><displayName>Initial Age Start Time</displayName><description>This property specifies the start time that the processor applies when running the first query.</description><required>false</required><sensitive>false</sensitive><expressionLanguageSupported>true</expressionLanguageSupported><expressionLanguageScope>ENVIRONMENT</expressionLanguageScope><dynamicallyModifiesClasspath>false</dynamicallyModifiesClasspath><dynamic>false</dynamic><dependencies><dependency><propertyName>query-type</propertyName><propertyDisplayName>Query Type</propertyDisplayName><dependentValues><dependentValue>property-based-query</dependentValue></dependentValues></dependency><dependency><propertyName>age-field</propertyName><propertyDisplayName>Age Field</propertyDisplayName></dependency></dependencies></property><property><name>age-delay</name><displayName>Age Delay</displayName><description>The ending timestamp of the time window will be adjusted earlier by the amount configured in this property. For example, with a property value of 10 seconds, an ending timestamp of 12:30:45 would be changed to 12:30:35.</description><required>false</required><sensitive>false</sensitive><expressionLanguageSupported>true</expressionLanguageSupported><expressionLanguageScope>ENVIRONMENT</expressionLanguageScope><dynamicallyModifiesClasspath>false</dynamicallyModifiesClasspath><dynamic>false</dynamic><dependencies><dependency><propertyName>query-type</propertyName><propertyDisplayName>Query Type</propertyDisplayName><dependentValues><dependentValue>property-based-query</dependentValue></dependentValues></dependency><dependency><propertyName>age-field</propertyName><propertyDisplayName>Age Field</propertyDisplayName></dependency></dependencies></property><property><name>custom-where-condition</name><displayName>Custom WHERE Condition</displayName><description>A custom expression to be added in the WHERE clause of the query</description><required>false</required><sensitive>false</sensitive><expressionLanguageSupported>true</expressionLanguageSupported><expressionLanguageScope>FLOWFILE_ATTRIBUTES</expressionLanguageScope><dynamicallyModifiesClasspath>false</dynamicallyModifiesClasspath><dynamic>false</dynamic><dependencies><dependency><propertyName>query-type</propertyName><propertyDisplayName>Query Type</propertyDisplayName><dependentValues><dependentValue>property-based-query</dependentValue></dependentValues></dependency></dependencies></property><property><name>include-deleted-records</name><displayName>Include Deleted Records</displayName><description>If true, the processor will include deleted records (IsDeleted = true) in the query results. When enabled, the processor will use the 'queryAll' API.</description><defaultValue>false</defaultValue><allowableValues><allowableValue><displayName>true</displayName><value>true</value><description></description></allowableValue><allowableValue><displayName>false</displayName><value>false</value><description></description></allowableValue></allowableValues><required>true</required><sensitive>false</sensitive><expressionLanguageSupported>false</expressionLanguageSupported><expressionLanguageScope>NONE</expressionLanguageScope><dynamicallyModifiesClasspath>false</dynamicallyModifiesClasspath><dynamic>false</dynamic><dependencies><dependency><propertyName>query-type</propertyName><propertyDisplayName>Query Type</propertyDisplayName><dependentValues><dependentValue>property-based-query</dependentValue></dependentValues></dependency></dependencies></property><property><name>read-timeout</name><displayName>Read Timeout</displayName><description>Maximum time allowed for reading a response from the Salesforce REST API</description><defaultValue>15 s</defaultValue><required>true</required><sensitive>false</sensitive><expressionLanguageSupported>true</expressionLanguageSupported><expressionLanguageScope>ENVIRONMENT</expressionLanguageScope><dynamicallyModifiesClasspath>false</dynamicallyModifiesClasspath><dynamic>false</dynamic></property><property><name>create-zero-record-files</name><displayName>Create Zero Record FlowFiles</displayName><description>Specifies whether or not to create a FlowFile when the Salesforce REST API does not return any records</description><defaultValue>false</defaultValue><allowableValues><allowableValue><displayName>true</displayName><value>true</value><description></description></allowableValue><allowableValue><displayName>false</displayName><value>false</value><description></description></allowableValue></allowableValues><required>true</required><sensitive>false</sensitive><expressionLanguageSupported>false</expressionLanguageSupported><expressionLanguageScope>NONE</expressionLanguageScope><dynamicallyModifiesClasspath>false</dynamicallyModifiesClasspath><dynamic>false</dynamic><dependencies><dependency><propertyName>query-type</propertyName><propertyDisplayName>Query Type</propertyDisplayName><dependentValues><dependentValue>property-based-query</dependentValue></dependentValues></dependency></dependencies></property><property><name>oauth2-access-token-provider</name><displayName>OAuth2 Access Token Provider</displayName><description>Service providing OAuth2 Access Tokens for authenticating using the HTTP Authorization Header</description><controllerServiceDefinition><className>org.apache.nifi.oauth2.OAuth2AccessTokenProvider</className><groupId>org.apache.nifi</groupId><artifactId>nifi-standard-services-api-nar</artifactId><version>2.3.0</version></controllerServiceDefinition><required>true</required><sensitive>false</sensitive><expressionLanguageSupported>false</expressionLanguageSupported><expressionLanguageScope>NONE</expressionLanguageScope><dynamicallyModifiesClasspath>false</dynamicallyModifiesClasspath><dynamic>false</dynamic></property></properties><relationships><relationship><name>failure</name><description>The input flowfile gets sent to this relationship when the query fails.</description><autoTerminated>true</autoTerminated></relationship><relationship><name>original</name><description>The input flowfile gets sent to this relationship when the query succeeds.</description><autoTerminated>true</autoTerminated></relationship><relationship><name>success</name><description>For FlowFiles created as a result of a successful query.</description><autoTerminated>false</autoTerminated></relationship></relationships><writesAttributes><writesAttribute><name>mime.type</name><description>Sets the mime.type attribute to the MIME Type specified by the Record Writer.</description></writesAttribute><writesAttribute><name>record.count</name><description>Sets the number of records in the FlowFile.</description></writesAttribute><writesAttribute><name>total.record.count</name><description>Sets the total number of records in the FlowFile.</description></writesAttribute></writesAttributes><triggerSerially>true</triggerSerially><stateful><description>When 'Age Field' is set, after performing a query the time of execution is stored. Subsequent queries will be augmented with an additional condition so that only records that are newer than the stored execution time (adjusted with the optional value of 'Age Delay') will be retrieved. State is stored across the cluster so that this Processor can be run on Primary Node only and if a new Primary Node is selected, the new node can pick up where the previous node left off, without duplicating the data.</description><scopes><scope>CLUSTER</scope></scopes></stateful><inputRequirement>INPUT_ALLOWED</inputRequirement><seeAlso><see>org.apache.nifi.processors.salesforce.PutSalesforceObject</see></seeAlso><defaultSchedule><strategy>TIMER_DRIVEN</strategy><period>1 min</period><concurrentTasks>1</concurrentTasks></defaultSchedule></extension></extensions></extensionManifest>