# FolderWatcher Binding

This binding is intended to monitor a local folder, FTP and S3 bucket and their subfolders and notify of new files.

## Supported Things

The binding support three types of things: `localfolder`, `ftpfolder`, `s3bucket` and `azureblob`.

## Thing Configuration

The `localfolder` thing has the following configuration options:

| Parameter          | Name                        | Description                         | Required | Default value |
| ------------------ | --------------------------- | ----------------------------------- | -------- | ------------- |
| localDir           | Local Directory             | Local directory to be watched       | yes      | n/a           |
| listHiddenLocal    | List Hidden                 | Allow listing of hidden files       | yes      | No            |
| pollIntervalLocal  | Polling interval in seconds | Interval for polling folder changes | yes      | 60            |
| listRecursiveLocal | List Sub Folders            | Allow listing of sub folders        | yes      | No            |

The `ftpfolder` thing has the following configuration options:

| Parameter         | Name                           | Description                         | Required | Default value |
| ----------------- | ------------------------------ | ----------------------------------- | -------- | ------------- |
| ftpAddress        | FTP server                     | IP address of FTP server            | yes      | n/a           |
| ftpPort           | FTP port                       | Port of FTP server                  | yes      | 21            |
| secureMode        | FTP Security                   | FTP Security                        | yes      | None          |
| ftpUsername       | Username                       | FTP user name                       | yes      | n/a           |
| ftpPassword       | Password                       | FTP password                        | yes      | n/a           |
| ftpDir            | RootDir                        | Root directory to be watched        | yes      | n/a           |
| listRecursiveFtp  | List Sub Folders               | Allow listing of sub folders        | yes      | No            |
| listHidden        | List Hidden                    | Allow listing of hidden files       | yes      | false         |
| connectionTimeout | Connection timeout in seconds  | Connection timeout for FTP request  | yes      | 30            |
| pollInterval      | Polling interval in seconds    | Interval for polling folder changes | yes      | 60            |
| diffHours         | Time stamp difference in hours | How many hours back to analyze      | yes      | 24            |

The `s3bucket` thing has the following configuration options:

| Parameter      | Name                 | Description                                        | Required | Default value |
|----------------|----------------------|----------------------------------------------------|----------|---------------|
| s3BucketName   | S3 Bucket Name       | Name of the S3 bucket to be watched                | yes      | n/a           |
| s3Path         | S3 Path              | S3 path (folder) to be monitored                   | no       | n/a           |
| pollIntervalS3 | Polling Interval     | Interval for polling S3 bucket changes, in seconds | yes      | 60            |
| awsKey         | AWS Access Key       | AWS access key                                     | no       | n/a           |
| awsSecret      | AWS Secret           | AWS secret                                         | no       | n/a           |
| awsRegion      | AWS Region           | AWS region of S3 bucket                            | yes      | ""            |
| s3Anonymous    | Anonymous Connection | Connect anonymously (works for public buckets)     | yes      | true          |

The `azureblob` thing has the following configuration options:

| Parameter          | Name                      | Description                                               | Required | Default value |
|--------------------|---------------------------|-----------------------------------------------------------|----------|---------------|
| azureAccountName   | Azure Account Name        | Name of the Azure account where the container located     | yes      | n/a           |
| azureContainerName | Azure Blob Container Name | Name of the Azure container to be watched                 | yes      | n/a           |
| containerPath      | Container Path            | Container path (folder) to be monitored                   | no       | ""            |
| pollIntervalAzure  | Polling Interval          | Interval for polling Azure container changes, in seconds  | yes      | 60            |
| azureAnonymous     | Anonymous Connection      | Connect anonymously (works for public containers)         | no       | false         |
| azureAccessKey     | Azure Access              | Access Key for Azure storage account                      | no       | ""            |

## Events

This binding supports the following event:

| Channel Type ID | Item Type | Description                |
|-----------------|-----------|----------------------------|
| newfile         | String    | A new file name discovered |

## Full Example

Thing configuration:

```java
folderwatcher:localfolder:myLocalFolder [ localDir="/myfolder", pollIntervalLocal=60, listHiddenLocal="false", listRecursiveLocal="false" ]
folderwatcher:ftpfolder:myLocalFolder   [ ftpAddress="X.X.X.X", ftpPort=21, secureMode="EXPLICIT", ftpUsername="username", ftpPassword="password", ftpDir="/myfolder/",  listHidden="true", listRecursiveFtp="true", connectionTimeout=33, pollInterval=66, diffHours=25 ]
folderwatcher:s3bucket:myS3bucket       [ s3BucketName="mypublic-bucket", pollIntervalS3=60, awsRegion="us-west-1", s3Anonymous="true" ]

```

### Using in a Rule

Local folder example:

```java
rule "New Local file"
when
    Channel "folderwatcher:localfolder:myLocalFolder:newfile" triggered
then
    logInfo("NewLocalFile", receivedEvent.toString())
end
```

FTP example:

```java
rule "New FTP file"
when
    Channel "folderwatcher:ftpfolder:myFTPFolder:newfile" triggered
then
    logInfo("NewFTPFile", receivedEvent.toString())
end
```

S3 bucket example:

```java
rule "New S3 file"
when
    Channel "folderwatcher:s3bucket:myS3bucket:newfile" triggered
then
    logInfo("NewS3File", receivedEvent.toString())
end
```

Azure Blob container example:

```java
rule "New Azure file"
when
    Channel "folderwatcher:azureblob:myAzureBlob:newfile" triggered
then
    logInfo("NewAzureFile", receivedEvent.toString())
end
```
