<extensionManifest><groupId>org.apache.nifi</groupId><artifactId>nifi-slack-nar</artifactId><version>2.0.0-M4</version><parentNar><groupId>org.apache.nifi</groupId><artifactId>nifi-standard-shared-nar</artifactId><version>2.0.0-M4</version></parentNar><systemApiVersion>2.0.0-M4</systemApiVersion><buildInfo><tag>nifi-2.0.0-M4-RC1</tag><branch>UNKNOWN</branch><revision>19c5be0</revision></buildInfo><extensions><extension><name>org.apache.nifi.processors.slack.ConsumeSlack</name><type>PROCESSOR</type><description>Retrieves messages from one or more configured Slack channels. The messages are written out in JSON format. See Usage / Additional Details for more information about how to configure this Processor and enable it to retrieve messages from Slack.</description><tags><tag>slack</tag><tag>conversation</tag><tag>conversation.history</tag><tag>social media</tag><tag>team</tag><tag>text</tag><tag>unstructured</tag></tags><properties><property><name>Channels</name><displayName>Channels</displayName><description>A comma-separated list of Slack Channels to Retrieve Messages From. Each element in the list may be either a Channel ID, such as C0L9VCD47, or (for public channels only) the name of a channel, prefixed with a # sign, such as #general. If any channel name is provided instead,instead of an ID, the Access Token provided must be granted the channels:read scope in order to resolve the Channel ID. See the Processor's Additional Details for information on how to find a Channel ID.</description><required>true</required><sensitive>false</sensitive><expressionLanguageSupported>false</expressionLanguageSupported><expressionLanguageScope>NONE</expressionLanguageScope><dynamicallyModifiesClasspath>false</dynamicallyModifiesClasspath><dynamic>false</dynamic></property><property><name>Access Token</name><displayName>Access Token</displayName><description>OAuth Access Token used for authenticating/authorizing the Slack request sent by NiFi. This may be either a User Token or a Bot Token. It must be granted the channels:history, groups:history, im:history, or mpim:history scope, depending on the type of conversation being used.</description><required>true</required><sensitive>true</sensitive><expressionLanguageSupported>false</expressionLanguageSupported><expressionLanguageScope>NONE</expressionLanguageScope><dynamicallyModifiesClasspath>false</dynamicallyModifiesClasspath><dynamic>false</dynamic></property><property><name>Reply Monitor Window</name><displayName>Reply Monitor Window</displayName><description>After consuming all messages in a given channel, this Processor will periodically poll all "threaded messages", aka Replies, whose timestamp is between now and this amount of time in the past in order to check for any new replies. Setting this value to a larger value may result in additional resource use and may result in Rate Limiting. However, if a user replies to an old thread that was started outside of this window, the reply may not be captured.</description><defaultValue>7 days</defaultValue><required>true</required><sensitive>false</sensitive><expressionLanguageSupported>false</expressionLanguageSupported><expressionLanguageScope>NONE</expressionLanguageScope><dynamicallyModifiesClasspath>false</dynamicallyModifiesClasspath><dynamic>false</dynamic></property><property><name>Reply Monitor Frequency</name><displayName>Reply Monitor Frequency</displayName><description>After consuming all messages in a given channel, this Processor will periodically poll all "threaded messages", aka Replies, whose timestamp falls between now and the amount of time specified by the &lt;Reply Monitor Window&gt; property. This property determines how frequently those messages are polled. Setting the value to a shorter duration may result in replies to messages being captured more quickly, providing a lower latency. However, it will also result in additional resource use and could trigger Rate Limiting to occur.</description><defaultValue>5 mins</defaultValue><required>true</required><sensitive>false</sensitive><expressionLanguageSupported>false</expressionLanguageSupported><expressionLanguageScope>NONE</expressionLanguageScope><dynamicallyModifiesClasspath>false</dynamicallyModifiesClasspath><dynamic>false</dynamic></property><property><name>Batch Size</name><displayName>Batch Size</displayName><description>The maximum number of messages to retrieve in a single request to Slack. The entire response will be parsed into memory, so it is important that this be kept in mind when setting this value.</description><defaultValue>100</defaultValue><required>true</required><sensitive>false</sensitive><expressionLanguageSupported>false</expressionLanguageSupported><expressionLanguageScope>NONE</expressionLanguageScope><dynamicallyModifiesClasspath>false</dynamicallyModifiesClasspath><dynamic>false</dynamic></property><property><name>Resolve Usernames</name><displayName>Resolve Usernames</displayName><description>Specifies whether or not User IDs should be resolved to usernames. By default, Slack Messages provide the ID of the user that sends a message, such as U0123456789, but not the username, such as NiFiUser. The username may be resolved, but it may require additional calls to the Slack API and requires that the Token used be granted the users:read scope. If set to true, usernames will be resolved with a best-effort policy: if a username cannot be obtained, it will be skipped over. Also, note that when a username is obtained, the Message's &lt;username&gt; field is populated, and the &lt;text&gt; field is updated such that any mention will be output such as "Hi @user" instead of "Hi &lt;@U1234567&gt;".</description><defaultValue>true</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></property><property><name>Include Message Blocks</name><displayName>Include Message Blocks</displayName><description>Specifies whether or not the output JSON should include the value of the 'blocks' field for each Slack Message. This field includes information such as individual parts of a message that are formatted using rich text. This may be useful, for instance, for parsing. However, it often accounts for a significant portion of the data and as such may be set to null when it is not useful to you.</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></property><property><name>Include Null Fields</name><displayName>Include Null Fields</displayName><description>Specifies whether or not fields that have null values should be included in the output JSON. If true, any field in a Slack Message that has a null value will be included in the JSON with a value of null. If false, the key omitted from the output JSON entirely. Omitting null values results in smaller messages that are generally more efficient to process, but including the values may provide a better understanding of the format, especially for schema inference.</description><defaultValue>true</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></property></properties><relationships><relationship><name>success</name><description>Slack messages that are successfully received will be routed to this relationship</description><autoTerminated>false</autoTerminated></relationship></relationships><writesAttributes><writesAttribute><name>slack.channel.id</name><description>The ID of the Slack Channel from which the messages were retrieved</description></writesAttribute><writesAttribute><name>slack.message.count</name><description>The number of slack messages that are included in the FlowFile</description></writesAttribute><writesAttribute><name>mime.type</name><description>Set to application/json, as the output will always be in JSON format</description></writesAttribute></writesAttributes><triggerSerially>true</triggerSerially><primaryNodeOnly>true</primaryNodeOnly><defaultSettings><yieldDuration>3 sec</yieldDuration><penaltyDuration>30 sec</penaltyDuration><bulletinLevel>WARN</bulletinLevel></defaultSettings><stateful><description>Maintains a mapping of Slack Channel IDs to the timestamp of the last message that was retrieved for that channel. This allows the processor to only retrieve messages that have been posted since the last time the processor was run. This state is stored in the cluster so that if the Primary Node changes, the new node will pick up where the previous node left off.</description><scopes><scope>CLUSTER</scope></scopes></stateful><inputRequirement>INPUT_FORBIDDEN</inputRequirement><seeAlso><see>org.apache.nifi.processors.slack.ListenSlack</see></seeAlso></extension><extension><name>org.apache.nifi.processors.slack.ListenSlack</name><type>PROCESSOR</type><description>Retrieves real-time messages or Slack commands from one or more Slack conversations. The messages are written out in JSON format. Note that this Processor should be used to obtain real-time messages and commands from Slack and does not provide a mechanism for obtaining historical messages. The ConsumeSlack Processor should be used for an initial load of messages from a channel. See Usage / Additional Details for more information about how to configure this Processor and enable it to retrieve messages and commands from Slack.</description><tags><tag>slack</tag><tag>real-time</tag><tag>event</tag><tag>message</tag><tag>command</tag><tag>listen</tag><tag>receive</tag><tag>social media</tag><tag>team</tag><tag>text</tag><tag>unstructured</tag></tags><properties><property><name>App Token</name><displayName>App Token</displayName><description>The Application Token that is registered to your Slack application</description><required>true</required><sensitive>true</sensitive><expressionLanguageSupported>false</expressionLanguageSupported><expressionLanguageScope>NONE</expressionLanguageScope><dynamicallyModifiesClasspath>false</dynamicallyModifiesClasspath><dynamic>false</dynamic></property><property><name>Bot Token</name><displayName>Bot Token</displayName><description>The Bot Token that is registered to your Slack application</description><required>true</required><sensitive>true</sensitive><expressionLanguageSupported>false</expressionLanguageSupported><expressionLanguageScope>NONE</expressionLanguageScope><dynamicallyModifiesClasspath>false</dynamicallyModifiesClasspath><dynamic>false</dynamic></property><property><name>Event Type to Receive</name><displayName>Event Type to Receive</displayName><description>Specifies the type of Event that the Processor should respond to</description><defaultValue>Receive App Mention Events</defaultValue><allowableValues><allowableValue><displayName>Receive App Mention Events</displayName><value>Receive App Mention Events</value><description>The Processor is to receive only slack messages that mention the bot user (App Mention Events)</description></allowableValue><allowableValue><displayName>Receive Message Events</displayName><value>Receive Message Events</value><description>The Processor is to receive Slack Message Events</description></allowableValue><allowableValue><displayName>Receive Commands</displayName><value>Receive Commands</value><description>The Processor is to receive Commands from Slack that are specific to your application. The Processor will not receive Message Events.</description></allowableValue></allowableValues><required>true</required><sensitive>false</sensitive><expressionLanguageSupported>false</expressionLanguageSupported><expressionLanguageScope>NONE</expressionLanguageScope><dynamicallyModifiesClasspath>false</dynamicallyModifiesClasspath><dynamic>false</dynamic></property><property><name>Resolve User Details</name><displayName>Resolve User Details</displayName><description>Specifies whether the Processor should lookup details about the Slack User who sent the received message. If true, the output JSON will contain an additional field named 'userDetails'. The 'user' field will still contain the ID of the user. In order to enable this capability, the Bot Token must be granted the 'users:read' and optionally the 'users.profile:read' Bot Token Scope. If the rate limit is exceeded when retrieving this information, the received message will be rejected and must be re-delivered.</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>Event Type to Receive</propertyName><propertyDisplayName>Event Type to Receive</propertyDisplayName><dependentValues><dependentValue>Receive App Mention Events</dependentValue><dependentValue>Receive Message Events</dependentValue></dependentValues></dependency></dependencies></property></properties><relationships><relationship><name>success</name><description>All FlowFiles that are created will be sent to this Relationship.</description><autoTerminated>false</autoTerminated></relationship></relationships><writesAttributes><writesAttribute><name>mime.type</name><description>Set to application/json, as the output will always be in JSON format</description></writesAttribute></writesAttributes><primaryNodeOnly>true</primaryNodeOnly><defaultSettings><yieldDuration>250 millis</yieldDuration><penaltyDuration>30 sec</penaltyDuration><bulletinLevel>WARN</bulletinLevel></defaultSettings><inputRequirement>INPUT_FORBIDDEN</inputRequirement><seeAlso><see>org.apache.nifi.processors.slack.ConsumeSlack</see></seeAlso></extension><extension><name>org.apache.nifi.processors.slack.PublishSlack</name><type>PROCESSOR</type><description>Posts a message to the specified Slack channel. The content of the message can be either a user-defined message that makes use of Expression Language or
the contents of the FlowFile can be sent as the message. If sending a user-defined message, the contents of the FlowFile may also be optionally uploaded as
a file attachment.
</description><tags><tag>slack</tag><tag>conversation</tag><tag>chat.postMessage</tag><tag>social media</tag><tag>team</tag><tag>text</tag><tag>unstructured</tag><tag>write</tag><tag>upload</tag><tag>send</tag><tag>publish</tag></tags><properties><property><name>Access Token</name><displayName>Access Token</displayName><description>OAuth Access Token used for authenticating/authorizing the Slack request sent by NiFi. This may be either a User Token or a Bot Token. The token must be granted the chat:write scope. Additionally, in order to upload FlowFile contents as an attachment, it must be granted files:write.</description><required>true</required><sensitive>true</sensitive><expressionLanguageSupported>false</expressionLanguageSupported><expressionLanguageScope>NONE</expressionLanguageScope><dynamicallyModifiesClasspath>false</dynamicallyModifiesClasspath><dynamic>false</dynamic></property><property><name>Channel</name><displayName>Channel</displayName><description>The name or identifier of the channel to send the message to. If using a channel name, it must be prefixed with the # character. For example, #general. This is valid only for public channels. Otherwise, the unique identifier of the channel to publish to must be provided.</description><required>true</required><sensitive>false</sensitive><expressionLanguageSupported>true</expressionLanguageSupported><expressionLanguageScope>FLOWFILE_ATTRIBUTES</expressionLanguageScope><dynamicallyModifiesClasspath>false</dynamicallyModifiesClasspath><dynamic>false</dynamic></property><property><name>Publish Strategy</name><displayName>Publish Strategy</displayName><description>Specifies how the Processor will send the message or file to Slack.</description><defaultValue>Send FlowFile Content as Message</defaultValue><allowableValues><allowableValue><displayName>Send FlowFile Content as Message</displayName><value>Send FlowFile Content as Message</value><description>The contents of the FlowFile will be sent as the message text.</description></allowableValue><allowableValue><displayName>Use 'Message Text' Property</displayName><value>Use 'Message Text' Property</value><description>The value of the Message Text Property will be sent as the message text.</description></allowableValue></allowableValues><required>true</required><sensitive>false</sensitive><expressionLanguageSupported>false</expressionLanguageSupported><expressionLanguageScope>NONE</expressionLanguageScope><dynamicallyModifiesClasspath>false</dynamicallyModifiesClasspath><dynamic>false</dynamic></property><property><name>Message Text</name><displayName>Message Text</displayName><description>The text of the message to send to Slack.</description><required>true</required><sensitive>false</sensitive><expressionLanguageSupported>true</expressionLanguageSupported><expressionLanguageScope>FLOWFILE_ATTRIBUTES</expressionLanguageScope><dynamicallyModifiesClasspath>false</dynamicallyModifiesClasspath><dynamic>false</dynamic><dependencies><dependency><propertyName>Publish Strategy</propertyName><propertyDisplayName>Publish Strategy</propertyDisplayName><dependentValues><dependentValue>Use 'Message Text' Property</dependentValue></dependentValues></dependency></dependencies></property><property><name>Character Set</name><displayName>Character Set</displayName><description>Specifies the name of the Character Set used to encode the FlowFile contents.</description><defaultValue>UTF-8</defaultValue><required>true</required><sensitive>false</sensitive><expressionLanguageSupported>true</expressionLanguageSupported><expressionLanguageScope>FLOWFILE_ATTRIBUTES</expressionLanguageScope><dynamicallyModifiesClasspath>false</dynamicallyModifiesClasspath><dynamic>false</dynamic><dependencies><dependency><propertyName>Publish Strategy</propertyName><propertyDisplayName>Publish Strategy</propertyDisplayName><dependentValues><dependentValue>Send FlowFile Content as Message</dependentValue></dependentValues></dependency></dependencies></property><property><name>Include FlowFile Content as Attachment</name><displayName>Include FlowFile Content as Attachment</displayName><description>Specifies whether or not the contents of the FlowFile should be uploaded as an attachment to the Slack message.</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>Publish Strategy</propertyName><propertyDisplayName>Publish Strategy</propertyDisplayName><dependentValues><dependentValue>Use 'Message Text' Property</dependentValue></dependentValues></dependency></dependencies></property><property><name>Max FlowFile Size</name><displayName>Max FlowFile Size</displayName><description>The maximum size of a FlowFile that can be sent to Slack. If any FlowFile exceeds this size, it will be routed to failure. This plays an important role because the entire contents of the file must be loaded into NiFi's heap in order to send the data to Slack.</description><defaultValue>1 MB</defaultValue><required>true</required><sensitive>false</sensitive><expressionLanguageSupported>false</expressionLanguageSupported><expressionLanguageScope>NONE</expressionLanguageScope><dynamicallyModifiesClasspath>false</dynamicallyModifiesClasspath><dynamic>false</dynamic><dependencies><dependency><propertyName>Include FlowFile Content as Attachment</propertyName><propertyDisplayName>Include FlowFile Content as Attachment</propertyDisplayName><dependentValues><dependentValue>true</dependentValue></dependentValues></dependency></dependencies></property><property><name>Thread Timestamp</name><displayName>Thread Timestamp</displayName><description>The Timestamp identifier for the thread that this message is to be a part of. If not specified, the message will be a top-level message instead of being in a thread.</description><required>false</required><sensitive>false</sensitive><expressionLanguageSupported>true</expressionLanguageSupported><expressionLanguageScope>FLOWFILE_ATTRIBUTES</expressionLanguageScope><dynamicallyModifiesClasspath>false</dynamicallyModifiesClasspath><dynamic>false</dynamic></property></properties><relationships><relationship><name>success</name><description>FlowFiles are routed to success after being successfully sent to Slack</description><autoTerminated>false</autoTerminated></relationship><relationship><name>failure</name><description>FlowFiles are routed to 'failure' if unable to be sent to Slack for any other reason</description><autoTerminated>false</autoTerminated></relationship><relationship><name>rate limited</name><description>FlowFiles are routed to 'rate limited' if the Rate Limit has been exceeded</description><autoTerminated>false</autoTerminated></relationship></relationships><writesAttributes><writesAttribute><name>slack.channel.id</name><description>The ID of the Slack Channel from which the messages were retrieved</description></writesAttribute><writesAttribute><name>slack.ts</name><description>The timestamp of the slack messages that was sent; this is used by Slack as a unique identifier</description></writesAttribute></writesAttributes><defaultSettings><yieldDuration>3 sec</yieldDuration><penaltyDuration>30 sec</penaltyDuration><bulletinLevel>WARN</bulletinLevel></defaultSettings><inputRequirement>INPUT_REQUIRED</inputRequirement><useCases><useCase><description>Send specific text as a message to Slack, optionally including the FlowFile's contents as an attached file.</description><notes></notes><keywords></keywords><inputRequirement>INPUT_ALLOWED</inputRequirement><configuration>Set "Access Token" to the value of your Slack OAuth Access Token.
Set "Channel" to the ID of the channel or the name of the channel prefixed with the # symbol. For example, "C0123456789" or "#general".
Set "Publish Strategy" to "Use 'Message Text' Property".
Set "Message Text" to the text that you would like to send as the Slack message.
Set "Include FlowFile Content as Attachment" to "true" if the FlowFile's contents should be attached as a file, or "false" to send just the message text without an attachment.
</configuration></useCase><useCase><description>Send the contents of the FlowFile as a message to Slack.</description><notes></notes><keywords></keywords><inputRequirement>INPUT_ALLOWED</inputRequirement><configuration>Set "Access Token" to the value of your Slack OAuth Access Token.
Set "Channel" to the ID of the channel or the name of the channel prefixed with the # symbol. For example, "C0123456789" or "#general".
Set "Publish Strategy" to "Send FlowFile Content as Message".
</configuration></useCase></useCases><multiProcessorUseCases><multiProcessorUseCase><description>Respond to a Slack message in a thread.</description><notes></notes><keywords><keyword>slack</keyword><keyword>respond</keyword><keyword>reply</keyword><keyword>thread</keyword></keywords><processorConfigurations><processorConfiguration><processorClassName>org.apache.nifi.processors.standard.EvaluateJsonPath</processorClassName><configuration>Set "Destination" to "flowfile-attribute"

Add a new property named "thread.ts" with a value of `$.threadTs`
Add a new property named "message.ts" with a value of `$.ts`
Add a new property named "channel.id" with a value of `$.channel`
Add a new property named "user.id" with a value of `$.user`

Connect the "matched" Relationship to PublishSlack.
</configuration></processorConfiguration><processorConfiguration><processorClassName>org.apache.nifi.processors.slack.PublishSlack</processorClassName><configuration>Set "Access Token" to the value of your Slack OAuth Access Token.
Set "Channel" to `${'channel.id'}`
Set "Publish Strategy" to "Use 'Message Text' Property".
Set "Message Text" to the text that you would like to send as the response. If desired, you can reference the user of the original message by including the text `&lt;@${'user.id'}&gt;`.
    For example: `Hey, &lt;@${'user.id'}&gt;, thanks for asking...`
Set "Include FlowFile Content as Attachment" to "false".
Set "Thread Timestamp" to `${'thread.ts':replaceEmpty( ${'message.ts'} )}`
</configuration></processorConfiguration></processorConfigurations></multiProcessorUseCase></multiProcessorUseCases><seeAlso><see>org.apache.nifi.processors.slack.ListenSlack</see><see>org.apache.nifi.processors.slack.ConsumeSlack</see></seeAlso></extension><extension><name>org.apache.nifi.services.slack.SlackRecordSink</name><type>CONTROLLER_SERVICE</type><description>Format and send Records to a configured Channel using the Slack Post Message API. The service requires a Slack App with a Bot User configured for access to a Slack workspace. The Bot User OAuth Bearer Token is required for posting messages to Slack.</description><tags><tag>slack</tag><tag>record</tag><tag>sink</tag></tags><properties><property><name>api-url</name><displayName>API URL</displayName><description>Slack Web API URL for posting text messages to channels. It only needs to be changed if Slack changes its API URL.</description><defaultValue>https://slack.com/api</defaultValue><required>true</required><sensitive>false</sensitive><expressionLanguageSupported>false</expressionLanguageSupported><expressionLanguageScope>NONE</expressionLanguageScope><dynamicallyModifiesClasspath>false</dynamicallyModifiesClasspath><dynamic>false</dynamic></property><property><name>access-token</name><displayName>Access Token</displayName><description>Bot OAuth Token used for authenticating and authorizing the Slack request sent by NiFi.</description><required>true</required><sensitive>true</sensitive><expressionLanguageSupported>false</expressionLanguageSupported><expressionLanguageScope>NONE</expressionLanguageScope><dynamicallyModifiesClasspath>false</dynamicallyModifiesClasspath><dynamic>false</dynamic></property><property><name>channel-id</name><displayName>Channel ID</displayName><description>Slack channel, private group, or IM channel to send the message to. Use Channel ID instead of the name.</description><required>true</required><sensitive>false</sensitive><expressionLanguageSupported>false</expressionLanguageSupported><expressionLanguageScope>NONE</expressionLanguageScope><dynamicallyModifiesClasspath>false</dynamicallyModifiesClasspath><dynamic>false</dynamic></property><property><name>input-character-set</name><displayName>Input Character Set</displayName><description>Specifies the character set of the records used to generate the Slack message.</description><defaultValue>UTF-8</defaultValue><required>true</required><sensitive>false</sensitive><expressionLanguageSupported>false</expressionLanguageSupported><expressionLanguageScope>NONE</expressionLanguageScope><dynamicallyModifiesClasspath>false</dynamicallyModifiesClasspath><dynamic>false</dynamic></property><property><name>record-sink-record-writer</name><displayName>Record Writer</displayName><description>Specifies the Controller Service to use for writing out the records.</description><controllerServiceDefinition><className>org.apache.nifi.serialization.RecordSetWriterFactory</className><groupId>org.apache.nifi</groupId><artifactId>nifi-standard-services-api-nar</artifactId><version>2.0.0-M4</version></controllerServiceDefinition><required>true</required><sensitive>false</sensitive><expressionLanguageSupported>false</expressionLanguageSupported><expressionLanguageScope>NONE</expressionLanguageScope><dynamicallyModifiesClasspath>false</dynamicallyModifiesClasspath><dynamic>false</dynamic></property><property><name>web-service-client-provider</name><displayName>Web Service Client Provider</displayName><description>Controller service to provide HTTP client for communicating with Slack API</description><controllerServiceDefinition><className>org.apache.nifi.web.client.provider.api.WebClientServiceProvider</className><groupId>org.apache.nifi</groupId><artifactId>nifi-standard-services-api-nar</artifactId><version>2.0.0-M4</version></controllerServiceDefinition><required>true</required><sensitive>false</sensitive><expressionLanguageSupported>false</expressionLanguageSupported><expressionLanguageScope>NONE</expressionLanguageScope><dynamicallyModifiesClasspath>false</dynamicallyModifiesClasspath><dynamic>false</dynamic></property></properties><providedServiceAPIs><providedServiceAPI><className>org.apache.nifi.record.sink.RecordSinkService</className><groupId>org.apache.nifi</groupId><artifactId>nifi-standard-services-api-nar</artifactId><version>2.0.0-M4</version></providedServiceAPI></providedServiceAPIs></extension></extensions></extensionManifest>