<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns="http://www.springframework.org/schema/integration/ftp"
	xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:beans="http://www.springframework.org/schema/beans"
	xmlns:tool="http://www.springframework.org/schema/tool"
	xmlns:integration="http://www.springframework.org/schema/integration"
	targetNamespace="http://www.springframework.org/schema/integration/ftp"
	elementFormDefault="qualified" attributeFormDefault="unqualified">

	<xsd:import namespace="http://www.springframework.org/schema/beans" />
	<xsd:import namespace="http://www.springframework.org/schema/tool" />
	<xsd:import namespace="http://www.springframework.org/schema/integration"
		schemaLocation="http://www.springframework.org/schema/integration/spring-integration-2.1.xsd" />

	<xsd:element name="outbound-channel-adapter">
		<xsd:annotation>
			<xsd:documentation><![CDATA[
                Builds an outbound-channel-adapter that writes files to a remote FTP endpoint.
            ]]></xsd:documentation>
		</xsd:annotation>
		<xsd:complexType>
			<xsd:complexContent>
				<xsd:extension base="base-ftp-adapter-type">
					<xsd:attribute name="remote-directory-expression"
						type="xsd:string">
						<xsd:annotation>
							<xsd:documentation>
								Allows you to provide a SpEL expression which
								will compute the directory
								path where the files will be transferred to
								(e.g., "headers.['remote_dir'] +
								'/myTransfers'");
							</xsd:documentation>
						</xsd:annotation>
					</xsd:attribute>
					<xsd:attribute name="temporary-remote-directory-expression"
						type="xsd:string">
						<xsd:annotation>
							<xsd:documentation>
								Allows you to provide a SpEL expression which
								will compute the temporary directory
								path where files will be transferred to before they are moved to the remote-directory
								(e.g., "headers.['remote_dir'] +
								'/temp/myTransfers'");
							</xsd:documentation>
						</xsd:annotation>
					</xsd:attribute>
					<xsd:attribute name="auto-create-directory" type="xsd:string"
						default="false">
						<xsd:annotation>
							<xsd:documentation>
								Specify whether to automatically create the
								remote target directory if
								it doesn't exist.
							</xsd:documentation>
						</xsd:annotation>
					</xsd:attribute>
					<xsd:attribute name="remote-filename-generator" type="xsd:string">
						<xsd:annotation>
							<xsd:documentation>
								Allows you to specify a reference to
								[org.springframework.integration.file.FileNameGenerator] bean.
							</xsd:documentation>
							<xsd:appinfo>
								<tool:annotation kind="ref">
									<tool:expected-type
										type="org.springframework.integration.file.FileNameGenerator" />
								</tool:annotation>
							</xsd:appinfo>
						</xsd:annotation>
					</xsd:attribute>
					<xsd:attribute name="remote-filename-generator-expression"
						type="xsd:string">
						<xsd:annotation>
							<xsd:documentation>
								Allows you to provide SpEL expression which
								will compute file name of
								the remote file (e.g., assuming payload
								is java.io.File
								"payload.getName() + '.transfered'");
							</xsd:documentation>
						</xsd:annotation>
					</xsd:attribute>
					<xsd:attribute name="use-temporary-file-name" type="xsd:string" default="true">
						<xsd:annotation>
							<xsd:documentation>
								Allows you to suppress using a temporary file name while writing the file.
							</xsd:documentation>
						</xsd:annotation>
					</xsd:attribute>
					<xsd:attribute name="order" type="xsd:string">
						<xsd:annotation>
							<xsd:documentation>
								Specifies the order for invocation when this
								endpoint is connected as a
								subscriber to a channel. This is
								particularly relevant when that channel
								is using a "failover"
								dispatching strategy, or when a failure in
								the delivery to one
								subscriber should signal that
								the message should not be sent to
								subscribers with a higher 'order'
								attribute. It has no effect
								when this
								endpoint itself is a Polling Consumer for a channel
								with a queue.
							</xsd:documentation>
						</xsd:annotation>
					</xsd:attribute>
				</xsd:extension>
			</xsd:complexContent>
		</xsd:complexType>
	</xsd:element>

	<xsd:element name="inbound-channel-adapter">
		<xsd:annotation>
			<xsd:documentation><![CDATA[
                    Builds an inbound-channel-adapter that synchronizes a local directory with the contents of a remote FTP endpoint. 
            ]]></xsd:documentation>
		</xsd:annotation>
		<xsd:complexType>
			<xsd:complexContent>
				<xsd:extension base="base-ftp-adapter-type">
					<xsd:sequence>
						<xsd:element ref="integration:poller" minOccurs="0"
							maxOccurs="1" />
					</xsd:sequence>
					<xsd:attribute name="filename-pattern" type="xsd:string">
						<xsd:annotation>
							<xsd:documentation>
								Allows you to provide a file name pattern to
								determine the file names
								that need to be scanned.
								This is based on
								simple pattern matching (e.g., "*.txt, fo*.txt"
								etc.)
							</xsd:documentation>
						</xsd:annotation>
					</xsd:attribute>
					<xsd:attribute name="local-filename-generator-expression"
						type="xsd:string">
						<xsd:annotation>
							<xsd:documentation>
								Allows you to provide a SpEL expression to
								generate the file name of
								the local (transferred) file. The root
								object of the SpEL
								evaluation is the name of the original
								file.
								For example, a valid expression would be "#this.toUpperCase() +
								'.a'" where #this represents the
								original name of the remote
								file.
							</xsd:documentation>
						</xsd:annotation>
					</xsd:attribute>
					<xsd:attribute name="filename-regex" type="xsd:string">
						<xsd:annotation>
							<xsd:documentation>
								Allows you to provide a Regular Expression to
								determine the file names
								that need to be scanned.
								(e.g.,
								"f[o]+\.txt" etc.)
							</xsd:documentation>
						</xsd:annotation>
					</xsd:attribute>
					<xsd:attribute name="comparator" type="xsd:string">
						<xsd:annotation>
							<xsd:documentation><![CDATA[
			Specify a Comparator to be used when ordering Files. If none is provided, the
			order will be determined by the java.io.File implementation of Comparable.
							]]></xsd:documentation>
						</xsd:annotation>
					</xsd:attribute>
					<xsd:attribute name="filter" type="xsd:string">
						<xsd:annotation>
							<xsd:appinfo>
								<tool:annotation kind="ref">
									<tool:expected-type
										type="org.springframework.integration.file.filters.FileListFilter" />
								</tool:annotation>
							</xsd:appinfo>
							<xsd:documentation>
								Allows you to specify a reference to a
								[org.springframework.integration.file.filters.FileListFilter]
								bean.
							</xsd:documentation>
						</xsd:annotation>
					</xsd:attribute>
					<xsd:attribute name="local-directory" type="xsd:string"
						use="required">
						<xsd:annotation>
							<xsd:documentation>
								Identifies the directory path (e.g.,
								"/local/mytransfers") where files
								will be transferred TO.
							</xsd:documentation>
						</xsd:annotation>
					</xsd:attribute>
					<xsd:attribute name="auto-create-local-directory"
						type="xsd:string">
						<xsd:annotation>
							<xsd:documentation>
								Tells this adapter if the local directory must
								be auto-created if it
								doesn't exist. Default is TRUE.
							</xsd:documentation>
						</xsd:annotation>
					</xsd:attribute>
					<xsd:attribute name="delete-remote-files" type="xsd:string">
						<xsd:annotation>
							<xsd:documentation>
								Specify whether to delete the remote source
								file after copying.
								By default, the remote files will NOT be
								deleted.
							</xsd:documentation>
						</xsd:annotation>
					</xsd:attribute>
				</xsd:extension>
			</xsd:complexContent>
		</xsd:complexType>
	</xsd:element>

	<xsd:element name="outbound-gateway">
		<xsd:annotation>
			<xsd:documentation><![CDATA[
                Builds an outbound gateway used to issue FTP commands.
            ]]></xsd:documentation>
		</xsd:annotation>
		<xsd:complexType>
			<xsd:complexContent>
				<xsd:extension base="base-adapter-type">
					<xsd:attribute name="command" use="required" type="xsd:string">
						<xsd:annotation>
							<xsd:documentation>
								FTP command - ls, get or rm
							</xsd:documentation>
						</xsd:annotation>
					</xsd:attribute>
					<xsd:attribute name="command-options" type="xsd:string">
						<xsd:annotation>
							<xsd:documentation>
								FTP command options; for ls, -1 means just
								return the file names
								(otherwise file
								metadata is returned, -dirs
								means include directories (not included by
								default),
								-links means
								include links (not included by default); for get, -P means
								preserve
								timestamp from remote file.
							</xsd:documentation>
						</xsd:annotation>
					</xsd:attribute>
					<xsd:attribute name="expression" use="required" type="xsd:string">
						<xsd:annotation>
							<xsd:documentation>
								SpEL expression representing the path in the
								command (e.g. ls path to
								list the files in directory path).
							</xsd:documentation>
						</xsd:annotation>
					</xsd:attribute>
					<xsd:attribute name="request-channel" use="required"
						type="xsd:string">
						<xsd:annotation>
							<xsd:appinfo>
								<tool:annotation kind="ref">
									<tool:expected-type
										type="org.springframework.integration.MessageChannel" />
								</tool:annotation>
							</xsd:appinfo>
							<xsd:documentation>
								Identifies the request channel attached to
								this
								gateway.
							</xsd:documentation>
						</xsd:annotation>
					</xsd:attribute>
					<xsd:attribute name="reply-channel" type="xsd:string">
						<xsd:annotation>
							<xsd:appinfo>
								<tool:annotation kind="ref">
									<tool:expected-type
										type="org.springframework.integration.MessageChannel" />
								</tool:annotation>
							</xsd:appinfo>
							<xsd:documentation>
								Identifies the reply channel attached to this
								gateway.
							</xsd:documentation>
						</xsd:annotation>
					</xsd:attribute>
					<xsd:attribute name="filter" type="xsd:string">
						<xsd:annotation>
							<xsd:appinfo>
								<tool:annotation kind="ref">
									<tool:expected-type
										type="org.springframework.integration.file.filters.FileListFilter" />
								</tool:annotation>
							</xsd:appinfo>
							<xsd:documentation>
								Allows you to specify a reference to
								[org.springframework.integration.file.filters.FileListFilter]
								bean.
							</xsd:documentation>
						</xsd:annotation>
					</xsd:attribute>
					<xsd:attribute name="filename-pattern" type="xsd:string">
						<xsd:annotation>
							<xsd:documentation>
								Allows you to provide file name pattern to
								determine the file names retrieved by the ls command
								and is based
								on simple pattern matching algorithm (e.g., "*.txt, fo*.txt"
								etc.)
							</xsd:documentation>
						</xsd:annotation>
					</xsd:attribute>
					<xsd:attribute name="filename-regex" type="xsd:string">
						<xsd:annotation>
							<xsd:documentation>
								Allows you to provide Regular Expression to
								determine the file names retrieved by the ls command.
								(e.g.,
								"f[o]+\.txt" etc.)
							</xsd:documentation>
						</xsd:annotation>
					</xsd:attribute>
					<xsd:attribute name="local-directory" type="xsd:string">
						<xsd:annotation>
							<xsd:documentation>
								Identifies directory path (e.g.,
								"/local/mytransfers") where file will be
								transferred TO.
							</xsd:documentation>
						</xsd:annotation>
					</xsd:attribute>
					<xsd:attribute name="auto-create-local-directory"
						type="xsd:boolean">
						<xsd:annotation>
							<xsd:documentation>
								Tells this adapter if local directory must be
								auto-created if it
								doesn''t exist. Default is TRUE.
							</xsd:documentation>
						</xsd:annotation>
					</xsd:attribute>
					<xsd:attribute name="order" type="xsd:string">
						<xsd:annotation>
							<xsd:documentation>
								Specifies the order for invocation when this
								endpoint is connected as a
								subscriber to a channel. This is
								particularly relevant when that channel
								is using a "failover"
								dispatching strategy, or when a failure in the
								delivery to one
								subscriber should signal that
								the message should not be sent to
								subscribers with a higher 'order'
								attribute. It has no effect
								when
								this
								endpoint itself is a Polling Consumer for a channel with
								a
								queue.
							</xsd:documentation>
						</xsd:annotation>
					</xsd:attribute>
				</xsd:extension>
			</xsd:complexContent>
		</xsd:complexType>
	</xsd:element>

	<xsd:complexType name="base-ftp-adapter-type">
		<xsd:complexContent>
			<xsd:extension base="base-adapter-type">
				<xsd:attribute name="remote-directory" type="xsd:string"
					use="optional">
					<xsd:annotation>
						<xsd:documentation>
							Identifies the remote directory path (e.g., "/remote/mytransfers")
						</xsd:documentation>
					</xsd:annotation>
				</xsd:attribute>
				<xsd:attribute name="temporary-remote-directory" type="xsd:string"
					use="optional">
					<xsd:annotation>
						<xsd:documentation>
							Identifies the remote temporary directory path (e.g., "/remote/temp/mytransfers")
						</xsd:documentation>
					</xsd:annotation>
				</xsd:attribute>
				<xsd:attribute name="channel" type="xsd:string">
					<xsd:annotation>
						<xsd:appinfo>
							<tool:annotation kind="ref">
								<tool:expected-type type="org.springframework.integration.MessageChannel"/>
							</tool:annotation>
						</xsd:appinfo>
						<xsd:documentation>
			            	Identifies channel attached to this adapter. Depending on the type of the adapter 
							this channel could be the receiving channel (e.g., outbound-channel-adapter) or channel where 
							messages will be sent to by this adapter (e.g., inbound-channel-adapter).
			            </xsd:documentation>
					</xsd:annotation>
				</xsd:attribute>
		        <xsd:attribute name="charset" type="xsd:string" default="UTF-8">
		        	<xsd:annotation>
						<xsd:documentation>
							Allows you to specify Charset (e.g., US-ASCII, ISO-8859-1, UTF-8). [UTF-8] is default
						</xsd:documentation>
					</xsd:annotation>
		        </xsd:attribute>
	        </xsd:extension>
        </xsd:complexContent>
	</xsd:complexType>
	
	<xsd:complexType name="base-adapter-type">
		<xsd:attribute name="id" type="xsd:string" />
		<xsd:attribute name="session-factory" type="xsd:string"
			use="required">
			<xsd:annotation>
				<xsd:appinfo>
					<tool:annotation kind="ref">
						<tool:expected-type
							type="org.springframework.integration.ftp.session.DefaultFtpSessionFactory" />
					</tool:annotation>
				</xsd:appinfo>
				<xsd:documentation><![CDATA[
                Reference to a [org.springframework.integration.ftp.session.DefaultFtpSessionFactory] bean.
            ]]></xsd:documentation>
			</xsd:annotation>
		</xsd:attribute>
		<xsd:attribute name="temporary-file-suffix" type="xsd:string">
			<xsd:annotation>
				<xsd:documentation>
					Extension used when downloading files. We
					change
					it right after we know it's
					downloaded.
				</xsd:documentation>
			</xsd:annotation>
		</xsd:attribute>

		<xsd:attribute name="remote-file-separator" type="xsd:string"
			default="/">
			<xsd:annotation>
				<xsd:documentation>
					Allows you to provide remote file/directory
					separator character. DEFAULT:
					'/'
				</xsd:documentation>
			</xsd:annotation>
		</xsd:attribute>
		<xsd:attribute name="cache-sessions" type="xsd:string"
			default="true">
			<xsd:annotation>
				<xsd:documentation><![CDATA[
		[DEPRECATED] Consider wrapping your SessionFactory in an instance of org.springframework.integration.file.remote.session.CachingSessionFactory.
		]]></xsd:documentation>
			</xsd:annotation>
		</xsd:attribute>
		<xsd:attribute name="auto-startup" type="xsd:string"
			default="true">
			<xsd:annotation>
				<xsd:documentation>
					Lifecycle attribute signaling if this component
					should be started during
					Application Context startup.
					Default is
					'true'
				</xsd:documentation>
			</xsd:annotation>
		</xsd:attribute>
	</xsd:complexType>
	

</xsd:schema>
