From c9c500b24492b58c155720deef70aa6e15c8b9fc Mon Sep 17 00:00:00 2001 From: Monika Michalska <153922997+monikamichalska@users.noreply.github.com> Date: Mon, 14 Oct 2024 16:58:17 +0200 Subject: [PATCH] [DOCS-7529] Alfresco Federation Services 3.2 Migration (#1520) * [DOSC-7529] Add the 3.2.0 version of Alfresco Federation Services * [DOCS-7529] Alfresco Fedenration Services Migration * [DOCS-7529] Added the last section and fixed links * [DOCS-7529] Fixed header levels * [DOCS-7529] Minor changes after review * [DOCS-7529] Initial UA review * [DOCS-7529] Final UA review * [DOCS-7529] More fixes --------- Co-authored-by: Adelaide Nxumalo <27953420+anxumalo@users.noreply.github.com> --- _config.yml | 7 +- _data/toc/federation-services.yaml | 160 +- federation-services/3.1/admin/index.md | 41 + federation-services/3.1/config/index.md | 57 + federation-services/3.1/index.md | 47 + federation-services/3.1/install/index.md | 46 + federation-services/3.1/support/index.md | 17 + .../images/architecture-diagram.png | Bin 0 -> 47958 bytes .../images/content-service-mapping.png | Bin 0 -> 10054 bytes federation-services/images/job-flow.png | Bin 0 -> 22660 bytes .../latest/admin/admin-properties.md | 103 + federation-services/latest/admin/index.md | 166 +- federation-services/latest/admin/logging.md | 70 + federation-services/latest/config/index.md | 5666 ++++++++++++++++- federation-services/latest/index.md | 92 +- federation-services/latest/install/index.md | 156 +- federation-services/latest/support/index.md | 12 +- federation-services/latest/using/index.md | 3070 +++++++++ 18 files changed, 9463 insertions(+), 247 deletions(-) create mode 100644 federation-services/3.1/admin/index.md create mode 100644 federation-services/3.1/config/index.md create mode 100644 federation-services/3.1/index.md create mode 100644 federation-services/3.1/install/index.md create mode 100644 federation-services/3.1/support/index.md create mode 100644 federation-services/images/architecture-diagram.png create mode 100644 federation-services/images/content-service-mapping.png create mode 100644 federation-services/images/job-flow.png create mode 100644 federation-services/latest/admin/admin-properties.md create mode 100644 federation-services/latest/admin/logging.md create mode 100644 federation-services/latest/using/index.md diff --git a/_config.yml b/_config.yml index 4d87a344fd..fc0cfac909 100644 --- a/_config.yml +++ b/_config.yml @@ -1218,6 +1218,7 @@ defaults: toc: "federation-services" support: true versions: + - 3.2 - 3.1 - 3.0 - 2.1 @@ -1227,8 +1228,12 @@ defaults: - scope: path: "federation-services/latest" values: - version: 3.1 + version: 3.2 latest: true + - scope: + path: "federation-services/3.1" + values: + version: 3.1 - scope: path: "federation-services/3.0" values: diff --git a/_data/toc/federation-services.yaml b/_data/toc/federation-services.yaml index 3634822170..ef857a56e7 100644 --- a/_data/toc/federation-services.yaml +++ b/_data/toc/federation-services.yaml @@ -1,71 +1,91 @@ -# Federation Services 3.1 -- version: 3.1 - pages: - - title: 'Introduction' - path: '/federation-services/latest/' - - title: 'Install' - path: '/federation-services/latest/install/' - - title: 'Configure' - path: '/federation-services/latest/config/' - - title: 'Administer' - path: '/federation-services/latest/admin/' - -# Federation Services 3.0 -- version: 3.0 - pages: - - title: 'Introduction' - path: '/federation-services/3.0/' - - title: 'Install' - path: '/federation-services/3.0/install/' - - title: 'Configure' - path: '/federation-services/3.0/config/' - - title: 'Administer' - path: '/federation-services/3.0/admin/' - -# Federation Services 2.1 -- version: 2.1 - pages: - - title: 'Introduction' - path: '/federation-services/2.1/' - - title: 'Install' - path: '/federation-services/2.1/install/' - - title: 'Configure' - path: '/federation-services/2.1/config/' - - title: 'Administer' - path: '/federation-services/2.1/admin/' - -# Federation Services 2.0 -- version: 2.0 - pages: - - title: 'Introduction' - path: '/federation-services/2.0/' - - title: 'Install' - path: '/federation-services/2.0/install/' - - title: 'Configure' - path: '/federation-services/2.0/config/' - - title: 'Administer' - path: '/federation-services/2.0/admin/' - -# Federation Services 1.1 -- version: 1.1 - pages: - - title: 'Introduction' - path: '/federation-services/1.1/' - - title: 'Install' - path: '/federation-services/1.1/install/' - - title: 'Configure' - path: '/federation-services/1.1/config/' - - title: 'Administer' - path: '/federation-services/1.1/admin/' - -# Federation Services 1.0 -- version: 1.0 - pages: - - title: 'Introduction' - path: '/federation-services/1.0/' - - title: 'Install' - path: '/federation-services/1.0/install/' - - title: 'Configure' - path: '/federation-services/1.0/config/' - - title: 'Administer' +# Federation Services 3.2 +- version: 3.2 + pages: + - title: 'Introduction' + path: '/federation-services/latest/' + - title: 'Install' + path: '/federation-services/latest/install/' + - title: 'Configure' + path: '/federation-services/latest/config/' + - title: 'Administer' + pages: + - title: 'Overview' + path: '/federation-services/latest/admin/' + - title: 'Logging' + path: '/federation-services/latest/admin/logging/' + - title: 'Admin Properties' + path: '/federation-services/latest/admin/admin-properties/' + - title: 'Using' + path: '/federation-services/latest/using/' + +# Federation Services 3.1 +- version: 3.1 + pages: + - title: 'Introduction' + path: '/federation-services/3.1/' + - title: 'Install' + path: '/federation-services/3.1/install/' + - title: 'Configure' + path: '/federation-services/3.1/config/' + - title: 'Administer' + path: '/federation-services/3.1/admin/' + +# Federation Services 3.0 +- version: 3.0 + pages: + - title: 'Introduction' + path: '/federation-services/3.0/' + - title: 'Install' + path: '/federation-services/3.0/install/' + - title: 'Configure' + path: '/federation-services/3.0/config/' + - title: 'Administer' + path: '/federation-services/3.0/admin/' + +# Federation Services 2.1 +- version: 2.1 + pages: + - title: 'Introduction' + path: '/federation-services/2.1/' + - title: 'Install' + path: '/federation-services/2.1/install/' + - title: 'Configure' + path: '/federation-services/2.1/config/' + - title: 'Administer' + path: '/federation-services/2.1/admin/' + +# Federation Services 2.0 +- version: 2.0 + pages: + - title: 'Introduction' + path: '/federation-services/2.0/' + - title: 'Install' + path: '/federation-services/2.0/install/' + - title: 'Configure' + path: '/federation-services/2.0/config/' + - title: 'Administer' + path: '/federation-services/2.0/admin/' + +# Federation Services 1.1 +- version: 1.1 + pages: + - title: 'Introduction' + path: '/federation-services/1.1/' + - title: 'Install' + path: '/federation-services/1.1/install/' + - title: 'Configure' + path: '/federation-services/1.1/config/' + - title: 'Administer' + path: '/federation-services/1.1/admin/' + +# Federation Services 1.0 +- version: 1.0 + pages: + - title: 'Introduction' + path: '/federation-services/1.0/' + - title: 'Install' + path: '/federation-services/1.0/install/' + - title: 'Configure' + path: '/federation-services/1.0/config/' + - title: 'Administer' path: '/federation-services/1.0/admin/' \ No newline at end of file diff --git a/federation-services/3.1/admin/index.md b/federation-services/3.1/admin/index.md new file mode 100644 index 0000000000..0795a954f4 --- /dev/null +++ b/federation-services/3.1/admin/index.md @@ -0,0 +1,41 @@ +--- +title: Administer Federation Services +--- + +The Admin app allows you to setup and manage your Federation Services environment. + +The Admin app is a console for managing the administration of your Federation Services environment. It has separate menus that identify a particular activity or feature, and sub-menus that allow you to configure everything you need to perform migrations or federation. + +The Dashboard displays a snapshot of the admin information, including sections for Connectors, Discovery, Migration, Federation, Reports, and Admin. In each of these sections, you can view a list of recently accessed settings. + +![Screenshot of the Federation Services menu]({% link federation-services/images/menu.png %}){:height="220px" width="140px"} + +|Menu option|Description| +|-----------|-----------| +|Connectors|Allows you to configure Authentication, Repository, and Output connectors.| +|Discovery|Allows you to perform schema discovery and create aggregate reports.| +|Migration|Allows you to create and manage jobs.| +|Groups|Allows you to manage Job, Mapping, and Task groups.| +|Federation|Allows you to manage your federation information. Specifically, this is where you manage Federated Search and related views, as well as configure Content Service and Search connectors.| +|Reports|Provides basic audit reports.| +|Admin|Allows you to manage users, logging, import/export, license keys, etc..| + +## Managing Licenses + +In the Admin app, the **Licenses** page allows you to manage your license keys. + +When you first deploy the Federation Services Admin app, you'll need to apply your license key. + +You can add a new license key, or reactivate previously entered keys. The details of each key are listed, including the associated **MAC Address**, **Documents Allowed**, **Documents Used**, **End Date**, and which key is in use. + +1. Access the Federation Services Admin app. + +2. In the left hand menu, click **Admin > License**. + +3. Paste your license key into the **License Key** field, and click **Add License Key**. + + The license information displayed in the table. + + > **Note:** You can only have one active license at a time. + +If you need to reactivate a license key or add a new license key, simply repeat the steps above. If the key already exists, then it will be activated and the old key will be set to inactive. diff --git a/federation-services/3.1/config/index.md b/federation-services/3.1/config/index.md new file mode 100644 index 0000000000..f7acd8eb93 --- /dev/null +++ b/federation-services/3.1/config/index.md @@ -0,0 +1,57 @@ +--- +title: Configure Federation Services +--- + +The configuration for Federation Services is managed in the Admin app. + + + +Below is a high-level summary of the configuration process using the menu options in the Admin app. You'll need to follow the links provided in the Simflofy documentation to set up your environment. You can also see the Simflofy [Connectors](https://simflofy.helpdocsonline.com/connectors){:target="_blank"} documentation for a list of supported connectors and configuration details. + +Start by accessing the Admin app and then expand the **Connectors** menu option: + +1. Open your browser and navigate to: `http://:/3sixty-admin`, where `` is the IP address or DNS address to your Federation Services server and `` is the port to your Federation Services server. + + For example, if installing on your localhost, your URL may be: `http://localhost:6060/3sixty-admin` + +2. Enter your user name and password, and then click **Login**. + + The default administrator user name/password is `admin/admin`. + +3. Expand the **Connectors** menu + +![Screenshot of the connectors menu]({% link federation-services/images/connectors.png %}){:height="220px" width="140px"} + +Next, complete the configuration in each of the following areas. + +1. Create an Authentication Connection - one entry for each of the systems that you'd like to federate. + + For example, see the Simflofy [Google Drive OAuth Connector](https://simflofy.helpdocsonline.com/google-drive-oauth-connector){:target="_blank"} documentation for creating a Google Drive connector. + +2. Create a **Repository Connection** - one entry for each authentication connection. This configuration uses the authentication connection that you created in the previous step. + + > **Note:** If the option is available, validate your connection by clicking **Test**. + + See the Simflofy [Repository connector](https://simflofy.helpdocsonline.com/repository-connector){:target="_blank"} documentation for more information. + +3. Create a **Content Services Connection** so that you can use the manage in place functionality. + + See the Simflofy [Content services](https://simflofy.helpdocsonline.com/content-services){:target="_blank"} documentation for more information. + +4. Create an **Output Connection** that sets the target folder for the repository / output. + + See the Simflofy [Output connector](https://simflofy.helpdocsonline.com/output-connector){:target=_blank"} documentation for more information. + +5. Create a **Discovery connector** that configures the retrieval of content metadata from your source systems. You can run a report to view the discovery results. + + See the Simflofy [Discovery connector](https://simflofy.helpdocsonline.com/discovery-connector){:target="_blank"} documentation for more information. + +6. Create a Job for federated search - one entry to synchronize a single source system to a single target system. + + > **Note:** If you're planning to use manage in place federation, expand **Advanced Options** settings, and uncheck the **Include Binary** checkbox. + + See the Simflofy [Jobs](https://simflofy.helpdocsonline.com/jobs){:target="_blank"} documentation for more information. + +7. Run the Job after completing the above configuration. Click **Migration** > **Run and Monitor Jobs** to start, stop, and view the status of your jobs. + +See the Simflofy documentation on [Setting Up Federated Search](http://simflofy.helpdocsonline.com/setting-up-federated-search-tutorial){:taget="_blank"} for more information. diff --git a/federation-services/3.1/index.md b/federation-services/3.1/index.md new file mode 100644 index 0000000000..fba8fa0366 --- /dev/null +++ b/federation-services/3.1/index.md @@ -0,0 +1,47 @@ +--- +title: Alfresco Federation Services +--- + +Alfresco Federation Services is an add-on module that provides a powerful and easy way to search and manage content federated from leading business systems and content management applications. Manage in place functionality allows you to access, control, and govern content residing in more than sixty different business and content repository types. This provides a single view of information across different content systems, by synchronizing content into Alfresco Content Services. + +By connecting information from different systems, you can provide a single view of information stored across multiple repositories. + +Here is a summary of the key capabilities: + +* Federated search - content can be searched for across multiple content repositories and made accessible inside Alfresco Content Services. This means it doesn't need to be migrated from different content systems. +* Manage content in place - all content can be controlled, no matter where it's stored. +* Intelligent content migration - enables content migration to be completed in the background, with minimal disruption to your end users. + +Alfresco Federation Services ensures that customers are able to: + +* Federate and manage content or records in other repositories +* Apply Alfresco Governance Services to content that's stored in other content systems (using the manage in place functionality) +* Support enterprise-wide eDiscovery cases in order to allow legal holds across the enterprise + +The following diagram shows a simple representation of how Alfresco Content Services and Alfresco Federation Services interact with different content systems. + +![Simple architecture diagram for Federation Services]({% link federation-services/images/simple-architecture-3.0.png %}){:height="300px" width="615px"} + +Alfresco Federation Services can integrate any two endpoints in systems such as: + +* CMS (Alfresco Content Services, Documentum, SharePoint, etc.) +* Network file systems + +See the [Alfresco Federation Services summary and demo](https://www.alfresco.com/information-governance/content-federation-and-manage-place){:target="_blank"} to learn more. + +## Terminology + +Here's some useful terminology from the Federation Services documentation. + +|Term|Description| +|----|-----------| +|Auth Connector|This allows you to authenticate against a repository.| +|Repository Connector|This is a connector to a repository for getting content, metadata, versions, and renditions.| +|Output Connector|This is a connector to the output system you want to migrate or index to. to.| +|Content Service Connector|This connector allows you to attach a system to the Objective 3Sixty Content Services API for Federation.| +|Discovery Connector|This connector is used to get schema information from a system.| +|Job|A job is a basic construct used to specify the repository and output used in a migration or index. This is how you connect two systems together with Federation Services.| +|Mapping|Provides metadata mapping between types/aspects from a source system to an output system. These can be used in a job and in a content services connector.| +|Tasks|Provides a processing pipeline that allows you to process documents, metadata, versions, and renditions as part of a job.| +|TCS|Transparent Content Services (for managing content in-place)| +|TSearch|This component provides federated search capabilities| diff --git a/federation-services/3.1/install/index.md b/federation-services/3.1/install/index.md new file mode 100644 index 0000000000..c63120bc25 --- /dev/null +++ b/federation-services/3.1/install/index.md @@ -0,0 +1,46 @@ +--- +title: Install Federation Services +--- + +The Federation Services capability for Alfresco Content Services is delivered in a number of installation files. + +## Prerequisites + +Check the [supported platforms]({% link federation-services/3.1/support/index.md %}) for information on what you require before you start the installation. + +> **Note**: A compatible version of Alfresco Governance Services (if you plan to use the Manage in Place capabilities) is required, for example: if using Alfresco Content Services 23.1, make sure that you install Alfresco Governance Services 23.1. + +You can download the Federation Services software from [Hyland Community](https://community.hyland.com/){:target="_blank"}. + +### Federation Services requirements + +* Federation Services Admin server (i.e. 3Sixty Admin) + +* MongoDB server +* Tomcat server + + > **Note:** We recommend using a separate instance, where possible, instead of using the same one used by Alfresco Content Services. + +See the [3Sixty documentation](https://helpdocs.objective.com/3sixty_user/Content/get-started/architecture.htm){:target="_blank"}, for specific hardware and software requirements. + +> **Note:** This release of Alfresco Federation Services doesn't support deployment in Docker containers. + +## Install steps + +These steps describe how to install Federation Services to an instance of Alfresco Content Services. + +1. Go to [Hyland Community](https://community.hyland.com/){:target="_blank"} and download the files provided for the Federation Services release. + + This should include the following: + + * `AFS-federation.war` + * `AFS-admin.war` + + + + + + +2. Follow the steps in the 3Sixty documentation, [Install 3Sixty](https://helpdocs.objective.com/3sixty_user/Content/get-started/installation.htm){:target="_blank"}. + +3. After completing all the installation steps, you'll need to access the Admin app through your preferred browser to [configure]({% link federation-services/3.1/config/index.md %}) your installation. diff --git a/federation-services/3.1/support/index.md b/federation-services/3.1/support/index.md new file mode 100644 index 0000000000..4fa9907f26 --- /dev/null +++ b/federation-services/3.1/support/index.md @@ -0,0 +1,17 @@ +--- +title: Supported platforms +--- + +The following are the supported platforms for Alfresco Federation Services 3.1: + +| Version | Notes | +| ------- | ----- | +| Content Services 23.1 | | +| | | +| **Java** | | +| Java JRE 17 or later | | +| | | +| **Browsers** | | +| Chrome (latest) | | +| Firefox (latest) | | +| Safari (latest) | | diff --git a/federation-services/images/architecture-diagram.png b/federation-services/images/architecture-diagram.png new file mode 100644 index 0000000000000000000000000000000000000000..6750b0660422c650133f68dbb1255204a8085096 GIT binary patch literal 47958 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 literal 0 HcmV?d00001 diff --git a/federation-services/images/content-service-mapping.png b/federation-services/images/content-service-mapping.png new file mode 100644 index 0000000000000000000000000000000000000000..a2f36550b09dd459022d0f44ff7b68164cd24bca GIT binary patch literal 10054 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 literal 0 HcmV?d00001 diff --git a/federation-services/images/job-flow.png b/federation-services/images/job-flow.png new file mode 100644 index 0000000000000000000000000000000000000000..3e8ebeb901842edc1ca9fc82074fb1c8a96392ea GIT binary patch literal 22660 zcmd43Wmuctwl><9QYh}UxEGh=?(QC(;;zN5KyiY!K!Fx_Z*ccO(V(FOcX#(Mto5$F z_xa8~{|{GygeRGE%<&AFbBy~YN=-!;9fb(x#ful{@^VrdFJ8QY!k=d$zk&Z;_?xK+ z|Mk*cLssHNAAmnfzk8){j%S=*y6A-gA62q;Y{7plJe@`C_kJAzIxpL5*3GjR}wG1Hq@_D*lkygzW5X`CA8j-hhass zM*AM&6nhQmfaVSM{|>b6TrGIb2tI{HynxAZvQxjY+PDkMO7j@~73!Jl5m+-S;P*s+ z5JZCoNj!K~)v~EKz4fOps#mkMQXL?kH*Tj7s+FR99>&}1ADXdHTZ0P?i9d~qb zlg|WB^S!l-`ADDo-fP|!sqJ>RjLRO%TwPs_!$qf>skHR;c$K_nNiSy@FZ#%*oFSm? z!>VYpIh=NWxAc_h)N;VHk@|kHq2s~P_XJG1;oL~5S*VoLPv$pFPpCq&HZDuPVO~0F z8MW+uQ1HWewL^G1^*xFRDn#^2D2PXEt41n;Gf@yo8}w)AJDsvd<`7QT5_{!?%Zq96 zw^mVbsj#p6qGK!p32ctVquIhE`~;BEaEC!9j1NdiNVkVx9c3iEl3(We1Ozm60txDl z90<8e(@X!bb;cX}9n?{paH&rdi3SS!+}^31f!!4BiwSmhG`2%%(s`Z9gwMw$2VFT| zlOXgfL@DOLR`vCbG^|gOHj@)OszjAj*@N3pfX?*&$|lF}JFO`@XTIwXPA2&b;4lnF zZq7%MloIhuim}S7V5-FCO-*a>LV#h3TG|SW;xG4KxV)Thd}|f)ynsg2=BB2J>3|I> z-Sn`k>;5p`=y9A&j)8v~!8aG)n%1J-T226~@VX&`;hlJQFv_%+d3(7REP;y978mYE;q^lz04G`zXZ{XCeFV`9@pmpC|ZsdL08;i3`;e3 zYN>LhHw_j=s#%pJyaCuCvQ%D?pwJM>(47d;`y99&(!IW>8l^)`KQww_TqLufle$BC zwu?j`O8&WaSv5dQO#G9wfiV(L#=yTI|B@r|e9z=bpWi8DHU|yG>TBdhXC&Y!0k-`l zwV9*7RJn3|WSuR1CRh5h6+-0(?0#y|7yNSY+@CsmvUG;S&zIL~~chyO1a2 zrg6F`txHdL?9gSS5s?m4-uB|Ej{OCh4~&k+kz|kz%+A_Mt>g#u^KhVozpIMa)=DEe z{qGBCnl(dj2wv;-SQZ*pQCVNz7s_>+2()gb`-OYRKjpKJF7=*^=(?XGXCzbjXRE&u zgNUO@GMANlPvyoGRF5auW>HrH|A0R!9ak|hSj58FSrsC3S3a&&NQ{iV7tDbK>YJb0 z5)qaq>}ZrbdfE%v5E0-ZhbcKf%oq$hGA`b)D#N^-vfO^=7~W3Oigeh`iTz(|9>KA1 zMEmu|33s1dEDV)!G9{f(pvg%vW1-eh$~8ZLv!bHBU^pKUwgvr3ipRf9_qP6{4W3#Y zIj<8*lV78{l{%FppPsZ)R(XzOR(+gzeTSZ+^hMhG+7VbWPULzybdZDn4HXoDbKWdq z8Hj*~gD){YFph^!-t`pLS$c^$N;dj=^#K*cQnN%=JSLC59gpGdY(VGo0j4?C?> z@+yZagN_K4|Gq^rk##%RARZQ8$?_F;mozaGQ9Gup!g$PI`9T>0e!XW9PTie~j0~+r zO|i^Fvi*D)&FOdVuq|Ew%=;a+`Gb&AuJTd>Xs2#Ywy|~}9rzof%{01iQhL-j%qid| zVZ{d~iYfXl0IR-lKWp#;6m$Nt(s(HJU2K244`kFcl2A5C-#*P^b1!cIIP*0Im+F^p z_xdeV&3QFUg4x(kAsK{%JI4kQcaaw-Uh$eflKd6B0BJ&zmd<`O;M;=huoM5-p`d0Z zd}aLFRx5r~-bIAVj3wCukAf*skz_9n?RjZ%3zmhOW~zR9;?fHH&WZf_;$ohHIO)#) z+PT4Jw+GL3a-6;!g1Ay5RO%cwjHs5Q_Mh-%AUPhDQ~LnaFGz@^yX=^edasDvgy~nz zG*yBH_tq7>y<7B)q+eZxQwwJmeWI*&v$-0-#Ep^6czC z6s1c5RkBC2&+EI`r^jceX?=kkz>U^;mGY&VJ3;@}6i1dMlSIh$Nm)>n!poJHwdKC= z8*;o6y-$2#o^^@9HuRY5-HWn;>AB?e2A;D!>GBcG|8}z&1~Ad+>i)h`!K}}DRzDkK z!Dp^uh5L}duRXOIOYM|mzkKAg8OuW$e+xv*HqzZqrV=3HKNjaK*aDBY`kci+D$Bux zO}J)xj1K+Kd#AX zNdViPQ|iA%g&89#ysT3%#nNKZM8!}edfR6GtjC&xjyYtZOA7LbAvE;Wz{AZ})(4Xy zHvJ&8Fby$TPQOK`>_697DYXVpP15`_q2m7*pO}aHcjIMTjxfS%E6AN%IfEnliosC* zuWY$`M!i@4)`M?HLjxcWWx=5QB=fxvXJdi6^bm^gMV;=Ap#VsR=}#)i+}mI}ozd!O zwr&1tp}qwe-*mRF@_z}80_v0WZ#<-x1yB5t9c4oN%;j!r{Q>dzrly7}2)+$LrVkBW zeY`u`@{EkGr=7Zp(if2x+*8#`EGuJD)y^Zz>!N@M-yR0&wrzc;{m21H!e&j@FUxTm zaxNI(w~yZ%uZTj>a-{ddEAeR<8KSRx?p7yOZTh1~@iK6fD+CRiaDWfKG2FL#0h0bZ zZ9%QF$s@_<^X`!G0yef2ex3S?^)sKiReO3`N&43cU( z5?eoeuRFE#muH0i-G=vO?Qpoy%Kl}HuEPYN(+Sc zt8luJeDEnyZXp=P4drspH7K0a=r)&^hT|6iVRS5^_hqJF9Z^$wpx4EudAfPPC zw6HY1ci6@EUTD28Q67uIj$D&q^%fV$0!!ITHH({%>2`t&)UyfdISylo)6VI(rFb0Rr^f1^)i}Wg0xMmF#k%!z{P!2Bd{ z{84$!bHH=Z(<83Q*~Ez%oNl~656rbf06gcSP*n|!MQsg+ThS>)#*5Rqx zoYhQN|Gf$*(~dV{^9PG%N!Yr66Mqd_ORtno^{-xSizo2Tdh)lE+NDc0F3{KkoEU?D#LjJ#Q9z^}A2OBB_Bi!pv6q!PrtG4{Q#m!~VgwIQ{h=#$V z(732*g2fh>0M4urxs6{)>SCB^o-PKyH-^M9UjDV!v>h+hdBpi*_am~-hXS77WpV*? zh_+d0VGMXR)nB`#-E1cum?}lq6q_XFUTppN)%NoS)#K9)Yq}|S%&I*TKbwW)!7|%C zl&sR9P|3sJ+)N1+{=HLqu==ctRD$+rO7D`YQO@>n7f-;nH#&~x7==^Yh0dcIOPNtV zp0c9FNU%obGWGkizG19?c7t$(QLW7cPum`yTPOh9LgrY1qnnYo<)#LC0@GC0H>B^~ zPXuDsiXNstP?Py3AZ0m#Em%(Ey(9;*NVS;i!WsIEQUxZX#H)JJdzz%a=LPCMM zzz7X4mPBq#?fWa#AKJiK3bi-ruLzaPhuUwH>NGwAyV|{olU>~{kLG}eT|u`yMakw? z$Z(T*-f<5X;OFzUfdyO!s7@84wl3qrb2HyF_etZzaJ{{g2Ma63ZDi5A~fuW7K*ZiT7eubRSK_1aR0+pmZQz%wdM z%KeX5KW%)5Bv2wf^R}g5*1Da2%bX@_Xanu0KOmWHB~SY^PxDCXC6M+E!4L4mSZ}DI zPe*RJZ7m&1i;D&lN96Q*Y^qxBN_AE3_Ykm*z~67uLHwF?A0E}M5wo@=4?3P6tR%A> z3$17(FQz+;H}pj7Nfsv%HuFV3-(b}_IIFiKnLh61>Be71eJYIKh3<-QXqp|G0ikgv zm-X}Q!I$x4-LwlVRC>1Q^8#b7V`6SV;5rhHdRjM!QSD4)G3!HV7L1ZBl4)|X?m@ll zQbmy}B0jG$=_lim6$(5NKKbNiitua6Kiz2`KFkoK z2N*w@uoMNl{QmX0rC|>7OK4Da9zOD^!2C1vr)wEgR%h&~g{#)knLbaxJW(^@LxN`c ze8vD9XEKe^F>UykbvU?PIQPXwZ#IqePP_e{yY)D=$*bKBvbVj6BItLe`DONR>4qsnR*D z!sN3`ZD5J2wM6Un_<))z|&V8Q0} zd%?^aYB_*ua*)}ek65_W=F53p+P4)Pd#!Z$ONZ4M-6zKcr*q*w<2<({ zP*ZZ*SaZ?YNnq_~u|N;i3wI?yVDx8*13B#EL}VCcjB~C(jkTTS7pMftG#>dPHWwGbS+};_T3{`6SWeOI)Q-1|J@$csm_T;abM&*>-oUeYxL(lNl>qYo zZ62ayZUr4>=npeHM1cYRMyy*KqPF~4Rcr^$xoT_%1TG7HtVjAP5p&gg-Mm#wJJbsZ z!L1_ZrvQDd6&c&aL%d}tNdw)2OXSvQ&Ggoeyr@RIpEMkdJP!tZuq~ zxb>!F33WPJ{UHaNEC9Rj#!+&II10N{&42|%f{gY_Ath|i4vUJ213O8$SrfQDhJQ^+ zL}t!>T^(>7tDIH`ue0LY#&Ks{ZTAA*YC#1(_B`h<)#k)(!jD<~OY5cQ6Q z&o!&9C9ZmC&O!EG9Ld&U>Xx4GbosF)-Aqi<^1+g}LGE-PHlEt%m5%nA3h-xFYMXpt zhIx;)$&_a}7EQLmL>gZ#zxsy1ryP?j>@&9|TUPwZmP?xzBaaD&h=8ANX&Vd!Tk&Mf zC&&f~x1>XLXioX#tA;olCvxKflD~qEL&;qxBEA&Y|I{xJ2np~G++93*AiUJ{@bkLx zIa?XQ%OZm~2sbC23xN8x{5CE&gqA#9m0jZjRdyy|Q0*_S-R7xjcSG~sDnQVY-%?)7 zVY7W_$0tcJ?Aw@bIeEbO_{*noAOo}#qtb$RF3z)RcBCrakzeKe2c=EEUZULeEMu`9 z*PW^6TwvMXIiiNi!EQT7!`h??vk4pf9-hD>jROxqZKMJ_(CR*pK+^%9WBCEWUckYf z?Zv4;>7R=1*xupHtIw5tx%=x5i~xWbumCt!m?3%9g8n7|OtczH8;5lJ^oiXJ*t)l2 z1Fnvp8JZ0J<9f&?kn@(uxFNZ3a@E^epm3udch8-lFmp~rEJB~K=AEGJozwU!E8_%G z?JvW0Y>A7oal`fPfJ{*`1NqCEA{P>V0xwKq603>kXqv^x%}dK#H~H7xHaAZ-)Y|Eh zRTepr=(E)sa`MuASO~p-vS3!_A;Y1&LjYVSApc9Tpq^!`=nFXs6HxnBrr$Qat~vT8 zsK*7HZ(y+xqrjBtRVft9zSfV~AR$No)X)u7R}_}$I$!t_bm`^!!C98DI-Muua;omq zN3>U5zKl=Fc1G#dxsEA952rMYX1gXVOJ;{W^2jX7Xk=d#g zV~)eX!6y;pr|IaVp5^|oJ9@rgznXWj$2S*k7hQyg(|R=jTOSziJcNH7FH%SphTmGs zhm+);3eDKkId%Xf&HLIVfPOzt%BdGuRG8=6mf{ua{jw4GZE;94S0%aU&YC9Xe|s_b zMDU-8koFJSfcqR^XP&|ZcwaR&j8o~B(a&$Mb(0e|Nm$Mf3qMIIK|lXWxS=z^e9Y5GaXlPot+LqBbsv;{M6? z@%#@;bwj3vpl;FlVYu`Oj+5$XW5=oIt z5oV~Oh8v)ivR`Mi!bWwEtkk$Unl5&7G%Hh8PhOA9ug^iC`R3h7>c`M~q5I-eQ`(Wb z%%LZiQAVqA8Nok|GyNw`DOSwXgnop9s$Z;MfWyGH-A3}0bgFs7Ux)1jWhLRJ>q-o` z;=P|+dQ2%=+RcbSqK2AUs_<>K2DPcHM&+Rl(iwns^^bi;0+4dwF9Mjm+Je~$@NpiDA761jh4~ZNcO~sWB zVcD5{;1z&1M}d9SwS-X5!lU(5KHZo5iT3)QUcY5t72wgSv;x&3YLcWVh@=^jVTQxAt@gqjG>#zcR_BW`T^V=kCN!z#`^Y zGiYaC;ou?0Hsyee(Gjvu4F%psHxdbpPX8zy`!uk~3~lDY-Ot0dKaXK!j$0jUQvJ$V zN5bVFco;{GzrJ}mIIR&07KF^Qfn6Pf*{2$K`dvJVd)-q$1XDNO8j{*+ zc0W^7$J~^#a!_YmD`}oNq9xE!kWk>IyC7l55LfVmmssBj3w%ct(Q?e8zVSPa<0Rbd z;mW;CZi}!0kXMWAR+wLWLYs6hI;3B>+ z+O9%&hiqfs&8P}z-W|;qv!~}lYzYfOrs+i>>DuR zE5cejt1hk{&E|L$jflQbpGx;@I$zs>H&y+rsf$lRryTRem=PT-6lS99Z)gD})r-sJbODG4lP z1i!siv$#^27Ms_$5qe=zXi5x0DQG%)Rp#gf?lGB?Ay})G6_IsB831zyzUjtYvGxPu z_7^_yg6=Sd&#{8|&t2S$Pz^2_Hzu$?n*j;pUhqQ5Y*mosvPsL*0p$kKjC`J+J*=nc zTW&x=i=Bpl;MyUX$h_Ata^J6jJO$u`+bZE$3jRgX&r}8bb^)@*7=>%mx~w_HQu^Vc z_|3c58rEyD%r)Y{!reEXdNo+~S_nu?(3>*N#*J5^l3&MlNps|#4@+s{a<*Vri)b+4 zoOEOIr*t|P6F*tzzT{B)gl`-|HDj%_pta6Iul|)t1|aXsZzfrw(rNALYh;;kOBGTtY@r9p}YxMfmIR=Es>GkOS3>o`)NnkH4pD>?6%zFL1me!`%mkLJc1z>&DbTGEcdO z^8VA8kISo}WH!@0=3jiOJp%qB1V^NPt_j_aQ7PA6gAq?(uhz4!-=6f7^Ogd zlU|A$da;$b+{lYMc(|BhfLnd%lK0aI;-8)br$1L}y|>+k!otbx>Ax&%shF}x%a`Ph z)7NuZ){csn%mx;8m-@_%G8235Jb9|}*j1P8dxpGS;N-s^vWZtoZ; z*Cd(W?ZW;{c11y=9>&buI@&Yl_czD0;*IAZ6_^4bo{1#C!R*D(LrNY?mhc$v*RU>g z9?1F%!FDG{V zjiYFW&Jpu64+aV5YDT-zH~;Po23DrX`&x6oIpw01O0#q>M?;9~Soo`^%EfPrtbv~Q z?Ki0Y3?hP!kel77R;V!cUoh$^Ls z3=?%>!o^%`JzqVtbvA$Ftcc-NAevQ5>80FyvKS*64S=cB@>*QtNa~BLNlSy*r*%y> z6fPVa7Wx_}Bg*>Wx=h{a>6#6O9vH~VE{Q0lDRSzydzcwD<|h15?pLA$d?PUnfH%by zjJ_#Yi}EWTw9GN^eN6qqeiYzuZfe7X{1~3tOG&le0)0TI&LO6PrmFWaaVHkFckdmR zoYPIjRJG?0I9~ZfAG*$cQ{PL~p_@9{lC0H5;cgeq7#DEBg8Ef5hRf(mFOTBw4QXhh z+6)alU%bsdWSPUtVU^tpI#>(vt%tZ;$s@F(9URot=Y+^#yTZ<$!tLhF%{U(Q6i~xai~riB@#G1KaoWaq;sL!!ngY6o!~jkBJ3DEup`%2l zo4f>D95^6X4-~JZ5K8};hdW^M-BQRj(vIhK6JG#_j}6YevElR<;70>#ww`98dZ30r zrgTZ#c~`snd|3tV-hD3@OlMlGAI9^2dTJ->XM#c?tCJz9Pvp~LpjKOc!V)nq*2is~ z1R&GiY{zh}8PLjGPF@B4s=&|~Q!8WM`_jBhr9NK-4KG zJV22@jwk-%sBEit(LazDpS!@FocpUjp{#amOIx1a_k;VxEK$3hluXhWn1sCst{^Fhk@&OliEe}L zW+K-HlVEePUm1BCr(i^@9XWeAz>f~6)Rl&%ibralz|%nPKHOd?7Sef#@Weo81}9&8pJQ}zP>Qr1;uTCaQo zoS{VRr8AV~+H?+b6i%&alf-*Km_r!d%>wWtpNx*DW61$V=%`)2IzQ|*I#SG2H!)GC z#cn~3XspYr88n|fXxT7A_1^p@*Rk%Q;wpWwthLPqy_Sd^tYyr4r&&&oK&>aECl}CD zY#%_V+CWHN81Q!9GkQ+UkaXU=FyZ#wn@VFgh@lFZ3K=sb&QnFppf)`o5u}oy)r-H+ z-rBa?=yBhu?Og_EfCjPV3la(8imo|^sG;<#po?Qi?7F~W% zc#mH8*zqnJu=dF%sA2ZJ!F_@Mes|IA^cQc;;@px^z8GrXWtEizY$i#(>~zx|lSiLd zO%EF7lAWS>QjYdj&&%OU?i)9Dv0w{ZyBCCNztJIovy&~_tAuqc)LXx(nLu9))6OTC zL5rPaZJL5CRbF5D{ICu`J>zeKxC+A$hqWJe~F2adXseClrXE)Iq3nBG_y3~!ImbYqE=*z?LY#$0x z9yl$8ifyLo={#{N`JUFcA3Rv$FT~PdTJSeDxj@K~+$@Ht_E<^0q{73$b?VZ0l*wO3 z*!^p}8L(6|n#hJy8y;)DI^_js(1g$zf!7k>H;w98nERSjE6rM4JkcL^%5Feahuf>3 zaR}(7=g_#(%mBYd_j_f5YAbW{xH_lJt1P3A?`7kEj}9^-d};20%6_)G%A5gEk93u) zJ>%ugGfC^4R-~U$bX%vr^lqHX7v|+D6**|TK-Qe14KRql?DeEZi34P1H$s664PN=F zV0$Pszg;pG-NT)UAa3)b?}y5kJAW+!`_jPAiA%_mV4^bxSv$h6N7oF1YzkYR?PYyy z>$MW0EXt_Kuo=*$0>#C~(mXh)TR!1Gck&aW=EM8tqf8o)b6CngA%k zE@R#8B{B`%>y{K8fHw^N2?~!V_T2s3u0!Ht_VEme+qUYbb<3+FIKaN_+4wYcG@I#s zy}m(rFGDvw`ascK>Pu}_m`#Gs?v{piS?zGE<~5@?b7WTgtp>hW@zp#ECU)$2E)oFY z#)c4CmHZPm=uQ7fs*L-CKfTc%&VJ@Q$r|AWdZ{7Y?_03rAFk`D>%pDBl&aB>SAKnK zuTR`6i!TMJjKZvm-IpZ8K`<%{;uz(d{0}Ghx42d#%MS@mA#OD`X(_5MPFG*wosKQ? z_V|z~^0~d=oQgO%e++hqKT=Svs2K(gyZJvC zw_oB9W{WTLxOgjJc?4Qq3qkYJz(e2l{%XPdTZMRgiE(gv*n136_}^8D2+Kcr&Y^(3 zQXzP^w`@2v=QK3t(_!X_zd`Dck27%`L(@?cFycynnXKr#dh*RuaA2{`C;89i)o(Z& z#%WNd%W~K50I8Hv0M{GW;R2xfY{csXcP+lEvGCoxN}M;dvUTNGK1gOf?J*j;8uas`zfcJAF?`h1$7!IOgD%k*%m+2_!xLo?Pe0_B$_b3n zL?|m5;+AtsOM(;Ino~v*!8Wu3ar0IuyRkEg#+LNcTWqgj2LDZ&*Xl{OE^h{8Z!q5z z#;D?x%y&)1`IPtD_V*I{`TNK+2RL$$xYW+Lfj{-ZCX?M!di5Km1mgG?y5f$!KUF%E zUzgrB7-E`7ad*~Ler!-uh-mRku4ml(6BH#1BBJ?evik@Hop3=+o`^|=x8}VCxaf%fiZb_0m)KTh?}`0eh9IN_|Jrpiv z8V{ulysW^3`H2(-b)z>U8G)@ZyRc*3;G~+c;Q0gq>RZ&RE~YontUDNRj&r_ zGh#(LaF4%|(ZzSK>~bgKBO5*F;L89D=9_ZR^3EI|CAL?lorPt1lB|;kSYv)H1oX%+ z(^YIRC4aMxvY=%%jgTh$r}6)0@`sOi^JL-Vw8D5T&1Ku1)TeRr^KMi&`u;(+|DYWk z8}Ay=R#{R@sA=fF5_+p2*kh0c?y*Z2?{0Fh97UdjgA{o&-I=cBmm3iEL-^eqnXK5ZMB<7XlC(qD$ryNM7cIE#Dbs3a{qH_79FU!0R&z8sZXFS77P@3jf)u z?m1PVK3G_A9M7p+!X+5L;6Z<*8~l-vKA};lO{lo8Mv389N@r#RF+IiKh%IFvs3RgA zBK+P7)Yr|t_2iNn*A@_~u%|dM(hm$Hcx9lb*I7nQXGQajMkA?mD9v9kHWj!XRd>5| zDRj@u%v&h((o~Vh7^*94VCq0R(W|jO38I_=(7!oyo?YyICF*zR0EZTnAI-sWhn9hx z`)RdT`^LU^RnD4H{;%r}Z8p{lw+h_RIv{d5dymN*iJcdWHqS8L|3JGr>H*Xyo$3+@ zq1!{$3uh_@RMxzQbmVMRlv{5Q2bZ(QSO{>_u)0G^a3JGoj2C*+@)q{?em&C!=>Nh` z8kAel4(Cq&(lQq3$fF2V33REJEpK7|u}8Atq)XN843}&)$Z7pKjdu4HooAwmLcLNf-Kt3OY`AnecF?AB^P$OJUxs zdzCtYkapBNnG}El94hl)5Onhx?#@tOm*i+##DEl{2E2A5-(U^1)oYk@zVs*GJTwfV zd9&XQ4Moz3Z>MfRmUUmXYFQ|Gy?D*9b|V2M5i11tTH&B1@1u=g4>NRzzMj~}Pmi@L zVhvb%j0elBoguN8SiO~x8;l-CySdF59_xg={X=O8<&BY79cNcw+Y?!=C(*Gw?&XaF zaeu*VtQvEpJk=hx8}7=fT)`?q-swxIl!1F}&L>9^_(ZOm9(OZQfS;8ALw?Oj?k{DH zElrb~+CYUHl8XDaVFRsdz8^;TS@zR^(cqYAInx1+^P_d$0(3iu<3yPsmx#Gm?k|0O zn}{tJcORcI_xu-ty=@k#H;~M>HZt29#?%=TZ6Cd}Yf|;?dj#%A%7)t!r*AIhAlB9f z_fUzaBTGY?;p3zw3J_yMPxcup9MORkQ>XeHliR`0l;TkL(LXHc$Mw0l-O|G7mbf$T zqWPAE><0SAI{vn_ic>n^sqE;;Px!y60slh#gSE`imzh%oot@2*u1LzH;8@~@OKvGTu*`cYdQv~V#tDS8 zF&6G@pQO3{EcX-y{5RP9DQ1eL%uO;n^B~Qxiq!pMLBMy6i^W=1HhSVnY-HnYO0K%&h}CL{5l zDH*90dP}s-f&(S7ijKOO3?9Fr;5a8ls3)Y5C?<#M-*DZOFaNJOURDOXytB5p*8lcR z#ra@gBYH;;QFvVz#(Nh1-9>{B->uM&Iri&E8?M8qEi#pB)=E~qG%ST=(x%!2AQ9{- zkW<%BP*lIC?e8W=pl)s5ezS&ZSp!Q!5_o+5aHWq>N-mV)Nfie~_U?axz5fxSkih;6 zNr({8aDC@c+{ZR%+jPkH_I^z7c4$EHyg~EF4!qt;gq^*x)}dmUk9n1q?N~RGghMJ@ zSy}mudL_R!s3TGR4G`rK({DQ`!e+kF^&XEAYH@XPm78$$60e2g*Qy5fa5@0^dt2-j z^Kyd?*~UBTqa}(kyeUUlrg0?$?`p#B=0Eg-f7CvY27(6fQO>`KLzoFpFw<{ujFi() zN>F+q#b7nk{goyf1HA}NG4NF8+qynkn-y2qdvO4#l;9l4H?PGBUQ@-;T&;gsop6T; z^HO>5mK1GUi{8B#KK(;|545Hy6qkgvSN<1O@M@NOP>^@Q86hs@dQs7DqZitLJWHi4;l&Ur5~~FaoxNpu~E=b@IgG3eg{14wTBfAZ53i}*GwQ| z(NzY1J{gQl$ync6k%u?hvY+`+oHX8zE#t(3(f?vwEe(xmX(z~i|Dd`_6=t`8zOnJc zq;R>Hk5SMI@ZbYdOYuCQ@nU21-3Rq2t;Qk7dcxULX~E8=*QPmc zr1+bv;{+-R9lZPk0;j){C7Z%35gORlZ~DGfZZpJ1M*p_y-i%0$C_;+qMZgrwCgGIy zxn7CTt5k2g9Pj(f%iNoLf^z%;{^h$8Mi_n%MqGZ!M-aDjve(=zE=n>#?e0m}iam`MB)O+?|?J))kWc!(q$OW@*&!uawt1 zi_J&vciT_{XYIIY)2@>-f?R>3f?(7QBd-O^B(`t?7iJRNew~cTiOwaW!<6DayWjA- zRTjFxjMi4GUhI3$@Uq@gM_$x*g>@zKM|A2U>IUlmvQb;x<#f@h7M5;h+4p#_X`78l z=bSr?nv9-_slwZ`JkSLiaje+rkMzh2YUnjJHEVW2yB0Wy)fCPlL+o;Rrm?M6v>v{67xbma%Z7oj zu3#|HJM(lwI1{$ZgYIIJ4}>f>NG1zKce9h|j${AC&g z6x*m$ZsLC;y%88ffkym4FWRbXjr^RUh637+>#``2d&1#bL!dHaK@MT}Z#^AkVxCTY zJinZC);**~?*9F+NuSq6fkrNR-GvD#|Dc>MWpW2EWZuC);Q&_>I|W=_@PYbyJ8qN% zZBF2BspCZW`V#=I_D^E)g^Oc_6Ds-KE{9?=HoOgCFQ*UfMt-5myx`hT3MZRlE@)Ye zq=PYsi|f-~&0n@&E&5qj>WE_vW2}F|Bcf<3y|-lijdPe6FH#D}GLi*ee|k2t>lOKF zKID+G=TOHl=fu`}{EDBSKe4ER&FAhmUSM8W$S>0$2_AH;x^#dMaIK8IL9Ndw?O9yR z6l!fv_HoD$4boL5^Ykc4*`>j7mB_Q z?XmIMW7P+3&`Z;?zIfe>)Eqk=vnJJR4Xn}sm8+x4n(31ej>LKhteVHmDG|D_0G zxb(zcRR=5QH{=i^I5AYyWe;1ES(=V5KdvV0LOvuftgo`+&-4h;O}EaZ#&KYfdwqYu zyKSTN1pBpk<9k!qoz7!=efRrN`_m~K(~*;_0XFup8mNO+vpO))5BFLjAqHdxc%o9e zS-fh8XMZQH`om7{0jJvEE;kD87k_nxu3YaopMvT$dZ^1qu~+O*?l zY<_T`vdPH~L}>E!b;xYM;6rnb z1>S0=?1o7*CC`b&Ch#pB9a(C=!tIUu{(ehzE8=#HAZJjWI-_n&r07pCSG2N;#2%}E z$^3_)3jrtj)(faXvN;VhK`h)jD7|gQ;jo8~iuTD-PF!jrP|W=Ne2FK7f5TI)W)JPd z=O%Q9XY25J$B75FUS~L)w8?(#lzv=Qo2WNvBF+8=)RWBgUVXd4_cjDE56+53-o*0o z@Y?!NqYWSLi$a}=8hr(Mw!$lD<{kCT8+pM<3S{0aI0Q0ge}CUb?@Y%skO+Ob%bQI( z{U=68#e5|-6{R*z{Pl`HT%~9?7ga&Z?JvcrTsJWXX?Q2P4*JJZUn>kSsXHAhyN$Y~ zf3%DiN@hjwRz{35Z)$GV7#hDyYO>7_g~ngU`bR4nOW8x7)SKet_Dijd^^IVsuX8Zr z2{b&Gm^W^ffK{EYaa>Gt2LJRDHG88%FnP{TbE+CRXJ+AvC647pmwL#_#h8iuvUHwn zVu$Yz=@j#A5f~qR@Sv?^(e)b%Dd|m)?=;|TNEke(S-mNotpR~@_VGssU-J?HKsU&` zA-kA{8cs*(1gxEmrdLZr9d51ge-;pnewgs7d2*e0sA{f~=bQK)k{c7jriSB@a{nx3 zU}Qx3wj42s4KAgXDT6bdunu>T$d6sXH|(+=Vt{eo zemV#285k~iMmLnUauLxRwftzke^varY`Jmy_!Ueyj>^`WO~NMrTMe$%;pgP^3>VyT z)uC-jg#1WK&=wm<{b;jrLtJGRz9`E4?d)H83q`n@{>|=O+20>#!FnF|4`bO{GX6MD zE^IL?X&xtCz=IKzl1s!X{#)#MTro=m?biYM?ljex`__1gzrPTy|6ph+lN(?ujKcje zh!7h>F^@;)vkoU{o~~?(Yw_E1B{X_7NYfQCHI#H_$S^T6r9t$u9)WPPe9zW)jw4OW zMpPFNVDohR7L8|{!2WUfg3Ef8qS7HD-Dw}735 z^_!HXHwt^6smESR0S#`$ue)A7dyzx~g}8zW=p)Do6WRU*7OM5P`n!&UApbI>eh<1R z``W4mK5=u>oOV)`;GZM$r98X&=iBubg#?i3azJrNqT|4?qByg^D>-nhk~hj4BA6~Y zaAE^GJ3q~7O|Kg~U_AcKfBIWUjulz>d0!A5y${dW^gW&Ugo3qS5B3RV0y#>O)YPOs z4+HTMGo4f1jB56no0|N_N;9nC(`G})M;0=k4>B8#&o>nnkFPI|RB#)gkT8W;)7vgH zCE~$0y^i$hS3*Y!OeLsvK8W3-(qYEJ=xJ3dh@F>L$B@}+u3*0M)lhSbpYMsgSg9-S zYgDP{{kN7yMMZ_J?V6RP8F6GY!VjD7skAA#dxXG+a@x+;@QPNql~Q5CKOa7(?F+x6 zXDy0_LGFWb-9~p0b0;5^i@9|gjyY1Xg(euWV9P|U0srnQB2z6@J^!0G3_X9%jb2Zaq@hi}xsbh32 zXg_qYyP-$tPoPKGY>aYpS#CP8W^;XRo8J0$8)B;@+!lc5%ZKa8@iOOZ2Y$FobDRI? z?yti6^y_5xgTRQSD98WP%vpa$)%9&$NdajA0SW0w!T<&k5Rec=h8{u`B&0(c9Z))? zy9PvO2oZ*%5ou6TatOg8yhlPh<=vzA`#k@`vlc(FSi_mK&yI6lpYPrm_qgQ&JXs=~ z#TJI(zXz@IVE2lTNl&X`fA?!s0XFsuA}QupxLLFA^f`->Yj`rsQ1>9?btH@=TGFfoF|00U$^Wq_u-ez^%2&+GQQCxC@qe(T@LVu{3)i@`#c}37bWjkJJMJ7Bt&T@uw zWYWi|-jdXqC_YlB@JW8KF~}>hc|jPEzj8N%A_6C!_H#@GYVj|^n`?Y%)$PPfr?zKq zMX4nkOg)D@%HR1QP+_%Q-gmyEAz;ER%@eAo9Y~>+ba)9RcZm)Y>E_bln6$=r+0ng` z0(rabbrp=>#Kq*rytoig7D2lG+rk>$RazFzn(;Dk@DH#bD?aqDBR@5)&V7gCO})h2 zmC)c%d=>J~at>ol>K8KB=;L-xMEnr6I?n_D5vxS+^Q9{$vba$3!A7f?U&<2-5P1@%*tn zVVzzNR(p0rdpP~Ro!489Bis98^i)pU(0=N^YdiD$sG6IsD_0TQ!cP`GdMc^|V?Kt! z@je>!s?(aG^VIC*^?exciQSFVO14OZb7yeY;DDNXuv;0-_yR$ z!tB(o*zMxqiI+#uWDhp?Pm;TE_sstCPi=C8+S7NZS1R6q@hj$5D}tJ&%BXSB@N?3L z%ItL#R(|x1Rq3>^;z*3~NQ$uGD*ODwE6<-mpAiVgpCFV&vR9k!0m$MTY>_~4MNRdm zfCsH=e?E>?Mgz=2?h9RuV57AJM(gW3M@|h5^UV2+_smpZmN)jc$vp47ae0rf@v4}4 zOY|q(WWs;in<)-v5R3;wrqTa7@+c0Jm`xqn^GZG1pM7{9R3cr1o*AI?rRacLLlpcc zlY|QHE^}F;swI=)Obq_qV7Kz`s;S89%Hpo@RCX!LQJYRSeFUoO9(c!_+V~21(L3WF z8kQAgx0E>z*($nB%hEfmtP&J|WH(nROn5w_idZIi^)<8aPk^0~fzi5>;_1+sO}BghOJ9B6cArA`a7YPn7LK z)Lqxp^X05XJ$>D>5}F5J#-F@#fh6DEa8c`RAED&AprJx&B0g%jPRsDP<68L~d4*&Uw2dx~BI5ahJ~E7YKhmRXa-XIW@!|dg>QCw!V9P_(1V%9YoTei zb!DU5R_3L6qmT$HGFfh*^?gyv6P56kBDTC3^nNQb;ht;;X6}|riF0nb`>v5?t*z?$ zQ(HKcq_LD@Ck@wHZkl;t?KZtAz@wNCBj!ct97UyJEPC5SBP|rT`%I-+wk;6ca3-b| zN31kz+N{Y#7YD_Bb1<)1TAt*$YpOUGA2t(1`X~{rsQO6A-;CO1xLZF@@1ExTSO_LK zh_fa^%(6O$itBX4KKehC>a`~4)o1#WP9sS!8;{AVLVl#02+R6Ykn-CP_gBUbGvGP( z(%#A^gquDpBJ;gN{dfZ>C6cNA3$qp%QtLS*#da z>9-k2S3zCiL3}nKB~^9D>y5oYO(JVg8^>r?JLFCK+pcQG97@I)4^vutS%I&!roi|&WK8CASM$Jd2G%;k!Ix+;G;;l{M zbGc0~6W#$AYl{8PjOm~S!90!0Ldc2Q3MJU#x!qj1suR_+*H5eT^=9oWvc!-M4-GWR zc5&UZvt98f>*j&$UP|Q1dBz$l&1T=s@TTt~~1U1?`^V zp3inTWG+|tSf@`<(lTK}5sN#{wK9<~Iau7ZcKv?ahi#1&9XNmTjB|W1%oJ~YzXKUH zzCH8yu^P+#Qv2~aKK3;ZI!D~Zhq#FPQyN;0Jr?}(Bd#G`i_*OD_|=~bR$u7rt)5}% zY^=-PDp)W+J(+8$qcIzS(Z#|E>vSDyRCo&@9l=Rvp;a1aRt)XySP!g6S}voY0mNZ- zmHm@W!uLHcS51LSP!H5ydn0y&!gVw0S~5=5hf14h+_&uNJWsnQhJ=mI8hb7xIIH3Z zQQYazFI3dtItq99A?aT)+Jb-IWpReSv-bOCXWrywsb6-}k4=$JBwmsSxhBHBs84q{qX>KtO33tZ^lD&uVN+Me2B}#Ly zK!}9wJ)+X8=U1XV>jY*UCe$RlFY0n$mCA8rnJ8QFO#mutKk~ZBw3lVG*}(94gerxn z!t~*L?|{%MSNSc8W~GPHolcA8F}rWxhw%FQ`ER4|pe;#TND5N*&4K?W|D)ZS_pLmA zecu?JnhSBK)$e8>cNniju-gUPBA==HvxS|P%=O;ZHD9P2fK9c1fDJVvR)SHoD(iEY zF!PpwmMRqd%&?f;eRX~k{cINW#tQNV=i`nRpIj5a(4Uz1MVU@}-uqldChVs#8@}JX z5|R!0D(Zu>ncZ#{pXNR+XQ$Az(Sh`p=CGl@V#!}u;sK)X5|fh|nb0Q+ZbXnv@q6+Y z-blQ9qVHYK{8j+*ys#e;S!f&gk5oWu`d3$6%ae}R)m2>UJU6^8mrRq>WQH+uZ#6k9bzqs?opO%cKRXv@w9 zuh8Pv6y1QsrS#PA0vDJg3FC;6t2Z@0{a~u$w6Eih}MXqP+TRXoH#~ZEI{|X&v>tiQonR4x%)hebNJPE#vC#IgL%|xZdxrACvQ7o%n>scMZSanA!HYHT2NiOe;tTS$bRFzf$39eK_w$k z_8&F*zr%?>Ewg`Ztt&>pw0Qj3fCxY&GUel`!5RpY#}`{mL{wxr)I4#bne2s9iuccw zdasqO>f1=Ee@%L9{_mYq-15T1A#ZP9iqE$gQj=6D$e>H#Ww!j*p*u=Q@Wmu;84wUr zhFf0N^C5%G+#Gohjp*WAwe08>vb+b5rKS)?aGwzDgv?OuE38Xg#E}GpOcp>e3r@Y} zimuhRS?>T_JUZP7tpq#>xN)xu%V)0<2wtP7^2MKZ5HE64%W+%`75gcH6q%&59*cJf zfawq5>RQ9h>-qZnLT74qGG{c1`?G2jF`?X&DFxGW?7HX(tB(YwC}%|wx@0jO1@hUJ zQ-3a*iq+pFj=kP^)=bm3`#iiK8VDaEtO7EdcjTAve-V0TAb=UZy&G?c`{y5RbO7Iu zk%GP#DHrMivg;3m;-*aihx4#Q8u)FARjy|~UWmnUb`}qF{h%JX<3C}3O(boq1i*vq zWU(&Ztb1$+XQwWB5ciMfI?{J(Zw^-mYqysD6FX@NdN~6wm>-lBM67nvd@qpi1ygXl zZL-kyR#<)W%@XJRq_8kzOwZdcZ91__;3m~J?=+-W=BuC>4ThD@9EQ~Q{)C8vKt^6^gL#F^$i#Ii`Nus)v6hZozJ=)0g z>ULPq)LLZXG>GfRTyX0@)SW90shyNhg*Udh^Uq*%df*wpA=+NXPEOw6i?%0RE~Q-I zw(C0Q#Oc=a%p9V2grBP$$l&~oT>AiK(%4m%^0Vn`AI;XDST}Sf=U)pv*!$kRKZm-) z3;Nk`3wUP(2i+oRM4bj_25)Aky##^Wtj39_95YsAaGO60f>@@&=_9I~^TgO#WG zLR9V(&@hehl^hTq3UFqT-50Dw=W;tDdW)J|m`@}Rt8~9!Z@^4%JuhzuKvx}oP;#hBZaSBxQ%kgrPm;^p>eCf#G3X;u|Bx4oJx4&QSrC6| zumdqY`PhN1y6^<#xxV=m-Np=_X?q(ejoyCL9gmKLJO!)zpyGax*k}F=6QEeAapCQp zZHV(uL!9x@5sxaUa><2}_ZuBL*F1;B$~76C`Kr(z0b>a+L-?@)BJS^R+!tPf+SmW| gp98i-SI>x(M_SfMos1Jea_~7Vb-g + +### Pagination + +Pagination works with the shown number of entries selector to determine how many audits are on each page. By default, the page is set to the first page. Clicking the next tab will go to the next page while clicking the previous tab will bring you to the previous tab (if applicable). You can also click on a number to bring you to a certain page. + +### Date Range Picker + +The date range picker allows you to look at audits from within a certain time period. By default, the date range is set from 7 days ago to the current time. + +Clicking on the calendar icon will bring up the current dates month and year. You can select a day on this month, or you can go to a different month by using the back arrow which goes to the previous month, or the forward arrow which goes to the next month. + +Alternatively, you can just enter the date manually by selecting in the text field and entering a date and time that follows the format `dd/mm/YYYY h:mm`. + +For example, `12/23/2011 12:03 PM` would be a valid date and time + +### Displayed Number of Entries + +You can change the number of audit entries displayed using the number of entries selector. By default, the number of entries is set to `10`. You can change the number of entries per page by clicking on the selector and selecting a different value. The options are `10`, `25`, `50`, and `100`. + +### Configuration + +Internal auditing is set in the Admin Properties. By default, auditing is turned off. To turn auditing on check the box for Internal audits. Here you can choose to **Track All Internal Audits** by checking the Track all Audits box, or you can **Track Internal Audits by Type** by checking the box next to each action type you would like to audit. + +List of available Audit types: + +* job +* conn +* auth +* mappings +* mappingGroup +* view +* user +* search +* cs +* widget +* jobgroup +* taskgroup +* template +* config +* license +* widgetDefinition +* jobSchedule +* dataSet +* contentReport +* usergroup +* instance +* jobHistory +* organization +* eventConfiguration + +### My Internal Audit + +This page is available under the **Audit Reports** menu and displays a version of this page with information limited to the current user. + +By default, the audits are sorted in descending order on the date column (most recent audits show at the top). All the other columns except the Date column can be sorted alphabetically if you click on the header. The Date column is sorted by date and time. An up arrow indicates that the column is sorted in ascending order while a down arrow indicates that the column is sorted in descending order. diff --git a/federation-services/latest/admin/index.md b/federation-services/latest/admin/index.md index 0795a954f4..59bcebdd2d 100644 --- a/federation-services/latest/admin/index.md +++ b/federation-services/latest/admin/index.md @@ -2,40 +2,160 @@ title: Administer Federation Services --- -The Admin app allows you to setup and manage your Federation Services environment. +The following diagram shows the architecture of Alfresco Federation Services: -The Admin app is a console for managing the administration of your Federation Services environment. It has separate menus that identify a particular activity or feature, and sub-menus that allow you to configure everything you need to perform migrations or federation. +![Architecture Diagram]({% link federation-services/images/architecture-diagram.png %}){:height="395px" width="384px"} -The Dashboard displays a snapshot of the admin information, including sections for Connectors, Discovery, Migration, Federation, Reports, and Admin. In each of these sections, you can view a list of recently accessed settings. +## Configuration Tools -![Screenshot of the Federation Services menu]({% link federation-services/images/menu.png %}){:height="220px" width="140px"} +Federation Services's configuration tool allows for easy import/export of all configurations in Federation Services. This is great for backups or for bootstrapping Federation Services with common configurations. -|Menu option|Description| -|-----------|-----------| -|Connectors|Allows you to configure Authentication, Repository, and Output connectors.| -|Discovery|Allows you to perform schema discovery and create aggregate reports.| -|Migration|Allows you to create and manage jobs.| -|Groups|Allows you to manage Job, Mapping, and Task groups.| -|Federation|Allows you to manage your federation information. Specifically, this is where you manage Federated Search and related views, as well as configure Content Service and Search connectors.| -|Reports|Provides basic audit reports.| -|Admin|Allows you to manage users, logging, import/export, license keys, etc..| +### Admin Tools -## Managing Licenses +In the **Admin Tools > Configuration Tools** page, users can import configurations, export configurations, export configs by job, manage patches and reset configurations. -In the Admin app, the **Licenses** page allows you to manage your license keys. +#### Export Configuration -When you first deploy the Federation Services Admin app, you'll need to apply your license key. +Using the left-hand menu in the UI: -You can add a new license key, or reactivate previously entered keys. The details of each key are listed, including the associated **MAC Address**, **Documents Allowed**, **Documents Used**, **End Date**, and which key is in use. +1. Select **Admin Tools** under the **Admin** section. +2. Click on the **Export** button. +3. Select all the configuration you wish to export from the list. +4. Hit **Export Configuration**. -1. Access the Federation Services Admin app. + This will trigger the download of a JSON file that contains all the selected configuration. -2. In the left hand menu, click **Admin > License**. +#### Import Configuration -3. Paste your license key into the **License Key** field, and click **Add License Key**. +Using the left-hand menu in the UI: - The license information displayed in the table. +1. Access the **Configuration Tools** menu from the Admin panel on the left-hand menu. +2. Click on the **Import** button. +3. Click **Choose File** and select the exported JSON file from. +4. Click **Import**. - > **Note:** You can only have one active license at a time. +## Licenses -If you need to reactivate a license key or add a new license key, simply repeat the steps above. If the key already exists, then it will be activated and the old key will be set to inactive. +The **Licenses** page allows for management of your License Keys. You can add a new License key, or reactivate previously entered keys. The details of each key are listed, including the associated MAC Address, Documents Allowed, Documents Used, End Date and which key is in use. + +### Add a License Key + +To add a license key simply paste the key into the text box labelled License Key and click Add License Key. You can only have one active license at a time. + +### Reactivate a License Key + +To reactivate a license key or add a new license key, copy the key and put it into the `License Key` text box, then click **Add License Key**. If the key already exists then it will be activated and the old key will be set to inactive. + +## Users + +Users can be created within Federation Services for user authentication and authorization. From the User page in the Admin section you can conduct the following actions. + +* View users that have access to Federation Services. Their first and last name. Email address login user name and their role. +* Create, edit, delete or disable users. +* View users by organization. +* Manage active sessions to see who is currently logged in. From here you can end all sessions as well. For example, if you need to make updates to the system. +* You can use the search field to narrow down the list of users displayed by name, email, login, or role. + +### Creating New Users + +To create new users click on the **Create New User** button. On the **Edit User** page fill in the following details for the user you are creating: + +* First and Last Name +* Email address +* Login user name +* Chose a Federation Services Role +* Chose a Federation Role +* Add a password. This can be changed by the user at any time by accessing their profile information + +### List of User Role Definitions + +#### Federation Services Admin + +* **Discovery Only**: This user does not have access to the Federation Services Admin UI, and can only log in to Discovery +* **Monitor**: Can **monitor** the execution of jobs, run reports, view job details. This is a READ ONLY user. +* **Executor**: Can **execute** jobs, run reports, view job details +* **Manager**: Can **create, run, and update** jobs and reports for the given Tenant. +* **Org Admin**: Can **create, update, execute and delete** jobs, users and reports for a given Tenant. +* **Federation Services Admin**: This user is the Federation Services Root user, with all capabilities on the system, for all tenants. + +#### Discovery + +* **Discovery User**: Can log in to Discovery but cannot edit or delete views or alter configuration. +* **Discovery Admin**: Full access to basic federation features. + +## User Groups + +User groups are collections of users. They can be used as part of View Level Permissions. + +* While adding users you will be able to see their first name, last name, login and role. +* Federation Services Admins will be able to see all users. +* Organization Admins will only be able to see users from their organization. +* Includes the ability to search all users. + +## Themes + +Theming gives an admin the ability to customise the Logo and Top bar colour as well as customise Lead Text sections throughout the application. Each organization may have a separate theme that can be set up by that organisations' admin. This is done in two parts. First, the Logo and Top bar colour, through the themes' page under the applications' admin section. Second, the Lead Text Sections, through the editing of a messages.properties file. + +### Theme Fields + +* **Browser Title**: The title that's displayed in the header +* **Reset Browser Title**: Check to reset the browser title +* **Browser Favicon**: Chose your Brand Logo file. Logos are selected through the choose file prompt +* **Reset Favicon**: Check the box to reset +* **Top Bar Colour**: The Top Bar colour is selected through the colour picker prompt. + +After selections, click Save. After page reloads, the changes will have taken effect. + +## Active Jobs + +The Active Jobs page shows the jobs that are currently running. Sometimes jobs can get stuck in the RUNNING state. + +### Fixing Stuck Jobs + +If a job is running and the **Abort** does not stop the job in an appropriate amount of time, the job can be killed manually through an Admin page. + +Under Active Jobs, look for your **Job ID** and click on the **Kill Job** button. It will look like a small trash can. + +Once the job is killed, you will need to fully restart the job to run it again. Running errors may only produce undesired results. + +## Connectors + +The **Connectors** page shows the available Connector types with the option to Activate or Deactivate any given connector. Custom Connectors will be listed here as well. + +## Organization + +The Organization page shows the different Organisations used within the Federation Services platform for multi-tenancy. It will display the Organization name, short name, the status (Active/Inactive) which notes whether an organization is enabled, and also provide a link to search their users. + +By default, Federation Services has one organization, based on configuration in the global properties. + +> **Tip:** This page assumes `simflofy.multi.tenant` is set to `true` in your global properties. + +In multi-tenant mode, a user with the Federation Services Admin role will have access to the **Organisation** page under the **Admin** menu. This page displays all the current tenants in your Federation Services. It will display whether an organization is enabled, and also provide a link to search their users. + +#### Creating an Organization + +When clicking on **Create New Organization** a pop-up will appear with the following fields + +* **Organization Name**: The name for your new organization +* **Organizational Key**: The org key that will follow the @ after users names. This cannot be changed after the organization has been creation. +* **Organization Database**: This will be created and populated on submission. It cannot be changed after the organization has been creation. + +The Key and Database fields cannot contain spaces or of the following characters: + +```text +!@#$%^&*()+=-[]\';,./{}|":<>? +``` + +Clicking **Continue** will take you to the org edit screen, but the org will not be created yet. You will be presented with a list of products available on your license, which you can activate for the new organization. This can be changed at any time to remove access to certain connectors and features. + +Upon clicking **Save** in this page, the organization will be added to the database and a standard initialisation will be performed (generation of Mongo indexes, adding the enabled connectors, and loading the bootstrap). + +Users under non-global organisations will need to log in with: + +```text +usersname@orgkey +``` + +## About Federation Services + +On the **About** page users can find the version and build information for the installed version of Federation Services. diff --git a/federation-services/latest/admin/logging.md b/federation-services/latest/admin/logging.md new file mode 100644 index 0000000000..83b9469fe3 --- /dev/null +++ b/federation-services/latest/admin/logging.md @@ -0,0 +1,70 @@ +--- +title: Logging +--- + +Federation Services logging allows you to access and set the log levels of all Federation Services classes. + +## Accessing and Updating the Logging File + +Federation Services logging is set in the following file: + +```text +[Federation Services folder]/WEB-INF/classes/log4j.properties +``` + +You can set the log level of all Federation Services classes by changing the following: + +```text +log4j.logger.com.simflofy = debug, 3sixty-admin +``` + +Replace debug with another valid options: + +| Level | Description | +| ----- | ----------- | +| ALL | All levels including custom levels. | +| DEBUG | Designates fine-grained informational events that are most useful to debug an application. | +| ERROR | Designates error events that might still allow the application to continue running. | +| FATAL | Designates very severe error events that will presumably lead the application to abort. | +| INFO | Designates informational messages that highlight the progress of the application at coarse-grained level. | +| OFF | The highest possible rank and is intended to turn off logging. | +| TRACE | Designates finer-grained informational events than the DEBUG. | +| WARN | Designates potentially harmful situations. | + +In production, Federation Services suggests setting logging to the `ERROR` level. + +You'll notice there are other entries. These entries will override the `com.simflofy` setting for the specific packages they reference. + +For example, this sets the SharePoint connector logging to `TRACE`. The second line is necessary to prevent double-logging: + +```text +log4j.logger.com.simflofy.connectors.sharepoint = trace, 3sixty-admin +log4j.additivity.com.simflofy.connectors.sharepoint = false +``` + +### Federation Services Admin Log View + +To get a basic view of the log file, the Logging page can be found under the Admin Menu + +This page uses the global property `simflofy.admin.log.path`, with a default value of `${catalina.base}/logs/3sixty-admin.log`. + +To modify this value edit `simflofy-global.properties` in the `3sixty-admin/WEB-INF/classes` directory, for example: + +```text +simflofy.admin.log.path=/my/log/directory/logs/3sixty-admin.log +``` + +On this page the user can download the complete 3sixty-admin.log, as well as filter the last 5000 lines of the log file: + +| Level | Logs | +| ----- | ---- | +| Info | Info, Error | +| Debug | Info, Error, Debug | +| Trace | All | +| Error | Error only | + +You can also set the value `simflofy.max.log.size` to prevent performance issues. Defaults to `10 MB`. KB and GB are also valid sizes. + +## Log Levels + +On the **Log Levels** page you can add or remove [log appenders](https://dzone.com/articles/log-appender-what-is-it-and-why-would-you-use-it){:target="_blank"}. Both of which are temporary. There is a list of all available connectors if you wish to modify the logging level for an individual connector. diff --git a/federation-services/latest/config/index.md b/federation-services/latest/config/index.md index 2fdbbca4be..4116cfdc28 100644 --- a/federation-services/latest/config/index.md +++ b/federation-services/latest/config/index.md @@ -1,57 +1,5609 @@ ---- -title: Configure Federation Services ---- - -The configuration for Federation Services is managed in the Admin app. - - - -Below is a high-level summary of the configuration process using the menu options in the Admin app. You'll need to follow the links provided in the Simflofy documentation to set up your environment. You can also see the Simflofy [Connectors](https://simflofy.helpdocsonline.com/connectors){:target="_blank"} documentation for a list of supported connectors and configuration details. - -Start by accessing the Admin app and then expand the **Connectors** menu option: - -1. Open your browser and navigate to: `http://:/3sixty-admin`, where `` is the IP address or DNS address to your Federation Services server and `` is the port to your Federation Services server. - - For example, if installing on your localhost, your URL may be: `http://localhost:6060/3sixty-admin` - -2. Enter your user name and password, and then click **Login**. - - The default administrator user name/password is `admin/admin`. - -3. Expand the **Connectors** menu - -![Screenshot of the connectors menu]({% link federation-services/images/connectors.png %}){:height="220px" width="140px"} - -Next, complete the configuration in each of the following areas. - -1. Create an Authentication Connection - one entry for each of the systems that you'd like to federate. - - For example, see the Simflofy [Google Drive OAuth Connector](https://simflofy.helpdocsonline.com/google-drive-oauth-connector){:target="_blank"} documentation for creating a Google Drive connector. - -2. Create a **Repository Connection** - one entry for each authentication connection. This configuration uses the authentication connection that you created in the previous step. - - > **Note:** If the option is available, validate your connection by clicking **Test**. - - See the Simflofy [Repository connector](https://simflofy.helpdocsonline.com/repository-connector){:target="_blank"} documentation for more information. - -3. Create a **Content Services Connection** so that you can use the manage in place functionality. - - See the Simflofy [Content services](https://simflofy.helpdocsonline.com/content-services){:target="_blank"} documentation for more information. - -4. Create an **Output Connection** that sets the target folder for the repository / output. - - See the Simflofy [Output connector](https://simflofy.helpdocsonline.com/output-connector){:target=_blank"} documentation for more information. - -5. Create a **Discovery connector** that configures the retrieval of content metadata from your source systems. You can run a report to view the discovery results. - - See the Simflofy [Discovery connector](https://simflofy.helpdocsonline.com/discovery-connector){:target="_blank"} documentation for more information. - -6. Create a Job for federated search - one entry to synchronize a single source system to a single target system. - - > **Note:** If you're planning to use manage in place federation, expand **Advanced Options** settings, and uncheck the **Include Binary** checkbox. - - See the Simflofy [Jobs](https://simflofy.helpdocsonline.com/jobs){:target="_blank"} documentation for more information. - -7. Run the Job after completing the above configuration. Click **Migration** > **Run and Monitor Jobs** to start, stop, and view the status of your jobs. - -See the Simflofy documentation on [Setting Up Federated Search](http://simflofy.helpdocsonline.com/setting-up-federated-search-tutorial){:taget="_blank"} for more information. +--- +title: Configure Federation Services +--- + +[Connectors](#connectors) are the 1st step in the integration process. They represent how Federation Services connects to other systems. + +Connections are instances of connectors which the user configures. There are 5 types of connections: + +* Authentication +* Discovery +* Integration +* Content Service +* Content Search + +The Federation Services Wizards will help you quickly create all the connections needed for your data integration. +Available Wizards: [Quick Build](#quick-build-wizard), [Integration](#integration-wizard), [Federation](#federation-wizard) + +## Connection Wizards + +Federation Services wizards allow users to easily create connections and jobs by simply selecting the software connectors you want to use enter the required configurations and let Federation Services do the rest. + +### Quick Build Wizard + +To use the Quick Build Wizard follow the steps below: + +1. Begin by selecting wizards from the navigation menu on the left. +2. Select **Quick Build** +3. Name your connection prefix. Your connection type will be added to the end of the connector name you chose. +4. Click **Build Connections** + +The wizard will create all the connections needed for your integration. + +Clicking on the links for your new connections will open them in a new tab for you to add more configurations if needed and gives you the option to test your connections before continuing with your integration. + +If you have made a mistake in naming or choice of connector you can click **Undo and Restart** to begin the process again. + +### Integration Wizard + +With the Integration Wizard you can create source and target repository connections step by step. This wizard will then create a job with some configuration options along the way. Follow the example below to use the Integration Wizard. + +**Step 1: Connection Type** + +1. Name your repository connection +2. Choose your repository from the drop-down +3. Click **Next Authentication** + +**Step 2: Authentication** + +1. If there is already an authentication connection it will show up in the Authentication Drop-down to choose. +2. You can either choose the one already in the system by clicking the option Use selected Authentication or create a new one. +3. To create a new one choose the Authentication Connection type from the drop-down and ensure the slider is set to Create New authentication Connection. +4. Click the Fill Authentication Fields to configure any additional fields. Connection +5. Click **Next**: Source Options to continue + +**Step 3: Additional Options** + +In step 3 you will be given additional options to configure depending on the connections available for the software chosen. For example: + +* Create a Discovery Instance +* Create a Content Service Connection + +Repeat Steps 1-3 for your Output Repository. + +If the software doesn't require authorization the wizard will skip step 2 + +Click **Next Output** + +As each connection is built they will be listed in separate boxes on the left. Click on the links to open the connections in a separate tab to view or edit the connections. + +The system will use the repository and output integration connections and build an Integration Job + +Click on **View Completed Job** to fill out any additional mappings and / or configurations to the job specifications. + +### Federation Wizard + +The Federation Wizard is a more specific type of migration, meant to index content into Elasticsearch, Solr, or MongoDB. + +The following are step-by-step instructions on using the Federation Wizard. + +**Input Connection** +**Step 1: Connection Type** + +1. Name your repository connection +2. Choose your repository from the drop-down +3. Click **Next Authentication** + +**Step 2: Authentication** + +1. If there is already an authentication connection it will show up in the Authentication Drop-down to choose. +2. You can either choose the one already in the system by clicking the option Use selected Authentication or **create a new one**. +3. To create a new one choose the Authentication Connection type from the drop-down and ensure the slider is set to **Create new authentication Connection**. +4. Click the **Fill Auth Fields** to configure any additional fields. Connection +5. Click **Next: Source Options** to continue + +**Step 3: Additional Options** + +Yes is selected to create the content service connection + +Click **Next: Output** + +Repeat the above steps to set up your Content Service Connection. + +As each connection is built they will be listed in separate boxes on the left. Click on the links to open the connections in a separate tab to view or edit the connections. + +The system will use the repository and output integration connections and build an Integration Job + +## Connection Types + +### Authentication + +These are used to authenticate to outside systems and need certain authentication fields like passwords, access tokens or refresh tokens. Authentication is needed for sources such as Google Docs, Office 365, and Salesforce. + +Authentication connections are used by [Integration Connections](#integration-connections) to connect to the source repositories. + +Authentication connectors are reusable. Instead of writing the auth configuration into every repository / output connector, we can set the authentication configuration in one authentication connector and use it with multiple connectors. For more information on specific Authentication connectors, click the link for the software below that you want to connect to. + +#### New Authentication Connection + +1. Click on **Authentication Connectors** to create an authentication connector. +2. At the bottom of the Authentication Connections page click **CREATE A NEW AUTH CONNECTION** ". +3. The Connection Type drop-down is searchable. Repeat this step for other systems. + +#### Configuration Fields + +**Name**: Unique Name for the Auth Connection to identify it in the UI. + +**Connection Type**: The Connection Type refers to the type of the connection (i.e. Box OAuth Connector, CMIS Auth Connector, SharePoint Auth Connector, etc.) + +### Discovery + +Discovers schemas on the remote system. These are tables, columns, object types, aspects, categories, content types, index fields, etc... Basically the types and metadata associated for any given system. Federation Servicestion Services unifies all of this into a Schema for easier mapping. Discovery makes mapping to and from your sources easier for data migration and ensures the data gets connected to the right fields. + +Discovery connectors are responsible for discovering the schema, or the metadata about the repository. This will include content types and their associated properties. + +A discovery schema can then be used to aid in creating Job Mappings or to simply find out what's in the repository. Running a discovery instance will create a new version of the schema. Whatever version you select will be used when creating mappings. + +#### Schema Instances + +Viewing the schema instances will show you a table of all available Discovery Instances, this table can be sorted by Name, Type, and Available Versions. + +Here you can view the most recently created schema instances as well as created new ones. + +* Name: Unique Name for the Discovery Connection to identify it in the UI. +* Type: The Discovery Type refers to the type of the repository (i.e. CMIS, SharePoint, Documentum etc.). +* Version: Each Discovery Schema can have multiple versions. Selecting this version will set which is used in Job Mappings as well as which schema will be shown when examining a schema. + +#### New Discovery Connection Instance + +To create a new Discovery Connection, click the **Create New Discovery** Instance button at the bottom of the Schema Instances Page. Fill in the following fields. + +* **Name**: Unique Name for the Discovery Connection to identify it in the UI. +* **Discovery Type**: The Discovery Type refers to the type of the repository +* **Authentication Connection**: A predefined connection for authentication. +* **Ignore Types**: Comma delimited list of types to ignore. +* **Additional Fields**: Some connections require additional information to search for types. Click on a link in the table below for more details on setting up the Discovery Connection for a particular software. + +#### Discovery Schema View + +Once Discovery finishes running Federation Services will store the information. Discovery only needs to be run once, unless the schema of the source repository is changed. + +To view the report, click the document icon to the left of the instance. You can click into each attribute section by category. + +### Integration Connections + +These connections retrieve data from the source system. Their job is to query or crawl remote systems for files, folders, metadata, versions, and renditions. They also add source-specific configuration to job in the form of Specification Tabs. Integrate your Alfresco or FileNet servers for example for better document management. + +As a general rule, Connectors do not delete documents. It only copies and writes them. + +Most Integration Connections can act in both repository (read) and output (write) modes. If it can't, it will not appear as an option when creating or editing a job. + +#### Output (Write) Mode + +In Output mode, connectors push content and metadata. Many of them can also build version series' from the source systems. + +##### Versions + +If a connector retrieves versions, they will be queued as a series in the order of oldest to youngest and the writing connection (if it supports versioning) will attempt to write them in that order. Some connectors, such as Box, and SharePoint REST, can be configured to roll back any documents in a version series, should any of the documents in the series fail to upload + +#### Repository (Read) Mode + +In Repository Mode, connectors will generate a query, or use one provided, to retrieve unique ids for documents. It will then use this list to query individual documents to extract metadata, version information, and copy content for processing. + +##### Folders + +If a connector retrieves folders, they will be processed much like a document would be. The writing connection should know what to do with them. + +### Content Service Connections + +These connections provide a full ECM API for interacting with files, folders, metadata, versions, and renditions. This includes functionality like check- in/out, upload new files, modify metadata, upload new versions, create folders, redact documents etc. + +Content Service Connections offer public REST endpoints that allow for integration with external applications. Actions in the Content Services API or the Discovery web application perform actions against specific repositories through these connectors. + +#### Commonly Supported Operations + +> **Note:** The capabilities of each Content Service Connector is limited to operations allowed by the repository. Additionally, not all methods are available for all connectors. View individual connector pages for a list of capabilities. + +* Creating content + +* Retrieving file content + +* Showing content properties + +* Listing folder items +* Listing file versions +* Updating file content and properties +* Deleting files and folder +* Showing repository capabilities +* Retrieving the Root Folder ID +* Managing Permissions + +#### Basic Configuration + +> **Tip:** Connector ids are how Federation Services identifies the individual connector when receiving calls from other sources. This value must be usable as part of url. Use the description field if you need more than a few letters/numbers to describe the connection. The description shows up with its connector ID across the product. + +* Connector ID: A unique identifier for this connection (Alphanumeric, dashes and underscore characters only) +* Description: The text that will be displayed on drop-downs etc. to identify this connection. +* Type: The type of Search Connection (Solr, Mongo, Elastic etc.) +* Keep Connection Alive: Federation Services will cache the connection for a given amount of time before discarding it. +* Keep Alive in Milliseconds: How long to keep the connection alive before discarding it (`300000` is 5 minutes) +* Security Mode: This is how to authenticate with the back-end search. + * Authentication Connection: The most common method is to use the appropriate authentication connection + * User Pass-through Credentials: Users the authenticates with whatever authentication they used for Federation Services. Only supported in rare cases. + * None: Only usable with the Filesystem Content Service Connector + +#### Connection Configuration + +Different connectors might require additional configuration. These values will populate after selecting a Type. + +#### Content Service Mapping + +You can also add mappings or mapping groups to your Content Service Connections which will allow you to map custom parameters to properties in the destination system. + +#### Add Mappings to a Content Service Connector + +1. Create a mapping. + * (Optional) Add your mappings (and other mappings) to a Mapping Group. +2. Click the edit icon for your Content Service connector. +3. In the drop-down under Mapping Type select Single Mapping or Group Mapping +4. In the drop-down under the mapping type you chose, select the Mapping or Mapping Group you want to add to this connection. +5. Save the Content Service connector. + +#### Creating Mappings for Content Services + +Content Service mappings will use the source as the **parameter name** for the content service call. The target field should match a field name in the destination repository. For easier use, you can leverage the schema discovery for your connectors to populate the output field names when mapping. + +#### Creating A Content Service Connection + +Following is an example of how to create a new content service connection. + +**Step 1: New Connection** + +To create a content service connector instance select the Content Service Connections under the Connections header. Click **Create New Content Service Connection** + +You will be brought to the generic Content Connection page. + +**Step 2: Basic Configuration** + +* **Connector ID**: This uniquely identifies this instance of the connector. This must be unique and will be used when you index content and metadata. +* **Description**: Describe your connection. Be descriptive as you may not be the only one using this connection. +* **Type**: Select from a drop-down list of Content Service Connectors installed in your instance of Federation Services. Once you select a connector type you will be presented with further options which will be documented on the connector page for that type. Don't see your connector listed here? Contact your Federation Servicestion Services Administrator or Federation Services Support. +* **Keep Connection Alive**: If checked then we will cache the connection object so the user doesn't have to re-connector for every action they want to perform. If unchecked each API action will result in a login to the third-party system. +* **Keep Alive in Milliseconds**: How long to keep the session in cache. +* **Connection URL**: The URL or Path to connect to. +* **Security Mode**: Authentication Connection: This uses an authentication connector. An example may be a Box OAuth Connector. These can be a little more complex than the first 3 options and provides customizations by allowing you to create your own auth connectors. + +**Step 3: Connection Configuration** + +**Add Configuration Parameter (Button)**: Some connectors allow for optional parameters than can be passed via key/value pairs. Most of the time you'll have a form to fill out, but for more advanced features that are situational adding a key/value pair makes sense as it won't clutter up the user interface. + +### Content Search + +Provide a search interface to the Content Services API. These connections implement the Federation Services search API and query language, both of which mimic Apache Solr. + +Content View Connectors or Content Search Connector allow you to search content and then take action against the results. They are used by Content Views in Federation to populate results and update indexes as needed. + +#### Basic Configuration + +##### Connector ID + +Connector ids are how Federation Services identifies the individual connector when receiving calls from other sources, such as Federation Service. This value must be usable as part of url. Use the description field if you need more than a few letters/numbers to describe the connection. The description shows up with its connectorId across the product. + +* **Connector ID**: A unique identifier for this connection i.e. `simflofy_demo` (alphanumeric, dashes and underscore characters only) +* **Description**: The text that will be displayed on drop-downs etc. to identify this connection. +* **Type**: The type of Search Connection (Solr, Mongo, Elastic etc.) +* **Keep Connection Alive**: Federation Services will cache the connection for a given amount of time before discarding it. +* **Keep Alive in Milliseconds**: How long to keep the connection alive before discarding it (`300000` is 5 minutes) +* **Security Mode**: This is how to authenticate with the back-end search. +* **Authentication Connection**: The most common method is to use the appropriate authentication connection +* **User Pass-through Credentials**: Users the authenticates with whatever authentication they used for Federation Services. Only supported in rare cases. + +#### Result Links + +Result Links are under the **Search Configuration** tab, but work universally. + +If **Download** is selected, the file names in your view will call a document download, much like the Widget + +If **External** is selected, you will need to add **Result Links**. When you click the Result Links button a modal should appear. It takes three arguments: + +* **Content Service Connector**: External link configurations are grouped by content service connector. + * This allows documents from different repositories to form different links +* **Link Field**: The document field that contains relevant information for building the link. +* **Link Url**: The content of the link field will be appended to this url to create the link. + +Due to how certain ids with versions are handled, the value of the link field will be cut off after the first instance of a semicolon(;). + +#### Search Configuration + +Refer to the documentation for each connector to see which fields are available. + +#### Search Security + +* Filter: + +The authenticated user's group ids and login will be added to each search request. Requires content to be indexed using the Index User Group Task (used to index user and group information onto each document; adds two metadata fields to each document in order to restrict or allow access to documents indexed through this task). + +* Restrict: + +Only users from the selected groups will be able to use this search connection, regardless of role. If this connection in used as part of a Content View, users outside these groups will not be able to see it in their View List in Discovery. + +#### Connection Configuration + +Individuals connectors might have specific fields here that were not general enough to be in Search Configuration + +Additionally, this is where you can use the "Add Custom Parameter" button to set any default query values for the connection. + +A query_fq configuration param lets you define facet queries behind the scene. This is done to provide limited views or subsets of data in the search. Essentially you could create any number of views on the same date but each view would display different results. This can also be used in a role base system where you have views setup for specific user roles.Unless the fq is already encoded, you will need to wrap it in the encode() function where it will be URLEncoded UTF-8. + +The syntax is: + +```text +query_fq for the first one +query_fq1 for the second +etc. +``` + +## Connectors + +### Recommended Connectors + +The following connectors are recommended and supported by the latest version of Federation Services. + +| Software Connector | Description | +| [Objective ECM/Nexus](#objective-ecmnexus) | Can be used as an output connector for Manage in Place | +| [Elasticsearch](#elasticsearch) | Can be used as a content search connector for Manage in Place | +| [MongoDB](#mongodb), [MongoDB GridFS](#mongodb-gridfs) | Can be used as a content search connector for Manage in Place | +| [Alfresco](#alfresco) | Can be used as an output connector for Manage in Place | +| [Google Drive and Gmail](#google-drive-and-gmail) | Index files and emails from Google Drive and Gmail | +| [Microsoft Graph](#microsoft-graph) | This includes OneDrive, SharePoint, Outlook, and Teams | +| [File System](#file-system) | Index files straight from your computer or server | +| [Reporting](#reporting) | Used to gather data on other repositories | + +Additional Connectors: + +* [Amazon Glacier](#amazon-glacier) +* [Amazon S3](#amazon-s3) +* [Apache Kafka](#apache-kafka) +* [Apache Solr](#apache-solr) +* [Aprimo](#aprimo) +* [Azure Blob](#azure-blob) +* [Batch Parser](#batch-parser) +* [Bootstrap](#bootstrap) +* [Box Cloud](#box) +* [BFS](#bulk-file-system) +* [Centera](#centera) +* [CMIS](#cmis) +* [CSV](#comma-separated-value-csv) +* [Documentum](#documentum) +* [DocuShare](#docushare) +* [DocuWare](#docuware) +* [Dropbox](#dropbox) +* [Email](#email) +* [Ephesoft](#ephesoft) +* [FTP](#file-transfer-protocol-ftp) +* [IBM CMOD](#ibm-cmod-odwek) +* [IBM Filenet](#ibm-filenet) +* [iManage](#imanage) +* [Infor](#infor) +* [JDBC](#jdbc) +* [Jira Cloud and On Premise](#jira-cloud-and-on-premise) +* [Meridio](#meridio) +* [Mobius](#mobius) +* [Nuxeo](#nuxeo) +* [OpenText](#opentext-content-server) +* [Oracle](#oracle) +* [Salesforce](#salesforce) +* [ServiceNow](#servicenow) +* [Twitter](#twitter) +* [WebDav](#webdav) +* [Zendesk](#zendesk) + +#### Objective ECM/Nexus + +A logical, intuitive UX. Informative dashboards. Powerful business process capabilities. Focus on outcomes as well as information management. + +##### Authentication Connections + +> **Note:** Passthrough authentication currently only works for ECM content service: +Objective Basic Authentication Connector: passthrough username and password +Objective OAuth Connector: only passthrough username + +**Objective Basic Authentication** + +> **Note:** Objective Basic auth connector does not work for ECM Nexus + +* **Connection Name**: Unique Name for the Auth Connection to identify it in the UI. +* **Username**: The username to authenticate with the repository if applicable. +* **Password**: The password to authenticate with the repository if applicable. +* **Server URL**: The URL to your Objective server + +**Objective OAuth Connection** + +> **Note:** Minimum required version of ECM/Nexus is 11.2 for OAuth connections + +* **Name**: Connector Name +* **Server URL**: Server URL, for example `https://myserver.objective.com` +* **User Id**: User Id with permissions to execute API calls +* **Client Id**: Client Id generated when setting up the client application +* **Client Secret**: Client secret generated when setting up the client application + +##### Discovery Connector + +**Discovery Instance Configuration Fields** + +* **Name**: Unique Name for the Discovery Connection to identify it in the UI. +* **Authentication Connection**: Your Objective Authentication Connection +* **Ignore Types**: Comma delimited list of types to ignore. + +##### Integration Connection + +Also known as input an output connections. Their job is to query or crawl remote systems for files, folders, metadata, versions, and renditions. + +* **Connection Name**: This is a unique name given to the connector instance upon creation. +* **Description**: A description of the connector to help identify it better +* **Authentication Connection**: Your Objective Auth Connection + +##### Job Configuration + +**Repository** + +**Comma delimited list of folders to crawl:** For this field use FolderIds + +**Output Specification** + +* **Output Folder Path**: Folder ID to start output. Note that the path from the source will be duplicated in the output and subsequent folders will be created as needed. + +> **Note:** The Objective connector uses the job's Repository Time Zone field for time zone conversion. The output Time Zone field is ignored, since Federation Services always sends ECM a UTC DateTime. + +**Duplication Check Task** + +Given the ECM connector is the source repository, when there are two of the same documents in the source repository with different paths; and if documents are pptx, docx, xlsx files, the ECM seems to change these documents and their MD5 code are different. Therefore, when the job for ECM to ECM has a duplication check task with a field to compare as file content hash, it will create a new version for these types of documents. + +When the duplication check task field to Compare is set as File content hash, and there are two emails with the same content and the same subject, the MD5 codes will still be different for these two emails. Because of this, Federation Services cannot use duplication check task to skip one of them. + +> **Note:** Only new files greater than 100MB are up chunked and uploaded. +Chunked uploads do not take place if the file already exists in the Objective folder specified. +Linked documents and version updates are not currently supported by this feature. + +##### Mapping + +> **Note:** When adding job mapping, the type mapping and aspect mapping should be added first and then add the calculate mapping and field mapping. + +When "Field Mapping" from ECM connector, make sure fields do not have "document." prefix. For example, "document.dateUpdated" must be written as "dateUpdated" Remove the "document." prefix added by schema instance. + +SharePoint Connection: When mapping "Modified by" field of SharePoint, schema instance will add it as "Document.Modified By", but it must be manually changed to "Document.simflofy_last_modified_by". + +##### EMail Integrations + +*For the MS Graph Mail connector and the Exchange Email connectors + +In a job MS Graph Mail connector / Exchange Email connector to ECM with the job type set as Manage in Place, if the user changes the object type to E-Mail Message type through mapping, then when running the job, the external records will generate in ECM with object type as E-Mail Message and the default metadata fields set in the E-Mail Message will not get a value. + +##### Content Service Connection + +**Supported Methods** + +* Create Folder +* Get File Content +* Get Object Properties +* Delete Object By id +* List Folder items + +##### Manage In Place + +For Objective ECM Version 11.3+ + +Manage in Place (MIP) is intended for organisations who have their content spread out across multiple repositories (file shares, M365 sources like SharePoint, Exchange, OneDrive, or other line of business applications) and wish to centrally govern the content while meeting the records compliance needs. It allows users to manage their content's lifecycle through Objective ECM without the need to transfer it from its original location. + +#### Elasticsearch + +Elasticsearch is a search engine based on the Lucene library. It provides a distributed, multi-tenant-capable full-text search engine with an HTTP web interface and schema-free JSON documents. Elasticsearch is developed in Java. + +* **Version Support**: Federation Services currently only supports version 7.15 of Elasticsearch and does not support version 8 +* **AWS Compatibility**: As of September 2021 this connector will not work with AWS instances of ElasticSearch. AWS has its own version, now called OpenSearch, which is incompatible with current Elasticsearch libraries. + +> **Note:** To configure Elasticsearch to handle larger file sizes: +In installed `elasticsearch/config/elasticsearch.yml`, set `http.max_content_length` to a value greater than 100MB. See [here](https://www.elastic.co/guide/en/elasticsearch/reference/7.17/modules-network.html){:target="_blank"} for more options. + +##### Authentication Connection + +* **Name**: Unique connection name +* **Username**: Username for Authentication or blank when no auth needed. +* **Password**: Password for Authentication or blank when no auth needed. +* **Server URL**: Server URL with protocol, host and port `http://127.0.0.1:9200/` +* **Socket Timeout in milliseconds**: How long to wait before requests fail + +##### Integration Connection + +**Integration Connection Configuration** + +* **Connection Name**: This is a unique name given to the connector instance upon creation. +* **Description**: A description of the connector to help identify it better. +* **Authentication Connector**: Your FileNet Auth Connector + +##### Job Configuration + +ID ENCODING +Federation Services uses the source repository id of a document as a default value for the id in ElasticSearch. These can sometimes contain illegal characters, especially if they are file paths, such as from a Filesystem or Amazon S3. As part of the indexing process, the value of this field will be encoded to ensure its validity. Currently, only slashes, spaces and apostrophes are encoded, but this will likely change to full encoding in the future to better support non-standard character sets. +FILE CONTENT +If `Include Binaries` is checked in the Details tab, the connector will convert it to a base64 encoded String and store it in the `binaryData` field + +Note: ElasticSearch does not support writing of multiple versions of a document and will only write the latest one picked up in a migration. All other versions will be ignored instead of being audited and will not be counted as Skipped + +* **ID Attribute**: The field that will be used to set the document id +* **Index Name**: The name of the collection where the indexes will be created. + * If the collection already exists and does not have the required mappings, Federation Services will attempt to update the mappings +* **Batch size**: The number of documents to generate before sending a request. +* **Out Renditions as array to the `renditionData` field**: If there are multiple renditions, they will be stored as a list of base64 encoded strings. +* **Term Vectors**: Term vectors increase the size of an index but are required for highlighting and More Like This searches. + * All text based default Federation Services fields are included by default + * Term vectors can only be applied to text fields. + * Term vectors will be enabled for any custom text field added to mappings + +##### Content Search Connection + +##### Content Search Configuration + +A Content View Connector defines the who, what and how of search. A better term may be "Data Set" because the data you search and find is based on the configuration of the Content View Connection. More info + +**ElasticSearch Specific Parameters** + +* **Default Query**: (3.1.1+) This is field allows you to add a query, which will become a [Wrapper Query](https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-wrapper-query.html){:target="_blank"}, that will be added to all other search parameters made against this connection. For example, if you wish to only ever see content created between specific dates you would use the following: + +```text +{ +"range": { +"simflofy_created": { +"gte": "2018-12-22T10:39:00", +"lte": "2021-12-26T10:39:00" +} +} +} +``` + +Note that the usual `{"query":{}}` wrapper is not present. Including it will cause an error on search. + +* **elastic_q**: This parameter, added by clicking **Add Custom Parameter**, allows you to pass in a JSON formatted query to the elastic search server. When using this query method you must replace double quotes with single quote characters. +Here is an example query: + +`{'bool':{'must':[{'match':{'document_type':'accounting'}},{'match':{'account_type':''}}]}}` +Run your query (with proper double quotes) directly against your elastic index using a rest call to test before adding it to configuration. + +Response Buffer Size: + +Memory (in bytes) used to process responses from ElasticSearch. This memory is allocated per search, so use caution when raising it. Default value is 150MB, minimum is 25MB, maximum is 250MB. + +**Search Configuration** + +Legacy Fields: All other fields in this tab are legacy features used for the Solr Search Connection and will be removed in future releases. + +* **Collection**: The name of the collection to query against. Elasticsearch refers to these and "Indexes", but for our purposes they are collections. +* **Sort Field/Order**: Will contain the values in your field list. Allows you to choose which field to sort on and whether to sort ascending or descending. +* **Facet Fields**: Facet fields are simply occurrence counts for the entered fields. Content type counting is the most common example. Facet fields are required for a number of sidebar widgets. +* **Field List**: The field values to return in a result set. Similar to the **SELECT** Field1, Field2 clause in SQL. +* **Result Link**: Used on the Discovery UI to determine what to do when a user clicks on the link to the document. +* **Facet Limit**: Maximum number of facet values to return. +* **Highlight:Yes** if you want contextual highlighting, **No** otherwise. +* **Highlighted Fields**: Comma delimited list of fields for highlighting (i.e. content). +* **Highlight Field Length**: The maximum number of characters to highlight. +* **External Links**: Setup external links for the search results. The widget is not + +**Search Security** + +Only one of these options may be selected at a time + +* **Filter**: The authenticated user's group id is added to each search request. Used in tandem with the User group index task to only allow specified ids to search indexed content +* **Restrict**: The restricted users or groups cannot use this connector. Views that use it will not be visible to them, and they will not be able to use it through the Search APIs + +##### Indexing Content into Elasticsearch for Federation + +> **Note:** PREREQUISITES AND THE FEDERATION WIZARD +These steps can be performed automatically by using the Federation Wizard, but will still require job configuration. If you use the wizard, skip steps 1 and 2. + +For indexing content you will need: + +* A working Authentication Connection for your source system +* An Integration Connection for your source system +* A Content Service Connection for your source system +* A working Authentication Connection for Elasticsearch +* An Integration Connection for Elasticsearch + +1. Create a job using your two connections +2. In the **Details** tab Set the source repository's content service connection directly below the job name. +3. In the **Details** tab make sure the start and end times are set to a wide enough range to capture all the data you wish to index +4. In the **Tasks** tab, select the Tika Extractor Task. +5. This task will extract the content from a file and set it as a field on the document for indexing +6. In the **Mappings** tab, select "Basic Elasticsearch Mapping" from the Additional Mappings drop-down + If this is not present, simply add the field you set on the task in step 2 as a field mapping. + The default is *content* so the mapping would be `content ----Field Mapping----> content` + **(optional)** Add any additional mappings. The target fields will be created and mapped dynamically as part of the migration +7. In the Output Specification, select your id attribute (or leave it as the default) and pick what collection to index to. +8. **(optional)** If you wish to enable highlighting and your extracted content is not in the "content" field, place the name of your content field from your Tika task in Term Vector field. +9. **(optional)** If you wish to use the More Like This (MLT) to search on custom fields, add them to the Term Vector field. + +**Viewing Indexed Content** + +1. Create a Search Connection for Elasticsearch if you have not already. Use the authentication connection you used for indexing +2. Using the configuration section above, pick the fields you wish to see and get counts for. + You can add the basic Federation Services metadata by clicking **Add All Default Fields** +3. Under the Federation Menu > Content Views, Create A New Content View. + +##### Content Service Connector + +This section covers the specific configuration of the Content Service Connector. + +**Supported Method**: + +* Create File +* Create Folder +* Delete Object By Id +* Get File Content +* Get Id By Path +* Get Object Properties +* Get Types +* List Folder Items +* List Versions +* Update File + +#### MongoDB + +Can be used as a content search connector for Manage in Place. + +MongoDB is a source-available cross-platform document-oriented database program. Classified as a NoSQL database program, MongoDB uses JSON-like documents with optional schemas. + +> **Note:** This page is only meant to cover using MongoDB without [GridFS](#mongodb-gridfs). The common use case for MongoDB without GridFS is to act as an indexing engine, like [Elasticsearch](#elasticsearch) + +##### Authentication Connection + +Authentication Configuration Fields: + +* **Name**: Unique name for this auth connector. +* **Username**: The Username of the user to authenticate with to the Mongo DB Instance. +* **Password**: The password associated with the above username. +* **Mongo URI**: The Full mongodb connection URI to connect to. See this document for additional info on URI construction. +* **Database**: The database to authorise to. +* **Use MongoDB GridFS Services**: Using MongoDB GridFS Services. Leave unchecked for regular MongoDB + +MONGO URI +Federation Services inserts the username and password into the connection string. In order to include them as part of the URI we use `[[USER]]:[[PASS]]` + +##### Discovery Connector + +Discovery Instance Configuration Fields: + +* **Name**: Unique name for your connector +* **Authentication Connection**: Select the auth connector for this discovery +* **Ignore Types (comma delimited list)**: Chose document types to ignore when running discovery +* **Database**: The name of the Mongo database to read data from. +* **Server And Port**: The port used to connect to your Mongo database. + +##### Integration Connection + +Integration Connection Fields: + +* **Connection Name**: This is a unique name given to the connector instance upon creation. +* **Description**: A description of the connector to help identify it better. + +##### Job Configuration + +Output Specification: + +* **Collection**: The name of the collection to create/write to. Federation Services will handle the "files" and "chunks" collections internally +* **Insert Federation Services Metadata**: Required for Federation. Write Federation Services metadata onto objects. Automatically included if GridFS is enabled in auth connection. +* **Use bulk write operations (MongoDB only)**: Federation Services will use bulk write operations for better performance. +* **Number of documents to write per bulk operations**: Number of documents to send per bulk write +* **Include Un-Mapped Properties**: Add all metadata on the document + +Advanced Options: + +* **Drop and Build Indexes**: [Indexes](https://www.mongodb.com/docs/manual/indexes/){:target="_blank"} are created to speed up searches. This will rebuild them entirely. This can be a lengthy process and should only ever be performed on the initial run +* **Index Keys**: A comma delimited list of field keys to index. For multiple collections use key1:collection1,key2:collection2. +* **Upsert Key**: 'Upserting' is simply means "Update if exists". This key will be checked to see if the document already exists. Leave blank to use Federation Services source repository key. If not set and Insert Federation Services Metadata is not checked, then only creates will be called. +* **MongoDB Write Concern**: [Write concern](https://www.mongodb.com/docs/manual/reference/write-concern/){:target="_blank"} describes the level of acknowledgement requested from MongoDB for write operations +* **File Store Connector ID**: Connector ID of Content Service Connector to use as the File Store. Or leave blank to use native GridFS. This field is only used if MongoDB GridFS is Enabled in the Authentication Connector. + +Mango Repository: + +* **Comma delimited list of collections to crawl**: As the name says. +* **Select what field will act as the source id for the document**: The field which will appears as the "source_repository_id" field in the output document +* **Query**: A Mongo [Query](https://www.mongodb.com/docs/v4.2/tutorial/query-documents/){:target="_blank"}. If left blank the query will be "{}", or "get all" + +##### Content Service Connection + +This mode of connector does not interact with content stored in MongoDB. Use the GridFS mode. + +##### Content Search Connection + +**Default Query**: (3.1.1+) This field allows you to add a default mongodb query to all incoming queries. The query in this box will be wrapped in an $and clause with all other search parameters. + +**Get all versions and display versions on file name**: Only used in GridFS Mode + +###### Indexing Document Level Permissions + +Federation Services content views offer a number of security layers. Using the JavaScript processor permissions can be added to each document, which can restrict widget usage and the ability to search for the document. + +**Repository Document ACLS** + +Each document, whether it has source permissions or not, will have an Allow and Deny ACL (Access Control List). Both lists exist as a list of strings (String []) on the document, and can be access through JavaScript. In order to apply document level permissions to documents, permissions will need to take the form + +`action=principal1,principal2,principal3` + +Where action can be `Search`, or the id of a Widget Definition The principals are Federation Services user logins, or User Group names. + +LIMITATIONS +Only the `Search` permission is checked at the API level. Meaning, that a user can still access documents directly through the Content Services API. These permissions simply alter content views to prevent them from performing these actions via Widgets. + +```text +{ +"allow": true, +"action": "Search", +"principals": [ +"everyone" +] +} +``` + +Here is an example of some JavaScript that will prevent users in `group1` from downloading documents through Discovery. It will also stop `user1` from searching for the document. + +```text +var deny = ['DownloadWidget=group1', 'Search=user1']; +rd.setDenyAcl(deny); +``` + +#### MongoDB GridFS + +Can be used as a content search connector for Manage in Place. + +> **Note:** In Federation Services, the GridFS is just a mode of the MongoDB connector. + +GridFS is the MongoDB specification for storing and retrieving large files such as images, audio files, video files, etc. It is kind of a file system to store files but its data is stored within MongoDB collections. GridFS has the capability to store files even greater than its document size limit of 16MB. + +GridFS divides a file into chunks and stores each chunk of data in a separate document, each of maximum size 255k. + +GridFS by default uses two collections, [collection].files and [collection].chunks to store the file's metadata and the chunks. Each chunk is identified by its unique _id ObjectId field. The [collection].files serves as a parent document. The files _id field in the [collection].chunks document links the chunk to its parent. + +[More info on MongoDB GridFS](https://www.mongodb.com/docs/manual/core/gridfs/){:target="_blank"} + +##### GridFS Authentication Connection + +* **Name**: The name of your auth connector. +* **Username**: The username of the MongoDB admin user you want to authenticate as. +* **Password**: The password of the MongoDB admin user you want to authenticate as. +* **Mongo URI**: The URI to your MongoDB. For example:mongodb://localhost:27017 will connect to a Mongo database hosted locally (relative to Federation Services), with the port 27017. +* **Database**: The name of the database that you want to authenticate against. +* **Use MongoDB GridFS Services?**: Required for binary storage. This checkbox enables GridFS services + +MONGO URI +Federation Services inserts the username and password into the connection string. In order to include them as part of the URI we use `[[USER]]:[[PASS]]`. + +##### Integration Connection + +The Federation Services MongoDB Connector allows organisations to read/write from/toa Mongo Database using GridFS. This means that using Federation Services and your MongoDB Instance of choice, you can connect to, retrieve data, and content from these instances. + +##### Job Configuration + +Output Specification: + +* **Collection**: The name of the collection to create/write to. Federation Services will handle the "files" and "chunks" collections internally +* **Insert Federation Services Metadata**: Required for Federation. Write Federation Services metadata onto objects. Automatically included if GridFS is enabled in auth connection. +* **Use bulk write operations (MongoDB only)**: Ignore for GridFS +* **Number of documents to write per bulk operations**: Ignore for GridFS +* **Include Un-Mapped Properties**: Add all metadata on the document to the metadata object in [collections].files + +Advanced Options: + +* **Drop and Build Indexes**: Indexes are created to speed up searches. This will rebuild them entirely. Should always be checked for the first run for Federation, so you can include a text index for full text search. +* **Index Keys**: A comma delimited list of field keys to index. For multiple collections use key1:collection1,key2: collection2. +* **Test Index Keys**: Text index keys for full-text searching (comma delimited). Full text search will fail if this is not defined. For multiple collections use key1:collection1,key2:collection2. +* **Upsert Key**: 'Upserting' is simply means "Update if exists". This key will be checked to see if the document already exists. Leave blank to use Federation Services source repository key. If not set and Insert Federation Services Metadata is not checked, then only creates will be called. +* **MongoDB Write Concern**: Write concern describes the level of acknowledgement requested from MongoDB for write operations +* **File Store Connector ID**: Connector ID of Content Service Connector to use as the File Store. Or leave blank to use native GridFS. This field is only used if MongoDB GridFS is Enabled in the Authentication Connector. + +Repository Configuration: + +* **Comma delimited list of collections to crawl**: Do not append ".files" or ".chunks". +* **Select what field will act as the source id for the document**: The field which will appears as the " source_repository_id" field in the output document +* **Query**: A Mongo [Query](https://www.mongodb.com/docs/v4.2/tutorial/query-documents/){:target="_blank"}. If left blank the query will be "{}", or "get all" + +##### Content Service Connection + +Source repository for GridFS are a compound ID take the form of: + +`[collection]:[mongodbId]:[version]` + +As an example + +`demo:61684139dc5eb835dbf0a0c2:1` + +* **Insert Federation Services Metadata**: Uses Federation Services specific metadata with objects. File Store Connector ID is only used if this is enabled. Check-in and check-out functionality is only used if this is enabled. +* **GridFS Bucket for file uploads**: Name of a single collection +* **File Store Connector ID**: Connector ID of Content Service Connector to use as the File Store. Or leave blank to use native GridFS. This field is only used if MongoDB GridFS is Enabled in the Authentication Connector. +* **File Store Root Folder ID**: If using a File Store, this value is required. This field is only used if MongoDB GridFS is Enabled in the Authentication Connector. + +Supported Methods: + +* Check In * +* Check Out * +* Create File * +* Create Folder (id = bucket name to create) +* Delete Folder (id = bucket name to delete) +* Delete Object By ID +* Get File Content +* Get Version Content +* Get Object Properties +* Get Version Properties +* List Versions +* Update File Content +* Update File Properties +* Get Object ID By Path (**folderPath** will be the bucket in this case) + +##### Content Search Connection + +**Default Query**: (3.1.1+) This field allows you to add a default mongodb query to all incoming queries. The query in this box will be wrapped in an $and clause with all other search parameters. Adding the "metadata" prefix is required for all fields, except the following + +* length +* filename +* chunkSize +* uploadDate +* md5 + +To add a default query which filters out all `.txt` documents: + +```text +{ +"metadata.simflofy_content_type": { +"$not": { +"$eq": "text/plain" +} +} +} +``` + +**Get all versions and display versions on file name**: As the name says, search will now retrieve all versions of documents and label them + +#### Alfresco + +Can be used as an output connector for Manage in Place. + +The Alfresco connector only operates in write mode. For read operations from Alfresco, use the CMIS connector. + +BATCH API REQUIRED +This connector was built to work in tandem with the Federation Servicestion Services Batch API to offer a more performant migration. + +If you're planning to use the Transparent Content Services for Manage In Place, this API is already included in that module. However, it can be installed separately for standard migrations. + +##### Alfresco Authentication + +**Alfresco Webscript Auth Connector** +This connector uses basic authentication to retrieve a ticket from Alfresco. That ticket will be used to perform operations. The authenticating user will need the rights to access the folder you're attempting to write to. + +* **Name**: The name of the authentication connection +* **Username**: Name of the authenticating user +* **Password**: Password of the authenticating user +* **Service URL**: URL to contact Alfresco. Takes the form `(Alfresco)/alfresco/service` + +##### Discovery Connector + +* **Name**: Unique Name for the Discovery Connection to identify it in the UI. +* **Authentication Connection**: The authentication connection you want to search for +* **Ignore Types** (comma delimited list): Comma delimited list of types to ignore. Note that you can have regex as well. So to ignore all types with "workflow" in the name, you will enter(.)workflow(.) into the ignore types text box. +* **Alfresco Ticket Key**: The ticket key is used to generate credentials. + +##### Integration Connection + +**Batching** + +The Alfresco Connector requires batching, meaning it will batch up documents before attempting to upload them. Batch size is set under the **Advanced Options** under the **Details** job tab. When using a connector that requires batching, the value will be automatically set to 50. + +When batching is on, batch ids will be generated based on the job run id, which is the job id plus the timestamp of the current run. The batch number will then be added to that. Batch IDs will be prepended to parent folders of each document in a batch leading to the following: + +`/1612814334091_1624028461422_1/parentFolder/myfile.txt` + +**Configuration** + +* Connection Name: Name the Connector +* Description: Add a description for the connector +* Authentication Connection: Alfresco Auth connector +* Secondary Auth Connection: For Alfresco, the secondary authentication will route the file content to different stores. Available Options are: + * Amazon S3: Requires Alfresco instance with the Amazon S3 Module + * Azure Blob: Requires Alfresco instance with the Azure Blob Connector + * None: Binaries will be output to the filesystem if Include Binaries in the Details tab is checked. + +##### Job Configuration + +* **Alfresco Path**: The output folder path in your alfresco repository. +* **Binary Output Path**: Binary Output Path for Azure or S3. If populated and no Secondary Auth Connection is present, will output to the filesystem. +* **Create Content URL Always**: Only used for Manage In Place (MIP). Federation Services will generate an Alfresco Content Url based on a number of configuration: + +Be aware that these are checked in order + +* If the content service connector is set in the **Details** tab the content url will be `connectorId://documentId` +* If the document has the metadata field **simflofy.contenturl**. It will be checked for validity and used. +* If the secondary auth connection is for Amazon S3 the content url will be `s3v2://documentId` +* If the secondary auth connection is for Azure Blob the content url will be `azb://documentId` +* If none of these are true, the content url will be `store://documentId` + +**Advanced Settings** + +* **Included Un-Mapped properties**: Add all properties from the source to the target metadata. If unchecked, only mapped properties will be added +* **Do not convert metadata keys to lowercase**: Federation Services converts all type and field values to lowercase by default. If this is checked all fields will keep their original case +* **Debug mode**: Each document's metadata will be output as json file to a specified location +* **Debug Path**: Appears when debug mode is active. A path on the filesystem where the debug JSONs will go. +* **Alternative Thread Count**: If using a secondary auth connections, this will control the number of worker threads. Should never be set to 0, or the job will fail +* **Multi-Value Separator**: Multi-value fields will be combined into a list using this separator +* **Replace Existing Content**: If a document already exists at the output location, it will be overwritten +* **Use File Hash**: If checked, the file keys for documents will be an SHA Hash of their parent path + file name + modified date plus the extension '.sim' +* **Process ACLS**: Requires the use of the ACL Mapper or ACL Conversion Task. + * Will transform the product of these tasks into Alfresco's format for processing +* **Inherit ACLS**: If processing ACLs, the parent folder's permissions will be merged into the list of acls. +* **Include Aspects with no Field Mappings**: Mapped aspects will be applied even if none of the aspect's fields are present +* **Aspect Remove Field Mapping**: Takes a JSON string. Remove aspects if the listed fields are not present. The example of the UI: + +`{"myaspect:two":["field1","field2"],"myaspect:one":["field1","field2"]}` +Meaning that if field 1 or field 2 is not present, do not add the aspects. + +* **Date Format**: Date field mappings will be formatted this way. +* **Date Time Format**: Date/Time field mappings will be formatted this way. + +#### Google Drive and Gmail + +Index files and emails from Google Drive and Gmail + +> **Tip:** Google Drive folders usually display the ID in the url while looking at them in the browser. The root folder ("My Drive") does not show its ID, however. In order to retrieve it, you will need to create a Content Service Connection and use it to retrieve the id using the following url in your browser. If the root folder id it set on the content service connection, that folder's information will be returned. If blank, the My Drive folder's information will be returned. +`3sixty-admin/api/repo/{googleConnectorId}/rootfolderid` + +##### Authentication Connection + +There are currently two ways to connect to Google Drive. OAuth and Java Web Token. Both require creating a project and enabling the Google Drive API for that project. + +##### Enabling Google APIS + +Navigate to [Google Cloud Console](https://console.cloud.google.com/){:target="_blank"} and sign in with your organisational Google account. + +Type in the name of your project such as "Federation Services". Then click Create + +**Enabling APIs** + +Go to the following link and click select for your project from the drop-down, then click Continue. + +Next, click on libraries. Then select APIs. + +In the next screen, search for "Google Drive" and click "Google Drive API" from the search results. + +Then, click Enable. + +##### Google Drive OAuth Connector + +Use this method if you wish to authenticate as a specific user to access files and folders. + + 1. Navigate to the [Google Cloud Console](https://console.cloud.google.com/){:target="_blank"}and sign in with your organisational Google account, + 2. Select your project from the list. + 3. Click APIs and Services in the sidebar. + +You will now need to create an OAuth Consent Screen that will display when users attempt to authenticate using the app: + +**Setting up the OAuth Consent Screen** + +1. Click OAuth consent screen in the sidebar +2. Set user type to External +3. Set your app name. It can be whatever you wish unless... + 1. If you intend to use the Google Vision Text Extractor name the application **Federation Services-VisionTextExtractor/1.0** as that will affect the outcome of the vision tasks (Though those will only work if your project has a linked billing account and billing enabled). +4. Set the support email as the one you used to log in +5. At the bottom, fill in the support email address. + 1. The support email will be the email the user is directed to when they're directed to authorise Federation Services to transfer data. +6. Click **Save and Continue** +7. Set up scopes: + +Click **Add Scope** and check + +`.../auth/drive` + +**Creating OAuth Credentials** + +1. Return to the [APIs and Services Dashboard](https://console.cloud.google.com/apis/dashboard){:target="_blank"}. +2. Click **Credentials**. +3. Click **Create Credentials**. +4. Click OAuth Client Id. +5. On the next screen, select **Web Application**. +6. Give the credentials a name. +7. Under **Authorised Redirect URIs**, add the following: + + ```text + http://{SIMFLOFY_SERVER}/3sixty-admin/authconn/oauthcb + ``` + + For example. If you're running Federation Services on a local machine + `http://localhost:8080/3sixty-admin/authconn/oauthcb` + + > **Important:** For Manage In Place, the domain server has to be public server since Google Drive only supports public server or localhost. + + > **Tip:** `127.0.0.1` will not work, but `localhost` will. + +8. Click **Create**. +9. Your new credentials will appear under **OAuth 2.0 Client IDs**. Click the **Download** button on the right and retrieve the Client ID and Client Secret from the downloaded JSON file. + +**Creating your connector in Federation Services** + +1. Go to Connections > Authentication +2. Click **Create New Authentication Connection** +3. Select **Google OAuth Connector** +4. Fill in your client id and secret, then click **Authenticate** +5. You will be taken to the OAuth Consent Screen you set up earlier, click **Allow** +6. You will be returned to Federation Services, click **Save** + +**Completed Checklist** + +Ensure that you have all the following with your Google project: + +* A Google Drive API listed in your dashboard under APIs and Services. +* If using Vision Tasks: A Cloud Vision API listed in your dashboard under APIs and Services. +* A Web Application OAuth 2.0 Client, listed under Credentials of your project: + * This should have an authorised redirect URI with the following format: **{SIMFLOFY_SERVER}/3sixty-admin/authconn/oauthcb**. +* A filled out OAuth consent form page with: + * The ApplicationName **3Sixty-VisionTextExtractor/1.0** if using Vision Tasks. + * A support email to be used on the consent screen. + * The email, profile, openid, `../auth/drive`: + * If using Vision Tasks `../auth/cloud-vision`, `../auth/cloud-platform`. +* In Federation Services, a Google OAuth Connector using the secret key and ID from your credentials you created, and the token fields are now populated. + +https://developers.google.com/identity/protocols/oauth2#expiration + +Our app is in testing status, thus refresh token expires in 7 days and need to re-authenticate again. + +Production status apps will not have refresh token expiry. + +https://stackoverflow.com/questions/71777420/i-want-to-use-google-api-refresh-tokens-forever + +##### Google Drive JWT Connector + +Use this method if you wish to create a service user to interact with the data. + +**Creating The Service Account** + +1. Go to the [APIs and Services Dashboard](https://console.cloud.google.com/apis/dashboard){:target="_blank"}. +2. Click **Credentials**. +3. Click Create Credentials. +4. Select Service Account. +5. You will be asked you to assign roles to the account. Since we need wide-ranging access for now, we should choose Owner. This can be changed later. +6. The final screen invites other users to access this service account through their own service account portals. Use as needed for your organization. +7. Click **DONE**. You will be taken back to the service account list for the project. + + > **Tip:** Make note of the email address of this user. Any folders or Shared Drives you wish to migrate will need to be shared with this user. + +8. Click on the three dots under Actions, then click **Manage Keys**. +9. Click **ADD KEY** then **Create New Key**, then select **JSON**. +10. Click **Create**. You will download a json file to be used in the next step. + +###### Creating your JWT Auth Connector in Federation Services + +1. Go to Connections > Authentication +2. Create a **Google JWT Auth Connector** +3. Paste the content of that json file into the text box. +4. Click **Save**. + +##### Discovery Connector + +* **Authentication Connection**: The Google Drive authentication connection you want to use. +* **Folder ID**: The ID of the folder you wish to crawl. +* **Shared Drive ID**: If this is a shared drive, put the ID here. + +##### Integration Connection + +This is used to store and write content alongside its metadata to Google Drive. + +* **Connection Name**: This is a unique name given to the connector instance upon creation. +* **Description**: A description of the connector to help identify it better. +* **Authentication Connection**: Your Google Drive Auth Connection + +##### Job Configuration + +**Query (Repo)** + +* **Query**: A query written using [Google Drive's query language](https://developers.google.com/drive/api/v3/ref-search-terms){:target="_blank"} + * Not compatible with Folder ID list +* **Crawl Queried Folders**: If a queried object is a folder, crawl it. +* **Folder / File Id's**: A comma delimited list of IDs to retrieve or crawl + * Completely overrides query +* **This is a Shared Drive**: Check if this is a shared drive in a Google Workspace +* **The id of the shared drive**: Required to crawl the drive. Can be found in the URL at the root of the drive +* **Process Folders**: Add folders to the document queue for processing +* **Get Versions**: Will retrieve available revisions. Note that Google Drive does not keep all revisions of a document. Get versions only works for documents created in Google drive. It will not work for documents uploaded to Google Drive. +* **Get Permissions**: Will retrieve permissions for each object, where available. + +**Output Specification** + +* **Output Folder ID**: ID of the target folder, can be retrieved through the Google Drive UI +* **Include Un-Mapped Properties**: If selected, all available properties will be added output file. Otherwise, only mapped properties will be included. +* **This is a Shared Drive**: Check if this is a shared drive in a Google Workspace +* **The id of the shared drive**: Required to crawl the drive. Can be found in the URL at the root of the drive +* **Do not update property values if file already exists**: Since there is only one set of metadata per document (not per revision), this will allow you to skip mappings if the document already exists +* **Process permissions**: Will take the ACL list of the document and attempt to apply these permissions in Google Drive. +* **Notify users via email when they are added to a file**: If a permission is successfully added, an email will be sent to the user. + +Already supported ones from before: google docs, slide, spreadsheet, drawing + +Not exportable: google form, google map + +Added new ones which have export link/format available: + +google jamboard - pdf + +google script - json + +google site - txt + +However, these new ones don't seem to support revisions so we can't get the revisions when getVersion is checked! + +> **Tip:** If a document of the same name exists within a parent folder, the connector will attempt to create a new revision of the document, instead of uploading a new one. These revisions have the `keepRevisionForever` flag set to `true`, meaning Google Drive will not delete them automatically, as it does with most revisions. A document can have a maximum of 200 revisions. + +##### Run and Monitor Jobs + +When you run a job with Google Drive as the source repository: + +These content types will be transferred as is: google docs, slide, spreadsheet, drawing + +These content types will be skipped and not transferred: google form, google map + +These content types will be converted to the corresponding types and will not be supported by getVersions: + +* google jamboard - pdf +* google script - json +* google site - txt + +##### Permissions + +If the permission list is set on a document by the repository connection, Drive will attempt to set these permissions. It expects these permissions in the form `principal=permissions`. The principal must be an email address, and the allowed values for permissions are as follows: + +Available for files: + +* owner +* writer +* commenter +* reader + +To manipulate this list, use a JavaScript task. For more information on the ACL document field and the JavaScript task. + +Here is an example of mapping permissions from Box to Google Drive + +```java +if (rd.getACL() != null) { +var newAcl = []; +for (var i in rd.getACL()) { +var acl = rd.getACL()[i]; +var split = acl.split('='); +var nRole = '' +if (split[0] != 'AutomationUser_AAAAAAAAAA@boxdevedition.com') {//This is the service user for Box, so we'll skip it +if (split[1] === 'editor') { +nRole = 'writer'; +} else if (split[1] === 'owner') { +nRole = 'owner'; +} else if (split[1] === 'previewer') { +nRole = 'reader'; +} else if (split[1] === 'uploader') { +nRole = 'writer'; +} else if (split[1] === 'previewer uploader') { +nRole = 'reader'; +} else if (split[1] === 'viewer uploader') { +nRole = 'reader'; +} else if (split[1] === 'co_owner') { +nRole = 'writer'; +} else { +nRole = 'reader'; +} +newAcl.push(split[0] + '=' + nRole); +} +} +rd.setACL(newAcl); +} +``` + +##### Content Services Connector + +**Connection Configuration** +**Root Folder ID:** The root folder you wish to use for uploads using the connection + +**Supported Methods** + +* Create File +* Create Folder +* Update File +* Update Properties +* Get File Content +* Get File Item +* Get Content +* Get Types +* Get Properties +* Get Root Folder ID +* List Folder Items +* Delete File +* Delete Folder +* Get ACL - User email addresses only +* Edit ACL - User email addresses only +* Delete ACL - Use GET to retrieve permission id for aclId parameter +* Check In +* Check Out +* Create Version +* Delete Version +* Get Version Properties +* Get Version Content +* List Versions +* Revert Version + +##### Interacting with Shared Drives (3.1.2+) + +> **Tip:** These cases assume that you are working with a Google Workspace and the credentials you supply are allowed to view / access Shared Drive information. + +**Get a Shared Drive Id** + +The idbypath endpoint can be used to retrieve the id of a Shared Drive in a Google Workspace. In order to do this the folderPath argument should be the name of the Shared Drive. Additionally, the argument isDrive should be included with the call with a value of true. + +**Shared Drive Permissions** + +Passing a shared drive id to the **Get ACL** method should produce a list of Shared Drive Members with their respective roles. + +**JWT Connector** + +If using a JWT of service account, the service account email needs to be added as a member of Shared drive and be given Manager role. + +#### Microsoft Graph + +This includes OneDrive, SharePoint, Outlook, and Teams + +Microsoft Graph is the API for Microsoft 365. Connect to Office, Windows 10, and Enterprise Mobility + Security to empower creativity and collaboration. Federation Services has 3 Microsoft Graph based connectors which all use the same authentication connection. Their features implementations vary based on systems. For specifics of each implementation, see the following: + +* [MS Graph SharePoint](#microsoft-graph-sharepoint) +* [MS Graph Teams](#microsoft-graph-teams) +* [MS Graph OneDrive](#microsoft-graph-onedrive) +* [MS Graph Mail](#microsoft-email-exchange) + +##### Connector Capability Support + +| Connector | Read | Write | Discovery | Content Services | +| MS Graph SharePoint | Yes | Yes | Yes | Yes | +| MS Graph Teams | Yes | No | No | Yes | +| MS Graph One Drive | Yes | No | No | Yes | +| MS Graph Mail | Yes | No | No | No | + +##### Authentication Connection + +Federation Services Uses the Microsoft Identity Platform to communicate via the Graph API. You will need to register the Federation Services application with Azure active directory: [Quickstart: Register an application with the Microsoft identity platform](https://learn.microsoft.com/en-us/entra/identity-platform/quickstart-register-app){:target="_blank"} + +Set up your application for access: [Auth v2 Service - Authentication and Authorisation Steps](https://learn.microsoft.com/en-us/graph/auth-v2-service?tabs=http#authentication-and-authorization-steps){:target="_blank"} + +And finally grant Application Permissions via the [App registration](https://portal.azure.com/#blade/Microsoft_AAD_RegisteredApps/ApplicationsListBlade){:target="_blank"}. Delegated permissions will not work. + +Once you have set up your App in Azure, you can now configure your Federation Services auth connector for Graph. + +The Tenant, Client ID, and Client Secret, are all provided to you during your App registration from above. + +* **Tenant**: The directory tenant the application plans to operate against, in GUID or domain-name format. +* **Client ID**: The directory tenant the application plans to operate against, in GUID or domain-name format. +* **Client Secret**: The directory tenant the application plans to operate against, in GUID or domain-name format. + +#### Microsoft Graph SharePoint + +##### Authentification Connection + +> **Tip:** Tip: Its recommended that OAuth be used for Migration only. And Client / Secret Auth be used for Content Service + +This connector requires a standard [Microsoft Graph](#microsoft-graph) Authentication Connection. + +The application will require the following permissions: + +* **Repository**: Sites.Read.All +* **Output**" Sites.Manage.All + +##### Discovery Connector + +Discovery Connection Configuration + +* **Tenant Name**: The name of the tenant. All O365 SharePoint instances use the structure [tenant].sharepoint.com. We use this to construct urls and gather siteIds. +* **Sites to Crawl**: The base sites to crawl. Root will crawl your Team site +* **Crawl Subsites**: If the site has any subsites, crawl them as well. For example, if you leave the list above as root, but there is a subsite ([tenant].sharepoint.com/mySite), it will not be crawled unless this box is checked. + +##### Integration Connector + +RUNNING ERRORS +As of the 3.1.1 release, MSGraph connectors cannot rerun errored documents. We are aware of the issue, and it will be addressed in the next release. + +WARNING +The Microsoft Graph APIs throttle connections that make what it considers excessive api calls. They have not shared these metrics, and they are determined dynamically based on previous usage and presumably account type. See [here](https://learn.microsoft.com/en-us/sharepoint/dev/general-development/how-to-avoid-getting-throttled-or-blocked-in-sharepoint-online#why-cant-you-just-tell-me-the-exact-throttling-limits){:target="_blank"} for more details. + +Due to how SharePoint handles metadata, the document and its metadata will be uploaded separately. + +Documents with Metadata: This process is done by batching the document with its metadata, with the metadata write contingent on the success of the upload. In this case a document is complete if both the metadata and document successfully upload. If either fails due to a 429 (throttling) response, the missing piece will be attempted a number of times after waiting. + +Documents without Metadata: If a document has no metadata (no mappings), a non- batch upload will be performed. The same retry logic will take place but only for the file content. + +Recommended Settings to avoid Throttling: Details Tab Advanced Options Max Queue Size = 500 Output Threads = 5 Output Specification Number of retries = 10 + +##### Job Configuration + +Configuration + +* **Site List**: Comma delimited list of tenants sites to crawl for content types. Use 'root' for main site. +* **Library List**: Libraries to Crawl. List names do not require their parent sites (for example, 'Documents' not 'sites/Test/Documents') +* **Crawl Subsites**: If the site has any subsites, crawl them as well. For example, if you leave the list above as root, but there is a subsite ([tenant].sharepoint.com/mySite), it will not be crawled unless this box is checked. +* **Process Folders**: Process folders as well as documents. +* **Get Versions**: Retrieve document versions. + +CASE SENSITIVITY +Site and Library names are case-sensitive. If the case is wrong, the job will complete successfully, but no documents will be picked up. + +**Output Specification** + +* **Tenant Name**: The name of the tenant. All O365 SharePoint instances use the structure [tenant].sharepoint.com. We use this to construct urls and gather site IDs. +* **Output Folder Path**: The folder where the files will be stored. Do not include the library root folder in this path. If left blank, documents will be written to the library root (for example, Documents will write directly to the Shared Documents folder) +* **Output Site**: The tenant (sites/mySite) or subsite (/mySite) where the documents will be written. Defaults to root +* **Output List**: The name of the library within the site. Defaults to Documents +* **Check documents for a value to override destination site**: Each document will have its metadata checked for a new subsite or tenant site. +* **Field to check for site override value**: If checking for site overrides, this field will be checked for the new site path. If present, the document will be uploaded to that site. The default is 'site'. If this value is set and no list override is present, the files will upload to 'Documents' on the new site. +* **Check documents for a value to override destination list**: Each document will have its metadata checked for a new list name. +* **Field to check for list override value**: If checking for list overrides, this field will be checked for the new list name. If present, the document will be uploaded to that list. The default is 'list'. This can be combined with a site override. +* **Retry Attempts**: The number of times to try completing a document upload before failing. +* **Roll Back files**: There are instances where a document may be uploaded but its metadata will exceed the allowed number of upload attempts. If this flag is checked, that document will be deleted (and will be noted in the Removed column in the job status screen). +* **Set Permissions**: Set ACLs for documents when available. Expected format is "(email)=writer" or "(email)=reader" + +##### Content Service Connector + +**Configuration** + +* **Tenant Name**: The name of the tenant. All O365 SharePoint instances use the structure [tenant].sharepoint.com. We use this to construct urls and gather site IDs. +* **Site Name**: The path to the target site as it would appear in the SharePoint url. +* **List Name**: The name of the library, as seen on the sites' sidebar. +* **SiteId**: After configuring the connection the first time this can be populated using the REST APIs. See the Root Folder example below. + +**Examples** + +Document and folder ids will look like this. + +01WNAC6ZYYYWDZOWH2DFH3LRHT7MWF5L2R + +As SharePoint is actually backed by OneDrive, all the ids are actually OneDrive Ids as well. + +**Routing document** + +Following are simple examples of routing documents of different file types to different locations within your tenant. + +These examples assume you are using the default override field names. + +```java +if(rd.getMimeType() === 'application/pdf'){ + rd.addSingleField('site','sites/Simflofy'); + rd.addSingleField('list','Documents'); +} +``` + +```java +if(rd.getMimeType() === 'text/plain'){ + rd.addSingleField('list','Test Lib') +} +``` + +##### Content Service Examples + +Assume the connector ID in these examples will be `graph` + +###### Root Folder + +`GET /3sixty-admin/api/repo/graph/rootfolderid` + +You should receive the following: + +```text +{ +"success": true, +"results": { +"folderPath": "/Shared Documents", +"additionalInfo": { +"siteId": "simflofy.sharepoint.com,bfc93f6e-6eed-4f27-8aa8-72509a410d3b,a357fae5-24f9-464c-8087-cc1594eed1d4" +}, +"folderName": "Shared Documents", +"folderId": "b!bj_Jv-1uJ0-KqHJQmkENO-X6V6P5JExGgIfMFZTu0dSZbZes5ncJT7CQyPGcAqVS" +} +} +``` + +It should be noted that this is not the common form a folder Id will take. MSGraph treats the root folder of each Library as a drive, so this is actually a Drive ID. + +###### Upload a File + +`POST /api/repo/graph/file?folderId=01WNAC6Z4BAYBXXIMILVBLXKCZ6K3VVNHJ&fileName=newfile.txt&type=MetaDocument` + +Note: The file content needs to be set as part of a multi-part form (EDITING NOTE link testing with postman here) + +Note: The folderId can be a path off of the root library. Such as /test. + +```text +{ +"success": true, +"results": { +"id": "01WNAC6Z32P4QVKHLA7ZC2SZH7IYTSDON7" +} +} +``` + +###### Get ID By Path + +`GET api/repo/graph/idbypath?fileName=newfile.txt&folderPath=/tester` + +```text +{ +"success": true, +"results": "01WNAC6Z32P4QVKHLA7ZC2SZH7IYTSDON7" +} +``` + +###### Update File Content + +```text +GET /api/repo/graph/updateContent?fileId=01WNAC6Z32P4QVKHLA7ZC2SZH7IYTSDON7 +``` + +> **Note:** Set the new content as the request body. + +```text +{ +"success": true, +"results": { +"id": "01WNAC6Z32P4QVKHLA7ZC2SZH7IYTSDON7" +} +} +``` + +###### Get File Properties + +`GET /api/repo/graph/properties?id=01WNAC6Z32P4QVKHLA7ZC2SZH7IYTSDON7` + +```text +{ +"success": true, +"results": { +"Modified": { +"queryName": "Modified", +"value": "2021-09-14T17:29:46Z", +"displayName": "Modified" +}, +"LinkFilename": { +"queryName": "LinkFilename", +"value": "newfile.txt", +"displayName": "LinkFilename" +}, +"ContentType": { +"queryName": "ContentType", +"value": "MetaDocument", +"displayName": "ContentType" +}, +... +} +``` + +###### Update Files Properties + +```text +GET /api/repo/graph/updateProperties?fileId=01WNAC6ZYYYWDZOWH2DFH3LRHT7MWF5L2R&3SixtyText=metafield +``` + +> **Note:** Each field will be passed as a separate parameter. + +```text +{ +"success": true, +"results": { +"id": "01WNAC6Z2N7DMHZUXP7FGKZ6HS737U7AGD" +} +} +``` + +###### Folder Items + +```text +GET /api/repo/graph/folderitems?id=01WNAC6Z4BAYBXXIMILVBLXKCZ6K3VVNHJ +``` + +```text +{ +"success": true, +"results": { +"01WNAC6Z64FFID4E5VJBD354DSN7TZLVGY": { +"ParentId": "01WNAC6Z4BAYBXXIMILVBLXKCZ6K3VVNHJ", +"LastModifiedDateTime": "2021-09-10T15:32:14Z", +"ContentType": "text/plain", +"WebUrl": "https://simflofy.sharepoint.com/sites/Dev/Shared%20Documents/tester/FileB.txt", +"eTag": "\"{3E5029DC-B513-4748-BEF0-726FE795D4D8},1\"", +"Id": "01WNAC6Z64FFID4E5VJBD354DSN7TZLVGY", +"CreatedDateTime": "2021-09-10T15:32:14Z", +"Name": "FileB.txt" +}, +"01WNAC6Z2N7DMHZUXP7FGKZ6HS737U7AGD": { +"ParentId": "01WNAC6Z4BAYBXXIMILVBLXKCZ6K3VVNHJ", +"LastModifiedDateTime": "2021-09-13T20:01:27Z", +"ContentType": "text/plain", +"WebUrl": "https://simflofy.sharepoint.com/sites/Dev/Shared%20Documents/tester/newfile.txt", +"eTag": "\"{7CD8F84D-EFD2-4CF9-ACF8-F2FEFF4F80C3},2\"", +"Id": "01WNAC6Z2N7DMHZUXP7FGKZ6HS737U7AGD", +"CreatedDateTime": "2021-09-13T20:01:27Z", +"Name": "newfile.txt" +}, +"01WNAC6Z3BPNL7PIMLUBFK57GX23WAMLK7": { +"ParentId": "01WNAC6Z4BAYBXXIMILVBLXKCZ6K3VVNHJ", +"LastModifiedDateTime": "2021-09-09T19:49:55Z", +"ChildCount": "1", +"WebUrl": "https://simflofy.sharepoint.com/sites/Dev/Shared%20Documents/tester/10k", +"eTag": "\"{F7577B61-8BA1-4AA0-AEFC-D7D6EC062D5F},1\"", +"Id": "01WNAC6Z3BPNL7PIMLUBFK57GX23WAMLK7", +"CreatedDateTime": "2021-09-09T19:49:55Z", +"Name": "10k" +} +} +} +``` + +###### Create Folder + +`POST /api/repo/graph/folder?path=/testfolder` + +```text +{ +"success": true, +"results": { +"id": "01WNAC6Z6RFRXOGYJCYBDIU3TPKQQNDBB6" +} +} +``` + +###### Delete a file or folder + +`DELETE /api/repo/graph/delete?id=01WNAC6Z6RFRXOGYJCYBDIU3TPKQQNDBB6` + +```text +{ +"success": true +} +``` + +###### Get Permissions + +`GET /api/repo/graph/properties?acls=01WNAC6Z32P4QVKHLA7ZC2SZH7IYTSDON7` + +```text +{ +"success": true, +"results": [ +"Dev Owners:owner", +"Dev Visitors:read", +"Dev Members:write", +"Dev:owner" +] +} +``` + +> **Note:** Only available ACLs for SharePoint through MSGraph are read, write, and owner. + +###### Change Permissions + +Requires a JSON as a request body in the following format: + +`{"Dev Members":"read"}` + +`POST /api/repo/graph/properties?acls=01WNAC6Z32P4QVKHLA7ZC2SZH7IYTSDON7` + +```text +{ +"success": true, +"results": [ +"Dev Owners:owner", +"Dev Visitors:read", +"Dev Members:read", +"Dev:owner" +] +} +``` + +###### Delete Permissions + +`DELETE /api/repo/graph/properties?acls=01WNAC6Z32P4QVKHLA7ZC2SZH7IYTSDON7&aclId=Dev Visitors` + +The DELETE endpoint will not return any additional information, but a further call to retrieve the permissions should show the following. + +```text +{ +"success": true, +"results": [ +"Dev Owners:owner", +"Dev Members:read", +"Dev:owner" +] +} +``` + +###### Get Library Types + +Example response and ids are truncated for readability + +`GET /api/repo/graph/types` + +```text +{ +"success": true, +"results": { +.... +"Task": "0x0108", +"Invoice": "0x0101006248104F6C684C46B570A09939521E3A", +"Issue": "0x0103", +"MetaFolder": "0x012000AB92FFACCC027F4289957CAC503C4F63", +"Workflow Task": "0x010801", +"Timecard": "0x0100C30DDA8EDB2E434EA22D793D9EE42058", +"Holiday": "0x01009BE2AB5291BF4C1A986910BD278E4F18", +"MetaDocument": "0x0101009BF5E42EF312544B9224A53A7FF98D60…..", +"Schedule": "0x0102007DBDC1392EAF4EBBBF99E41D8922B264", +... +} +} +``` + +###### Get Type Columns + +`GET /api/repo/graph/typeDef?typeId=MetaDocument` + +or + +`GET /api/repo/graph/typeDef?typeId=0x0101009BF5E42EF312544B9224A53A7FF98D60` + +```text +{ +"success": true, +"results": { +"siteId": "simflofy.sharepoint.com,bfc93f6e-6eed-4f27-8aa8-72509a410d3b,a357fae5-24f9-464c-8087-cc1594eed1d4", +"parentId": "0x0101009BF5E42EF312544B9224A53A7FF98D60", +"properties": [ +{.....}, +{ +"Display Name": "3SixtyDate", +"Min Value": 0, +"Options": [], +"Max Value": 0, +"Description": "", +"Property Type": "DATETIME", +"Value": "", +"Id": "3SixtyDate", +"Is Required": false, +"Is Read Only": false +}, +{ +"Display Name": "3SixtyNumber", +"Min Value": 0, +"Options": [], +"Max Value": 0, +"Description": "", +"Property Type": "LONG", +"Value": "", +"Id": "3SixtyNumber", +"Is Required": false, +"Is Read Only": false +}, +{ +"Display Name": "3SixtyText", +"Min Value": 0, +"Options": [], +"Max Value": 0, +"Description": "", +"Property Type": "TEXT", +"Value": "", +"Id": "3SixtyText", +"Is Required": false, +"Is Read Only": false +} +] +} +} +``` + +#### Microsoft Graph Teams + +> **Important:** Due to the potentially sensitive nature of Teams content, Microsoft has restricted the usage of APIs that can retrieve chat messages. In order to use these APIs, an additional approval process is required. The form is found [here](https://forms.office.com/Pages/ResponsePage.aspx?id=v4j5cvGGr0GRqy180BHbR1ax4zKyZjVBmutzKVo1pVtUQ1VJMlNTNUdJV1FKTzVZSVU4MlMwTTdOTSQlQCN0PWcu){:target="_blank"}. The response will usually take 1 to 2 business days. + +> **Important:** In order to retrieve private chat messages, a payment model is required after a certain number of messages. See [this link](https://learn.microsoft.com/en-us/graph/teams-licenses#evaluation-mode-default-requirements){:target="_blank"}. Federation Services uses the Get messages across all chats for user method. + +> **Note:** Microsoft Teams file storage for a team is actually just a SharePoint site, with each channel being a folder in the `Documents` library. You can view your Teams files in SharePoint by going to `https://[tenant].sharepoint.com/sites/[teamName]`. + +##### Authentication Connection + +This connector requires a standard [Microsoft Graph](#microsoft-graph) Authentication Connection. + +The application will require the following permissions: + +* TeamSettings.Read.Group +* Channel.ReadBasic.All +* User.Read.All +* File.Read.Group +* ChannelMessage.Read.All +* Chat.ReadBasic.All + +##### Discovery Connector + +The Teams connector has some static content types. The Teams Discovery connector does not require authenticating to the service, so you can simply create the schema instance and hit Run. The three types are: + +* **Chat Message**: Represents any message sent privately or in a channel +* **Attachment**: Represents a file associated with chat messages +* **Chat Log**: A chat log generated by Federation Services which contains all messages sent in a channel during a time period. + +##### Integration Connector + +RUNNING ERRORS +As of the 3.1.1 release, MSGraph connectors cannot rerun errored documents. We are aware of the issue, and it will be addressed in the next release. +The Teams connectors has two modes of operation. Public Chats and Private The first mode allows you to export a teams files, but crawling the backing SharePoint site. It also lets you extract messages from the public channels + +The second mode allows you to pull the private chats for a user. + +##### Job Configuration + +* **Team Name**: Required for either mode. The name of the team. +* **What would you like to retrieve?** This will select the mode, and will change available options. + +**Team Chats or Files** + +* **Channels to migrate**: Tag input to list channels to migrate. + +* **Retrieve files associated with the team (will retrieve files for all channels)**: This is essentially identical to migrating the `Documents` library of the team's SharePoint site. These files will appear in their SharePoint folder structure, `sites//Shared Documents/` +* **Get messages from listed channels from between configured times**: Retrieve chat messages in the form of a single text file. The chat log will be in `///ChatLog` +* **Break down each chat message into an individual document**: Instead of a single chat log, each message and its direct replies will become an html document. Attachments will be added to the document as additional binaries, if they are being retrieved. +* **Select a format for chat messages**: If you are breaking down chat messages, this will determine the format. There are two options: +* **Plain Text**: Each message will be a simple text file with no additional formatting. See below for export structure +* **HTML**: Each message and its direct replies will become an html document. Attachments will be added to the document as additional binaries, if they are being retrieved. +* **Only retrieve chats from the listed users. Leave blank to retrieve all messages**: Will filter chat messages based on the sender. Use the same as it would appear in the 'from' line of a message. +* **Retrieve attachments attached to chat logs**: If only retrieving a single chat log the attachments will appear in `///ChatLog/Attachments`. See the export structure below for how they are handled when retrieving individual chats + +##### Plain Text Exposure Structure + +```text +/ +├─ / +│ ├─ .txt +│ ├─ attachments/ +│ │ ├─ attachment.pdf +│ ├─ replies/ +│ │ ├─ / +│ │ │ ├─ attachments/ +│ │ │ │ ├─ replyattachment.pdf +│ │ ├─ .txt +│ │ ├─ .txt +``` + +**Get Private Chat** + +* The display name of user's whose chats to pull: List of user's to pull. Each private chat thread will be output under its own folder. +* Preferred licensing and payment requirement model. The API used to retrieve private messages has limited usage. Usage beyond certain amounts require payment. For testing, stick to the default, but note that you will run out after 500 messages. +* Retrieve attachments attached to chat logs: Will attach documents as additional binaries for each message. + +> **Note:** If you wish to process a message via push event, there are some restrictions. + +* Private Chats are not available. Attempting to execute the push event against private chats will cause an error. +* The output for an event chat will always be in html format. +* If attachments are included, they will be additional binaries on the document. + +##### Content Service Connector + +The Content Service Connector for Teams is an extension of the one for [SharePoint](#microsoft-graph-sharepoint). The configuration simply points the connector at the team you wish to manage. Alternatively you can use the SharePoint connector with a site path of `sites/[teamName]` and a list name of `Documents`. Not that Content services cannot update, create or change chat messages at this time. + +**Configuration** + +* **Tenant Name**: The name of the tenant. All O365 SharePoint instances use the structure [tenant].sharepoint.com. We use this to construct urls and gather site IDs. If you do not know your tenant follow the steps below about retrieving your tenant name. +* **Team Name**: The name of the team you wish to manage with this connector. + +##### Retrieving your tenant name + +If you do not know your tenant name (it's usually your organisations name), you can retrieve it in teams. + +* Go to **Files** +* Click the ellipses `...` next to any file +* Click **Copy Link** +* This will produce a SharePoint url in the format `https://[tenant].sharepoint.com` + +#### Microsoft Graph OneDrive + +Microsoft OneDrive is a file hosting service and synchronisation service operated by Microsoft as part of its web version of Office. +Federation Services supports 3 types of OneDrive: + +1. Personal Drive +2. Business Drive +3. "SharePoint" Drive - (Document library within a SharePoint site) + +##### Authentication Connection + +**Standard Authentication Configuration** + +Use this authentication connector when accessing a "SharePoint" Drive. For more information see [Microsoft Graph](microsoft-graph.htm) Authentication Connection. + +The application will require the following permissions: + +* **Repository**: Sites.Read.All + +**oAuth Authentication Configuration** + +Use this authentication connector when accessing a Personal or Business Drive. +The name of this connector is **Microsoft Graph oAuth Connector** + +**Configuration Fields** + +* **Service URL**: This should be set to : [https://login.microsoftonline.com](https://login.microsoftonline.com/) +* **Scope**: These are the permissions required to access OneDrive files. Multiple permissions are separated by a space. Default scope: user.read files.readwrite.all +* **Tenant**: The directory tenant the application plans to operate against, in GUID or domain-name format. + +> **Note:** When accessing a personal drive replace the GUID with the word "common". + +* **Client ID**: The client id of the application. +* **Client Secret**: The client secret for the application. + +##### Discovery Connector + +Documents retrieved from OneDrive will have the same metadata as those read from [SharePoint](#microsoft-graph-sharepoint). + +##### Integration Connection + +> **Caution:** As of the 3.1.1 release, MSGraph connectors cannot rerun errored documents. We are aware of the issue, and it will be addressed in the next release. + +> **Important:** The Microsoft Graph APIs throttle connections that make what it considers excessive api calls. They have not shared these metrics, and they are determined dynamically based on previous usage and presumably account type. [See this link for more details](https://docs.microsoft.com/en-us/sharepoint/dev/general-development/how-to-avoid-getting-throttled-or-blocked-in-sharepoint-online#why-cant-you-just-tell-me-the-exact-throttling-limits){:target="_blank"} + +##### Job Configuration + +Works with Business and SharePoint OneDrive. Personal drives not supported at this time. + +**Repository Configuration Fields** + +* **Site Names**: A list of sites to crawl. **Only applicable if accessing a SharePoint Drive via a standard authenication connection** +* **Query**: A query to run against each drive. For a Business drive, leave blank to retrieve all items in the drive. For a Personal drive you must enter at least one search term. +* **Process Folders**: Process folders as well as documents. + +> **Note: Empty folders will be processed.** + +* **Get Versions**: Retrieve document versions. +* **Include Permissions**: Include the folder/document permissions. + +##### Content Services Connection + +This section covers the OneDrive specific configuration of the Content Service Connector. + +The only configuration required for this connector is the OneDrive Authentication Connector. + +Works with Personal, Business, and SharePoint OneDrive. + +**Supported Methods** + +* Create File +* Create Folder +* Check In - Does not work for personal drives. +* Check Out / Cancel Check Out - Does not work for personal drives. +* Delete Folder +* Delete Object By Id +* Get ACLs +* Set ACLs +* Delete ACLs +* Get Root Folder +* Get File Content +* Get Object Id By Path +* Get Object Properties +* List Versions +* List Folder Items +* Update File +* Update Properties + +#### Microsoft Email Exchange + +The Federation Servicestion Services Exchange Connector allows organisations to read from and move email records from Microsoft Exchange for archiving, integration, indexing etc. Emails may be obtained by crawling Active Directory based on search values (i.e. a* for all users that start with the letter a) and then subsequently crawl Exchange for each email returned by Active Directory. Users may also enter emails in manually to be crawled. + +Emails are queried using the date range given by the Federation Services Job allowing only new emails to be processed. Jobs can be run every x minutes/hours or days. Using Federation Services tasks, emails can be included or excluded based on certain metadata fields. Calculated fields may also be used to clean and normalise email metadata fields. + +##### Authentication Connection + +**Authentication Connection Configuration** + +**Connection** + +* **Exchange Master Email**: Email address of a user that has access to the email addresses that need to be crawled. +* **Exchange Master Password**: The password of the Exchange Master Email address. (Note: password is encrypted and never displayed in the input form after the Save button is pressed) +* **Exchange Master Domain**: Domain of the Exchange server to authenticate with if different from the email address. This is usually left blank. +* **Exchange URL**: URL of Exchange Web Services to query and retrieve emails from. This can be left blank to auto-detect the best server to use. +* **Exchange Version**: Version of the Exchange Server. For Office 365 use the default value + +**LDAP Configuration** + +Only fill this is if your Exchange server uses LDAP Authentication + +* **LDAP Username**: Username to authenticate with and query LDAP. +* **LDAP Password**: Password for the LDAP Username. (Note: password is encrypted and never displayed in the input form after the Save button is pressed) +* **LDAP Domain**: Domain of the LDAP server. +* **LDAP Base Filter**: The base filter to search for your ldap user. Defaults to `(&(&(objectCategory=Person)(objectClass=User)))`. + +#### Discovery Connector + +Normally Federation Services Discovery is used to discover the metadata models of the underlying repository. In the case of Microsoft Exchange, the Exchange Web Services (EWS) API provides us with the models as things such as Email Message and Calendar Event are static models depending on which version of the EWS you are using. + +It is still necessary to run Discovery in order to do Job mappings. You would only need to run Exchange Discovery Once and then use that Discovery for any Exchange Jobs. Using the Exchange Discovery, you can map Email Message fields to the output fields. + +**Discovery Instance Configuration Fields** + +* **Name**: Unique name for your connector +* **Authentication Connection**: Select the auth connector for this discovery +* **Ignore Types (comma delimited list)**: Chose document types to ignore when running discovery + +##### Integration Connection + +The Exchange Integration Connector only support repository mode + +**Integration Connection Configuration** + +* **Connection Name**: This is a unique name given to the connector instance upon creation. +* **Description**: A description of the connector to help identify it better. +* **Authentication Connection**: The Exchange Authentication connection + +##### Job Configuration + +Job specification includes Job run setting like number of worker threads and batch size, as well as how to query LDAP for email addresses. Job Specification settings are used so different Jobs can use the same Repository Connection Configuration but query and processes emails differently. Click here for details on how to set up an integration job. + +**Output Configuration Fields** + +* **Batch Size**: How many emails returned by Exchange per request (page size). Default is 50. Depending on network speed, average size of the email body etc. (Note: Exchange allows a max page size of 1000. Anything over 1000 and Exchange will lower 1000). +* **Folder to Start Crawl**: The starting folder of the Crawl. This is typically set to Inbox, however if you want to crawl the entire email account you can set to Root. +* **Cleanse Path**: Check this box to cleanse the email file path. It replaces anything that isn't alphanumeric with an underscore and coverts all letters to lowercase. +* **LDAP Search By**: You can search by LDAP User name or LDAP Email Address. +* **LDAP Search Value**: Value to search on, allows wild card . Example would be if you wanted all Users that start with the letter a then you would enter a +* **LDAP Search Base**: Domain location to query for users (i.e. DC=3Sixty,DC=com) for 3Sixty.com domain. If left blank, the LDAP Domain from the configuration will be used to generate the search base. +* **Email Address List**: Comma delimited list of email addresses to process. If there is a value in this field, it will override the LDAP search and just process the emails in the text box. This is commonly used for testing or if a small set of email addresses need to be processed. +* **Microsoft EWS API max calls**: The maximum amount of API calls to EWS before failing the document being written. Defaults to 5 with a minimum input value of 0. + +> **Info:** If the job, or PII scan, often throws errors, it is recommended to increase the API max calls value to let the job/PII scan run longer. + +##### Content Service Connection + +The source repository ids for exchange are a compound id in the form: + +`sourceEmail_SID_exchangeUniqueId` + +**Supported Methods** + +* Delete Folder +* Delete Object By Id +* Get File Content +* Get Object Properties +* List Folder items + +#### File System + +File system connectors give you access to the files on your local workstation or a mounted drive. It requires not authentication connection, but the user running Federation Services must have access to the files you wish to read. + +There is no Authentication connection needed for File System connections. + +##### Discovery Connector + +* Name: Unique Name for the Discovery Connection to identify it in the UI. +* Ignore Types: (Optional) A comma delimited list of types to ignore. +* Properties File Path: location of your properties file + +The properties take the format: + +`type.field=FieldType` + +Here are some examples: + +```text +document.name=TEXT +document.description=TEXTAREA +document.createddate=DATETIME +folder.name=TEXT +folder.isversion=CHECKBOX +``` + +SPACES +If a type has a space in it, replace it with the value `\u0020`. As an example: +`Historical\u0020Documents.field=CHECKBOX` + +Here is a list of available field types: + +`CHECKBOX,DATETIME,TEXT,TEXTAREA,INTEGER,LONG,DECIMAL,DOUBLE,URI,READONLY,BINARY` + +##### Integration Connection + +For retrieving content and its associated metadata from the specified filesystem directory. Also designed to write content, and it's associated metadata into a specified filesystem location.The Filesystem Integration Connection gives you easy access that allows you to crawl and output files and folder to a local file system or a mounted network drive (NAS, SAN). + +**Integration Connection Fields** + +* **Connection Name**: This is a unique name given to the connector instance upon creation. +* **Description**: A description of the connection + +##### Job Configuration + +**Paths (Repo)** + +Click the green plus sign below the paths to add more than one File Path. + +Click the red minus sign next to a file path to remove it. + +Manage In Place does not support multiple paths for the Filesystem Connector. + +* **File Path**: The path of a folder to crawl. +* **Convert to URI**: For Windows filesystems, converts backslashes to forward slashes and removes drive identifiers +* **Process Folders**: Folders will be processed as well as files +* **Include Hidden Files**: Hidden files will be processed +* **Include Empty Folders**: Requires **Process Folders** to be checked. Empty folders will be processed + +**Output Path** + +* **Output Folder Path**: Where to output the processed files and folders + +##### Content Service Connection + +The methods currently supported for this connector are: + +* Delete Folder +* List Folder items +* Create a File +* Get Object Properties +* Create a Folder +* Get File Content +* Get ID by Path +* Update File +* Delete Object By Id +* Get Types +* Get File Item + +**Connection Configuration** + +* **Root Path**: The location of your folders and files that you want Federation Services to access. Will be prepended to the id on all calls to the connection +* Note: For a content service connection make sure the Root folder in the content service connection is the same as the root folder in the job properties. + +IDS +Filesystem content services uses the files or folder's path as an ID. The connection will attempt to prepend the configured root folder on all calls. + +#### Reporting + +Used to gather data on other repositories + +There may be a need to identify duplicate documents in your enterprise and Federation Servicestion Services allows you to identify these duplicate documents in a variety of ways. + +One way to identify duplicate documents is by using the Duplication Check Job Task which allows you to log, skip or fail documents that are duplicates. This works well for large scale integrations when combining a number of legacy source systems into one new enterprise content management system. + +Another way to identify duplicate documents would be by leveraging Federation Services's Reporting Output Connector. Using the reporting output connector you can read content in from any source system Federation Servicestion Services supports and report on the content that is found. One of these reports is a hash of each document seen. Using this hash plus MongoDB's aggregation framework we can generate a CSV or JSON reports of all duplicate records. You can obtain the hash of a document by including the Hash Generator Job Task in your Job Tasks. + +After crawling your source system and outputting to the Federation Services Reporting Connector you can now run the following commands against MongoDB. Start my typing mongo in your terminal: + +Depending on how many documents you found during the crawl > 100,000, you may need to add docHash index. + +`db.tsRecordProcessed.createIndex( { docHash: 1 } )` + +Next we group by docHash and output to a new collection named duplicates (You can name the new output collection to anything you like). + +```text +db.tsRecordProcessed.aggregate([{$group:{_id:"$docHash",docs:{$push:"$doc_id"},doc_names:{$push:"$doc_name"}}},{$project:{docs:1,doc_names:1,numDocs:{$size:"$docs"}}},{$match:{numDocs:{$gt:1}}},{$out:"duplicates"}]) +``` + +You can now export de-dupes collection to CSV or JSON using mongoexport + +```text +mongoexport --db simflofy --collection duplicates --fields _id,docs,doc_names +--username user --password "pass" --type=csv --out duplicates.csv +``` + +### Additional Connectors + +#### Amazon Glacier + +Amazon Glacier is an online file storage web service that provides storage for data archiving and backup. + +[More info on Amazon Glacier](https://aws.amazon.com/pm/s3-glacier/){:target="_blank"} + +##### Authentication Connection + +**Configuration** + +* **Name**: Unique name for this auth connector. +* **Client ID**: The Access Key to connect to the client. For more information about AWS Access Keys, please visit this [link](https://docs.aws.amazon.com/AmazonS3/latest/dev/RESTAuthentication.html#RESTAuthenticationExamples){:target="_blank"}. +* **Client Secret**: The Secret key associated with the above Access Key. +* **S3 Region**: The AWS Region where your instance is located, It will be in the AWS console. default is us-east-1 +* **Glacier End Point**: Glacier end point where the vault exists. For example, `https://glacier.us-east-1.amazonaws.com` + +**Proxy Fields** + +* **Proxy User**: The proxy user to use. (Optional) +* **Proxy Password**: The password for the proxy user. (leave blank if no proxy) +* **Proxy Protocol**: The HTTP(S) Protocol to use to connect to the proxy. +* **Full Proxy Url**: The Proxy Host (leave blank if no proxy). +* **Proxy Port**: The port to connect to on the proxy. (Optional) +* **Proxy Domain**: The Domain for the proxy. +* **Proxy Workstation**: The workstation to use. + +##### Integration Connection + +**Configuration** + +* **Description**: Description for this connection +* **Authentication Connection**: Your Amazon Glacier Auth connector + +##### Job Configuration + +If you are using Amazon Glacier as an Output Connection you will need to fill out the following fields when setting up the integration job. + +**Output Specifications** + +* **Output Folder Path** : Path where archive zip file is created before sending to Glacier. +* **Glacier End Point** : Glacier end point where the vault exists. For example, `https://glacier.us-east-1.amazonaws.com`. +* **Glacier Vault** : Name of the vault to store archive files. + +##### Content Service Connection + +This section covers the Glacier specific configuration of the Content Service Connector. For a description of how to set up a content services connector generically see Content Service Connectors. + +**Configuration** + +This section covers the Glacier specific configuration of the Content Service Connector. + +* **End Point**: Glacier end point where the vault exists. For example, `https://glacier.us-east-1.amazonaws.com`. +* **Vault Name**: Name of the vault to store archive files. + +**Supported Methods** + +* **Create File** : use vault name as the `folderId` parameter. If `folderId` is left blank, will use vault name in the configuration. Returns archive ID. +* **Get File Content** : use the archive ID as the `fileId` parameter. Optional `fileName` parameter can be used to name the downloaded archive. + +Get File Content waits until the archive is available from Amazon. This could take up to many hours depending on the archive policy. + +#### Amazon S3 + +Amazon S3 or Amazon Simple Storage Service is a service offered by Amazon Web Services that provides object storage through a web service interface. Amazon S3 uses the same scalable storage infrastructure that Amazon.com uses to run its global e-commerce network. + +[More Info on Amazon Web Service](https://aws.amazon.com/s3/){:target="_blank"} + +##### Authentication Connection + +Authentication connectors are used to authenticate repository/output connections that need certain authentication fields like access tokens or refresh tokens. + +**Configuration** + +* **Name**: Unique name for this auth connector. +* **Client ID**: The Access Key to connect to the client. For more information about AWS Access Keys, [please visit this link](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_access-keys.html){:target="_blank"}. +* **Client Secret**: The Secret key associated with the above Access Key. +* **S3 Region**: The AWS Region where your instance is located, It will be in the AWS console. default is us-east-1 +* **End Point**: If using Amazon Glacier, set your instances' url here. It will override the region. +* **Connection Timeout**: Set the connection timeout. Higher values may be needed when moving large files. + +> **Tip:** INSTALLED AWS CREDENTIALS +If you leave the Client ID and Client Secret empty, Federation Services will attempt to authenticate with your installed AWS credentials. + +**Proxy Information** + +This tab is for if you're connecting through a proxy, and is optional. + +* **Proxy User**: The proxy user to use. (Optional) +* **Proxy Password**: The password for the proxy user. (Leave blank if there's no proxy) +* **Proxy Protocol**: The HTTP(S) Protocol to use to connect to the proxy. +* **Full Proxy Url**: The Proxy Host. (Leave blank if there's no proxy) +* **Proxy Port**: The port to connect to on the proxy. (Optional) +* **Proxy Domain**: The Domain for the proxy. +* **Proxy Workstation**: The workstation to use. + +##### Integration Connection + +Most Integration Connections can act in both repository (read) and output (write) modes. If it can't, it will not appear as an option when creating or editing a job. This connection can only be used as a repository connection. + +**Configuration** + +* **Description**: Description for this connection +* **Authentication Connection**: Your Amazon Auth connector + +##### Job Configuration + +**Folders (Repo)** + +Specification Tab: S3 Folders (Repo) + +* **List of S3 Keys**: A comma delimited keys of s3 keys (folders) to crawl. +* **Bucket Name**: The bucket where the keys are located +* **Retrieve File Tags**: File tags will be added as metadata with prefix "tag." + +**Basic Configuration (Output)** + +**Specification Tab: S3 Basic Configuration (Output)** + +> **Tip:** There are no actual folders in S3. All files in S3 have a "key", which includes their entire path. The folder path and bucket properties simply prepend these values to each files' keys + +* **Output Folder Path**: Output folder key. Will be prepended to all document parent paths to make keys. +* **Bucket Name**: The bucket name that will be prepended to all keys. +* **Includes Unmapped Properties**: Will apply all metadata on the document without mapping +* **Use GZip**: Sets whether gzip decompression should be used when receiving HTTP responses. +* **Do not generate XML when Outputting to S3**: Like the BFS Connector, the S3 Connector outputs metadata as separate files in the form of `[filename].metadata.properties.xml`. Check this box if you wish for it to only output files. +* **Use Transfer Manager**: If migrating larger files, the S3 APIs offer a transfer manager to ensure more stable uploads +* **Stage Binary to Filesystem**: To avoid issues with disconnects from the source, this will temporarily store file content in the Tomcat temp folder before uploading it. +* **Date/DateTime Format**: How to format the mapped fields of this type before upload. + +> **Important:** If **migrating large** files to S3 it is recommended that you check **Use Transfer Manager AND Stage Binary to Filesystem**. If you use the Transfer Manager without staging the file, all file uploads will be single threaded by the Transfer Manager. + +**Advanced Configuration (Output)** + +**Specification Tab: S3 Advanced Configuration (Output)** + +* **Max Connections**: The maximum number of connections the client can open. Adjusting this can cause changes in performance +* **Multi-value Separator**: Some documents have fields that contain multiple values.S3 does not support this, and will use this separator to form a list of these values as a string before upload. +* **Encrypt Object Server Side**: Will encrypt uploaded files using AES 256 Encryption +* **Disable Chunked Encoding**: Will remove the **transfer-encoding:chunked** header from all requests +* **Set Path Style Access**: Refer to [Amazon's page](https://docs.aws.amazon.com/AmazonS3/latest/userguide/VirtualHosting.html#path-style-access){:target="_blank"} for more information on this option +* **Object Metadata Fields**: A Comma delimited list of fields to add to the S3 Object as User Metadata. + +##### Content Service Connection + +This section covers the S3 specific configuration of the Content Service Connector. + +**Configuration** + +This section covers the S3 specific configuration of the Content Service Connector. + +> **Tip:** S3 file ids always take the form of `/bucket/(key)`. + +* **Bucket Name**: The target bucket for creating a file. +* **Output Folder Path**: The key of the folder to target when creating a file. +* **ACL Name**: [Canned ACL](https://docs.aws.amazon.com/AmazonS3/latest/userguide/acl-overview.html#canned-acl){:target="_blank"} to add to all new content uploaded via this connection. +* **Content Disposition**: Default [Disposition](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Disposition){:target="_blank"} of any content added via this connection. Will be added to objects metadata + +**Supported Method** + +* Create File - takes full `/bucket/key` as `folderId` parameter to bucket and folder configuration +* Delete Object by ID +* Get File Content +* Get Object Properties +* Update File +* Update Properties +* List Folder Items (3.1.1+) +* Get ACLs +* Set ACLs - Special(see below) +* Delete ACL + +> **Tip:** S3 ACCESS CONTROL +See this page for information on grantees and permissions. + +##### ACL Examples (3.1.1+) + +###### Get Permissions + +`GET /api/repo/s3/acls?id=/test-bucket/archive/testdoc.txt` + +```text +{ +"success": true, +"results": [ +"7cfbdbb50b0682227896f2b416777d4d74906ded4df472db3ace75768962c134:(adminuser):FULL_CONTROL" +] +} +``` + +###### Set Permissions + +`POST /api/repo/s3/acls?id=/test-bucket/archive/testdoc.txt` + +To add a user to a document, you can use their canonical id or email + +Requires a JSON as a request body in the following format: + +`{"7cfb11150b0682227896f2b416777d4d74906ded4df472db3ace75769062c134":"READ"}` + +or + +`{"testuser@gmail.com":"READ"}` + +which will result in + +```text +{ +"success": true, +"results": [ +"7cfbdbb50b0682227896f2b416777d4d74906ded4df472db3ace75768962c134:(adminuser):FULL_CONTROL", +"7cfb11150b0682227896f2b416777d4d74906ded4df472db3ace75769062c134:(testuser):READ" +] +} +``` + +To add a group, you'll need the group's URI, such as: + +`{"http://acs.amazonaws.com/groups/s3/LogDelivery":"WRITE"}` + +resulting in + +```text +{ +"success": true, +"results": [ +"7cfbdbb50b0682227896f2b416777d4d74906ded4df472db3ace75768962c134:(adminuser):FULL_CONTROL", +"http://acs.amazonaws.com/groups/s3/LogDelivery:(Group):WRITE" +] +} +``` + +###### Delete Permissions + +`DELETE /api/repo/s3/acls?id=/test-bucket/archive/testdoc.txt&aclId=7cfb11150b0682227896f2b416777d4d74906ded4df472db3ace75769062c134` + +The aclId parameter can either be the Canonical ID of a user, or the url of the group. + +The return will simply be the aclId, but a follow up GET call will produce + +```text +{ +"success": true, +"results": [ +"7cfbdbb50b0682227896f2b416777d4d74906ded4df472db3ace75768962c134:(adminuser):FULL_CONTROL" +] +} +``` + +The items before the semicolon is called the canonical ID of the user. It can be used to remove or update permissions for the user. + +Groups use a url instead of a Canonical ID. Such as `http://acs.amazonaws.com/groups/global/AllUsers`. They will appear as `:(Group):` + +#### Apache Kafka + +Apache Kafka is an open-source stream-processing software platform developed by the Apache Software Foundation, written in Scala and Java. + +The project aims to provide a unified, high-throughput, low-latency platform for handling real- time data feeds. + +[More info on Apache Kafka](https://kafka.apache.org/){:target="_blank"} + +##### Authentication Connection + +The Apache Kafka Authentication Connector allows you to read from an Apache Kafka Topic as a consumer or post to a topic as a producer. + +**Apache Kafka Authentication Connection Fields** + +* **Name**: Unique name for the connection +* **Bootstrap Servers**: Comma Delimited list of servers (in `host:port` format) to consume from/publish to. Required. +* **Topic Name**: Topic name to publish to or read from. Required. +* **SASL Protocol**: The security.protocol config option to set. Will not do anything if SASL Mechanism and SASL JAAS Config Fields are empty. Optional. +* **SASL Mechanism**: The sasl.mechanism config option to set. Will not do anything if Security Protocol and SASL JAAS Config Fields are empty. Optional. +* **SASL JAAS Config**: The sasl.jaas.config config option to set. Will not do anything if Security Protocol and SASL Mechanism Fields are empty. Optional. + +##### Integration Connection + +Most Integration Connections can act in both repository (read) and output (write) modes. If it can't, it will not appear as an option when creating or editing a job. + +**Integration Connection Fields** + +* Connection Name +* Description +* Connector Type +* Connector Class +* Authentication Connection (Required) +* Secondary Auth Connection + +##### Job Configuration + +A Federation Services Job is the process of moving or syncing content (including versions, ACLs, metadata) from one CMS (content management system) to another. + +**Repository Configuration**: No additional job configurations needed to set up Kafka as a repository source +**Output Configuration**: No additional job configurations needed to set up Kafka as an output source + +#### Apache Solr + +Solr is an open-source enterprise-search platform, written in Java, from the Apache Lucene project. Its major features include full-text search, hit highlighting, faceted search, real-time indexing, dynamic clustering, database integration, NoSQL features and rich document handling. + +> **Important:** While Federation Servicestion Services still supports Solr for some basic federation cases it will not receive any further enhancements beyond its current state. + +[More info on Apache Solr](https://solr.apache.org/){:target="_blank"} + +##### Authentication Connection + +Authentication connectors are used to authenticate repository/output connections that need certain authentication fields like access tokens or refresh tokens. Click here for more information on setting up an Authentication Connection. + +> **Important:** Federation Services has no way of creating a Solr core or generating a Solr schema. The configured Solr core must already exist. For the simplest case, go to your Silurian directory and execute the command `solr -c create _core-name_`. Any attempts to authenticate without a valid core will fail. + +**Configuration** + +* **Name:** The name of the connection. +* **Host:** The location of the Solr server. Can support multiple urls, comma delimited, if using Solr Cloud. +* **Solr Core Name:** The name of the Solr core (collection) to authenticate to. +* **Username:** (Optional) The username, if security is enabled. +* **Password:** (Optional) The password, if security is enabled. +* **Use SolrCloud:** A special high-availability set up for clustered Solr servers. +* **Use ZooKeeper:** Another Apache product used for clustering servers. + +##### Integration Connection + +The Solr Integration Connection is designed to index content into a Solr core + +**Configuration** + +* **Connection Name**: This is a unique name given to the connector instance upon creation. +* **Description**: A description of the connector to help identify it better. + +##### Job Configuration + +A Federation Servicestion Services Job is the process of moving or syncing content (including versions, ACLs, metadata) from one CMS (content management system) to another. + +**Solr Output Specifications** + +* **Solr Core Name:** The name of the Solr core to write to. +* **ID Attribute:** The attribute to be used for the id field +* **Autocommit:** Federation Services will not send a commit command and will let the server decide when to commit new documents. Committing can affect server performance +* **Enable Wait Flush:** Part of a manual commit call. From Solr’s' documentation: Block until index changes are flushed to disk +* **Enable Wait Searcher:** Part of a manual commit call. From Solr’s' documentation: Block until a new searcher is opened and registered as the main query searcher, making the changes visible +* **Enable Soft Commit:** Part of a manual commit call. From Solr’s' documentation: Makes index changes visible while neither fsync-ing index files nor writing a new index descriptor +* **Commit Frequency:** If not auto-committing, how many documents to send before making a commit call. Default (-1) will be set to 100. +* **Solr Cloud Queue Size:** If using Solr Cloud, the size of the queue. +* **Term Vector Field:** Required for More Like This searches. + +**Repository Specifications** + +Solr Cannot be set up as a repository source. + +##### Mappings + +Federation Services uses Solr’s "schemaless" mode, which update a core's schema automatically based on the first occurrence of a field. We use suffixes to tell Solr what type of field should be mapped. Use the table below as a guide. + +If you wish to not append suffixes to your field names, you will need to update the core's schema.xml file inside the Solr application. + +Suffix (Single) | Suffix (multi) | Type | Description +---|---|---|--- +_t | _txt | text_general | Indexed for full-text search so individual words or phrases may be matched. | +_s | _ss | string | A string value is indexed as a single unit. This is good for sorting, faceting, and analytics. It’s not good for full-text search. | +_i | _is | int | a 32-bit signed integer | +_l | _ls | long | a 64-bit signed long | +_f | _fs | float | IEEE 32 bit floating point number (single precision) | +_d | _ds | double | IEEE 64 bit floating point number (double precision) | +_b | _bs | boolean | true or false | +_dt | _dts | date | A date in Solr’s date format | +_p | NA | location | A latitude and longitude pair for geo-spatial search | + +##### Content Search Connector + +Search connectors are also called View Connectors. You can manage them in the Content Service menu by clicking on Content View Connections. When creating a content view, select the Solr Content View Connector. + +**Search Configuration** + +* **Collection**: Name of the Solr core (collection) you are connecting to. +* **Result Link**: Edit, External Link, Download, Inline. +* **Face Fields**: List of fields that will be used for faceted search +* **Search for default metadata fields**: +* **Field List**: List of fields to be part of search +* **Facet Limit**: 0 means let Solr decide. Otherwise, set to 1 or more. Default is typically 20, but check your Solr server to be sure. +* **Facet Minimum Count**: Minimum facets needed to return a result. +* **Facet Date Field**: Date field used for Facets +* **Facet Date Start**: Start Date for Facets +* **Facet Date End**: End Date for Facets +* **Facet Date Gap**: [Simple Facet Parameters](https://wiki.apache.org/solr/SimpleFacetParameters#facet.range.gap){:target="_blank"} +* **Highlight**: Yes or No to turn off or on highlighting. +* **Highlight Fields**: Which fields will we return with highlights? +* **Highlight Field Length**: The length of the highlighted field result. Default is 300, but many users like to set this to 500 or more. +* **Stats**: Gather usage stats for this connector? +* **Public Search:** Is this a public search page or behind an authentication wall? + +EXTERNAL LINKS + +If you choose External Link for the Result Link, you'll need to configure the URL by clicking the "Add External Link" button at the bottom of the page + +**Content Service Connector:** The unique name of the content service connector this is associated with. You typically have an External Link per content service that is part of the index. + +**Link Field:** The field that will be appended to the URL +**Link URL:** The URL that will be used. The Link Field will be appended to this field for each result. + +#### Aprimo + +Aprimo provides content operations and digital asset management software that helps marketing teams deliver personalized omnichannel experiences at scale. + +[More info on Aprimo](https://www.aprimo.com/){:target="_blank"} + +##### Authentication Connection + +Aprimo connections require an Aprimo Auth Connection to function. Authentication connectors are used to authenticate repository/output connections that need certain authentication fields like access tokens or refresh tokens. + +**Configuration** + +* **Name**: Name of your Aprimo Auth Connector +* **Aprimo Client ID**: The client ID obtained from your Aprimo environment +* **Aprimo User ID**: The user ID for authenticating to Aprimo +* **Aprimo User Token**: The user token obtained from your Aprimo environment +* **Aprimo Sub Domain Name**: The subdomain name of your Aprimo environment. Note: This is the subdomain only and not the full URL +* **Aprimo Classification ID**: The ID of the classification that the assets will be assigned to. If left blank then the assets will remain in the 'My Uploads' section until they are manually assigned a classification +* **Include Un-Mapped Properties**: If selected, all available properties will be included. If not selected, only mapped properties will be included + +##### Discovery Connector + +**Configuration** + +* **Name**: Unique name for your connector +* **Authentication Connection**: Select the auth connector for this discovery +* **Ignore Types (comma delimited list)**: Chose document types to ignore when running discovery + +##### Integration Connection + +The Aprimo Integration Connection has no configuration as we use a Federation Servicestion Services Auth Connector for authentication parameters. You will just need to apply your pre-configured Aprimo Auth Connector to the Aprimo Output Connector. + +**Configuration** + +* **Connection Name**: This is a unique name given to the connector instance upon creation. +* **Description**: A description of the connector to help identify it better. +* **Authentication Connection**: The Aprimo Authentication connection that you want to use. + +##### Job Configuration + +A Federation Services Job is the process of moving or syncing content (including versions, ACLs, metadata) from one CMS (content management system) to another. + +* **Repository Connection Configuration**: Aprimo cannot be used as a Repository Connection +* **Output Connection Configuration**: No additional configuration needed to use Aprimo as an Output source + +#### Azure Blob + +Azure Blob storage is Microsoft's object storage solution for the cloud. Blob storage is optimised for storing massive amounts of unstructured data. + +Unstructured data is data that doesn't adhere to a particular data model or definition, such as text or binary data. + +[More info on Azure Blob](https://azure.microsoft.com/en-us/products/storage/blobs){:target="_blank"} + +##### Authentication Connection + +The Azure Blob Auth Connector allows three different methods of authentication on the same connection. The field descriptions will tell you which to leave blank for your particular method. + +All of these keys generated in the Azure portal. +**Azure Key**: **Security + networking > Access Keys** +**SAS Token**: Security + networking > Shared access signature +**Application Credentials (Client ID/Secret)**: Follow [Microsoft's instructions](https://docs.microsoft.com/en-us/azure/active-directory/develop/howto-create-service-principal-portal){:target="_blank"} to generate these values + +**Configuration** + +* **Name**: Name of the Azure Blob Auth Connector +* **Azure Account Name**: Name of the account associated with your blob storage +* **Azure Key**: Azure authentication key. This can be obtained within your Azure portal +* **Azure Container Name**: Name of the container within your azure blob storage. Leave blank for root +* **Use SAS Token**: Tells the connection to look for a configured SAS token +* **SAS Token**: Hidden unless above is checked. Put your SAS token here +* **Use Application Credentials**: Tells connection to look for application credentials +* **Azure Storage Client ID**: Leave blank if using SAS or Azure Key Auth +* **Azure Storage Client Secret**: Leave blank if using SAS or Azure Key Auth +* **Azure Storage Tenant Id**: Leave blank if using SAS or Azure Key Auth +* **Number of seconds for each attempt to upload**: Default is 60s. Multiplying by the average MB per file is recommended. Must be between 1 and 2147483647. +* **Url to use instead of https://[account].blob.core.windows.net**.: Only used in cases where some custom url has been configured. Leave blank to use default url. + +**Proxy Information** + +* **ProxyURL**: The URL of the proxy server +* **ProxyPort**: The port of the proxy server +* **ProxyUsername**: (Optional) The username to authenticate to the proxy server +* **ProxyPassword**: (Optional) The password to authenticate to the proxy server + +##### Integration Connection + +The Azure Blob Connector supports repo and output modes. Repo mode will require no additional configuration on the job, as it will simply crawl the entire configured container on the auth connection. + +In output mode, the connector will output documents in the same fashion as the [BFS Connector](#bulk-file-system). The binaries will have a matching xml metadata file. + +**Integration Connection Fields** + +* **Connection Name**: This is a unique name given to the connector instance upon creation. +* **Description**: A description of the connector to help identify it better. +* **Authentication Connection**: The Azure connection that you want to use + +##### Job Configuration + +A Federation Services Job is the process of moving or syncing content (including versions, ACLs, metadata) from one CMS (content management system) to another. + +**Output Specification Fields** + +* **Output Folder Path**: The path of the root folder. This field must either be left empty, start with “/”, or start with “\\\”. +* **Include Batch ID in Output Path**: If using a batch migration, the batch ID will be included in the output path. +* **Include Un-Mapped Properties**: If selected, all available properties will be included in the metadata output file. If not selected, only mapped properties will be included in the metadata output. +* **Object Metadata Fields**: A Comma delimited list of fields to add to the Azure Blob file as metadata. By default, metadata will only be written to the xml metadata file. +* **Object Headers** : A comma-delimited list of header mappings to add to the Azure Blob file as metadata. Currently supported, and case-sensitive, headers: Content-Type, Cache-Control, Content-Encoding, Content-Language, Content-Disposition. + +For example: `Content-Disposition=content_disposition, Content-Type=content_type` + +* **Perform MD-5 Integrity Check** : This check uses MD5 to verify authenticity and integrity of the data transfer. This requires an MD5 Hash Value Generator task to perform. +* **Aspect Remove Field Mapping**: Currently not in use +* **Multi-value field separator**: Some documents have fields that contain multiple values. Azure Blob does not support this, and will use this separator to form a list of these values as a string before upload. + +**DateTime Config (Output) Configuration Fields** + +* **Date Format**: Date mappings will be converted to this ISO format +* **Date Time Format**: DateTme mappings will be converted to this ISO format + +**Repository Specifications** + +* **Root Folders**: Which root folders in the container to crawl. Leave blank to crawl all folders in the container. +* **Timeout in Second**: The number of seconds before hitting a timeout and failing the document. Timeouts below 60 seconds might cause read issues. + +##### Content Service Connection + +Content Service Connections define connections to specific repositories. Actions in the Content Services API or the Discovery web application perform actions against specific repositories. + +**Basic Configuration** + +* **Connector ID**: Give your connector a unique name +* **Description**: Provide a description for this connection +* **Type**: Select your DocuWare connector +* **Keep Connection Alive**: Keep this connection active +* **Keep alive in Milliseconds (300000 is 5 minutes)**: How long until connection expires if unused +* **Connection URL**: The web address for your connection +* **Security mode**: Select your preferred type of security credential access(Service Provided, User Pass through or Authentication Connector) +* **Mapping Type**: Choose a single map or group mapping. + +**Connection Configuration** + +* **Content Disposition**: The content disposition to apply to metadata when updated from the content service connector. +* Extra parameters can be passed to the content service connection and vary by connection. +**Supported Method** +* Create File +* Delete Object By Id +* Get File Content +* Get Object Properties +* Update File +* Update Properties + +#### Batch Parser + +Batch parser is for picking up batch exports from the file system. The typical use case is picking up batches from scanners. + +##### Integration Connection + +**Configuration** + +* **Connection Name**: This is a unique name given to the connector instance upon creation. +* **Description**: A description of the connector to help identify it better. +* **Authentication Connection**: Leave blank. This connection does not require authentication + +##### Job Configuration + +**Batch Parser** + +* **Ingestion Location**: Location to pick up files. +* **This can be a file path**: `/mnt/drop` or a URI `/service/pickup` +* **File Pattern**: Pattern for file matcher. + * For example `*.xml` +* **Parser (Required)**: Select a parser type. +* **Pre Parse Commands**: Command to be run before parsing the document. + * This is meant for cases where you have zip files and need to decompress before processing. +* **Server And Port**: Server and port for REST content retrieval. +* **Username**: Username for REST content. +* **Password**: Password for REST content. + +**Parser Formats** + +XML + +```xml + + + 5012421.pdf + M2M_DHR_20190703121505 + + + + + + + + +``` + +#### Bootstrap + +The Bootstrap Repository Connector is used for quickly generating dummy files and metadata to test things such as mappings and tasks. + +The basic setup gives a number of ranges for specific metadata fields for each file. + +Files generated by this connector will have the following metadata: + +* Document Length +* Document Mimetype (Content Type) +* A Parent folder path +* A Last Modified Date +* A Created Date +* If Include Binaries is checked under Advanced Settings, a fake binary within the configured size range will be attached to the metadata. +* Files will have a randomised name of letters and numbers and will be of a randomized mimetype from the supported list of [extensions](#extension-list). + +##### Integration Connection + +Most Integration Connections can act in both repository (read) and output (write) modes. If it can't, it will not appear as an option when creating or editing a job. This connection can only be used as a repository connection. + +**Configuration** + +* **Connection Name**: This is a unique name given to the connector instance upon creation. +* **Description**: A description of the connector to help identify it better. + +##### Job Configuration + +When the Bootstrap connector has been selected as the repository connector of a given job, additional configurations will need to be provided within the Job. + +**Basic Configuration** + +Use this when you need to quickly generate files + +FILE CONTENT + +If **Include Binaries** in the **Details** tab is checked, the dummy files will include a file which matches the size on the metadata. The content of the file will not be particularly useful. + +* **Number of files to generate**: This is a count of individual files, not batches of files. +* **Parent path base**: Sets the parent path metadata for the files being generated. +* **Creation Date Range Start**: The first possible date for the Created Date metadata +* **Creation Date Range End**: The last possible date for the Created Date metadata +* **Last Modified Date Range Start**: The first possible date for the Last Modified Date metadata +* **Last Modified Date Range End**: The last possible date for the Last Modified Date metadata +* **Size Range Start (Bytes)**: The minimum size of the document +* **Size Range End (Bytes)**: The maximum size of the document +* **Allow for non standard mimetypes**: Expands the list of mimetypes (200+) + +**Advanced Configuration** + +* **Config File Location**: This is the location where the config/properties file resides +* **File Generator**: Type of file generator (Random or Linear) + +**Advanced Configuration Properties** + +* **outputRootDir (string**): The root output folder for each document's parent +* **path.templateDir (string)**: folder which contains template files to use as content +* **numberOfFiles (int)**: number of files to create per repository thread +* **maxFilesInTree(int)**: Limits number of files per folder tree +* **folderPattern(string)**: A pattern using date parts that will create a parent based on the current date and pattern. Default pattern is /yyyy/M/dd/kk/mm/ss/(kk is hours) +* **File Names(String)**: File names will take the format[name.first][name.middle][name.last]. + +Each of the following properties should be a path to a text file with a list of options for file names. + +* **name.first.file** +* **name.middle.file** +* **name.last.file** + +##### Extension List + +* eml +* png +* csv +* xls +* ppt +* mp3 +* mp4 +* eml +* mpeg +* zip +* txt +* css +* html +* doc +* pdf +* xml + +#### Box + +Box, Inc.The company focuses on cloud content management and file sharing service for businesses. Official clients and apps are available for Windows, macOS, and several mobile platforms. + +Before you can set up your Box Cloud Connection you must first create the necessary Authorisations via the Box App. Follow this link for steps on Box App Creation and Authorisation. Once created return to this page to begin setting up your connections in Federation Services. + +##### Box Authentication + +**Creating a Box App** + +> **Tip:** We recommend using the Java Web Token (JWT) Authentication Connection, as it offers the best performance options + +**JWT Application Creation** + +* If using Java 8, JWT Authentication requires the installation of the Java Cryptography Extension. +* Ensure your account has 2-step verification enabled. +* Navigate to the Developers Console (link) +* Choose Create New App +* Select Custom App +* Box Cloud Custom App +* Select Server Authentication (with JWT). +* NOTE +* Box removed the ability to change this selection early in 2021, so this choice is permanent. +* Box Cloud Authentication Method +* TIP +* In your applications you should see Service Account Info. The Service Account ID is the service user's email address and must be a collaborator on any folder you wish to migration +* Under the Configuration tab in App Access Level, select the enterprise setting +* Box Cloud App Access Level +* In Application Scopes make sure both Content Actions are checked +* In Advanced Features, check both options +* Box Cloud App Advanced Features +* Click on Generate a Public/Private Key pair +* Open the file provided. It should take the following form +* { +* "boxAppSettings": { +* "clientID": "", +* "clientSecret": "", +* "appAuth": { +* "publicKeyID": "", +* "privateKey": "", +* "passphrase": "" +* } +* }, +* "enterpriseID": "" +* } +* Take the entire value of the private key and save it to a separate file. This will be your private key file. +* The information in this config file can be used to fill in the fields of aBox Integration Connection. +* Alternatively, you can use the file to create a JWT Authentication Connector. +* To authorise your app follow Box's instructions. Pay particular attention to the App Approval section. +* Logging in as the Service User +* Navigate to your account's admin console ( yourapp.app.box.com/master ) +* Click Content +* Select User(s) to view their content +* If you right-click, you can select "Log in to users account" +* This gives you the standard Box application view, allowing you to gather Folder Ids, etc. while in the view of the user. + +**OAuth Application Creation** + +> **Important:** This requires tomcat to be running using the 'https' protocol. Box will not accept 'http://' addresses. Tomcat will need to be configured to use SSL/TLS. + +Creating a Box OAuth Application requires you to choose the **Standard OAuth 2.0 Authentication Method** in the **Create a New App** screen. + +* In The **Configuration** tab of your app, retrieve the clientId and clientSecret. +* In **App Access Level**, select the enterprise setting + Box Cloud App Access level +* In Application Scopes make sure both Content Actions are checked +* In Advanced Features, check both options + Box Cloud App Advanced Features +`https://[simflofyUrl]/3sixty-admin/authconn/oauthcb` + +**Creating Authentication Connections** + +Each app type has its own Authentication Connection + +**Box JWT Authentication Connection** + +Connection +Proxy Information +Logging +Example +Preview +Name: Name of this connection. +JWT JSON Key File:If you have downloaded the JWT key file from the Box Admin Console, and it is on the same file system as Federation Services, then you can refer to it here (i.e. C:/Users/3Sixty/mykeyfile.json). +JWT JSON: Alternatively you can copy the contents of the JWT key file and paste it in this text area. +App Users Count: While in Output mode, the Federation Services Box Connector allows you to create Box App Users to do bulk uploads to Box. This is an advanced setting and is only recommended for large integrations since there is a start-up cost in creating the app users in Box. Set to 0 to not use app users. +Base name of the app users: Base name that will be used for each app user. +The ID of the managed user you wish to act as: The connection will act as the user id for all actions. +Box Connection Timeout: Connection timeout interval. +Box Read Timeout: Read timeout interval. + +**Box OAuth Authentication Connection** + +Connection + +Proxy Information + +Logging + +Name: Unique name for this auth connector. + +Box Developer Token: (Optional) Developer Token to be used instead of clientId and secret. Developer tokens expire 60 minutes after creation + +Box Client ID: Client ID box will give you once you've set up the Application in Box. + +Box Secret Key: Secret Key Box will generate for you as part of the Application Setup in Box. + +AUTHENTICATION + +After filling in your client id and secret. Hit the **Authenticate** button. You will be redirected to a screen in Box asking you to confirm the application permissions. You should be returned to Federation Services after accepting. If you receive an error, your redirect URI in the Box Application config may not be correct. + +##### Discovery Connector + +The Box Discovery Connector requires a working authentication connection. It will gather all metadata templates and their associated fields. However, there is one type of metadata, known as "Custom Metadata" that is applied to individual documents, but not part of a global template. + +In order to find Custom Metadata, you will need to supply the id of a folder to crawl for documents. The id of a folder is visible in its URL. + +Federation Services will attempt to extract the custom metadata elements of any folder or file it finds, adding it to the schema. + +The values will have a type of "properties" for the purposes of mappings. + +##### Box Job Configuration + +##### Job Configuration (Repository) + +COMMON ISSUE: PKIX PATH BUILDING FAILED + +This is a common issue when attempting to download files from box. + +The full error will look like this in the logs: + +```text +Caught exception: Couldn't connect to the Box API due to a network error. +com.box.sdk.BoxAPIException: Couldn't connect to the Box API due to a network error. +...(About fifteen lines of stacktrace)... +Caused by: javax.net.ssl.SSLHandshakeException: PKIX path building failed: +sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target +``` + +In order to fix this, first, attempt to install Box's ssl certificate in your Java keystore. + +If that does not work, you can also download the Java Cryptography Extension (JCE) Unlimited Strength from Oracle and install the files in /jre/lib/security. + +**Box Query** + +This tab gives you three ways to retrieve data from Box. They construct a query using [Box's Search API](https://developer.box.com/reference/get-search/){:target="_blank"} and can be mixed and matched as needed + +* **Box Query**: Used as a [query parameter](https://developer.box.com/guides/search/){:target="_blank"} +* **Folder ID's (comma delimited)**: A comma delimited list of folder ids to restrict the search +* **Content Types (comma delimited)**: Available options are: + * file - Limits the search results to files + * folder - Limits the search results to folders + * web_link - Limits the search results to web links, also known as bookmarks + +**Repository Crawl** + +**Retrieve Folders**: Folders will be retrieved as repository documents. +**Retrieve Files**: Checked by default, files will be retrieved. +**Retrieve only listed folderIds**: The connector will only collect the documents and folders configured in the Box Query tab, and will not crawl. +**Retrieve Collaborations**: Will retrieve collaborations in the format [user]=[role]. +**Truncate parent paths to exclude folders above specified folders**: + +As a default, the parent paths of files are absolute, and will include the root folder All Files as well as any folders above the configured ones. When this box is checked, only folder paths up to the "crawled" folders will be included. + +> **Tip:** If we have the file `/AFolder/subfolder/testfile.txt` at our root in Box, and we migrate `subfolder`, the file's final parent path will be `/All Files/AFolder/subfolder/`. With the truncate option checked, it will be `/subfolder/testfile.txt`. + +##### Job Configuration (Output) + +> **Tip:** The upload APIs for box are different from most others used by Federation Services. Make sure your firewall is set to `allow upload.box.com`, or you will receive the error: +> +> ```text +> Error while uploading file .pdf Extended Response is: Couldn't connect to the Box API due to a network error. +> ``` + +**Output Specification** + +**Output Folder Path**: +The root folder to output too. Your repository folder structure will be replicated under this directory +**Output Folder ID**: +Another option for selecting the output folder. Folder Ids can be retrieved from the url when viewing the folder in a browser. This will take precedence over path if supplied +**Include Un-Mapped Properties** +All metadata will be output, even if no mappings are supplied. These values will be applied as global properties to the file. +**Date/Date-Time Format** +Output format for the date. Box is restrictive on this, so changing either is not recommended. + +**Collaborations** + +**Add Collaborations**: +Add collaborations to files written. Collaborations will need to be added as part of a task in the format of [email]=role. The JavaScript task is useful for this. +**Strip Collaborations**: +Will remove all collaborations before adding them. +**Collaborators Can View Path**: +Sets the option to true on a collaboration. The collaborator can see the parent path of the document. +**Notify Collaborators on Add**: +Collaborators will receive an email (not recommended). +**User ID to add Collaborations (Group Only)**: +Use a group id instead of an email. + +**Data** + +**Remove document and previous versions if it fails to fully upload**: +Used when outputting versions to Box. If a document is a version series fails to upload, Federation Services will delete the previously uploaded versions as well. They will be counted in the Removed column in the job status page +**Milliseconds to wait in response eto rate limit errors (multiplies times retries)**: +Box has a very strict rate limit and will return an error code 429 (Too Many Requests) fairly often. This tells Federation Services how long to wait before automatically retrying the call that failed. +**Number of retries to attempt before failing a document**: +The name says it all. +**If a file with the name already exists in the parent folder, create a new version**: +If unchecked, documents with the same name will fail if a document already in the target folder has the same name +**Move Files Instead of Write (Box to Box only)**: +Box has special methods for moving files within the same box organization. If this is checked, Federation Services will use those methods instead of reading and writing content. To do this you will need a task to manipulate the parent path of the document in order to rehome it. +**Copy Files Instead of Write (Box to Box only)**: +Same as moving, but box will copy the files to their new location, instead of move them. +**Pre Cache Folder Structure(experimental)**: +Federation Services will recursively walk the structure below the target folder and cache their paths and ids. This can take a long time and is not really of use unless there is already content under the target folder. +**Use Large Files Method on Files over 20 MB**: +Will use Box's large file APIs to more reliably upload large files +> **Important:** This method is currently bugged and will cause an error if called by a Service User account. If you use JWT Authentication, leave this unchecked +**Only Create Folders**: +Works in tandem with pre caching. Prebuild the folder structure, then use a different job that pre-caches to reduce overall times needed to move the content (experimental) +**Only add template metadata if all listed fields are present**: +This field allows you to regulate what fields are allowed to be empty for documents receiving a metadata template + +##### Box Content Service Connector + +##### Managing Permissions + +The API supports GET, POST, and DELETE calls. All the endpoints take the "id" parameter, which takes the form of a number. Ex.77411856592. + +A guide to available box roles can be found [here](https://support.box.com/hc/en-us/articles/360044196413-Understanding-Collaborator-Permission-Levels){:target="_blank"} + +**Read Permissions (ACLs)** + +**Request:** + +`GET /repo/(connectorId)/acls?id=(id)&isFolder=(isFolder)` + +**Description:** + +Retrieves a list of in the format of ["UserName(UserId):Role",..... ] +You will need to extract the UserId or Name from each item for use in POST/DELETE request. + +**Path Parameters:** + +connectorId: The connector ID of your content service connector + +**Query Parameters:** + +id: The repository id of the item. + +**Optional Parameters:** + +isFolder: Is the item a folder? Default is false. + +GET repo/box/acls?id=77411856592&isFolder=true + +**Returns:** + +```text +{ +"results": [ "M Lugert(77567866603):EDITOR", "JLipton(77422856603):VIEWER" ], +"success": true +} +``` + +**Example With CURL** + +`curl -u admin:admin "localhost:8081/3sixty-admin/api/repo/**box/acls?id=77411856592 &isFolder=true**" | json_pp` + +**Write Permssions (ACLs)** + +**Request:** + +POST /repo/(connectorid)/acls?id=(id)&acls=(acls)&isFolder=(isFolder)&viewPath=(viewPath)¬ify=(notify)&isGroup=(isGroup) + +**Description:** + +Adds acls to the selected document. +It is important to note that Box collaborations are inherited from the parents. The parent of the item must also have the collaboration being added or a 403 response will occur. + +**Path Parameters:** + +connectorid: The connector id of your content service connector + +**Query Parameters:** + +id: The repository id of the item. +acls: A JSON Object in the format {"User1":"Permission1","User2":"Permission2"} +Optional Parameters: Applied for each pair in acls +isFolder: Is the item a folder? Default is false. +viewPath: Dictates whether the collaborator can view the parent path of the item. Default true. +notify: If true, will send a notification for each collaboration created. Default false. +isGroup: If true, will attempt use the supplied id to add collaboration for a group. Default false + +This will not work with an email address as groups don't have them + +**Example from Postman** + +POST repo/box/acls?id=77411856592&acls={"testuser@box.com":"EDITOR"}¬ify=true&isFolder=true + +**Returns:** + +```text +{ +"results": [ +"M Lugert(77567866603):EDITOR", +"J Lipton(77422856603):VIEWER", +"testuser@box.com(77427777603):EDITOR" +], +"success": true +} +``` + +**Example With CURL** + +`curl -u admin:admin -X POST "localhost:8081/3sixty-admin/api/repo/**box/acls?id=77411856592&acls={"testuser@box.com":"EDITOR"}¬ify=true&isFolder=true**" | json_pp` + +**Delete Permissions (ACLs)** + +**Request:** + +DELETE /repo/(connectorid)/acls?id=(id)&aclId=(aclId)&isFolder=(isFolder) + +**Description:** + +Removes the permissions for the supplied User or Group IDs from and item. + +**Path Parameters:** + +connectorid: The connector id of your content service connector + +**Query Parameters:** + +id: The repository id of the item. + +aclId: A comma delimited list of User or Group Ids to remove from the item + +**Optional Parameters:** + +isFolder: Is the item a folder? Default is false. +DELETE repo/box/acls?id=77411856592&isFolder=true&aclId=testuser@box.com,77422856603 + +**Returns:** + +```text +{ +"success": true +} +The following GET call should produce: +{ +"results": [ +"M Lugert(77567866603):EDITOR" +], +"success": true +} +``` + +**Example With CURL** + +`curl -u admin:admin "localhost:8081/3sixty-admin/repo/box/acls?id=77411856592&isFolder=true&aclId=testuser@box.com,77422856603" | json_pp` + +##### Content Service Methods + +The methods currently supported for this connector are: + +* Create Folder +* Create File +* Update File +* Create File from Item +* Get Object by path +* Update Properties +* Get File Content +* Get Object Properties +* Delete Folder +* Get Root Folder Id +* List Folder Items +* Delete Object by ID +* Get Types +* Get File Item +* Get ACLs +* Set ACLs +* Delete ACL + +#### Bulk File System + +The BFS Connector is useful for outputting files and their metadata as separate entities. File binaries will be output with their metadata in a file with the format. It can also read in these files for export to other systems. + +`[filename].metadata.properties.xml` + +##### Integration Connection + +Most Integration Connections can act in both repository (read) and output (write) modes. If it can't, it will not appear as an option when creating or editing a job. This connection can only be used as a repository connection. +**Configuration** + +* **Connection Name**: This is a unique name given to the connector instance upon creation. +* **Description**: A description of the connection. + +##### Job Configuration + +**Repository Specification** + +* **Source Directory**: The directory to begin crawling for BFS files. +* **Do not convert metadata keys to lowercase**: Federation Services converts all type and field values to lowercase by default. If this is checked all fields will keep their original case +* **Process Folders**: Tells the job to process to folders. If checked and the job is rerun for errors, folders will be processed again. +* **Process Files**: Tells the job to process files. Check by default +* **Check for multi-valued fields**: Will check for commas in field values. If present, they will be added as multivalued fields to the metadata + +**Output Specification** + +* **Name**: Name of your BFS Auth Connector +* **Output Folder Path**: The output directory location where your BFS files will be stored +* **Multi-Value Separator**: Multi-value fields will be combined into a list using this separator +* **Include Un-Mapped Properties**: If selected, all available properties will be included in the metadata output file. If not selected, only mapped properties will be included in file +* **Inherit ACLs**: If selected, inherited ACL properties will be included in the metadata output file. +* **Metadata as XML**: Creates a metadata XML file. If not selected, metadata will be stored in a properties file +* **Zip Output**: If selected, output will be created as zip files. This option can only be used with batch migrations (i.e. batch size must be greater than 0). +* **Aspect Remove Field Mapping**: Takes a JSON string. Remove aspects if the listed fields are not present. + +The example of the UI: + +`{"myaspect:two":["field1","field2"],"myaspect:one":["field1","field2"]}` + +Meaning that if field 1 or field 2 is not present, do not add the aspects. + +**DateTime Config (Output)** + +> **Note:** BFS as an output repository now uses the job's Repository Time Zone and Output Time Zone fields for time zone conversion + +* Date Format: Date mappings will be converted to this ISO format +* Date Time Format: DateTme mappings will be converted to this ISO format + +##### Version History Files + +The import tool also supports loading a version history for each file. To do this, create a file with the same name as the main file, but append it with a v# extension. For example: + +```text +IMG_1967.jpg.v1 <- version 1 content IMG_1967.jpg.v2 <- version 2 content IMG_1967.jpg <- "head" (latest) revision of the content This also applies to metadata files if you want to capture metadata history as well. For example: +IMG_1967.jpg.metadata.properties.xml.v1 <- version 1 metadata +IMG_1967.jpg.metadata.properties.xml.v2 <- version 2 metadata +IMG_1967.jpg.metadata.properties.xml <- "head" (latest) revision of the metadata +``` + +Additional notes on version history loading: + +You can’t create a new node based on a version history only. You must have a head revision of the file. Version numbers do not have to be contiguous. You can number your version files however you want, provided you use whole numbers (integers). The version numbers in your version files won’t be used in Content Services. The version numbers in Content Services will be contiguous, starting at 1.0 and increasing by 1.0 for every version (so 1.0, 2.0, 3.0, and so on). Content Services doesn’t allow version labels to be set to arbitrary values, and the bulk import doesn’t provide any way to specify whether a given version should have a major or minor increment. Each version can contain a content update, a metadata update or both. You are not limited to updating everything for every version. If not included in a version, the prior version’s content or metadata will remain in place for the next version. The following example shows all possible combinations of content, metadata, and version files: + +```text +IMG_1967.jpg.v1 <- version 1 content +IMG_1967.jpg.metadata.properties.xml.v1 <- version 1 metadata +IMG_1967.jpg.v2 <- version 2 content +IMG_1967.jpg.metadata.properties.xml.v2 <- version 2 metadata +IMG_1967.jpg.v3 <- version 3 content (content only version) +IMG_1967.jpg.metadata.properties.xml.v4 <- version 4 metadata (metadata only version) +IMG_1967.jpg.metadata.properties.xml <- "head" (latest) revision of the metadata +IMG_1967.jpg <- "head" (latest) revision of the content +``` + +#### Centera + +Centera is an archiving system that uses objects as storage elements with the application or the Centera Universal Access server storing the objects using an Ethernet interface. + +##### Authentication Connection + +* Authentication Fields +* Application name: The application name registered with Centera +* Application Version: Version of Centera being connected to +* Cluster address: The Centera cluster being connected to + +##### Repository Connection + +Also known as an input connection. It's job is to query or crawl remote systems for files, folders, metadata, versions, and renditions. + +**Repository Connection Fields** + +* Connection Name: This is a unique name given to the connector instance upon creation. +* Description: A description of the connector to help identify it better. +* Connector Type: The type of connector. +* Connector Class: The class of this connector that implements the IOutputConnector interface. You may have different connector types that write to the same type of repository +* Authentication Connection: None needed for this connection + +##### Content Service Connection + +**Content Service Connection Fields** + +* Connector ID: Give your connector a unique name +* Description: Provide a description for this connection +* Type: Select the Filesystem Content Service Connector +* Keep Connection Alive: Keep this connection active +* Keep alive in Milliseconds (`300000` is 5 minutes): How long until connection expires if unused +* Connection URL: The web address for your connection +* Security Mode: None needed for this connection +* Mapping Type: Choose single map or group mapping if you are using mapping for jobs + +#### CMIS + +Content Management Interoperability Services (CMIS) is an open standard that allows different content management systems to interoperate over the Internet. Specifically, CMIS defines an abstraction layer for controlling diverse document management systems and repositories using web protocols. + +If going from CMIS to CMIS, associations are only included if job type mappings are included + +##### Authentication Connection + +* **Name**: The name of your CMIS authentication connector +* **Username**: Username to authenticate with. +* **Password**: Password to authenticate with. +* **URL**: The full URL leading to your CMIS endpoint +* **Binding**: AtomPub or Web Services. AtomPub is the default and most common choice. +* **Repository ID**: You can specify a specific repository to query. +* **Vendor (CMIS 1.0 Only)**: No vendor, Alfresco, or FileNet + +##### Discovery Connector + +The CMIS Discovery Connector requires a CMIS Authentication Connection + +* **Name**: Unique name for your connector +* **Authentication Connection**: Select the auth connector for this discovery +* **Ignore Types (comma delimited list)**: Chose document types to ignore when running discovery +* **Repository ID**: You can specify a specific repository to discovery if supported by your specific CMS. The CMIS Discovery Connector will discover all content models including their metadata and properties. + +##### Integration Connection + +Utilising the CMIS Query Language, the CMIS Integration Connection allows the user to query the CMS system for content and metadata. It is also designed to write content, and it's associated metadata into a CMIS compliant Content Management System (CMS). This connector leverages the Apache OpenCMIS API v1.1. + +To set up the CMIS Integration Connection fill in the following fields: + +* **Connection Name**: Name the Connector +* **Description**: Add a description for the connector +* **Authentication Connection**: Select the Auth connector +* **Secondary Auth Connection**: Not used for CMIS + +##### Job Configuration + +##### CMIS Query + +A query to run against the source system using The [CMIS Query Language](https://hub.alfresco.com/t5/alfresco-content-services-hub/cmis-query-language/ba-p/289736){:target="_blank"}. Must begin with + +`select * from cmis:document d` + +from there you can perform any type of query needed to collect the specific documents or types you wish. Most commonly, we walk a file tree using the root folder's node reference like so: + +`select * from cmis:document d WHERE in_tree('workspace://SpacesStore/3144f53f-55b9-478e-9ad8-bca477a54238')` + +As with most query based repo connections, we append the start and end times from the Details tab of the job to restrict the documents based on their last modified date + +This appends the following to the query: + +`d.cmis:lastModificationDate >= TIMESTAMP (Your Configured Start Time) AND d.cmis:lastModificationDate <= TIMESTAMP (Your Configured End Time)` + +CMIS Query Order By: + +The field and ordering in the form of (Field) [ASC/DESC]. This will be added as an ORDER BY clause + +If left blank, the following will be added to the query, after the modified time clause + +`cmis:lastModificationDate DESC` + +**Version Depth**: +How many versions of a document to retrieve, going backwards. If the value is five, then the connector will attempt to retrieve the current document and its five most recent versions, if they exist. + +**Search All Versions**: +Must be true if connecting to a Nuxeo repository. Must be false if connecting to an Alfresco repository. + +**Process Relationships**: +Supported in most Alfresco systems. This will attach any relationships found as metadata, similar to version information. + +> **Important:** If you are running with process relationships checked, and the source system does not support it, there will be an error in the logs, but the document should continue processing without error. + +##### CMIS Server + +**Output Folder Path**: The folder where you wish the files to be written. This folder will be created if it does not exist. + +> **Tip:** To write to a site, prepend 'site/[shortname]/' to the path + +**Strict Version Mode**: Required to be true for most ECM systems. This simply means that if a document is retrieved by ID, it will retrieve that object, and not attempt to retrieve the latest version. +**CMIS Cache Enabled**: A setting for the cmis session. All retrieved objects will be cached for quicker lookup later. If false, the connector will search the source system each time for a document for folder. +**Add ACLs**: Requires a task to set the transformedPermissions field on a repository document before output. The acls should take the form of map with principals as the keys and sets of permissions as the values. For example: + +```text +{ +"principal1": ["read","write"], +"principal2": ["read"] +} +``` + +**Include Aspects With No Field Mappings**: Aspects will be applied to documents even if the data for their fields is missing or unmapped. +**Aspect Remove Field Mapping**: Takes a JSON string. Remove aspects if the listed fields are not present. The example of the UI: + +`{"myaspect:two":["field1","field2"],"myaspect:one":["field1","field2"]}` + +Meaning that if field 1 or field 2 is not present, do not add the aspects. + +**CMIS Update Query**: If populated, this query will be run, for every document, before any other attempt to upload the document. Any document ids which are returned by this query will be updated using the metadata and content from the document being processed. +**Check in In/Check Out on Updates**: If using an update query, the documents being updated will be checked out, have updates to metadata applied, and then be checked back in. +**Update Binary on Updates**: If using an update query, the document's content will be updated in addition to metadata. + +##### Content Service Connector + +This section covers the CMIS specific configuration of the Content Service Connector. + +##### Managing Permissions + +The API supports GET, POST, and DELETE calls. + +All the endpoints take the "id" parameter, which takes the form of a string. + +For example: `5dba1525-44a6-45ed-a42e-4a155a3f0539` + +**Read Permissions (ACLs)** + +Request: + +`GET /api/repo/(connectorid)/acls?id=(id)` + +Description: + +Retrieves a list of in the format of ["principalID:permission1,permissions2",..... ] + +Path Parameters: + +**connectorid**:The connector id of your content service connector + +Query Parameters: + +**id**:The repository id of the item. + +GET /api/repo/cmis/acls?id=5dba1525-44a6-45ed-a42e-4a155a3f0539 + +Returns: + +```text +{ +"results": [ +"user@alfresco.com:cmis:all" +], +"success": true +} +``` + +**Example With CURL** + +`curl -u admin:admin "localhost:8081/3sixty-admin/api/repo/cmis/acls?id=5dba1525-44a6-45ed-a42e-4a155a3f0539" | json_pp` + +**Write Permissions (ACLs)** + +Request: + +`POST /repo/(connectorid)/acls?id=(id)&acls=(acls)` + +Description: + +Adds a principal to an object with the specified permissions. If the object exists, replace its permissions with those supplied. + +Path Parameters: + +**connectorid**:The connector id of your content service connector + +Query Parameters: + +**id**:The repository id of the item. +**acls**: A JSON String in the format of {"principalID":"permission1,permission2",....} + +`POST /api/repo/cmis/acls?id=5dba1525-44a6-45ed-a42e-4a155a3f0539&acls={"newuser@alfresco.com":"cmis:read,cmis:write"}` + +**Returns:** + +``` +{ +"results": [ +"user@alfresco.com:cmis:all", +"newuser@alfresco.com:cmis:read,cmis:write" +], +"success": true +} +``` + +**Delete Permissions (ACLs)** + +**Request:** + +`DELETE /repo/(connectorid)/acls?id=(id)&acls=(acls)` + +**Description:** + +Remove a principle from an object. + +**Path Parameters:** +**connectorid**: The connector id of your content service connector + +Query Parameters: **id**:The repository id of the item. +**aclId**:a comma delimited link of principal Ids to remove from the target document. + +`DELETE /api/repo/cmis/acls?id=5dba1525-44a6-45ed-a42e-4a155a3f0539&aclId=newuser@alfresco.com` + +**Returns:** + +```text +{ +"success": true +} +``` + +And the following GET call should return: + +```text +{ +"results": [ +"user@alfresco.com:cmis:all" +], +"success": true +} +``` + +**Example With CURL** + +`curl -u admin:admin -X DELETE "localhost:8081/3sixty-admin/repo/fn/acls?id=5dba1525-44a6-45ed-a42e-4a155a3f0539&aclId=newuser@alfresco.com| json_pp` + +##### Supported Methods + +* Check In +* Check Out +* Create Folder +* Create File +* Create Relationship +* Update File +* Create File from Item +* Get Document by path +* Update Document Properties +* Get File Content +* Get Document Properties +* Delete Folder +* Get Root Folder ID +* List Folder Items +* Delete Object by ID +* Get Types +* Get ACLs +* Post ACLs +* Delete ACL + +#### Comma Separated Value (CSV) + +No authentication connection is needed to set up CSV connectors, as it reads from the local filesystem. CSV cannot be used as an output connector nor a Content Service Connection. + +##### Discovery Connector + +Viewing the discovery schema instances will show you a table of all available Discovery Instances, this table can be sorted by Name, Type, and Collection. + +**Discovery Instance Fields** + +* **Name**: Instance Name +* **Ignore Types**: List of types to ignore, not used for CSV +* **CSV File Path**: Full path to the CSV File. +* **CSV Type**: If blank, the type on the fields will be csv file name with periods replaced with '_' + +##### Job Configuration + +**Repository Connection Configuration** + +All of these fields will appear in a Job Specification where the CSV connector is the repository. + +**CSV File Info** + +* **CSV File Path**: Path to the CSV file +* **CSV Type**: CSV Type. Will be prepended to all properties. If blank, the type will be the (filename)_csv +* **Separator Character**: The character that separates each field value, also called a delimiter. Default is comma (,) +* **Escape Character**: The value used to escape values such as slashes and quotes. Default is backslash (\\) +* **Quote Character**: The character used to denote fields. Default is double quotes (") +* **Document Type**: Sets the base type for the migrated files to either documents or folders +* **Maximum number of rows**: Including the header. Set to 0 or leave blank to read the entire csv + +**File Field Mapping** + +* **Path Field**: The header under which file paths are stored +* **Path Includes Files**: If checked, Federation Services will extract the filename from the value found in the Path Field. Only checked if Path Field is populated +* **File Field**: The header under which file names are stored +* **Id Field**: Field which contains the source document Id. If blank, the id will be `(csvfilepath):(row)` +* **Created Date Field**: The field that stores the date the file was created +* **File Length Field**: The field that stores the file length +* **Modified Date Field**: The field that stores the date the file was modified +* **Path to Files**: If set, the connector will prepend this to the file path and search for a file at that location. **Include Binaries** must also be checked + +#### Documentum + +Documentum is an enterprise content management platform. Its functionality is made available through application programming interfaces (API). + +Most of the customisation in the basic product is done using the DFC (Documentum Foundation Classes), a comprehensive collection of Java APIs. Customisation can be done via configuration, particularly through the extension products D2 and xCP. These additions aim to provide faster ways of building applications based on document types and metadata, and business processes, respectively. + +##### Authentication + +**Configuration** + +* **Name**: Unique name for connection +* **Username**: Username to authenticate with +* **Password**: Password to authenticate with +* **Collection**: The default collection name +* **Doc Broker**: Documentum Doc Broker +* **Doc Base**: Documentum Doc Base +* **Server Port**: Port number + +##### Discovery Instance + +**Configuration** + +* **Name**: Unique Name for the Discovery Connection to identify it in the UI. +* **Authentication Connection**: A predefined connection for authentication. +* **Ignore Types**: Comma delimited list of types to ignore. Note that you can have regex as well. So to ignore all types with "workflow" in the name, you would enter(.)workflow(.) into the ignore types textbox. +* **Doc Base**: Documentum Doc Base +* **Server Port**: Port number +* **Doc Broker**: Documentum Doc Broker + +##### Integration Connection + +The Documentum DFC (Documentum Foundation Classes) Integration Connection is for retrieving content, and it's associated metadata from a Documentum Repository based on root folder, content type and document type. Federation Servicestion Services is currently compatible with Documentum v5 and higher.The Documentum Integration Connection utilises the DFC library along with DQL (Documentum Query Language) to sync/integrate content, and it's associated metadata to Documentum. Federation Services is currently compatible with Documentum v5 and higher. + +**Configuration** + +* **Connection Name**: This is a unique name given to the connector instance upon creation. +* **Description**: A description of the connector to help identify it better. +* **Connector Class**: The class of this connector that implements the IOutputConnector interface. You may have different connector types that write to the same type of repository. + +##### DFC Query Repository Connector + +There is a new Documentum connector called the DFC Query Connector it's query based, not folder crawl based + +* **Query**: this is how you get docs, needs to be a full query that works in Documentum. + * You need the i_chronicle_id, and it should be unique, so DISTINCT i_chronicle_id + * If you want to track links as relationships you can add this to the select part of the query: i_reference_cnt +* **Worker Count**: number of workers. These will go and get each document, and it's versions, metadata, renditions, permissions, etc... essentially think of a worker as a concurrent user, though because of queries that need to be run it could result in more than one connection to Documentum. +* **Document Queue Size**: the internal queue we use for documents. These will just be document ids that will be picked up by workers and then resolved + * If there are a lot of files in folders this will speed things up a lot to have folders in cache, but you don't want the cache too big, or it will take up a lot of memory. We suggest 1000-10000 as the optimal number depending on your system. +* **Cache Options Tab**: Number of Items in Cache: this is a folder cache where we keep the properties and info for folders this is used to get the document path and to get folder properties if that option is checked + +##### Job Configuration + +###### Output Configuration + +* Version Label Field: Source field containing version label +* Root Path: This is the root path / cabinet to start writing content to. Note that any subsequent folders that do not exist will be created. Defaults to "/" +* Content Type Rule: This is the DQL to find the Documentum Content Type (dm_format object) for a given extension and or mime type using content specific parameters. This is done as Documentum may have more than one content type per extension and or mimetype. If more than one dm_format is returned in the DQL result, then the first one will be used. + * dos_extension --> Query Parameter: ${extension} + * Example: select name from dm_format where dos_extension = '${extension}' + * mime_type --> Query Parameter: ${mimeType} + * Example: select name from dm_format where mime_type= '${mimeType}' + * is_hidden + * Example: select name from dm_format where mime_type= '${mimeType}' and dos_extension = ${extension} and is_hidden = false + * can_index + * Example: select name from dm_format where mime_type= '${mimeType}' and dos_extension = ${extension} and can_index = true + +###### Repository Run Options + +* **Query**: this is how you get docs, needs to be a full query that works in Documentum. + * You need the i_chronicle_id, and it should be unique, so DISTINCT i_chronicle_id + * If you want to track links as relationships you can add this to the select part of the query: i_reference_cnt +* **Content Max Length**: Max Document Size Allowed, set to 0 to allow any sized document. +* **Document Queue Size**: the internal queue we use for documents. These will just be document ids that will be picked up by workers and then resolved + * If there are a lot of files in folders this will speed things up a lot to have folders in cache, but you don't want the cache too big, or it will take up a lot of memory. We suggest 1000-10000 as the optimal number depending on your system. +* **Max Document Retries**: How many times to attempt a document before erring. +* **BFS Integration**: Check if output connector is BFS (Bulk File System). +* **Include Parent Folder Properties**: Check to include +* **Parent Folder Properties**: The number of levels of parent properties you want. 1 is the parent, 2 is the parent and grandparent, etc... +* **Include ACLs**: Check box to include +* **dctm.includeFoldersDesc**: Check box to include the folder description. +* **Filesystem Staging Location**: Enter a location on the filesystem to stage documents or leave blank to use in-memory staging. +* **Use Mounted Drive for Binary**: Check to use a mounted drive to retrieve binary using getPath on DFC Document. +* **All versions**: Check to retrieve all versions of a Document. +* **Use Renditions**: Check to retrieve the renditions of the document. +* **Ignore Use Renditions Mime Types**: Comma delimited list of mime types to ignore using renditions. +* **Use First Matching Rendition as Binary**: Check to use the first Rendition that matches as the Document Binary (Include Binaries and Use Renditions also have to be checked) +* **First Rendition MimeType to match and use as Binary**: + * If the Use First Rendition as Binary box is checked, this field is the MimeType of the Rendition to match (defaults to application/pdf if left blank or fed invalid value). + * If ANY MimeType to Match is acceptable EXCEPT a specific MimeType. Use: NOT(mimetype) where mimetype is the mimetype you would like to only have a rendition and NOT the binary + * (for example, NOT(application/pdf) will use the first rendition that is NOT of the mimetype application/pdf.) + +**Repository Cache Options** + +Max Number of Items in Cache:Maximum number of folders to keep cached + +###### Troubleshooting + +**Detecting Resource Leaks** + +In a case of Troubleshooting the Documentum DFC Connector, there may be the need to look for resource leaks. To detect these leaks, a property will need to be added to your dfc.propertiesfile. If you do not have adfc.propertiesfile, create one in the web application'sWEB-INF/classes directory with the single entry. This will allow for the detection of the leaks and provide a statement about the cause of the leak in your log files. The entry to add to your log file isdfc.diagnostics.resources.enable=true + +**Documentum DFC External Dependencies** + +Federation Services comes pre-packaged with some required dependencies for Documentum. If you experience errors related to missing classes or any errors stemming from the DFC connector classes you may need to replace existing DFC dependencies with files from your targeted Documentum server. Federation Services is currently compatible with Documentum v5 and higher. + +1. Locate the following jars on your Documentum server: + +* **dfc.jar** +* **configservice-api.jar** +* **configservice-impl.jar** + +2. Copy those jars to your Federation Services server +3. **Delete** the **dfc-1.0.jar** file from the **tomcat/webapps/3sixty-admin/WEB-INF/lib** directory. +4. Place Documentum jars in the **tomcat/webapps/3sixty-admin/WEB-INF/lib** directory. +5. **Restart** Federation Services. + +Note: There are known compatibility issues with the external DFC dependencies and Java 11. If you are using Java 11and experience start-up errors after adding the external dependencies, please consider using Java 8. + +##### Content Service Connector + +**Note:** An Auth connector is not needed for the Documentum DFC content service connector. For Security Mode, choose **Service Provided Credentials** + +**Managing Permissions with Documentum DFC Content Services** + +As of Version 2.7.6, this connector also offers permissions support using the /acls content service endpoint. +The API supports GET, POST, and DELETE calls. +All the endpoints take the "id" parameter, which takes the form of a string. +The methods currently supported for this connector are: + +* Create Folder +* Create File +* Update File +* Get Object by path +* Update Properties +* Get File Content +* Get Object Properties +* Delete Folder +* Get Root Folder ID +* List Folder Items +* Delete Object by ID +* Get Types + +#### DocuShare + +A content management system developed by Xerox Corporation. Federation Servicestion Services supports connection to DocuShare versions 7.0 and newer. + +##### Connecting to DocuShare + +When setting up DocuShare, make sure you open all the rmi access ports for the DocuShare server. RMI will establish communication via the server port configured (defaults to 1099), however continued transmission takes place on random high number ports. + +> **Tip:** If you suspect a firewall is causing connection issues, open all ports and use ip restrictions to the Federation Services server in order to restrict unwanted access. + +**Encrypted Content** + +If you are using encryption on content in your environment you will need to add the **cryptoContent.jar** from your DocuShare class path to Federation Servicestion Services's class path. + +**Access and Permissions** + +When accessing content with a system user, the user assigned should be a Content Administrator. This will ensure you have the appropriate access to read all content and all collections. You can add your system user to the Content Administrators group to give them the appropriate level of access. + +**Other Resources for Developers** + +Download API documentation and other developer resources by signing up here: [Xerox DocuShare](https://docushare.xerox.com/dsdn/dsweb/HomePage){:target="_blank"} + +##### Authentication Connection + +Used to authenticate repository/output connections that need certain authentication fields like access tokens or refresh tokens. + +**Authentication Connection Fields** + +* **Name**: This is a unique name given to the connector instance upon creation. +* **Username**: The username of a user with privileges to access targeted content +* **Password**: The user's password. +* **Server URL**: The host url without protocol. (RMI is used, no protocol is necessary) +* **Server Port**: The port to use when establishing an RMI connection with DocuShare. Defaults to 1099. The port used to establish the initial communication to DocuShare may not be the same port used to execute requests. +* **Domain**: The domain for the target directories. Out-of-the-box this is set to **DocuShare** + +##### Discovery Connector + +Discovery is the 2nd step in the integration process. Create an instance, select a connector and a schema will be produced based on the connector's configuration. Includes a list of all object types as well as attributes stored in each. This function discovers schemas on the remote system. These are tables, columns, object types, aspects, categories, content types, index fields, etc... + +**Discovery Instance Configuration Fields** + +* **Name**: Unique name for your connector +* **Authentication Connection**: Select the auth connector for this discovery +* **Ignore Types (comma delimited list)**: Chose document types to ignore when running discovery + +##### Integration Connection + +The DocuShare Integration Connection must include a DocuShare Authentication Connector in order to connect. Once added to a job, you will be able to configure the location of your DocuShare data in the Job Specification. + +**DocuShare Integration Connection Fields** + +* **Connection Name**: This is a unique name given to the connector instance upon creation. +* **Description**: A description of the connector to help identify it better. +* **Connector Class**: The class of this connector that implements the connector interface. The connector class helps identify the current connector. +* **Authentication Connection**: The Authentication connection that you want to use. + +##### Job Configuration + +**DocuShare Object Selection Job Configuration** + +* **DocuShare Query**: (Optional) - Text that will be used as part of a search against the docuShare repo. When used, folder crawling does not take place. +* **Root Folders**: A comma delimited list of directories to crawl. +* **Workspaces**: A comma delimited list of workspaces to crawl. +* **Crawl User Personal Collections**: When checked, Federation Services will crawl all directories in user personal collections. +* **Process Collections**: A collections (folders) to the document queue for processing. +* **Include Message Attachments** +* **The rate in MBs to read DocuShare binaries**: (0 to read the file all at once) + +##### Content Service Connector + +##### Retrieving Object Permissions + +Retrieving ACLs follows the standard format. You will need to send Federation Services the Document id for the target document or collection. The document id is the .getHandle().toLongString(). This means the id includes a reference to the host location: **Document-54:ec2-34-228-158-26.compute-1.amazonaws.com** + +**Example**: +**CURL** + +```text +curl -X GET -u admin:admin 'http://localhost:8081/simflofy- +admin/repo/ds/acls?id=Document-54:ec2-34-228-158-26.compute-1.amazonaws.com' +``` + +**Output** + +```text +{ +"results": [ +"test[User-11:ec2-34-228-158-26.compute-1.amazonaws.com]:manage,write_object,read_object,read_linked,write_linked,read_history,search", +"admin[User-2:ec2-34-228-158-26.compute-1.amazonaws.com]:manage,write_object,read_object,read_linked,write_linked,read_history,search", +"Content Administrators[Group-2:ec2-34-228-158-26.compute-1.amazonaws.com]:manage,write_object,read_object,read_linked,write_linked,read_history,search" +], +"success": "true" +} +``` + +The returned result is in the formation of "userName[user- handle]:permission1,permission2...". The user handle is the user's ID for DocuShare and can be used to update permissions. + +##### Setting Object Permissions + +When updating permissions of an object you will need to send an **encoded** JSON string as the **acls** argument that includes the handle (id) of the authority you want to change. + +**Permission Options** + +* all +* read_all +* write_all +* manage +* write_object +* write_linked +* read_object +* read_linked +* read_history +* search + +**Example**: + +Update a single user's permissions + +`{"User-11:ec2-34-228-158-26.compute-1.amazonaws.com":"read_object,read_linked,read_history,search"}` + +Update a group's permissions + +`{"Group-7:ec2-34-228-158-26.compute-1.amazonaws.com":"read_all"}` + +**CURL** + +```text +curl -u admin:admin -X POST 'http://localhost:8081/simflofy- +admin/repo/ds/acls?id=Document-54:ec2-34-228-158-26.compute-1.amazonaws.com&acls=%7B%22User-11%3Aec2-34-228-158-26.compute-1.amazonaws.com%22%3A%22manage%2Cwrite_object%2Cread_object%2Cread_linked%2Cwrite_linked%2Cread_history%2Csearch%22%7D' +``` + +**Output:** + +```text +{ +"results": [ +"test[User-11:ec2-34-228-158-26.compute-1.amazonaws.com]:manage,write_object,read_object,read_linked,write_linked,read_history,search", +"admin[User-2:ec2-34-228-158-26.compute-1.amazonaws.com]:manage,write_object,read_object,read_linked,write_linked,read_history,search", +"Content Administrators[Group-2:ec2-34-228-158-26.compute-1.amazonaws.com]:manage,write_object,read_object,read_linked,write_linked,read_history,search" +], +"success": "true" +} +``` + +**Error Output:** + +```text +{ +"message": "Exception while setting access controls for id Document-54:ec2-34-228-158-26.compute-1.amazonaws.com and connector with id ds", +"error": "In three-bit permission mode, all of the read bits must be the same value as each other and all of the write bits must be the same value as each other", +"success": false +} +``` + +In the above error, you are attempting to use an illegal combination of permissions. + +```text +{ +"message": "Exception while setting access controls for id Document-54:ec2-34-228-158-26.compute-1.amazonaws.com and connector with id ds", +"error": "Could not find connection with id ds", +"success": false +} +``` + +In the above error, we used a connector ID that does not exist in Federation Services. + +##### Deleting Object Permissions + +When deleting permissions of an object you will need to send an encoded comma separated string as the aclsid argument. This will be a list of principal handles to be deleted. +**Example**: Delete a single principal Group-6:msedgewin10.local +**CURL** + +```text +curl -u admin:admin -X POST 'http://localhost:8081/simflofy- +admin/repo/ds/acls?id=Document-54:ec2-34-228-158-26.compute-1.amazonaws.com&aclId=Group-6%3Amsedgewin10.local +``` + +**Output** + +```text +{ +"success": true, +"results": "Group-6:msedgewin10.local" +} +Error (invalid principal) +{ +"message": "Error while deleting access controls [id:Document-141] [permissions:1Group-6:msedgewin10.local] for connection docushare-test Error: modifyAclEntries; nested exception is: \n\tcom.xerox.docushare.db.DatabaseException: This class does not exist: 1Group", +"error": "modifyAclEntries; nested exception is: \n\tcom.xerox.docushare.db.DatabaseException: This class does not exist: 1Group", +"success": "false" +} +``` + +##### Supported Methods + +The methods currently supported for this connector are: + +* Create Folder +* Get Object by path +* Update Properties +* Get File Content +* Get Object Properties +* Delete Folder +* Get Root Folder ID +* List Folder Items +* Delete Object by ID +* Get Types +* Get Type Definition +* Get File Item +* Get ACLs +* Set ACLs +* Delete ACL +* Delete Version +* Get Version Properties +* Get Version Content +* List Versions +* Revert Version (makes the version the preferred version) +* Check In (unlocks the file, does not create a new version) +* Check Out (locks the file) + +#### DocuWare + +DocuWare provides cloud document management and workflow automation software that enables you to digitise, secure and work with business documents, then optimise the processes that power the core of your business. [https://start.docuware.com/](https://start.docuware.com/){:target="_blank"} + +##### Authentication Connection + +**Configuration** + +* **Name**: This is a unique name given to the connector instance upon creation. +* **Username**: The username of a user with privileges to access targeted content +* **Password**: The user's password. +* **Server URL**: The host url without protocol. +* **Default File Cabinet**: DocuWare Document location +* **Organization Name**: Used within the Federation Services platform for multi-tenancy. +* **Domain**: The domain for the target directories. + +##### Discovery Instance + +**Configuration** + +* **Name**: Unique Name for the Discovery Connection to identify it in the UI. +* **Authentication Connection**: The Authentication connection that you want to use. +* **Ignore Types**: Comma delimited list of types to ignore. Note that you can have regex as well. So to ignore all types with "workflow" in the name, you would enter(.)workflow(.) into the ignore types textbox. + +##### Integration Connection + +**Configuration** + +* **Connection Name**: This is a unique name given to the connector instance upon creation. +* **Description**: A description of the connector to help identify it better. +* **Connector Type**: The type of connector. In the screenshot above you can see that it's a CMIS Output Connector type. +* **Connector Class**: The class of this connector that implements the IOutputConnector interface. You may have different connector types that write to the same type of repository. +* **Authentication Connection**: None needed for this connection + +##### Job Configuration + +**Repository Configuration** + +* **Cabinet List**: List of Docuware file cabinets + +**Output Configuration** + +* **Date Time Configuration**: When setting up your migration job using DocuWare you have the option to configure the date and time using the DateTime Config tab. + +##### Content Service Connection + +**Basic Configuration** + +* **Connector ID**: Give your connector a unique name +* **Description**: Provide a description for this connection +* **Type**: Select your DocuWare connector +* **Keep Connection Alive**: Keep this connection active +* **Keep alive in Milliseconds (300000 is 5 minutes)**: How long until connection expires if unused +* **Connection URL**: The web address for your connection +* **Security mode**: Select your preferred type of security credential access(Service Provided, User Pass through or Authentication Connector) +* **Mapping Type**: Choose a single map or group mapping + +**Connection Configuration** + +* Extra parameters can be passed to the content service connection and vary by connection. + +**Supported Methods** + +The methods currently supported for this connector are: + +* Delete Object By Id +* Get Object Properties +* Get Types +* List Folder Items +* Update Properties + +#### Dropbox + +Dropbox is a file hosting service operated by the American company Dropbox, Inc., head quartered in San Francisco, California, that offers cloud storage, file synchronisation, personal cloud, and client software. + +With Dropbox bring Your Files & Cloud Content With the Tools Your Team Wants To Use. Easily Access Your Teams Work From Your Computer, Mobile Device, or Any Web Browser. Password-Protected Links. Extended File Recovery. + +There are 3 ways to connect to Dropbox: + +**Regular Dropbox OAuth**: This allows us to connect to the Dropbox API. This authenticates with only one user, and any content must be able to be accessed by that user. +**Dropbox for Business OAuth**: This allows us to connect to the Dropbox For Business API. This will require an Admin to login for a Dropbox for Business +**Developer Token**: These last about 1 hour and are good for testing or providing temporary access. + +##### Application Setup + +First, you'll need Dropbox account. + +Then go to: [Dropbox Developer Apps](https://www.dropbox.com/developers/apps){:target="_blank"}. + +* Click the Create app button +* Create your app under My Apps +* Select the Scoped access permission model +* Select Full Dropbox for the access type +* Name your app +* Check the I agree box +* Click the Create app button + +Now, you should be able to go to your app control panel. You have two options + +Add the following to the redirect uri: + +`https://{simflofy instance}/3sixty-admin/authconn/oauthcb` + +**Use the Access Code** + +Hit "Generate Access Token" and copy the code. That's it! + +Back in Federation Services, create or edit your authentication connection and enter the auth code in **Client Auth** + +**Key and Secret** + +Now, grab your App key and secret. Make sure, if you copy them, you didn't grab any extra spaces. + +Back in Federation Services, create or edit your authentication connection and enter your app key and secret and hit "Authenticate". If this is a business application, check the "Use Business API" checkbox first. + +You will be asked to log into your Dropbox account and give your app access permission. You will then be returned to Federation Services and you can save your access tokens. + +For a business connection, you will have a drop-down for team members in the connection upon editing the connection again. Any action taken with this auth connection will be performed as that member. + +##### Authentication Connection + +**Important:** REQUIREMENTS + +Federation Services must be running with SSL (https://). + +* **Name**: Unique name for this auth connector. +* **Dropbox App Key**: Client ID Dropbox will give you once you've set up the Application in Dropbox. +* **Dropbox Secret Key**: Secret Key Dropbox will generate for you as part of the Application Setup in Dropbox. +* **Dropbox Client Auth Code**: Optional Developer Token to be used instead of requiring users to login. +* **Business API**: Optional Flag for whether to use the Dropbox For Business API (Checked)or the regular Dropbox API (Unchecked). + +##### Discovery Connector + +Dropbox only has two core types, Files and Folders. Custom metadata takes the form of templates. These templates have names and field groups. These templates will appear as a type in the discovery report. + +**Discovery Instance Fields** + +* **Name**: Unique Name for the Discovery Connection to identify it in the UI. +* **Authentication Connection**: The Authentication connection that you want to use. +* **Ignore Types**: Comma delimited list of types to ignore. Note that you can have regex as well. So to ignore all types with "workflow" in the name, you would enter(.)workflow(.) into the ignore types textbox. +* **Folder Path**: The directory location where your files are stored. + +##### Integration Connector + +The Dropbox Integration Connection is designed to write content, and it's associated metadata into a specified Dropbox location. It is also for retrieving content, and it's associated metadata from Dropbox. Utilising the Dropbox Java SDK and Dropbox APIs, the Dropbox Integration Connection allows the user to obtain content and metadata from their specified Dropbox Location. + +* **Connection Name**: This is a unique name given to the connector instance upon creation. +* **Description**: A description of the connector to help identify it better. +* **Authentication Connector**: Your FileNet Auth Connector + +##### Job Configuration + +**Repository** + +* **Repository Folders**: Comma delimited list of folder paths to crawl +* **Get Folders**: Process Folders + +**Output Specification** + +* **Target Folder**: The path of the target folder +* **Max Retries before failing a document**: Dropbox retries uploads automatically if they fail. This will set the number of retries. +* **Generate Templates**: Federation Services will attempt to generate metadata templates based on mappings. + +**GENERATING TEMPLATES AND JOB MAPPINGS** +You can use a calculated field to map to a property template. You may either use the Output Type and Target drop-downs. If you would like to dynamically create these templates, create a calculated field mapping with the output as `[template].[field]`. + +If the "Generates Templates" checkbox is set on the output, the connector will generate a template (if it doesn't already exist) using any fields with the same template name. + +##### Content Service Connector + +This section covers the Dropbox specific configuration of the Content Service Connector. + +**Basic Configuration Fields** + +* **Connector ID**: Give your connector a unique name +* **Description**: Provide a description for this connection +* **Type**: Select your DocuWare connector +* **Keep Connection Alive**: Keep this connection active +* **Keep alive in Milliseconds (300000 is 5 minutes)**: How long until connection expires if unused +* **Connection URL**: The web address for your connection +* **Security mode**: Select your preferred type of security credential access(Service Provided, User Pass through or Authentication Connector) +* **Mapping Type**: Choose a single map or group mapping + +**Connection Configuration** + +* Extra parameters can be passed to the content service connection and vary by connection. + +**Supported Method** + +* Create File +* Create Folder +* Delete Folder +* Delete Object By Id +* Get File Content +* Get Object Id By Path +* Get Object Properties +* Get Types +* List Folder Items +* List Versions +* Update File + +#### Email + +These connections can be used to integrate data from your email servers with a few easy steps. + +##### Authentication Connection + +Used to authenticate repository/output connections that need certain authentication fields like access tokens or refresh tokens. + +**Configuration** + +* **Connection Name**: Unique Name for the Auth Connection to identify it in the UI. +* **Username**: The username to authenticate with the repository if applicable. +* **Password**: The password to authenticate with the repository if applicable. +* **Server URL**: URL of the email service location. +* **Server port**: The port number that your email server is listening on. +* **Protocol**: The email protocol type being used (IMAP, IMAPS, POP3, GIMAP, PST) + +##### Discovery Connector + +**Schema Instance Configuration** + +* **Name** +* **Authentication Connection** +* **Ignore Types** + +##### Integration Connection + +Also known as input and output connections. Their job is to query or crawl remote systems for files, folders, metadata, versions, and renditions. + +**Configuration** + +* **Connection Name**: This is a unique name given to the connector instance upon creation. +* **Description**: A description of the connector to help identify it better. +* **Authentication Connection**: Your email auth connection + +##### Job Configurations + +**Email Repository Job Specification** + +* **Max Emails Returned** +* **Email Folder** +* **Search Terms** + +##### Content Service Connections + +**Supported Methods** + +* Create File +* Update File +* Update Properties +* Get File Content +* Get Object Properties +* Get Edit Properties +* Get Content +* Get Root Folder ID +* List Folder Items +* Delete Object by ID + +#### Ephesoft + +Ephesoft offers a suite of Smart Capture Document Scanning Software Products that automatically classify, separate, sort, and extract data from paper, fax, and electronic documents. + +##### Discovery Connector + +Federation Servicestion Services's Ephesoft Discovery Connector can be used to discover the metadata of your Ephesoft repository. This will include content types and their associated properties. + +Viewing the schema instances will show you a table of all available Discovery Instances, this table can be sorted by Name, Type, and Available Versions. + +From the Discovery Connector page you can view the most recently created schema instances as well as created new ones. + +To create a new Discovery Connection, click the Create New Discovery Instance button at the bottom of the Schema Instances Page. Fill in the following fields. + +**Discovery Schema Instance Configuration** + +* **Name**: Unique Name for the Discovery Connection to identify it in the UI. +* **Ignore Types**: Comma delimited list of types to ignore. Note that you can have regex as well. So to ignore all types with workflow in the name, you would enter (.)workflow(.) into the ignore types text box. +* **Batch Path**: The path to the batch folder + +#### File Transfer Protocol (FTP) + +Configuration for the FTP connectors can be applied in the Server tab of the connector edit page. + +##### Authentication Connection + +**Connection** + +**Authentication Fields** + +* **Username**: The username to authenticate with the repository if applicable. +* **Password**: The password to authenticate with the repository if applicable. +* **Server URL**: Full URL of the ftp server. +* **Server Port**: The port of the ftp server. Default is 23. +* **Is Implicit**: Is Implicit security mode. Your server will most likely dictate which to use. +* **Use FTPS**: This is SSL(TLS) based FTP + +**Proxy Information** + +**iManage Auth Proxy Information** + +* **Full Proxy Url**: The proxy host. +* **Proxy Port**: The proxy port +* **Proxy User**: Proxy User +* **Proxy Password**: ProxyPassword + +##### Integration Connection + +Also known as input and output connections. Their job is to query or crawl remote systems for files, folders, metadata, versions, and renditions. + +**Integration Connection Fields** + +* **Connection Name**: This is a unique name given to the connector instance upon creation. +* **Description**: A description of the connector to help identify it better. +* **Connector Type**: The type of connector. In the screenshot above you can see that it's a CMIS Output Connector type. +* **Connector Class**: The class of this connector that implements the IOutputConnector interface. You may have different connector types that write to the same type of repository +* **Authentication Connection**: None needed for this connection + +##### Job Configurations + +**Email Repository Job Specification Fields** + +* **File Path**: The location of your folders and files that you want Federation Services to access + +**Output Configuration** + +This connection cannot be used as an output source + +##### Content Service Connector + +**Basic Configuration Fields** + +* **Connector ID**: A unique identifier for this connection i.e. FTP Content Service Connector (Alphanumeric, dashes and underscore characters only) +* **Description**: The text that will be displayed on drop-downs etc. to identify this connection. +* **Connector ID**: Give your connector a unique name +* **Description**: Provide a description for this connection +* **Type**: Select the Filesystem Content Service Connector +* **Keep Connection Alive**: Keep this connection active +* **Keep alive in Milliseconds (300000 is 5 minutes)**: How long until connection expires if unused +* **Connection URL**: The web address for your connection +* **Security Mode**: None needed for this connection +* **Mapping Type**: Choose single map or group mapping if you are using mapping for jobs + +**Connection Configuration** + +* **Root Folder** +* **Encrypt Data** +* **EPSV With IPV4** +* **Add Custom Parameters** + +The methods currently supported for this connector are: + +* Create File +* Create Folder +* Delete Folder +* Delete Object By Id +* Get File Content +* Get Object Id By Path +* Get Object Properties +* Get Types +* List Folder items +* Update File + +#### IBM CMOD ODWEK + +IBM Content Manager OnDemandWeb Enablement Kit allows users to access data that is stored in an IBM Content Manager OnDemand server with IBM Content Navigator or a user-written program. + +There is no Discovery Instance or Content Service Connection available for IBM Content Manager on Demand. + +##### Authentication Connection + +**Connection Fields** + +* Name +* Username +* Password +* Server URL +* Server Port +* Application Name ( Optional) +* DB2 Server +* DB2 Port +* DB2 Database +* DB2 User +* DB2 Password + +##### Integration Connection + +**Connection Fields** + +* **Connection Name** +* **Connector Type** +* **Connector Class** + +##### Federation Services Setup + +This setup is for CMOD ODWek version 9.5 (64 bit). Other versions of ODWek can also be used with Federation Services but the supporting libraries in this setup are located in different places depending on the version of CMOD/ODWek you are using. + +1. In **3sixty-admin/WEB-INF/classes** create the following folder structure: com/ibm/edms/od +2. Copy **ArsSVTInterface.class** from C:/Program Files/IBM/OnDemand/V9.5/www/servlets into the folder created in step 1 +3. Copy C:/Program Files/IBM/OnDemand/V9.5/www/servlets/ArsWWWServlet.jar to 3sixty-admin/WEB-INF/lib +4. Copy C:/Program Files/IBM/OnDemand/V9.5/www/api/ODApi.jar to 3sixty-admin/WEB-INF/lib +5. Copy C:/Program Files/IBM/OnDemand/V9.5/www/ars3wapi64.dll into C:/Program Files/IBM/OnDemand/V9.5/bin +6. Add the following directory to your Windows PATH C:/Program Files/IBM/OnDemand/V9.5/bin +7. Restart/Start the Tomcat instance that Federation Services is installed on and setup is complete. + +##### Job Configuration + +A Federation Services Job is the process of moving or syncing content (including versions, ACLs, metadata) from one CMS (content management system) to another. + +**Repository Configuration Fields** + +* Folder Search Criteria +* Document SQL Search +* Process Folders + +**Output Configuration Fields** + +* Output Folder Path +* Include Un-Mapped Properties + +#### IBM FileNet + +IBM FileNet Content Manager is a flexible, full-featured content management solution that provides the foundation for the IBMCloud Pack for Business Automation. Use it to create innovative business applications on any cloud and more effectively manage all your content, from any source. + +##### Authentication Connection + +An Authentication Connector is required to connect to any FileNet instance. Click here for more information on setting up an Authentication Connection. + +**Authentication Connection Configuration** + +* **Name**: The Authentication connector name. +* **Username**: The username +* **Password**: The password +* **Host**: The URL or Path to connect to. +* **Server Port**: The connection port (defaults to 9080) +* **Protocol**: Choose between http or https (for SSL). +* **Repository Name**: The name of the repository you're attempting to connect to. This is not the ID. +* **Connection Timeout**: Time to wait for a connection. A value of zero waits for infinity + +FILENET API +Federation Services currently leverages the FileNet P8 API v5.2.0 + +**Example** + +* **Name**: FileNet Demo Authentication Connection +* **Username**: Admin +* **Password**: Password +* **Host**: `http://ec2-52-4-181-197.compute-1.amazonaws.com` +* **Server Port**: 9080 +* **Protocol**: HTTP +* **Repository Name**: P8G6ObjectStore +* **Connection Timeout**: 30000 + +##### Discovery Connector + +**Discovery Instance Fields** + +* **Name**: Unique Name for the Discovery Connection to identify it in the UI. +* **Authentication Connector**: Select your FileNet Authentication Connector +* **Ignore Types**: (Optional) A comma delimited list of types to ignore. + +##### Integration Connector + +**Integration Connection Configuration** + +* **Connection Name**: This is a unique name given to the connector instance upon creation. +* **Description**: A description of the connector to help identify it better. +* **Authentication Connector**: Your FileNet Auth Connector + +##### Job Configuration + +**FileNet Repository Job Configuration** + +* **FileNet Query**: This query will gather the document Ids to be transferred. + * Sample Document Query: `Document d WHERE d.[Creator] = "jsmith"` + * Sample Folder Query: `Folder f WHERE f.This INSUBFOLDER '\4523'` + * See FileNet Query Documentation [here](https://www.ibm.com/docs/en/filenet-p8-platform/5.5.x?topic=reference-query-syntax){:target="_blank"}. +* **Process Folders** Tells Federation Services you are using a folder query. This will treat folders as documents, allowing you to extract metadata and transform folders in the process. + +> **Note:** When choosing to **process folders** make sure you apply a **Folder** query. + +* **Name Property**: The property to check to set the Filename. Will default to DocumentTitle if prop is empty. (Document queries only.) +* **Query Limit**: When populated, will set a limit on the number of IDs returned from a Repository query. If blank, the server default values will be used. +* **Page Size**: Sets the page size for the FileNet query. Default value is 200 +* **Get Versions**: Retrieve document version numbers +* **Documents have multiple binaries**: Check to include +* **Get Annotations**: Check to include +* **Filesystem Staging Location** +* **Filesystem Staging Timeout (Seconds)** + +**FileNet Output Job Configuration** + +* **Output Folder Path** Cannot be root folder (/) +* **Do Not File new Documents**: Output Path will be ignored, no new paths will be generated +* **Do not check if document is filed before adding it to a folder**: Will version if the file already exists. + +##### Content Services Connector + +The only configuration required for this connector is the FileNet authentication connection. + +**Supported Methods** + +* Create File +* Create Folder +* Update File +* Update Document Properties +* Get File Content +* Get Document Properties +* Delete Folder +* List Folder Items +* Delete Document +* Get Permissions +* Set Permissions +* Delete Permissions +* Check In +* Check Out +* Create Version +* Delete Version +* Get Version Properties +* Get Version Content +* List Versions +* Revert Version + +**Content Services Basic Configuration** + +* **Connector ID**: A unique identifier for this connection i.e. simflofy_demo(Alphanumeric, dashes and underscore characters only) +* **Description**: The text that will be displayed on drop-downs etc. to identify this connection. +* **Type**: The type of Search Connection (Solr, Mongo, Alfresco Faceted etc.) +* **Keep Connection Alive**: How long until connection is expired if unused. +* **Keep Alive in Milliseconds**: How long until connection is expired if unused. +* **Security Mode** +* **Authentication Connection** +* **Pass-through Credentials** +* **Mapping Type** + +##### Managing Permissions + +As of Version 2.7.6, this connector also offers permissions support using the [/acls](https://api.simflofy.com/#/Content%20Service/getAccessControlsUsingGET){:target="_blank"} content service endpoint. + +* The API supports `GET`, `POST`, and `DELETE` calls. +* All endpoints require an **id** parameter. For example, id=6385C1A5-EF01-45F1-86C3-FDC3C4E3B6A8 +* All endpoints also take the **isFolder** parameter, which tells the API whether the item is a file or folder. Default to false. + +Federation Services has a number of default access templates for FileNet. They were created using the following tables: + +**Folders**: [Folder security levels](https://www.ibm.com/support/knowledgecenter/SSGLW6_5.2.0/com.ibm.p8.security.doc/p8psa046.htm){:target="_blank"} +**Files**: [Document security levels](https://www.ibm.com/support/knowledgecenter/SSGLW6_5.2.0/com.ibm.p8.security.doc/p8psa044.htm){:target="_blank"} + +**Templates:** + +* MODIFY_PROPERTIES +* VIEW_PROPERTIES +* FULL_CONTROL +* PUBLISH_DOCUMENT +* MAJOR_VERSIONING +* MINOR_VERSIONING +* ADD_TO_FOLDER +* MODIFY_FOLDER_PROPERTIES + +###### Read Permissions (ACLs) + +**Request** + +`GET /api/repo//acls?id=&listAll=&isFolder=` + +Description: + +Retrieves a list of in the format of `["Grantree:Access1,Access2",..... ]` + +Path Parameters: + +* **connectorid**: The connector id of your content service connector + +Query Parameters: + +* **id**: The repository id of the item. + +Optional Parameters: + +**listAll**: Boolean value. If the access lists falls under a default permissions sets and this is true, will list all permissions instead of template names. Default false, +**isFolder**: Is the item a folder? Default false. + +**Example** + +`GET /api/repo/fn/acls?id=6385C1A5-EF01-45F1-86C3-FDC3C4E3B6A8` + +Returns: + +```text +{ +"results": [ +"cn=P8User,O=SAMPLE:FULL_CONTROL", +"cn=P8Viewer,O=SAMPLE:VIEW_PROPERTIES" +], +"success": "true" +} +``` + +Example With CURL + +`curl -u admin:admin "localhost:8081/3sixty-admin/api/repo/fn/acls?id=6385C1A5-EF01-45F1-86C3-FDC3C4E3B6A8" | json_pp` + +###### Write Permissions (ACLs) + +Request: `POST /api/repo//acls?id=&isFolder=` + +Description: + +Adds or replaces permissions for a user/group/grantee + +Preset template and the breakdown for each is found above. + +If the grantee already exists, their list will be replaced with the posted access rights. + +Path Parameters: + +**connectorid**: The connector id of your content service connector + +Query Parameters: + +**id**: The repository id of the item. + +Request Body: + +A JSON in the format `{"Grantee":"Template1,Access1,..."}` + +Optional Parameters: + +**isFolder**: Is the item a folder? Default false. + +**Example** + +`POST /api/repo/fn/acls?id=6385C1A5-EF01-45F1-86C3-FDC3C4E3B6A8` + +Body: `{"cn=TESTUser,0=SAMPLE":"READ_ACL,VIEW_CONTENT,WRITE_ACL"}` + +Returns: + +```text +{ +"results": [ +"cn=P8User,O=SAMPLE:FULL_CONTROL", +"cn=P8Viewer,O=SAMPLE:VIEW_PROPERTIES", +"cn=TESTUser,0=SAMPLE:READ_ACL,VIEW_CONTENT,WRITE_ACL" +], +"success": "true" +} +``` + +###### Delete Permissions (ACLs) + +Request: + +`DELETE /api/repo//acls?id=&aclId=&isFolder=` + +Description: + +Removes a grantee from the item. + +Path Parameters: + +connectorid : The connector id of your content service connector + +Query Parameters: id: The repository id of the item. + +aclId: A pipe (`|`) delimited list of grantees to remove. + +Optional Parameters: isFolder: Is the item a folder? Default is false. + +`DELETE /api/repo/fn/acls?id=6385C1A5-EF01-45F1-86C3-FDC3C4E3B6A8&aclId=cn%3DTESTUser,0%3DSAMPLE|cn%3DTESTUser2,0%3DSAMPLE` + +Returns: + +```text +{ +"success": "true" +} +``` + +A GET call should not return: + +```text +{ +"results": [ +"cn=P8User,O=SAMPLE:FULL_CONTROL" +], +"success": "true" +} +``` + +Example With cURL + +`curl -u admin:admin -X DELETE "localhost:8081/3sixty-admin/api/repo/fn/acls?id=6385C1A5-EF01-45F1-86C3-FDC3C4E3B6A8&aclId=cn%3DTESTUser,0%3DSAMPLE|cn%3DTESTUser2,0%3DSAMPLE" | json_pp` + +###### Retrieving Annotations + +**3.0 and 3.1** + +While annotations can be gathered from the queried documents, accessing the annotations requires a JavaScript task to allow them to be exported as document fields. This will change in future versions. + +The following code will retrieve the annotations for each document and add each as a field + +```text +var rp = rd.getExtendedProperties().toString(); +rp = rp.replace('[','').replace(']',''); +print(rp); +var split = rp.split(','); +var i = 0; +for each (var r in split){ +rd.addSingleField('annotation'+i,r); +i++; +} +``` + +**3.1.1+** + +Annotations will be added as fields to the document with the name annotationX, where X is an integer. + +#### iManage + +iManage is a system to store, Organize and manage documents email and related content. You create top-level spaces called projects, each project can hold documents, emails, folders and so forth. +[imanage.com](http://imanage.com/){:target="_blank"} + +##### Authentication Connection + +The iManage Auth Connector is designed to capture the required authentication credentials for an iManage System. Used to authenticate repository/output connections that need certain authentication fields like access tokens or refresh tokens. + +**Connection Fields** + +* **Connection Name**: Unique Name for the Auth Connection to identify it in the UI. +* **Username**: The username to authenticate with the repository if applicable. +* **Password**: The password to authenticate with the repository if applicable. +* **Server URL**: URL of the service. +* **iManage Database** +* **iManage Default Workspace ID (Client Matter ID)** +* **Security**: default is public + +**iManage Auth Proxy Information** + +* **Full Proxy Url**: The proxy host. +* **Proxy Port**: The proxy port +* **Proxy User**: Proxy User +* **Proxy Password**: Proxy Password + +##### Discovery Connector + +Every Discovery Connector can define custom fields that it needs to be able to connect to and discover the repository. +**Instance Connection Fields** + +* **Name**: Unique Name for the Discovery Connection to identify it in the UI. +* **Authentication Connection**: A predefined connection for authentication. +* **Ignore Types**: Comma delimited list of types to ignore. Note that you can have regex as well. So to ignore all types with "workflow" in the name, you would enter(.)workflow(.) into the ignore types textbox. + +##### Integration Connection + +Also known as input an output connections. Their job is to query or crawl remote systems for files, folders, metadata, versions, and renditions. + +**Integration Connection Configuration Fields** + +* **Connection Name**: This is a unique name given to the connector instance upon creation. +* **Description**: A description of the connector to help identify it better. +* **Authentication Connection**: Your iManage auth connection + +##### Job Configuration + +**iManage Output Job Configuration** + +* **Output Folder Path** +* **Include Un-Mapped Properties** + +**iManage Repository Job Configuration** + +* **Folders to Crawl**: Comma Delimited +* **Client IDs**: (Comma delimited. If entered, client ID's will take precedence over folders) +* **Get Versions?** + +##### Content Service Connection + +**Content Service Connection Fields** + +* **Connector ID**: Give your connector a unique name +* **Description**: Provide a description for this connection +* **Type**: Select the Filesystem Content Service Connector +* **Keep Connection Alive**: Keep this connection active +* **Keep alive in Milliseconds (300000 is 5 minutes)**: How long until connection expires if unused +* **Connection URL**: The web address for your connection +* **Security Mode**: None needed for this connection +* **Mapping Type**: Choose single map or group mapping if you are using mapping for jobs + +**Supported Methods** + +* Create a File +* Create a Folder +* Get File Content +* Get Object Properties +* Get ID by Path +* Get Types +* Get Type Definition +* List Folder items +* List Versions +* Update File +* Update Properties + +#### Infor + +ERP Cloud Software Integration - Migrate and Federate with Infor. Infor is an enterprise software company that focuses on business applications for organisations delivered via cloud computing as a service. + +##### Authentication Connection + +**Infor Authentication Connector Fields** + +* **Name**: Give your Infor connection a Unique name +* **Username**: The name of the user to authenticate with your Infor server +* **Password**: The password of the user authenticating with Nuxeo +* **Web Service URL**: The URL to you Infor server location +* **Tenant Name**: The container for accounting entities and locations +* **Organization**: Infor Organization name +* **Organization Code**: Infor Organization Code + +##### Discovery Connector + +**Discovery Instance Configuration Fields** + +* **Name**: Unique name for your connector +* **Authentication Connection**: Select the auth connector for this discovery +* **Ignore Types (comma delimited list)**: Chose document types to ignore when running discovery + +##### Integration Connection + +**Infor Integration Connection Fields** + +* **Connection Name**: This is a unique name given to the connector instance upon creation. +* **Description**: A description of the connector to help identify it better. +* **Authentication Connection**: Infor Authentication + +##### Job Configuration + +* **Infor Query**: When using Infor as a repository during an Integration job you can add a query to the Job to limit the files being integrated. + +##### Content Service Connection + +**Content Service Connection Fields** + +* Delete Object by ID +* Get Object Properties +* Get File Content +* Update Properties + +#### JDBC + +Java Database Connectivity is an application programming interface for the programming language Java, which defines how a client may access a database. It is a Java-based data access technology used for Java database connectivity. It is part of the Java Standard Edition platform, from Oracle Corporation. + +Java Tutorial: [JDBC Basics](https://docs.oracle.com/javase/tutorial/jdbc/basics/index.html){:target="_blank"} + +Click the following link to see an example of this set up process using JDBC as the repository connector and BFS as the Output connector. JDBC to BFS Oracle Integration + +##### Authentication Connection + +This connector works for any Database that accepts JDBC connections. It requires knowledge of which JDBC Driver you will be using, as well as the specific connection parameters to your JDBC Instance. These can vary greatly by system. + +**JDBC Authentication Connection Configuration** + +* **Name**: Unique name for this auth connector. +* **Username**: The Username of the user to authenticate with to the JDBC DB Instance. +* **Password**: The password associated with the above username. +* **JDBC URL**: The Full JDBC URL to connect to. Required. +* **JDBC Driver**: The JDBC Driver to use, based on the DB you are connecting to. + * Use the table below to find and retrieve the jar file for your database, and place it in the tomcat/lib folder + +JDBC is a widely used protocol, and has not been tested with every system on this list. + +##### Drivers + +| DBMS | Driver class | Library name | +| ---|---|--- | +| PostgreSQL | org.postgresql.Driver | postgresql-42.2.8.jar (exact name depends on the driver version) | +| Firebird SQL | org.firebirdsql.jdbc.FBDriver | firebirdsql-full.jar | +| H2 Database Engine | org.h2.Driver | h2.jar [http://www.h2database.com](http://www.h2database.com/) | +| HSQLDB | org.hsqldb.jdbcDriver | hsqldb.jar [http://hsqldb.sourceforge.net](http://hsqldb.sourceforge.net/) | +| Apache Derby | org.apache.derby.jdbc.EmbeddedDriver | derby.jar | +| IBM DB2 | com.ibm.db2.jcc.DB2Driver | db2jcc4.jar | +| IBM DB2 for iSeries | com.ibm.as400.access.AS400JDBCDriver | jt400.jar | +| Teradata | com.teradata.jdbc.TeraDriver | terajdbc4.jar | +| SQL Server (Microsoft driver) | com.microsoft.sqlserver.jdbc.SQLServerDriver | mssql-jdbc-6.2.2.jre8.jar (exact name depends on the driver version) | +| Oracle | oracle.jdbc.OracleDriver | ojdbc8.jar | +| MariaDB | org.mariadb.jdbc.Driver | mariadb-java-client-1.3.6.jar (exact name depends on the driver version) | +| MySQL | com.mysql.jdbc.Driver | mysql-connector-java-5.1.36-bin.jar (exact name depends on the driver version) | + +##### Discovery Connector + +**JDBC Discovery Connector Configurations** + +* **Name**: A name for the Discovery Connection to identify it in the UI. +* **Authentication Connection**: JDBC Authentication Connector +* **Ignore Types**: Comma delimited list of types to ignore. Note that you can have regex as well. So to ignore all types with "workflow" in the name, you would enter(.)workflow(.) into the ignore types textbox. +* **Table Types**: Types of tables delimited by comma to retrieve. Normal values are TABLE,VIEW,SYSTEM TABLE,GLOBAL TEMPORARY,LOCAL TEMPORARY,ALIAS,SYNONYM. The default value and the one used mostly is TABLE +* **Driver**: JDBC Driver class (i.e.com.mysql.jdbc.Driver) +* **Catalogue**: Enter text to narrow results or leave blank to not use Catalogue in Discovery. +* **Schema Pattern**: Must match the schema name as it is stored in the database. Enter a single space to discover those without a schema. Leave blank if you do not want to use the schema name to narrow the search. +* **Table Name Pattern**: Enter % to search for all tables or enter text to match against. + +##### JDBC Integration Connection + +Your JDBC Integration connection allows Federation Services to input and output data to and from your JDBC repository. + +The Output Connection will push records, metadata, and permissions into the target repository. They also handle deleting content in sync mode. These connectors output files, folders, metadata, versions and renditions to the output system associated with this connector. Every Output Connector can define custom fields that it needs to be able to connect and write to the repository. These fields are defined during the development of the individual connectors. + +The Repository Connector allows organisations to read from Repositories using a Java Database Connectivity (JDBC) technology. This means that using Federation Services and your JDBC Driver of choice, you can connect to many repositories to retrieve data and content. + +**JDBC Integration Connection Configuration** + +* **Connection Name**: This is a unique name given to the connector instance upon creation. +* **Description**: A description of the connector to help identify it. +* **Authentication Connection**: Your JDBC Auth connection + +##### JDBC Job Configuration + +**JDBC Processor Config** + +The JDBC Connector uses different processors which process results in different ways. Some fields will only function with certain processors. + +* **SQL Query**: The SQL Query to run. +* **Failed ID**: Only works for the Failed ID JDBC Processor (See below) +* **ID Field**: The field to use as the source repository id +* **Fetch Size**: Refers to how many rows to fetch from the data source at one time. Default is 10. +* **Input Directory**: This is for processors where metadata is in the database but the binary content files are on the filesystem. This would be the root directory of the files. You can leave blank if not needed. +* **Output Directory**: Some processors needs a place to safely store files while doing conversions and processing. This is such a place. You can leave blank if not needed. +* **Internal Queue Size**: Records to queue before halting read from the data source. Once records fall below the internal queue size, reading will resume. +* **Include Content**: Check to include content or un-check to exclude content and only retrieve metadata. +* **Processor Class**: The Processor Class is a registered Spring Bean and is used to process the ResultSet. + +Currently, there are two processors included out of the box: + +**Default JDBC Processor** + +The default processor runs a query and will convert the table rows into processable documents. It does not use the start and end times configured in the **Details** tab. In order to filter on date fields, you will need your own WHERE clause. + +**Failed ID Processor** + +The Failed ID processor is used for running errors. It is run for each failed document ID and offers the following parameter to insert the id into your failed ids query. + +`${DOC_ID}` + +So an example of a failed ID query would be + +`SELECT * FROM MYTABLE WHERE OBJECTID = '${DOC_ID}'` + +**Output Specification** + +* **JDBC Output Table Name**: This field is the name of the table to output items to. Required if not using Auto Create (If not set, and Auto Create is used. The Job Name will be used instead). +* **JDBC Output Key**: The unique key to find/set/update in the table. Required if not using Auto Create. +* **Catalogue**: The Catalogue (Or Domain) of the JDBC Instance to connect to. Required if not using Auto Create. +* **Schema**: The Schema (Or Database/NameSpace) of the JDBC Instance to connect to. Require for Output. +* **Binary Column Name**: The name of the column where document binaries will be sent to if "Include Binaries" is checked in the job configuration. +* **Auto Create**: See below +* **Quote Identifier**: If there are spaces in your table names, catalog names, schema names or column names, enter a quote identifier. For example, SQL Server and Oracle use a double quote ". MySQL uses a backtick ` + +> **Important:** Use extreme caution when using this field. The Default for this field is False. If Checked it will only use the Table Name, Schema Name, and Binary Column Name fields from this tab. + +##### Content Service Connection + +This section covers the JDBC specific configuration of the Content Service Connector. + +**Configuration Fields** + +This section covers the JDBC specific configuration of the Content Service Connector. + +* **JDBC Table Name**: Database table name. +* **Schema**: Database schema name. +* **Catalogue**: Database catalog name. +* **ID Field**: The primary key column to use as the unique ID (expecting an auto generated (i.e. auto increment)) field. +* **Name Property**: The column to use as the "document name". This field should not be left blank. +* **Created Date Property**: The column to use as the "document created date". This field should not be left blank. +* **Modified Date Property**: he column to use as the "document modified date". This field should not be left blank. +* **Binary Property**: The column to use as the file content. This field can be left blank. +* **Root Version Id Property**: If the entities in the table track versions, this should provide the column that contains the root version id. This field can be left blank. +* **Is Latest Version Property**: This field is only used if the Root Version Id Field is populated. This field can be left blank only if the Root Version Id Field is also blank. If the entities in the table track versions, this should provide the column that contains whether the version is the latest (as a boolean). +* **Major Version Label Property**: This field is only used if the Root Version Id Field is populated. This field can be left blank. If the entities in the table track versions, this should provide the column that contains the major version portion of a version label. +* **Minor Version Label Property**: This field is only used if the Root Version Id Field is populated. This field can be left blank. If the entities in the table track versions, this should provide the column that contains the major version portion of a version label. +* **Quote Identifier Property**: If there are spaces in your table names, catalog names, schema names or column names, enter a quote identifier. For example, SQL Server and Oracle use a double quote ". MySQL uses a backtick ` + +**Supported Methods** + +* Create File +* Delete Object By Id +* Get File Content +* Get Object Properties +* Update File +* Update Properties + +##### Advanced Topic: Connecting to a Microsoft Access Database + +To use an Access database you'll need a JDBC Driver [here](http://ucanaccess.sourceforge.net/site.html){:target="_blank"}. + +You will need to install the JARs in the 3sixty-admin web app. [This post](https://stackoverflow.com/questions/21955256/manipulating-an-access-database-from-java-without-odbc/21955257#21955257){:target="_blank"} tells you the JARS you will need: + +Place them into `3sixty-admin/WEB-INF/lib`. + +After installing the JARs you should be able to start Federation Services and use the JDBC connector. + +**Example JDBC to BFS Oracle Integration** + +This process walks you through setting up an integration from a JDBC Repository to a BFS Output system. + +1. **Create a JDBC Auth Connector**: + + For Oracle there are a couple of things to note: + + * The username must be all caps + * The SID/Schema must be all caps as well + * The username can be different from the Schema name, but obviously needs permissions to that Schema. + * Note the Driver class + +2. **Create a JDBC Discovery Connector**: + + Set the authentication connector to be the auth connector created above. For Oracle, the above will get all objects in your database. + + Troubleshooting: + + Remove any ojdbc jar file from the 3Sixty-admin/WEB-INF/lib directory and put in the ojdbc jar for your Oracle version. For Oracle 12c as an example that would be ojdbc8.jar. + + The schema pattern should be set to the schema you want. Oracle seems to hang if you leave that field blank. + + Table types can be a comma delimited list of the following: + + * TABLE + * VIEW + * SYSTEM TABLE + * GLOBAL TEMPORARY + * LOCAL TEMPORARY + * ALIAS + * SYNONYM + +3. **Create an integration connector for JDBC**: +4. **Create an integration connector for BFS.** + + > **Note:** BFS does not have an authentication connector. + +5. **Create a job with the repo connector** as your JDBC integration connector and the output connector as your BFS integration connector. + +6. **Edit the BFS Tab**: + + Chose your output folder path that must exist ahead of time. Check the **Include Un-Mapped Properties** check box. Leave the rest as the default like the above picture. + +7. **Edit the JDBC Tab**: + +::: Configuration Some things to note about this configuration: + + 1. You should test your query using SQL Developer. This will allow you to get your query correct before testing it in Federation Services + 2. Notice how ABC_PLAN_id is in quotes in the query? That's because in this instance that field won't work unless its in quotes. Both SQL Developer and Federation Services will throw and error. + 3. The ID Field must be unique and is used as the file name. See the image below to see how this shows up in BFS Output + 4. The query should list the fields you want. Select * is not intended to work. + 5. The query cannot end with a ; or it will fail. + 6. Fetch Size can be modified to improve performance + +This is what the BFS Output looks like for this query. It returns one row, and the id was the number 1. + +```xml + + + +--No Comment--- +1 + +12.45 +cm:content +2004 +, + +``` + +The above xml is an example of the properties that were output for this job. + +You'll notice the fields come over as is with no prefix. PLAN_YEAR won't have a type associated with it. When you see this, you can fix it by modifying your query like the following: + +select "ABC_PLAN_id" as "mytype.abc_plan_id", plan_year as "mytype.plan_year", plan_year_nbr as "mytype.plan_year_nbr" from abc_plan + +The new query results in a xml file that looks like the following: + +```xml + + + +--No Comment--- + +12.45 +1 +cm:content +2004 +, + +``` + +But the file is named: default_document_name.doc.metadata.properties.xml + +This is because we changed the ID Field in the query, but not in the ID Field in the form. Now if we update it like the following: + +You'll see the file name is back to: 1.metadata.properties.xml + +Now that you have this working with BFS you can create your mappings to match what you want in the output system. You can map mytype in this case to the output type you want. You can then map the mytype fields to the fields of the new type. + +8. **Run the JDBC to BFS Job** to finish the integration process + +#### Jira Cloud and On Premise + +The Jira connector is available for any Jira instance that uses version 2 or 3 of the JiraREST API. There are 2 ways to connector to Jira. However, the authentication method depends on whether you're connecting to an on premise instance of Jira or a cloud based instance of Jira. + +There are 2 ways to connector to Jira. However, the authentication method depends on whether you're connecting to an on premise instance of Jira or a cloud based instance of Jira. OAuth Authentication for Cloud Jira requires an app to authenticate and interact with. The other parameters are required to specify the project you plan on interacting with. + +##### Jira Cloud App Configuration + +Please visit [developer.atlassian.com/apps](https://developer.atlassian.com/){:target="_blank"} to create an app. Once you create your app you'll need to collect a bit of information and do some configuration. + +You'll need to configure the Authorisation code grant callback URL to your Federation Servicestion Services instance. + +Currently, the Jira connectors only support interactions with one Project at a time. The app must have full/admin level access to the Jira instance. You'll need to add all the APIs listed below in order for this connector to work. + +From there you configure the APIs to include all permissions. + +##### Authentication Connection + +There are 2 ways to connector to Jira. However, the authentication method depends on whether you're connecting to an on premise instance of Jira or a cloud based instance of Jira. + +**Jira Cloud OAuth** + +JIRA CLOUD +This Connector is for a Cloud instance of Jira only. It interacts with Jira through the Rest API version 3.O Auth Authentication for Cloud Jira requires an app to authenticate and interact with. Follow the steps above to set up your cloud app. +**Important:**SSL REQUIRED +You will ALWAYS need to enable SSL on your Federation Services instance in order to use OAuth 2.0 for Authorisation. In this case, you would replace the localhost with your Federation Services server host and replace the 9443 with your port (if you're not using a publicly facing DNS). + +**Name**: Unique name for this auth connector. + +* **Client ID**: Client ID from the Application you set up in the Atlassian App Management area earlier. +* **Client Secret**: Secret from the Application you set up in the Atlassian App Management area earlier. +* **Cloud Domain**: The Domain of the Jira Cloud instance you wish to connect to without atlassian.net connected to it. The example should help explain. +* **Jira Project Key**: The Project Key associated to the Project in Jira you would like to interact with. + +Click **Authenticate** and to complete the process. + +**Jira On Premise Basic** + +LIMITATIONS +Currently, the Jira connectors only support interactions with one Project at a time. The user must have full/admin level access to theJira instance. + +This Connector is for the on premise instance of Jira only. It interacts with Jira through the Rest API version 2, and was tested on version 7.6.2. + +Basic Authentication for on premise Jira just requires a Username and Password to authenticate. The other parameters are required to specify the project you plan on interacting with. + +* **Name**: Unique name for this auth connector. +* **Username**: Username of the user Jira will Authenticate with. +* **Password**: Password for the user Jira will Authenticate with. +* **Server Url**: The URL of the On Premise Jira Server to connect to. **Must** include protocol (http or https) in the url. +* **Jira Project Key**: The Project Key associated to the Project in Jira you would like to interact with. + +##### Discovery Connector + +**Discovery Instance Fields** + +* **Name**: Unique Name for the Discovery Connection to identify it in the UI. +* **Authentication Connection**: Your Jira Auth connection. Either Cloud or Basic +* **Ignore Types**: Comma delimited list of types to ignore. Note that you can have regex as well. + * So to ignore all types with "workflow" in the name, you would enter(.)workflow(.) into the ignore types textbox. + +##### Integration Connection + +The Jira Integration connection is designed to write Issues and their associated metadata into a specified Jira project, and conditionally create the Project if it does not exist. This connection will also allow Federation Services to retrieve Issues and their associated metadata from Jira. Utilising the Jira REST APIs (v2 for On-Premise and v3 for Cloud), the Jira Integration Connection allows the user to obtain Issues, Issue Attachments, Issue Comments, and Issue Components within the project specified in the Authentication connector. Click here for more information on setting up an integration connection. + +**Integration Connection Configuration** + +* **Connection Name**: This is a unique name given to the connector instance upon creation. +* **Description**: A description of the connector to help identify it better. +* **Authentication Connector**: The Authentication connector to use based on your Jira instance type, and will be used to determine Project configuration information. + +##### Job Configuration + +**Jira JQL Query** +**Jira JQL Query**: The **Optional** JQL Query for narrowing down Issues. For more information on JQL visit this site. + +**Output Specification** + +* **Create Project in Jira if it doesn't exist?** - This field will allow jobs to know whether to create the project (based on the Project Key provided) in Jira if it does not already exist, and allows you to define values for project creation that are required by Jira. +* **Default Project Name**: The Default Name for Projects created that don't exist for output +* **Default Project Lead**: The Default Username (not user account ID) for Project Lead created that don't exist for output. +* **Default Project Type Key**: The Project type key which dictates the application-specific feature set that don't exist for output +* **Default Project Template Key**: The Project template key which is a prebuilt configuration for a project that don't exist for output + +> **Tip:** Type key and Template key must "Match". if You don't know which type/template key to match, we suggest type key "business" and template key "com.atlassian.jira-core-project-templates:jira-core-project-management. + +##### Content Service Connection + +**Supported Methods** + +* Create File +* Delete Object By Id +* Get File Content +* Get Object Properties +* Get Types +* Get Type Definition +* List Folder Items + +#### Meridio + +Meridio is a worldwide provider of enterprise Document and Records Management (eDRM) software, built for Microsoft .NET platforms. + +NOTE +Content Service Connection is not available for Meridio + +##### Authentication Connection + +The Meridio Auth Connector is the only way to provide Meridio authentication parameters to your Meridio Repository and Discovery Connector. + +**Authentication Fields** + +* **Name**: This is a unique name given to the connector instance upon creation. +* **Username**: The username to authenticate with the repository. +* **Password**: The password to authenticate with the repository. +* **WebService URL**: URL of the Meridio DMWS service location. This will typically be **http://(your.meridio.domain)/DMWS/MeridioDMWS.asmx** +* **Workstation Name**: Workstation name to be used with webservice calls + +##### Discovery Connector + +**Discovery Instance Configuration Fields** + +* **Name**: Unique name for your connector +* **Authentication Connection**: Select the auth connector for this discovery +* **Ignore Types (comma delimited list)**: Chose document types to ignore when running discovery + +##### Integration Connection + +**Integration Connection Fields** + +* **Connection Name**: This is a unique name given to the connector instance upon creation. +* **Description**: A description of the connector to help identify it better. + +##### Job Configuration + +* **File Path**: The folder where the files will are stored +* **Party ID** + +#### Mobius + +ASG Mobius Content Services (Mobius) provides you with a modern, scalable content services platform enabling you to improve collaboration, reimagine and automate content-rich business process, eliminate information silos and mitigate compliance risks. + +###### Authentication Connection + +Mobius connections require a Mobius Auth Connection to function. Authentication connectors are used to authenticate repository/output connections that need certain authentication fields like access tokens or refresh tokens. + +**Mobius Authentication Fields** + +**Name:** Connection name +**User Name:** Username to authenticate with. +**Password:**Password to authenticate with. +**Server URL:**URL of the Mobius service location +**Admin Username:**Username for Mobius Admin App +**Admin Password:**Password for Mobius Admin App + +##### Discovery Connector + +**Discovery Instance Configuration Fields** + +* **Name**: Unique name for your connector +* **Authentication Connection**: Select the auth connector for this discovery +* **Ignore Types (comma delimited list)**: Chose document types to ignore when running discovery + +##### Integration Connection + +The Mobius Integration Connection has no configuration as we use a Federation Services Auth Connector for authentication parameters. You will just need to apply your pre-configured Mobius Auth Connector to the Mobius Output Connector. + +**Integration Connection Configuration** + +* **Connection Name**: This is a unique name given to the connector instance upon creation. +* **Description**: A description of the connector to help identify it better. +* **Authentication Connection**: The Mobius Authentication connection that you want to use. + +##### Job Configuration + +A Federation Services Job is the process of moving or syncing content (including versions, ACLs, metadata) from one CMS (content management system) to another. + +* **Repository Connection Configuration**: No additional configuration needed to use Mobius as an Repository source + +**Output Specification** + +* **Repository Name**: Mobius Repository Name (ie 'Mobius'). +* **Include Un-Mapped Properties**: All metadata will be output, even if no mappings are supplied. These values will be applied as global properties to the file. + +#### Nuxeo + +Nuxeo is a software company making an open source content management system. +[More info on Nuxeo](https://doc.nuxeo.com/){:target="_blank"} + +##### Authentication Connection + +The Nuxeo Authentication Connector contains configuration to authenticate with a Nuxeo server for discovery, content sourcing, and content output. The Nuxeo Auth connector, like the other Nuxeo connectors, leverages Nuxeo's Java Client to communicate with your Nuxeo server. + +**Configuration Options** + +* **Name**: The name of the connector. +* **Nuxeo Username**: The name of the user to authenticate with Nuxeo. +* **Nuxeo Password**: The password of the user authenticating with Nuxeo. +* **Nuxeo URL**: The url to the **Nuxeo** endpoint. +* **Use Caching**: (required) Should the client use caching when making authentication requests? +* **Session Timeout**: Maximum session timeout in milliseconds (ms). +* **Transaction Timeout**: Maximum transaction timeout in milliseconds (ms). +* **Nuxeo Provider ID**: The provider ID set in the Nuxeo's configuration for Manage in Place (MIP) /Content Federation. + +##### Discovery Connector + +**Discovery Configuration with Auth** + +If you have created your Nuxeo Authentication Connector you can use it to facilitate Discovery by filling in the following fields. + +* **Name**: Unique Name for the Discovery Connection to identify it in the UI. +* **Authentication Connector**: Select yourNuxeo Authentication Connector. +* **Collection**: The name of your Mongo DB collection + +##### Integration Connection + +The Nuxeo Integration configuration only requires you to set an Authentication connection. + +Also note that you can connect to a Nuxeo server using a CMIS repository connector and CMIS authentication connector as well. Provided are links to theCMIS Repository connector documentation and theCMIS Authentication connector documentation. + +In the Server settings of the CMIS connector, your server for an Atom binding will look like as follows:(NUXEO_SERVER)/nuxeo/atom/cmis + +**Integration Connection Configuration** + +* **Connection Name**: This is a unique name given to the connector instance upon creation. +* **Description**: A description of the connector to help identify it better. +* **Authentication Connection**: Nuxeo Authentication + +##### Job Configuration + +Setting the Nuxeo query is done on a job by job basis. If a job has a Nuxeo repository set, a Nuxeo Query tab will appear at the top of the job for configuration. + +##### Content Service Connection + +The Nuxeo Content Service Connection provides a full ECM API for interacting with files, folders, metadata, versions, and renditions. This includes functionality like check in, upload new files, modify metadata, upload new versions, create folders, etc... + +**Basic Configurations** + +* **Connector ID**: A unique identifier for this connection i.e. `simflofy_demo` (alphanumeric, dashes and underscore characters only) +* **Description**: The text that will be displayed on drop-downs etc. to identify this connection. +* **Type**: The type of Search Connection (Solr, Mongo, Alfresco Faceted etc.) +* **Connection URL**: Your server's web address +* **Security Mode**: This is how to authenticate with the back-end search +* **Username**: to authenticate with +* **Password**: Password to authenticate with +* **Configuration Parameters**: Extra parameters that can be passed to the content service connection and vary by connection. See the section on extra query parameters below. + +**Connection Configuration** + +A query_fq configuration param lets you define facet queries behind the scene. This is done to provide limited views or subsets of data in the search. Essentially you could create any number of views on the same date but each view would display different results. This can also be used in a role base system where you have views setup for specific user roles. + +The syntax is: + +```text +query_fq for the first one +query_fq1 for the second +etc. +``` + +Unless the fq is already encoded, you will need to wrap it in the encode() function where it will be URLEncoded UTF-8. + +**Supported Methods** + +* Create File +* Create Folder +* Delete Folder +* Delete Object By Id +* Get File Content +* Get Object Id By Path +* Get Object Properties +* Get Types +* Get File Item +* List Folder Items +* Update File +* Update Properties + +#### OpenText Content Server + +OpenText Content Server is the core content repository and foundational document management technology for the OpenText Enterprise Content Suite, giving control over documents and business content across the enterprise by securing and storing it throughout its life cycle. [More info on OpenText](https://www.opentext.com/){:target="_blank"} + +Content Service Connection is not available for OTCS + +##### Authentication Connection + +* **Name**: The name of your CMIS authentication connector +* **Username**: Username to authenticate with. +* **Password**: Password to authenticate with. +* **Server URL**: URL of the OpenText service location + +##### Discovery Connector + +**Discovery Instance Configuration** + +* **Name**: Unique Name for the Discovery Connection to identify it in the UI. +* **Authentication Connection**: No auth connection needed for OTCS +* **Username**: The username to authenticate with the OTCS repository. +* **Password**: The password to authenticate with the OTCS repository. +* **Collection**: Each discovery connection version will have its own MongoDB collection to store its report, this field will show you the name of that collection. +* **Ignore Types**: Comma delimited list of types to ignore. Note that you can have regex as well. So to ignore all types with "workflow" in the name, you would enter(.)workflow(.) into the ignore types textbox. +* **Collection URL**: The ful lURL leading to your OTCS endpoint + +##### Integration Connection + +**Integration Connection Fields** + +* **Connection Name**: This is a unique name given to the connector instance upon creation. +* **Description**: A description of the connector to help identify it better. +* **Authentication Connection**: Your OpenText auth connection + +##### Job Configuration + +**Output Specification** + +* **Output Folder Path**: The path of the output root folder + +**Repository Paths** + +* **File Path**: The path of the root repository folder + +#### Oracle + +Oracle WCC is a platform that supports digital content management and search across multiple integrated platforms including Microsoft Office and Windows Explorer. + +###### Authentication Connection + +> **Note:** ACCESS +The authenticating user will need at least read access to migrate content. + +* **Username**: The username of the Oracle WCC user you will be authenticating with +* **Password**: The password of the Oracle WCC user you will be authenticating with +* **CGI URL Path**: The URL to your CGI endpoint for your Oracle WCC server. Here is Oracle’s documentation on obtaining the CGI path. + +##### Integration Connection + +This connector currently only operates in repository (read) mode + +* **Connection Name**: This is a unique name given to the connector instance upon creation. +* **Description**: A description of the connector to help identify it better +* **Authentication Connection**: Your Objective Auth Connection + +##### Job Configuration + +* **Oracle WCC Search Query**: The search query to run on WCC and return documents with. This is formatted in the Universal Query syntax. No need to add modified dates as it is applied by the job automatically based on the set job start and end date times. Using the Query Builder Form in Oracle WCC is an easy way to construct these queries. +* **Get Versions**: When checked, additional versions of a document from Oracle WCC will be added to the repository document to be migrated. When unchecked, only the latest version of a document is migrated. + +#### Salesforce + +Salesforce.com, Inc. is an American cloud-based software company headquartered in San Francisco, California. It provides customer relationship management service and also provides a complementary suite of enterprise applications focused on customer service, marketing automation, analytics, and application development. + +##### Authentication Connection + +The Authentication connection configuration is simple as it only contains three parts. + +* **Username**: User id for the account you're accessing from. This is usually in the form of an email address, but could vary. + * example: `me@mydomain.com` +* **Password**: Your password is a combination of your normal password and the security token for your account. If you have not created a security token, follow the steps here. The format of your password should be (user password)(token). So if your password is 1234 and my token is `hjdu2983`, you will enter `1234hjdu2983` into the password field. + * example: `1234hjdu2983` +* **Server URL**: This is the url that points to your instance of Salesforce. + * example: `https://nt89.salesforce.com` + +##### Discovery Connector + +The Salesforce Discovery Connector allows you to connect to your Salesforce domain and extract information about available data types and metadata. + +**Discovery Configuration** + +* **Name**: Give your connector a name. +* **Authentication Connector**: Select your Salesforce Authentication Connector +* **Ignore Types**: (Optional) A comma delimited list of types to ignore. + +##### Integration Connection + +The Salesforce Integration Connection allows you to retrieve information and documents using [SOQL](https://developer.salesforce.com/docs/atlas.en-us.soql_sosl.meta/soql_sosl/sforce_api_calls_soql.htm){:target="_blank"} +, Salesforce's object query language. + +Federation Services currently supports version **26.0** of the [Salesforce SOAP API](https://developer.salesforce.com/docs/atlas.en-us.api.meta/api/sforce_api_quickstart_intro.htm){:target="_blank"}. + +**Salesforce Integration Connection Configuration** + +* **Connection Name**: This is a unique name given to the connector instance upon creation. +* **Description**: A description of the connector to help identify it better. +* **Authentication Connector**: Your FileNet Auth Connector + +##### Job Configuration + +**Salesforce Repository** + +* **Default Name Field**: This field will be used to extract the document name from the columns of data. It should be formatted {type}.{field}. + * **Example**: `Account.Name` when selection FROM Account + * **Example**: `ContentVersions.Title` when selecting from ContentVersions +* **SOQL Query**: The query to run against Salesforce. All fields that you intend to extract or map should be included in this query. + * **Example**: `SELECT AccountNumber,BillingCity,CreatedById,CreatedDate,Id,LastModifiedDate,Name,OwnerId FROM Account` + * Test your query using the [Salesforce Workbench](https://workbench.developerforce.com/login.php){:target="_blank"} tool. + * See Salesforce documentation on [SOQL](https://developer.salesforce.com/docs/atlas.en-us.soql_sosl.meta/soql_sosl/sforce_api_calls_soql.htm){:target="_blank"} + + +**Salesforce Output** + +Salesforce output is not currently supported. + +TIME BASED QUERIES +In order to use the start and end time configured on the jobs, the variables `[starttime]` and `[endtime]` must be included in the query. + +* The **ID** for the object is required and must be included in the query. + +CONTENT +Currently, this connector can only retrieve Attachments and ContentVersions. In order to retrieve Content Versions you must query them directly. Here's an example query that will retrieve the standard Federation Services metadata: + +`Select Id,ContentDocumentId,ContentUrl,Description,FileType,PathOnClient,Title,ContentModifiedById,ContentModifiedDate,CreatedDate,ContentSize from ContentVersion` + +##### Content Services Connection + +This section covers the SalesForce specific configuration of the Content Service Connector. + +The only configuration required for this connector is the Salesforce Authentication Connector. + +**Supported Methods** + +* Create File +* Create Folder +* Create Version +* Delete Folder +* Delete Object By Id +* Get File Content +* Get Object Id By Path +* Get Object Properties +* Get Type +* Get Type Definition +* Get Version Content +* Get Version Properties +* List Versions + +#### ServiceNow + +ServiceNow is a platform-as-a-service provider, providing technical management support, such as IT service management, to the IT operations of large corporations, including providing help desk functionality. +[More info on ServiceNow](https://www.servicenow.com/){:target="_blank"} + +> **Info:** Federation Services is compatible with ServiceNow Kingston versions or later. + +##### Authentication Connection + +* **Name**: Name of your ServiceNow Authentication Connector +* **Username**: The user ID that will be used to access the ServiceNow instance. +* **Password**: The password for the corresponding user. +* **ServiceNow Instance URL**: The URL of your ServiceNow instance. +* **ServiceNow Table**: The name of the ServiceNow table that content will be processed from. + +##### Integration Connection + +The ServiceNow Integration Connection turn records into Federation Services Repository Documents, or a subclass. This is Federation Services's representation of a record, its metadata, its versions, its binaries, and its permissions. This connector only support repository (read) mode +* **Connection Name**: This is a unique name given to the connector instance upon creation. +* **Description**: A description of the connector to help identify it better. +* **Authentication Connection**: Your ServiceNow Auth connection + +##### Job Configuration + +**ServiceNow Query Parameters:** + +By default, your job will use the start and end times (located under the **Details** tab) in your ServiceNow Query. If you would like to add additional query parameters, you may do so by entering them in the ServiceNow Query Parameters field. These parameters will be appended to the query that is being used to retrieve content from your ServiceNow instance. You can simply use the ServiceNow name-value pairs to further filter your result set. +**Example**: `&active=true,&state=closed` or `&active=true&assigned_to=john.smith` + +##### Content Service Connection + +This connector supports the following methods + +*Create File* + +Get File Content *Get Object Properties + +#### Twitter + +##### Registering a Twitter App + +To use the Twitter API you will need the following: + +* A Twitter Account +* A phone number must be added to this account + +Get a Developer Account, by [clicking "Sign Up" here](https://developer.twitter.com/){:target="_blank"} +you will be asked to create a project and a development app during this process. Twitter may offer you your API Key, Secret, and Bearer Token as this point. Save them for later. With all that done, you should see a dashboard. + +Once that's done, you can gather your Consumer Keys. You can do so by clicking the Key icon next to your app's name. This will take you to a **Keys and tokens** tab. + +Click the black button to the right of "API Key and Secret" to generate and retrieve your consumer keys. + +Back in the dashboard, you may have noticed where the word **Essential**. This is a new tiered access structure which controls which types of searches your app can perform. You will need to apply for **Elevated** access in order for Federation Servicestion Services to read Tweets. On the right-hand side of the dashboard, you should see an offer to apply for Elevated access. Fill in the required information, and when it asks why you need access, use the following: + +We are performing a migration of a user's twitter data, and the tool we use only works with Twitter's v1.1 APIs. So, we will need elevated access in order to retrieve the user's tweets and attached metadata. + +Answer "No" to the following questions. Access is usually granted within a few hours, but it may be as long as a day. + +###### Authentication Connection + +The fields required are the four pieces of information you retrieved while creating your app + +* Consumer Key +* Consumer Secret Key +* Access Token +* Access Token Secret + +BEARER TOKEN +While it is not a requirement currently, Federation Services may require it in the future to use certain features of Twitter's APIS + +##### Discovery Connector + +The Twitter Discovery Connector only supports one type right now and that is a Tweet. No auth connection needed, but you will need to run it the first time to generate the Tweet type. + +##### Integration Connection + +**Twitter Integration Connection Configuration** + +The Twitter Repository Connector only works in repository (read) mode + +* **Connection Name**: This is a unique name given to the connector instance upon creation. +* **Description**: A description of the connector to help identify it better. +* **Authentication Connector**: Your Twitter Auth Connector + +##### Job Configuration + +* **Screen Names to Crawl, Comma Delimited**: Include the @ sign before each handle. +* **Max Tweet Pages**: By default, we will get 1 page of tweets from each handle. This should retrieve 20 tweets. +* **Get Tweets**: Enables retrieval of tweets + +#### WebDav + +WebDAV (Web Distributed Authoring and Versioning) is an extension of the Hypertext Transfer Protocol (HTTP) that allows clients to perform remote Web content authoring operations. WebDAV is defined in RFC 4918 by a working group of the Internet Engineering Task Force. + +##### Authentication Connection + +The WebDav Authentication connector will be used to connect to your WebDav source repository so that you can integrate your files with other sources. + +**WebDav Authentication Fields** +* **Name**: Unique Connection Name +* **Username**: Username to authenticate with +* **Password**: Password to authenticate with +* **Server URL**: The URL of your Webdav Server + +##### Integration Connection + +Using Federation Services's WebDav authentication connection users can create integration jobs that will filter and move files from your WebDav source to another repository. + +**Connection Configuration** +* **Connection Name**: This is a unique name given to the connector instance upon creation. +* **Description**: A description of the connector to help identify it better. + +##### Job Configuration + +When using WebDAV as the output connection you will see an additional tab titled Output Specification when setting up your job. This will allow Federation Services to integrate your files from your WebDav source into other sources + +**Output Specification** + +* **Output Folder Path**: FolderID of where the documents will reside within your WebDAV server + +##### Content Service Connection + +Content Service Connections define connections to specific repositories. Actions in the Content Services API or the Discovery web application perform actions against specific repositories. + +**Basic Configuration Fields** + +* Root Path: + +**Supported Methods** + +* Create File +* Create Folder +* Delete Folder +* Delete Object By Id +* Get File Content +* Get Object Id By Path +* Get Object Properties +* Get Types +* List Folder Items +* Update File + +#### ZenDesk + +The ZenDesk Connector is available for any ZenDesk instance that uses version 2 of the REST API. + +##### Authentication Connection + +> **Note:** The user must have full/admin level access to the ZenDesk instance. + +There are 2 ways to connect to ZenDesk. However, the authentication method depends on whether you have OAuth enabled for ZenDesk or not. This Connector is for ZenDesk instances. It interacts with ZenDesk through the REST API version 2 + +* **Username**: Zendesk username +* **Password**: Zendesk password +* **Zendesk Sub Domain**: Zendesk Sub Domain (without the `.zendesk.com` attached (for example, simflofy.zendesk.com becomes simflofy)) + +[Here is ZenDesk's document for registering an application](https://support.zendesk.com/hc/en-us/articles/4408845965210-Using-OAuth-authentication-with-your-application){:target="_blank"}. You will generate the ClientId and Secret from this process. + +* **Name**: Unique name for this auth connector. +* **Client ID**: App Client ID of the app Zendesk will Authenticate with. +* **Client Secret**: App Client Secret Key for the app Zendesk will Authenticate with. +* **ZenDesk Sub Domain**: Zendesk Sub Domain (without the .zendesk.com attached (for example, simflofy.zendesk.com becomes simflofy)) + +##### Discovery Connector + +* **Name**: Unique Name for the Discovery Connection to identify it in the UI +* **Authentication Connection**: The Zendesk authentication connection +* **Ignore Types (comma delimited list)**: Not applicable, as the connector only returns tickets + +##### Integration Connection + +* **Connection Name**: This is a unique name given to the connector instance upon creation. +* **Description**: A description of the connector to help identify it better. +* **Authentication Connector** - The Authentication connector to use based on your Zendesk instance type + +##### Job Configuration + +The Zendesk connector only has job configuration while in repository (read) mode. In output mode it will push tickets to the authenticated subdomain. + +> **Tip:** Do not include date ranges as those are taken in by the start/end date of the Job configuration in the Details tab. + +* **ZenDesk Query**: Written in the [Zendesk Query Language](https://support.zendesk.com/hc/en-us/articles/203663226){:target="_blank"} \ No newline at end of file diff --git a/federation-services/latest/index.md b/federation-services/latest/index.md index a18a97fcb8..947265a958 100644 --- a/federation-services/latest/index.md +++ b/federation-services/latest/index.md @@ -1,47 +1,45 @@ ---- -title: Alfresco Federation Services ---- - -Alfresco Federation Services is an add-on module that provides a powerful and easy way to search and manage content federated from leading business systems and content management applications. Manage in place functionality allows you to access, control, and govern content residing in more than sixty different business and content repository types. This provides a single view of information across different content systems, by synchronizing content into Alfresco Content Services. - -By connecting information from different systems, you can provide a single view of information stored across multiple repositories. - -Here is a summary of the key capabilities: - -* Federated search - content can be searched for across multiple content repositories and made accessible inside Alfresco Content Services. This means it doesn't need to be migrated from different content systems. -* Manage content in place - all content can be controlled, no matter where it's stored. -* Intelligent content migration - enables content migration to be completed in the background, with minimal disruption to your end users. - -Alfresco Federation Services ensures that customers are able to: - -* Federate and manage content or records in other repositories -* Apply Alfresco Governance Services to content that's stored in other content systems (using the manage in place functionality) -* Support enterprise-wide eDiscovery cases in order to allow legal holds across the enterprise - -The following diagram shows a simple representation of how Alfresco Content Services and Alfresco Federation Services interact with different content systems. - -![Simple architecture diagram for Federation Services]({% link federation-services/images/simple-architecture-3.0.png %}){:height="300px" width="615px"} - -Alfresco Federation Services can integrate any two endpoints in systems such as: - -* CMS (Alfresco Content Services, Documentum, SharePoint, etc.) -* Network file systems - -See the [Alfresco Federation Services summary and demo](https://www.alfresco.com/information-governance/content-federation-and-manage-place){:target="_blank"} to learn more. - -## Terminology - -Here's some useful terminology from the Federation Services documentation. - -|Term|Description| -|----|-----------| -|Auth Connector|This allows you to authenticate against a repository.| -|Repository Connector|This is a connector to a repository for getting content, metadata, versions, and renditions.| -|Output Connector|This is a connector to the output system you want to migrate or index to. to.| -|Content Service Connector|This connector allows you to attach a system to the Objective 3Sixty Content Services API for Federation.| -|Discovery Connector|This connector is used to get schema information from a system.| -|Job|A job is a basic construct used to specify the repository and output used in a migration or index. This is how you connect two systems together with Federation Services.| -|Mapping|Provides metadata mapping between types/aspects from a source system to an output system. These can be used in a job and in a content services connector.| -|Tasks|Provides a processing pipeline that allows you to process documents, metadata, versions, and renditions as part of a job.| -|TCS|Transparent Content Services (for managing content in-place)| -|TSearch|This component provides federated search capabilities| +--- +title: Alfresco Federation Services +--- + +Alfresco Federation Services is an add-on module that provides a powerful and easy way to search and manage content federated from leading business systems and content management applications. Manage in Place (MIP) functionality allows you to access, control, and govern content residing in different business and content repository types. This provides a single view of information across different content systems, by synchronizing content into Alfresco Content Services. + +By connecting information from different systems, you can provide a single view of information stored across multiple repositories. + +Below is a summary of the key capabilities: + +* Federated search - content can be searched for across multiple content repositories and made accessible inside Alfresco Content Services. This means it doesn't need to be migrated from different content systems. +* Manage content in place (MIP) - all content can be controlled, no matter where it's stored. +* Intelligent content migration - enables content migration to be completed in the background, with minimal disruption to your end users. + +Alfresco Federation Services ensures that customers are able to: + +* Federate and manage content or records in other repositories +* Apply Alfresco Governance Services to content that's stored in other content systems (using the Manage in Place functionality) +* Support enterprise-wide eDiscovery cases in order to allow legal holds across the enterprise + +The following diagram shows a simple representation of how Alfresco Content Services and Alfresco Federation Services interact with different content systems. + +![Simple architecture diagram for Federation Services]({% link federation-services/images/simple-architecture-3.0.png %}){:height="300px" width="615px"} + +Alfresco Federation Services can integrate any two endpoints in systems such as: + +* CMS (Alfresco Content Services, Documentum, SharePoint, etc.) +* Network file systems + +## Terminology + +Here's some useful terminology from the Federation Services documentation. + +|Term|Description| +|----|-----------| +|Auth Connector|This allows you to authenticate against a repository.| +|Repository Connector|This is a connector to a repository for getting content, metadata, versions, and renditions.| +|Output Connector|This is a connector to the output system you want to migrate or index to. | +|Content Service Connector|This connector allows you to attach a system to the Content Services API for Federation.| +|Discovery Connector|This connector is used to get schema information from a system.| +|Job|A job is a basic construct used to specify the repository and output used in a migration or index. This is how you connect two systems together with Federation Services.| +|Mapping|Provides metadata mapping between types/aspects from a source system to an output system. These can be used in a job and in a content services connector.| +|Tasks|Provides a processing pipeline that allows you to process documents, metadata, versions, and renditions as part of a job.| +|TCS|Transparent Content Services (for managing content in-place)| +|TSearch|This component provides federated search capabilities| diff --git a/federation-services/latest/install/index.md b/federation-services/latest/install/index.md index f2b39791a7..d6895d8e33 100644 --- a/federation-services/latest/install/index.md +++ b/federation-services/latest/install/index.md @@ -1,46 +1,110 @@ ---- -title: Install Federation Services ---- - -The Federation Services capability for Alfresco Content Services is delivered in a number of installation files. - -## Prerequisites - -Check the [supported platforms]({% link federation-services/latest/support/index.md %}) for information on what you require before you start the installation. - -> **Note**: A compatible version of Alfresco Governance Services (if you plan to use the Manage in Place capabilities) is required, for example: if using Alfresco Content Services 23.1, make sure that you install Alfresco Governance Services 23.1. - -You can download the Federation Services software from [Hyland Community](https://community.hyland.com/){:target="_blank"}. - -### Federation Services requirements - -* Federation Services Admin server (i.e. 3Sixty Admin) - -* MongoDB server -* Tomcat server - - > **Note:** We recommend using a separate instance, where possible, instead of using the same one used by Alfresco Content Services. - -See the [3Sixty documentation](https://helpdocs.objective.com/3sixty_user/Content/get-started/architecture.htm){:target="_blank"}, for specific hardware and software requirements. - -> **Note:** This release of Alfresco Federation Services doesn't support deployment in Docker containers. - -## Install steps - -These steps describe how to install Federation Services to an instance of Alfresco Content Services. - -1. Go to [Hyland Community](https://community.hyland.com/){:target="_blank"} and download the files provided for the Federation Services release. - - This should include the following: - - * `AFS-federation.war` - * `AFS-admin.war` - - - - - - -2. Follow the steps in the 3Sixty documentation, [Install 3Sixty](https://helpdocs.objective.com/3sixty_user/Content/get-started/installation.htm){:target="_blank"}. - -3. After completing all the installation steps, you'll need to access the Admin app through your preferred browser to [configure]({% link federation-services/latest/config/index.md %}) your installation. +--- +title: Install Federation Services +--- + +The Federation Services capability for Alfresco Content Services is delivered in a number of installation files. + +## Prerequisites + +Check the [supported platforms]({% link federation-services/latest/support/index.md %}) page for information on what you require before you start the installation. + +> **Note:** A compatible version of Alfresco Governance Services is required if you plan to use the Manage in Place capabilities. For example, if you're using Alfresco Content Services 23.1, make sure that you install Alfresco Governance Services 23.1. + +You can download the Federation Services software from [Hyland Community](https://community.hyland.com/){:target="_blank"}. + +### Software requirements + +See [Supported platforms]({% link federation-services/latest/support/index.md %}) page for required versions. + +* Java: Java JRE is required +* Application server: Apache Tomcat + * Memory pool: 4GB required, 8GB recommended. This can be updated in the Java tab of your Apache Tomcat **Properties** window. + + > **Note:** A separate instance is recommended, where possible, instead of using the same one used by Alfresco Content Services. + + > **Note:** Federation Services runs on the Spring platform, which does not support Tomcat versions beyond 9. + +* Database: MongoDB +* Operating systems: Linux or Windows + +#### Client Access + +The client uses a web browser to access Federation Services. The following browsers are supported: + +* Chrome (latest) +* Firefox (latest) +* Safari (latest) + +#### Create a MongoDB database + +Create the Federation Services database and user in MongoDB by executing the following commands in the mongo shell: + +```text +use simflofy +db.createUser({"user":"simflofy", "pwd":"password", +"roles":["clusterMonitor", "dbOwner"]}); +``` + +### Hardware requirements + +Federation Services performance is based on a number of factors: + +* Number of CPUs and speed +* Network bandwidth and latency +* RAM assigned to the operating system and Federation Services (Tomcat) itself +* Hard drive disk speeds and latency + +Federation Services uses a database for configuration, job state, and auditing data. Auditing data can also be configured to go to a log file. + +Finally, Federation Services will be integrating 2 or more products. Performance will be determined by the above factors, but also by the performance of each system being integrated. + +> **Note:** Federation Services is an I/O intensive application and therefore should be provisioned accordingly. Recommend SSD or NVMe based back end storage with enough capacity to index the entire contents of the source data. + +## Install steps + +These steps describe how to install Federation Services to an instance of Alfresco Content Services. + +You can download the release files from [Hyland Community](https://community.hyland.com/){:target="_blank"}. Log in, select the **Support** tab, and then the **Alfresco Downloads** option under **Software Downloads**. Search for the required product version and navigate to the version page. + +1. Download the files provided for the Federation Services release. + + This should include the following: + + * `AFS-federation.war` + * `AFS-admin.war` + +2. Copy the Federation Services Admin and discovery WAR files or expanded ZIP to the Tomcat installation directory, `/Tomcat/webapps`. +3. Start Tomcat. +4. Navigate to the `mongo-db.properties` file, `Tomcat/webapps/3Sixty/Admin/WEB-INF/classes/mongo-db.properties`. +5. Set the credentials for the user and the database connection details. + + Depending on what database you created the admin user in, you may have to append the database name to the end of the URI. This is the authenticating database. + + The following example configuration assumes you followed the previous steps exactly: + + ```text + mongo.db.username=simflofy + mongo.db.password=#whatever password you set during mongo user creation + mongo.db.uri=mongodb://[[USER]]:[[PASS]]@localhost:27017/simflofy + ``` + +6. In the same folder, open `simflofy-global.properties` and check if all of the 'initialize' properties are set to `true`. If not, set them to `true` and save the file. + + See the section on [properties]({% link federation-services/latest/admin/admin-properties.md %}) for more information. + +7. If you have a shared loader enabled in Tomcat, move the global properties files to the `shared/classes` folder. Now the properties files will persist after redeploying the WAR. +8. Restart Tomcat. +9. In `simflofy-global.properties` set initialize properties to `false`. +10. Copy and paste the following into your browser: + + ```text + http://(servername):(port)/3sixty-admin + ``` + + The default Federation Services username/password is `admin/admin`. + +11. Access the Admin app through your preferred browser to [configure]({% link federation-services/latest/config/index.md %}) your installation. + +## Configure Tomcat for SSL + +To finish the installation of Federation Services, you need to generate or install a certificate, enable SSL, and port 8443 or port 443 in `tomcat/conf/server.xml`. Go to the [Tomcat SSL documentation](https://tomcat.apache.org/tomcat-9.0-doc/ssl-howto.html){:target="_blank"} for more information. diff --git a/federation-services/latest/support/index.md b/federation-services/latest/support/index.md index 281afd6f66..66e9128e22 100644 --- a/federation-services/latest/support/index.md +++ b/federation-services/latest/support/index.md @@ -2,14 +2,20 @@ title: Supported platforms --- -The following are the supported platforms for Alfresco Federation Services 3.1: +The following are the supported platforms for Alfresco Federation Services: | Version | Notes | | ------- | ----- | -| Content Services 23.1 | | +| Content Services 23.x | | | | | | **Java** | | -| Java JRE 17 or later | | +| Java JRE 17 | | +| | | +| **Databases** | | +| MongoDB 6 | | +| | | +| **Application servers** | | +| Tomcat 9 | | | | | | **Browsers** | | | Chrome (latest) | | diff --git a/federation-services/latest/using/index.md b/federation-services/latest/using/index.md new file mode 100644 index 0000000000..cbb74d8e2e --- /dev/null +++ b/federation-services/latest/using/index.md @@ -0,0 +1,3070 @@ +--- +title: Using Federation Services +--- + +Once your Federation Services environment has been successfully installed, you are ready to start making connections and executing jobs. + +## Quick Start User Guide + +This guide will walk you through this process. For this example, we will be using Google Drive as our source (repository) location and Dropbox as our target location (output). + +* **Step 1.** Login to your Federation Services environment once all the required components have been installed. +* **Step 2.** Create the repository connection for your source data that you want to transfer. +* **Step 3.** Create your output connection for your target location you want to move your data to. +* **Step 4.** Create a new integration job to sync your two new connections. +* **Step 5.** Create a task to filter your results before moving your data. +* **Step 6.** Map your fields to tell Federation Services where you want the data in each field moved to. +* **Step 7.** Run your new job to begin the data transfer process. +* **Step 8.** View your results to confirm the transfer was successful. + +**Step 1. Login to your Federation Services environment** + +1. **Install Federation Services** - To begin using Federation Services, make sure you have all the required software components installed. +2. **Login to Federation Services Admin** - Once Federation Services is installed, you are ready to log in and begin setting up jobs to transfer your data. + +**(Sub-Step 1)** + +1. **Create Authentication Connections** - Before we begin, please note that some connections will require authentication before you can create an Integration Connection. The Authentication process can vary from connector to connector. For details on the specific authentication steps for your connectors, see the full Authentication Connection List. + +**(Sub-Step 2)** + +1. **Create Discovery Instance** - Once Authenticated, you will set up your discovery instance to allow Federation Services to find the field properties in your connected repository for mapping in Step 6. For steps on setting up this instance, see [Discovery Schema Instances](#discovery-schema-instances). + +NEXT STEP: Create your integration connections. + +**Step 2. Create your Integration Connections.** + +Your Integration connections will be the places you want to move your files to and from. First set up your Integration connection for your source repository that you are pulling your files from and then set up one for your output repository that you are moving your files to. + +1. Select **Connections** from the navigation section on the left +2. Select **Integration Connections** +3. Click the **Create Integration Connection** button +4. Add the following: + * Connection Name + * Connection Description (Optional) + * Connection Type +5. Click **Save** to continue editing your integration connector +6. Edit your new Integration Connection +7. Add the **Authentication Connection** you created for this connector. + +NEXT STEP: Create your Output Connection. + +**Step 3. Create your Output Integration Connection:** + +Repeat Step 2 for your Output Integration Connection. This will be the location you want to move your files to. + +1. Select **Connections** from the navigation section on the left +2. Select **Integration Connections** +3. Click the **Create Integration Connection** button +4. Add the following: + * Connection Name + * Connection Description (Optional) + * Connection Type +5. Click **Save** to continue editing your integration connector +6. Edit your new Integration Connection +7. Add the Authentication Connection you created for this connector. + +NEXT STEP: Create your Integration Job + +**Step 4. Create a new integration job to sync your two new connections.** + +This process will allow Federation Services to connect the two systems and move your data from one location to another. + +1. Click **Integration** in the navigation +2. Select **List Jobs** +3. Click the Create New Job button +4. Add the following: + * Give your job a descriptive Job Name + * Select your Repository Connection + * Select your Output Connection +5. Leave the Job type as Simple Migration +6. Click **Save** +7. View your new job edit page. +8. Edit the start and end dates and times to filter for the documents in your repository connection that were created within that time period. +9. Configure Repository Specifications: This tab will vary depending on the connector. +10. Click on the Query Tab if there is one and add the Google Drive folder ID. This can be found after the last slash "/"in the url for the folder. +11. Leave Query blank and leave process folders unchecked. +12. Output Specifications: This tab will vary depending on the connector +13. Click on the Output Specifications Tab and enter your Target Folder. + +NEXT STEP: Add Tasks + +**Step 5. Create a task** + +Among other things, tasks will allow you to filter your documents, so you only bring over the data you need. You can also use tasks to check for duplicates among other useful filters. + +1. In your saved job edit page click the **TASKS** tab. +2. Select the task you would like to add from the list drop-down. +3. Click the green plus sign to add the task. Fill in the necessary configurations for that specific task. +4. Click DONE to add the task to the job. + +NEXT STEP: Job Mapping + +**Step 6. Map your fields** + +This will tell Federation Services which data property fields from one location match the property fields in the other location. + +1. From the edit job page click the **mappings** tab +2. Select Manual in the Mapping Type drop-down and add the following. +3. Select your **Repository Discovery** +4. Select **drive_file** as the Repository Type +5. Select your Output Discovery +6. Select **file** as your output type Select the source field Select the target field Click on the blue plus button to add to the mapping +7. Click **Save** at the top of the page + +NEXT STEP: Run Job + +**Step 7. Run your new job** + +1. From the navigation section on the left, click Integration to expand the section and select Run and Monitor Jobs +2. Click the **Play** button to the left of your new job to begin transferring files. +3. Click the **REFRESH** button to see the progress of your integration. You can also set the auto refresh time periods to 30 seconds, 1 minute, 5 minutes. + +NEXT STEP: View your results + +**Step 8. View your Integration results** + +1. Once the integration job is complete, you can view your results. This shows that all the files have been successfully integrated from one system to the other. If you log into your target repository you will see these files have been added successfully. + +Congratulations! You have successfully created your first Integration Job. + +## Discovery and Analytics + +Discovery is the 2nd step in the integration process. Create an instance, select a connector and a schema will be produced based on the connector's configuration. Includes a list of all object types as well as attributes stored in each. + +### Discovery Schema Instances + +Discovery connectors are responsible for discovering the schema, or the metadata about the repository. This will include content types and their associated properties. + +A discovery schema can then be used to aid in creating [Job Mappings](#job-mappings) or to simply find out what's in the repository. Running a discovery instance will create a new version of the schema. Whatever version you select will be used when creating mappings. + +#### Schema Instances + +Viewing the schema instances will show you a table of all available Discovery Instances, this table can be sorted by Name, Type, and Available Versions. + +Here you can view the most recently created schema instances as well as created new ones. + +* **Name**: Unique Name for the Discovery Connection to identify it in the UI. +* **Type**: The Discovery Type refers to the type of the repository (i.e. CMIS, SharePoint, Documentum etc.). +* **Version**: Each Discovery Schema can have multiple versions. Selecting this version will set which is used in Job Mappings as well as which schema will be shown when examining a schema. + +#### New Discovery Connection Instance + +To create a new Discovery Connection, click the Create New Discovery Instance button at the bottom of the Schema Instances Page. Fill in the following fields. + +* **Name**: Unique Name for the Discovery Connection to identify it in the UI. +* **Discovery Type**: The Discovery Type refers to the type of the repository +* **Authentication Connection**: A predefined connection for authentication. +* **Ignore Types**: Comma delimited list of types to ignore. +* **Additional Fields**: Some connections require additional information to search for types. Click on a link in the table below for more details on setting up the Discovery Connection for a particular software + +#### Discovery Schema View + +Once Discovery finishes running Federation Services will store the information. Discovery only needs to be run once, unless the schema of the source repository is changed. + +To view the report, click the document icon to the left of the instance. You can click into each attribute section by category. + +### Data Collection + +Data Collection is a scheduling system that allows the user to schedule job runs. It can be turned on and off in the Data Collection index page. + +Data collection schedules can be run for a job group or individual job. For the purposes of data collection jobs it is suggested you use the Reporting Connector and do not have **Include Binaries** checked in the **Details** tab. Federation Services can create the necessary auditing data without the actual file content + +#### How to use Data Collection + +The **Set Info Pane** will show you basic information about the various collections in the data set, as well as allowing you to delete individual runs. + +The data collection service runs in the background based on properties set either in **simflofy-global.properties** or in the **Admin Properties** page. It checks each data set (created once you hit **Set Collection Schedule**) to see if that job group needs to be run based on whether Collect Data is 'on'. + +* Collection **Statuses**: Sets can have one of three statuses + * **Unsaved**- The Collection hasn't been saved yet + * **Off**- The service will not collect data for this group + * **Waiting**- The job group is between collections + * **Running**- The jobs in the job group are currently running +* **Time until next run**: As it reads. If this runs to zero, it will not refresh unless the schedule is closed and reopened. Will Display as NA if performing a run. +* **Collect Date**: If on, the collection will run based on the collection dates. +* **Run jobs in parallel**: Run all jobs in the set simultaneously. The default is to run them in prescribed order set on the job group. +* **Collection dates**: Dates over which data will be collected. + * If the "From" time is set to a value before the current date/time, the run will begin immediately. + * The "To" time and Interval are checked upon completion of a collection run to determine whether the set should run again. +* **Interval**: The interval between collections will dictate how often the jobs are going to run. + * It is suggested you determine the general length of the jobs you wish to run to avoid overlap. The Set Info pane provides an average run time for the data set. + * Setting the collection interval to **Once** will turn off collection after a single run. + * Interval below 3 minutes are not allowed, as they cause unpredictable behaviour. +* **Choose between a job group or individual job** + * If selecting a job group, you can choose the run order by dragging. The top job is run first. + +#### Example Duplicate Checking + +If you wish to collect information on duplicate data, use the Duplication Check Task. As of the inclusion of Data Collection, you do not need to include a binary for duplication checks. If you declare a field that is not the md5 field as your "hash", you can set a field in the JavaScript Task using the `rd.setMetaHash(Strings)` method. + +### Discovery Report Views + +A view which charts data from a Content Report generated through [Data Collection](#data-collection) + +Once you have finished with your Data Collection, Federation Services allows users to visualize their data in a Discovery Report View in the Discovery UI + +In this report view users will find: + +* An interactive chart that adjusts to selected repositories +* Content Past Date +* Content Summary +* Storage Summary +* Total Numbers of files + +#### Generate Reports + +This tab initially only contains a drop-down of data sets that have job runs associated with them. It also displays their collection status. + +Upon selecting a data set you should see the following: + +* Included in the table are the date of the run, number of job runs included in the dataset, as well as some general stats on the document counts. The table is sortable on the various values. +* Clicking the eye icon next to the job run count will open a pop-over with the individual job run ids +* Clicking one of these ids will take you to a detailed view of the job run. For content reporting you are currently only allow to select one dataset. +* In the future a "Content Growth Report" option will be made available, allowing you to select multiple job runs to monitor increases in storage usage. + +##### Filter Dataset + +There are a number of filters that can be applied to the dataset during report generation. These include: + +* Filters for Obsolete Date +* Checked against the Last Modified Date, or Created date if the former is unavailable +* Filters for certain file type extensions. +* Extracted from filename +* Filters for file size +* (New) Filters for type. Document types can also be filtered out. + +These filters are processed in this order, upon selecting them you will have the option to reorder them. + +#### Available Reports + +Upon completion of report generation you should be taken to the Available Reports tab. + +This tab shows the generated reports as well some additional information: + +* **Obsolete Data**: The report contains data on content that was past the filter date +* **Duplicate Data**: The report has information on duplicates +* **Content Type Data**: The report contains a content type breakdown for all included repositories. +* **Multiple repositories**: The report contains data for each of the jobs run as part of the dataset, as well as a merged report containing the combined data. +* **Actions**: + * Download the raw report in JSON format + * Generate New Version of this Report + * Delete Report with the additional option to delete all versions of the report + +#### Schedule Reports + +The schedule reports tab allows you to automate the creation of reports after creating the initial one. + +* **Automatically Generate This Reports**: Enables the scheduling of this report's creation +* **Generate Reports Every**: The time interval to use for generating this report. +* **Starting On and Ending On**: How long the schedule lasts. If the Before time is set before the current time, generation will accrue immediately upon setting the schedule. +* **Update Associated Report Views**: Each Discovery Content View is associated with a single report series. If set to On, the view will be updated to use the most current version each run. +* **Which views**: A list of associated views to update. +* **Use Data From the Following Set or Most Recent**: If checked, the new report will always use the next data collection chronologically from the previous. Otherwise the most recent data set will be used. Useful if you wish to perform QA on the most recent runs before creating a new report. +* **Send email Notifications**: A simple yes/no. Email must be enabled for the application. +* **Comma delimited list of emails**: As the tooltip says. + +### Pii Scan + +The Pii Scan feature allows the user to select a configured repository connector and job, then scan the repository for Personally Identifiable Information (Pii). + +This can include phone numbers, social security numbers, proper names, and addresses. + +A temporary job is created using the repository configuration of the selected job. + +Appropriate tasks and mappings are added to the job, then the job is run. + +Upon completion, the temporary job and records are deleted, leaving only Pii Data. + +## Federated Search + +Federation Services allows you to manage data throughout multiple repositories without having to move the content from one location to another. With Federated Search users can view, organise, report on, update and maintain all of their documents, files and records in one easy to use highly customisable space. + +### Content Search + +Content View Connectors are used by Content Views in Federation to query indexed documents and populate the results within a federated search view. Federation can then take action against the results such as preview, download, check in and out and edit the file's properties. + +#### Content Search Connection Configuration + +##### Available Content View Connection Types + +* [Elasticsearch Connector]({% link federation-services/latest/config/index.md%}#elasticsearch) +* [MongoDB GridFS]({% link federation-services/latest/config/index.md%}#mongodb-gridfs) Search Connector +* [MongoDB]({% link federation-services/latest/config/index.md%}#mongodb) Search Connector +* [SOLR]({% link federation-services/latest/config/index.md%}#apache-solr) Search Connector (End of Life) + +##### Basic Configuration + +**Connector ID** +Connector ids are how Federation Services identifies the individual connector when receiving calls from other sources, such as Federation Service. This value must be usable as part of url. Use the description field if you need more than a few letters/numbers to describe the connection. The description shows up with its connectorId across the product. + +* **Connector ID:** A unique identifier for this connection i.e. `simflofy_demo` (alphanumeric, dashes and underscore characters only). +* **Description:** The text that will be displayed on drop-downs etc. to identify this connection. +* **Type:** The type of Search Connection (Solr, Mongo, Elastic etc.) +* **Keep Connection Alive:** Federation Services will cache the connection for a given amount of time before discarding it. +* **Keep Alive in Milliseconds:** How long to keep the connection alive before discarding it (`300000` is 5 minutes). +* **Security Mode:** This is how to authenticate with the back-end search. +* **Authentication Connection:** The most common method is to use the appropriate authentication connection. +* **User Pass-through Credentials:** Users the authenticates with whatever authentication they used for Federation Services. Only supported in rare cases. + +##### Result Links + +Result Links are under the **Search Configuration** tab, but work universally. + +If **Download** is selected, the file names in your view will call a document download, much like the Widget + +If **External** is selected, you will need to add **Result Links**. When you click the Result Links button a modal should appear. It takes three arguments + +* **Content Service Connector:** External link configurations are grouped by content service connector. + * This allows documents from different repositories to form different links. +* **Link Field:** The document field that contains relevant information for building the link. +* **Link Url:** The content of the link field will be appended to this url to create the link. + +**Link Field With Semicolons** +Due to how certain ids with versions are handled. The value of the link field will be cut off after the first instance of a semicolon(;) + +##### Search Configuration + +Refer to the documentation for each connector to see which fields are available. + +##### Search Security + +* **Filter:** + + The authenticated user's group ids and login will be added to each search request. Requires content to be indexed using the Index User Group Task. + +* **Restrict:** + + Only users from the selected groups will be able to use this search connection, regardless of role. If this connection in used as part of a Content View, users outside these groups will not be able to see it in their View List in Discovery. + +##### Connection Configuration + +Individuals connectors might have specific fields here that were not general enough to be in Search Configuration + +Additionally, this is where you can use the "Add Custom Parameter" button to set any default query values for the connection. + +A `query_fq` configuration parameter lets you define facet queries behind the scene. This is done to provide limited views or subsets of data in the search. Essentially you could create any number of views on the same date but each view would display different results. This can also be used in a role base system where you have views setup for specific user roles.Unless the `fq` is already encoded, you will need to wrap it in the `encode()` function where it will be URLEncoded UTF-8. + +The syntax is: + +```text +query_fq for the first one +query_fq1 for the second +etc. +``` + +### Content Services + +Content Service Connections are used to interact with content in Federated Search views. Actions set up in the Content Services API or the Discovery UI web application will be performed against specified repositories and documents through these Content Service connectors. + +#### Content Service Connections + +Federation Services's Content Service Connections offer public REST endpoints that allow for integration with external applications. Actions in the Content Services API or the Discovery web application perform actions against specific repositories through these connectors. + +##### Commonly Supported Operations + +> **Note:** The capabilities of each Content Service Connector is limited to operations allowed by the repository. Additionally, not all methods are available for all connectors. View individual connector pages for a list of capabilities. + +* Creating content +* Retrieving file content +* Showing content properties +* Listing folder items +* Listing file versions +* Updating file content and properties +* Deleting files and folder +* Showing repository capabilities +* Retrieving the Root Folder ID +* Managing Permissions + * [CMIS]({% link federation-services/latest/config/index.md%}#cmis) + * [Documentum]({% link federation-services/latest/config/index.md%}#documentum) + * [Box]({% link federation-services/latest/config/index.md%}#box) + * [FileNet]({% link federation-services/latest/config/index.md%}#ibm-filenet) + * [SharePoint Online (O365)]({% link federation-services/latest/config/index.md%}#microsoft-graph-sharepoint) + +##### Basic Configuration + +> **Tip:** Connector ids are how Federation Services identifies the individual connector when receiving calls from other sources, such as Federation Service. This value must be usable as part of url. Use the description field if you need more than a few letters/numbers to describe the connection. The description shows up with its connector ID across the product. + +* **Connector ID**: A unique identifier for this connection i.e. `simflofy_demo` (alphanumeric, dashes and underscore characters only) +* **Description**: The text that will be displayed on drop-downs etc. to identify this connection. +* **Type**: The type of Search Connection (Solr, Mongo, Elastic etc.) +* **Keep Connection Alive**: Federation Services will cache the connection for a given amount of time before discarding it. +* **Keep Alive in Milliseconds**: How long to keep the connection alive before discarding it (`300000` is 5 minutes) +* **Security Mode**: This is how to authenticate with the back-end search. + * **Authentication Connection**: The most common method is to use the appropriate authentication connection + * **User Pass-through Credentials**: Users the authenticates with whatever authentication they used for Federation Services. Only supported in rare cases. + * **None**: Only usable with the Filesystem Content Service Connector + +##### Connection Configuration + +Different connectors might require additional configuration. These values will populate after selecting a Type. + +##### Content Service Mapping + +You can also add mappings or mapping groups to your Content Service Connections which will allow you to map custom parameters to properties in the destination system. + +##### Add Mappings to a Content Service Connector + +1. Create a mapping. + * (Optional) Add your mappings (and other mappings) to a Mapping Group. +2. Click the edit icon for your Content Service connector. +3. In the drop-down under Mapping Type select Single Mapping or Group Mapping +4. In the drop-down under the mapping type you chose, select the Mapping or Mapping Group you want to add to this connection. +5. Save the Content Service connector. + +##### Creating Mappings for Content Services + +Content Service mappings will use the source as the **parameter name** for the content service call. The target field should match a field name in the destination repository. For easier use, you can leverage the schema discovery for your connectors to populate the output field names when mapping. + +![Content Service Mapping]({% link federation-services/images/content-service-mapping.png %}) + +In the above example, the parameter **name** can be populated to map data to the Title field in the connected repository. + +Here is an example call using the mapping above: + +```text +http://localhost:8080/3sixty-admin/repo/spo2/update? +fileId=s5dba1525-44a6-45ed-a42e-4a155a3f0539&name=second_level_22 +``` + +The above call will update the SharePoint document by setting the Title to '**second_level_22**'. + +##### Creating A Content Service Connection + +Following is an example of how to create a new content service connection. + +**Step 1: New Connection** + +To create a content service connector instance select the Content Service Connections under the Connections header. Click Create New Content Service Connection + +You will be brought to the generic Content Connection page. + +**Step 2: Basic Configuration** + +* **Connector ID:** This uniquely identifies this instance of the connector. This must be unique and will be used when you index content and metadata. +* **Description:** Describe your connection. Be descriptive as you may not be the only one using this connection. +* **Type:** Select from a drop-down list of Content Service Connectors installed in your instance of Federation Services. Once you select a connector type you will be presented with further options which will be documented on the connector page for that type. Don't see your connector listed here? Contact your Federation Services Administrator or Federation Services Support. +* **Keep Connection Alive:** If checked then we will cache the connection object so the user doesn't have to re-connector for every action they want to perform. If unchecked each API action will result in a login to the third-party system. +* **Keep Alive in Milliseconds:** How long to keep the session in cache. +* **Connection URL:** The URL or Path to connect to. +* **Security Mode:** Authentication Connection: This uses an authentication connector. An example may be a Box OAuth Connector. These can be a little more complex than the first 3 options and provides customisations by allowing you to create your own auth connectors. + +**Step 3: Connection Configuration** + +**Add Configuration Parameter (Button)**: Some connectors allow for optional parameters than can be passed via key/value pairs. Most of the time you'll have a form to fill out, but for more advanced features that are situational adding a key/value pair makes sense as it won't clutter up the user interface. + +##### List of Repositories supported by Content Services + +* Alfresco +* CMIS +* Amazon S3 +* Azure Content Service Connector +* Box +* MongoDB (GridFS) +* Documentum (DFC) +* DocuShare +* Dropbox +* Elasticsearch +* File-system +* FTP +* Google Drive +* IBM FileNet +* iManage +* Microsoft Exchange +* Microsoft OneDrive +* Nuxeo +* Objective +* Salesforce +* ServiceNow +* SharePoint Online +* Webdav +* Zendesk + +#### Content Service REST Endpoints + +##### GET FILE + +```text +GET /api/repo//file?id= +``` + +**Description**: + +* Returns an input stream that contains the document's content. + +**Path Parameters**: + +* **connectorid**: The connector id of your content service connector + +**Query Parameters**: + +* **id**: Source repository id. Differs depending on repository. + +**With CURL** + +```bash +curl -u admin:admin -X GET "localhost:8081/3sixty-admin/api/repo/box/file?id=384896487495" | json_pp +``` + +##### GET OBJECT ID BY PATH + +```text +GET /api/repo//idbypath?fileName=&folderPath= +``` + +**Description**: + +* Searches for a file and returns its unique id + +**Path Parameters**: + +* **connectorid**: The connector id of your content service connector + +**Query Parameters**: + +* **fileName**: Name of the file to find +* **folderPath**: Parent folder path of the file + +**Returns**: + +```text +{ +"results": { +"id": "38489648749" +}, +"success": true +} +``` + +**With CURL** + +```bash +curl -u admin:admin -X GET "localhost:8081/3sixty-admin/api/repo/box/idbypath?fileName=testFolder&folderPath=/TestFolder/ | json_pp +``` + +##### POST FILE + +```text +POST /api/repo//file?fileName=&folderId=&type= +``` + +**Description**: + +* Uploads a file to the target repository. Must be a multipart /form-data request with the file as a body. Multipart form boundaries will need to be set. See the Postman tutorial for correct settings. + +**Body Parameters**: + +* **file**: Attach your multipart file as the **file** parameter + +**Path Parameters**: + +* **connectorid**: The connector id of your content service connector + +**Query Parameters**: + +* **fileName**: The name of the file. +* **folderId**: The repository id of the folder where the file with live. +* **type**: The document type. Varies greatly depending on repository. Use **types** endpoint. + +**Returns**: + +```text +{ +"results": { +"id": "629425696136" +}, +"success": true +} +``` + +**With CURL** + +```bash +curl -u admin:admin -Ffile=@/Users/simflofy/CaterpillarDEUAjax.pdf" +localhost:8081/3sixty-admin/api/repo/box/file?fileName=Caterpillar%20DEU%20Ajax.pdf&folderId=105965269305&type=document" | json_pp +``` + +##### UPDATE FILE + +```text +PUT /api/repo//update? +fileId=&folderId=&fileName=&type=&property1=&property2=... +``` + +**Description**: + +* Uploads a file's content or properties to the target repository as an update.Content can be attached as a binary body to the request. If no content is supplied, Federation Services will try update properties instead. + +**Path Parameters**: + +* **connectorid**: The connector id of your content service connector + +**Query Parameters**: + +* **fileId**: The ID of the file you wish to update, from the repository. +* **fileName**: The name of the file. Use if supplying folder ID. +* **folderId**: The repository id of the folder where the file you are updating lives. Use if supplying fileName. +* **type**: The document type. Varies greatly depending on repository. Use types endpoint. +* **property(n)**: Properties that you wish to update with this call can be appended to the query + +**Returns**: + +```text +{ +"results": { +"id": "629425696136" +}, +"success": true +} +``` + +**With CURL** + +```bash +curl -u admin:admin -Ffile=@/Users/simflofy/CaterpillarDEUAjax.pdf" +localhost:8081/3sixty-admin/api/repo/box/update?fileName=Caterpillar%20DEU%20Ajax.pdf&folderId=105965269305&type=document" +| json_pp +``` + +##### UPDATE FILE CONTENT + +```text +PUT /api/repo//updateContent?fileId= +``` + +**Description**: + +* Will update the content of the file using the supplied request body + +**Path Parameters**: + +* **connectorid**: The connector id of your content service connector + +**Query Parameters**: + +* **fileId**: The ID of the file you wish to update, from the repository. +**Returns**: + +```text +{ +"results": { +"id": "804939960448" +}, +"success": true +} +``` + +**With CURL** + +```bash +curl -X PUT -u admin:admin --data-binary '@/Users/simflofy/CaterpillarDEUAjax-newversion.pdf' +'localhost:8081/3sixty-admin/api/repo/box/updateContent?fileId=804939960448' +| json_pp +``` + +##### UPDATE FILE PROPERTIES + +```text +PUT /api/repo//updateProperties?fileId=&=&= +``` + +**Description**: + +* Will update the properties of the file using the supplied parameters + +**Path Parameters**: + +* **connectorid**: The connector id of your content service connector + +**Query Parameters**: + +* **fileId**: The ID of the file you wish to update, from the repository. +* **paramX**: Name of the parameter to update +* **valueX**: New value of the parameter + +**Returns**: + +```text +{ +"results": { +"id": "804939960448" +}, +"success": true +} +``` + +**With CURL** + +```bash +curl -X PUT -u admin:admin +'localhost:8081/3sixty-admin/api/repo/box/updateProperties?fileId=804939960448&textfield=newvalue' +| json_pp +``` + +##### CHECKIN FILE + +`POST /api/repo//checkin?id=&comment=` + +**Description**: + +* Checks in the target file with the specified comment + +**Path Parameters**: + +* **connectorid**: The connector id of your content service connector + +**Query Parameters**: + +* **id**: Source repository id of the file +* **comment**: Optional: The check-in message. + +`POST /api/repo/cmis/checkin?id=5dba1525-44a6-45ed-a42e-4a155a3f0539&comment=Spacing%20Fix` + +**Returns**: + +```text +{ +"results": { +"id": "5dba1525-44a6-45ed-a42e-4a155a3f0539" +}, +"success": true +} +``` + +**With CURL** + +```bash +curl -u admin:admin -X POST "localhost:8081/3sixty-admin/api/repo/cmis/checkin? +id=5dba1525-44a6-45ed-a42e-4a155a3f0539&comment=Spacing%20Fix" | json_pp +``` + +##### CHECK OUT FILE + +`POST /api/repo//checkout?id=` + +**Description**: + +* Checks out the target file + +**Path Parameters**: + +* **connectorid**: The connector id of your content service connector + +**Query Parameters**: + +* **id**: Source repository id of the file + +`POST /api/repo/cmis/checkout?id=5dba1525-44a6-45ed-a42e-4a155a3f0539` + +**Returns**: + +```text +{ +"results": { +"id": "5dba1525-44a6-45ed-a42e-4a155a3f0539" +}, +"success": true +} +``` + +**With CURL** + +```bash +curl -u admin:admin -X POST "localhost:8081/3sixty-admin/api/repo/cmis/checkout? +id=5dba1525-44a6-45ed-a42e-4a155a3f0539" | json_pp +``` + +##### GET FILE BATCH (3.1.1 and older) + +```text +GET /api/repo/__BATCH__/file?id[x]=&conn[x]=&fname[x]= +``` + +**Description**: + +* Retrieves the requested files and returns them as a zip file. + +**Query Parameters**: + +> **Note:** [X] EQUALS AN INTEGER + +* **idx**: ID of the file to retrieve +* **connx**: Connector id of the file +* **fname**: The name to give the file when zipped. + +```text +GET /api/repo/__BATCH__/file? +id0=/home/user/simflofy/test.txt&conn0=localFS&fname0=test.txt&id1=629425696136&conn1=box&fname1=Caterpillar%20DEU%20Ajax.pdf +``` + +**With CURL** + +```bash +curl -u admin:admin -X "localhost:8081/3sixty-admin/api/repo/__BATCH__/file? +id0=/home/user/simflofy/test.txt&conn0=localFS&fname0=test.txt&id1=629425696136&conn1=box&fname1=Caterpillar%20DEU%20Ajax.pdf" +``` + +##### GET FILE BATCH (3.1.2+) + +`POST /api/repo/batch` + +**Description**: + +* Batches files into a zip file and returns a download link item, whose id can be used with the File Service. Any errors will be reported in the file errors.txt, included with the export. + +**Body Parameters**: + +A JSON Object in the following format: + +```json +{ +"batch":[ +{ +"fileName": "myfile.txt" +connId: "fs" +"id": "/Users/user/Documents/myfiles.txt" +}, +{ +"fileName": "boxfile.txt" +connId: "box" +"id": "635846060210" +} +] +} +``` + +**Returns**: + +```json +{ +"success": true, +"results": { +"internal": true, +"expires": 1646759571044, +"fileName": "BATCH_1646757913.zip", +"createdBy": "admin", +"connectorId": "3Sixty Admin", +"docId": "6213e0f0f7558f0cc7458e5e", +"created": 0, +"id": "$2a$04$3vXhjvIAX7lQZY4OSUa8L.tY6263QBw61eye9OYaEiAGp9enNX.lW", +"used": 0 +} +} +``` + +##### GET FILE VERSIONS + +```text +GET /api/repo//listversions?id= +``` + +**Description**: + +* Returns a JSON Object listing the versions of an object. + +**Path Parameters**: + +* **connectorid**: The connector id of your content service connector + +**Query Parameters**: + +* **id**: Source repository id. Differs depending on repository. + +```text +GET /api/repo/cmis/listversions?id=5dba1525-44a6-45ed-a42e-4a155a3f0539 +``` + +**Returns**: + +```text +{ +"results": [ +{ +"docId": "5dba1525-44a6-45ed-a42e-4a155a3f0539;1.0", +"lastModified": 1583870808000, +"name": null, +"versionLabel": "1.0", +"versionLength": 409303, +"versionSeriesId": "512" +}, +{ +"docId": "5dba1525-44a6-45ed-a42e-4a155a3f0539;2.0", +"lastModified": 1583870809000, +"name": null, +"versionLabel": "2.0", +"versionLength": 409303, +"versionSeriesId": "1024" +} +], +"success": true +} +``` + +**With CURL** + +```bash +curl -u admin:admin -X GET "localhost:8081/3sixty-admin/api/repo/spo/listversions? +id=5dba1525-44a6-45ed-a42e-4a155a3f0539" | json_pp +``` + +##### DELETE FILE OR FOLDER + +**Delete Requests:** + +**Description**: Deletes a file based on source id. + +`DELETE /api/repo//delete?id=&allversions=` + +**Description**: Deletes a folder based on path. + +`DELETE /api/repo//delete?path= //Only for Filesystem` + +**Path Parameters**: + +* **connectorid**: The connector id of your content service connector + +**Query Parameters**: + +* **id**: The source repository id of the file. +* **allversions**: Delete all versions of the file, if any exist. Defaults is true +* **path**: The path of the folder to delete. + +`DELETE /api/repo/box/delete?id=629425696136&allversions=false` + +**Returns**: + +```text +{ +"results": { +"id": "629425696136" +}, +"success": true +} +``` + +**With CURL** (remember to encode spaces and quotes) + +```bash +curl -u admin:admin -X DELETE "localhost:8081/3sixty-admin/api/repo/box/delete? +id=629425696136&allversions=false" | json_pp +``` + +##### GET FOLDER ITEMS + +**Request**: + +```text +GET /api/repo//folderitems?id= +``` + +**Description**: + +* Returns a JSON Object listing the folders content. + +**Path Parameters**: + +* **connectorid**: The connector id of your content service connector + +**Query Parameters**: + +* **id**: Source repository id. Differs depending on repository. + +```text +GET /api/repo/box/folderitems?id=384896487495 +``` + +**Returns**: + +```text +{ +"results": { +"/All Files/3Sixty/credentials.csv": { +"BaseType": "document", +"CheckedOut": "false", +"CheckinComment": null, +"ContentLength": "201", +"CreatedBy": "", +"CreatedDate": "1573473832000", +"Description": "", +"Id": "556063296648", +"ItemPath": "/All Files/3Sixty/credentials.csv", +"MimeType": "text/csv", +"ModifiedBy": "", +"ModifiedDate": "1573473832000", +"Name": "credentials.csv", +"3SixtyType": "document", +"SitePath": "", +"Type": "file", +"VersionCount": "-1", +"VersionLabel": null, +"VersionSeriesId": "" +}, +"/All Files/3Sixty/test copy 24.txt": { +"BaseType": "document", +"CheckedOut": "false", +"CheckinComment": null, +"ContentLength": "40", +"CreatedBy": "", +"CreatedDate": "1573473831000", +"Description": "", +"Id": "556069315644", +"ItemPath": "/All Files/3Sixty/test copy 24.txt", +"MimeType": "text/plain", +"ModifiedBy": "", +"ModifiedDate": "1573473831000", +"Name": "test copy 24.txt", +"3SixtyType": "document", +"SitePath": "", +"Type": "file", +"VersionCount": "-1", +"VersionLabel": null, +"VersionSeriesId": "" +}, +"/All Files/3Sixty/test copy.txt": { +"BaseType": "document", +"CheckedOut": "false", +"CheckinComment": null, +"ContentLength": "40", +"CreatedBy": "", +"CreatedDate": "1573473831000", +"Description": "", +"Id": "556069266751", +"ItemPath": "/All Files/3Sixty/test copy.txt", +"MimeType": "text/plain", +"ModifiedBy": "", +"ModifiedDate": "1573473831000", +"Name": "test copy.txt", +"3SixtyType": "document", +"SitePath": "", +"Type": "file", +"VersionCount": "-1", +"VersionLabel": null, +"VersionSeriesId": "" +} +}, +"success": true +} +``` + +**With CURL** + +```bash +curl -u admin:admin -X GET "localhost:8081/3sixty-admin/api/repo/box/folderitems?id=384896487495" | json_pp +``` + +##### CREATE FOLDER + +`POST /api/repo/(connectorid)/folder?path=` + +**Description**: + +* Creates a folder at the specified location. + +**Path Parameters**: + +* **connectorid**: The connector id of your content service connector + +**Query Parameters**: + +* **path**: Absolute path of the folder to create. + +`POST /api/repo/box/folder?path=/3Sixty/testfolder` + +**Returns**: + +```text +{ +"results": { +"id": "109374560508" +}, +"success": true +} +``` + +**With CURL** + +```bash +curl -u admin:admin -X POST"localhost:8081/3sixty-admin/api/repo/box/folder?path=3Sixty/testfolder" | json_pp +``` + +##### GET ITEM PROPERTIES + +```text +GET /api/repo//properties?id= +``` + +**Description**: + +* Returns a JSON Object listing the objects properties + +**Path Parameters**: + +* **connectorid**: The connector id of your content service connector + +**Query Parameters**: + +* id: Source repository id. Differs depending on repository. +* GET /api/repo/box/properties?id=384896487495 + +**Returns**: + +```text +{ +"results": { +"simflofy_created": { +"DisplayName": "[2019-11-11T07:03:46]", +"QueryName": "Created" +}, +"simflofy_last_modified": { +"DisplayName": "[2019-11-15T18:46:31]", +"QueryName": "Last Modified" +}, +"simflofy_filename": { +"DisplayName": "[3Sixty]", +"QueryName": "File Name" +}, +"simflofy_content_type": { +"DisplayName": "[application/octet-stream]", +"QueryName": "Mime Type" +}, +"simflofy_length": { +"DisplayName": "[16249882]", +"QueryName": "Content Length" +} +}, +"success": true +} +``` + +**With CURL** + +```bash +curl -u admin:admin -X GET "localhost:8081/3sixty-admin/api/repo/box/properties?id=384896487495" | json_pp +``` + +### Discovery + +Discovery is Federation Services's user interface for Federation services. It is a highly configurable platform which uses Views and Widgets to organise, view, and manage your data in the most effective ways possible. + +#### Federation Configuration + +* **tsearch.simflofy.services.url**= The full url of the Federation Services-admin webapp. +* **tsearch.security.allow.expired**= Allows for expired ssl certificates when connecting to simflofy admin +* **tsearch.simflofy.services.auth.strategy**= Represents how to authenticate when performing queries. Note that this has no effect on how users log in. Options are **service** or **passthrough**. + * passthrough - The currently logged-in user is used to perform queries. This is the default, recommended setting. + * service - Queries will be performed as a single service user. This is not recommended, as many security features required the querying users username to filter results + * **tsearch.simflofy.admin.username**= service user username + * **tsearch.simflofy.admin.password**= service user password +* **tsearch.logo.file**= The location of the logo to use for certain views. Default is **tsearch/resources/styles/images/logo-simflofy-search.png** +* **tsearch.favicon.file**= Location of the favicon file. Favicon is the symbol that appears in tabs. Default is **/resources/styles/images/favicon.ico** + +Many of these can be accessed by Discovery Admins at `tsearch/config`. It is available via the user navigation (top right corner) menu under Configuration + +### Widgets + +#### Widget Instances + +Widget Instance is an instance of a Widget Definition that can now be placed in a Content View. Many instances of the same definition can exist in a content view. Each instance has a unique id. Federation Services comes preloaded with a number of common widget instances. If you don't find the type you need in your list, found under **Federation > Widget Instances**, you will need to create one. + +In the Widget Instance list you can search and sort by name, widget ID, label and field. + +##### Widget Instance List + +Following is a the list of widgets you will see upon installing Discovery with Federation Services depending on the template used when building a content view. + +**Top Menu All (Templates)** + +* My Views +* Create New View +* Bulk Download +* Upload Documents +* Saved Searches +* User Management + +**Left Navigation (Search and Dashboard Templates)** + +* Source Repository +* File Name Search +* Content Search +* Content Type +* Date Search +* File Size +* Has Pii +* Declared as Record + +**Content Action (Search Template)** + +* Edit Properties +* Edit Metadata +* View Metadata +* Version Information +* Preview +* Download File +* Check In File +* Check Out File + +##### Customisation + +To the left of each widget instance there are edit and delete buttons. + +To make changes to a widget instance click the edit button. Make any necessary updates and click save. You will need to republish any templates that have the widget in use in order to see any changes reflected in your Discovery environment. + +You cannot delete a widget instance that is being used by any content view template. To delete a widget instance you must first remove it from any templates it's being used on. Once this is done, you can click the delete button and click ok to confirm that you want to delete the instance. This action cannot be reversed. + +##### Create a New Widget Instance + +* In **Federation Services Admin** go to **Federation > Widget** Instances +* Click the **Plus** button. +* Select the Widget Definition for the new Widget Instance and click the **Continue** button + +**Name**: The name of the Widget Instance that will be display in Federation Services Admin when creating Federation Services Views +**Field**: The facet field associated with this Widget Instance. You can put na if this Widget does not require a field but there must be a value. +**Label**: The label that will be displayed in the Federation Services View when this Widget is displayed (only if the Widget shows a label). + +Options is a custom field. See below + +> **Info:** Custom Fields are also defined are part of the Widget Definition and act as additional configuration for the widget. Common examples include sort order, chart size, and whether to allow the widget to perform bulk actions. In the above case, the user is defining what facts to search on, and how to label them in a drop-down. When developing a widget, all custom fields should have a default value. + +Click **Save** to finish creating your new Widget Instance. + +#### Content Views + +Content Views are how users can interact with indexed content in Discovery. They also allow for administrators to control who can access the view, as well as who can use specific widgets within the view. Content views can be found under the Federation menu in Federation Services Admin. + +##### Creating a View + +Views can be created under **Federation > Content Views**. The following information is needed to create a new view. + +* **Short Name**: The key for the view. Only accepts alphanumeric characters, underscored and dashes (URL legal characters). This will be used as part of the url. + +> **Tip:** For example: if the shortname is 'test' and the template is 'search', the url will be `/Federation Services-discovery/view/search/test` + +* **Template**: Which view template to use. Federated Search or Reporting Dashboard Templates. +* **Display Name (Optional)**: Enter the name you want displayed for this view in the views drop-down and in the views list in the left navigation menu. If no display name has been entered Discovery will use the short name. +* **Select a Search Connection**: Select the Content Search Connection the view will use to perform searches. This connector should be set up prior to creating a Content View as not having one will prevent you from being able to save the view. + +##### Configuring Views + +**View Builder** + +**Sections**: The sections of the view, as defined by the template. The default SearchTemplate has three sections. Left Sidebar, Body, and Top Menu. +**Available Widgets**: The widget instances of types allowed for the section. +**Section Widgets**: The widgets in the section + +**Controls** + +* **+**: Add the widget to the section +* **x**: Remove the widget from the section +* **i**: Widget information panel. It allows you to update the properties of the instance.. +* **Double arrow**: Widgets can be reordered by dragging up and down. This changes the order in which the widgets are loaded + +**Configuration** + +* **Short Name**: The short name of the view. +* **Display Name**: Display name of the view. +* **Connector**: Search connector the view will use +* **Search on page load**: The view will perform its base query (as configured on the search connection) when the page is first loaded. +* **Add Records Management**: Only available with the Records Management module. Will be grouped with Records Management views on the federation dashboard. + +**Security** + +**View Users**: Users and groups who can access this view. Leave blank to allow all users to see this view. + +This list applies to both the Admin and Discovery apps. The SIMFLOFY_ADMIN role will not bypass this list. + +##### Content View Examples + +Discovery can be customised in various ways using the content view builder. Following are some examples of the types of views you can build for different result sets. + +**Basic Search View**: Will give you the search results of the files in the indexed repositories. This will allow users to filter these results in various ways. By Filename, file content, connector, and content type. It also gives users the option to perform actions on the files selected. Such as checking files in and out, editing and exporting file properties, preview and download content, upload files, save searches and create new views based on search results. + +**Simple Dashboard View**: Lets users create a visual representation of their data by adding charts based on indexed file properties. For example, you can create charts for the number of files by connector, file size, or file type. You can filter the results using the panels on the left-hand sidebar. Users can also remove and add counts from the charts by selecting the value labels in the chart legend. + +**Connector Report Dashboard**: Provides a report on the search connector in use. The report gives you a line graph of searches per day as well as search terms over the previous 4 days. + +**Clustering**: Provides a visual representation of the data using clusters that the user can drill into by content tags. + +## Integrations + +Federation Services has a standard process for performing integrations or indexing, as demonstrated by the steps below. + +1. Create connector instances - This is part of the installation and requires the Admin to create Integrations and Discovery connections for use with the source and target systems. If setting up Federation Content Service and View connections will also be required. +2. Discovery - Discovery is the 2nd step in the integration process. Here you will create a discovery schema instance, based on the connector's configuration. It includes a list of all object types as well as attributes stored in each. Run discovery to get the schema/content type information from both the source and destination systems. +3. Create and run jobs - This involves mapping metadata, configuring tasks for any kind of processing that is required (pre-requisite), and any targeted configuration for the source and destination. There are several ways to run jobs and depending on the amount of data the Federation Services Admin will set these up accordingly. + +### Job Setup and Configurations + +The final step in the integration process includes mapping fields from each repository, creating and running the final job. + +**Event Configuration** + +Event Rules let you trigger jobs from content service calls. For example, if a file is updated in a source system, an event can be set up to trigger an index. + +#### Event Job Configurations + +Event Rules let you trigger jobs from content service calls. For example, if a file is updated in a source system, an event can be set up to trigger an index. + +Event jobs, in abstract are meant to be triggered by some external action. For a basic event job, we use the push event endpoint, which tells Federation Services which document to get and which job to run it with. + +Event Configurations enhance Event Jobs and require: + +* `simflofy.event.queue=true` (which is the default setting) + +It allows them to be triggered through content service actions. So, if we want to add to that tutorial we would need to add a scenario in which we: + +1. Set up an event configuration +2. Add it to an Event Job +3. Trigger that job through a call to a content service endpoint. + +##### Field Options + +* **Name:** The name of the document. +* **Content Length:** The size of the document. +* **Content Type:** The content type (mimetype) of the document. + +> **Important:** The previous three field options will currently only work for the following endpoints. This may change in future releases. +> `/file` +> `/properties` +> `/contentStream` + +* **Content Connector:** The `connectorId` which was used. Can trigger on any endpoint. +* **Event Type:** The type of action. See the table below for the action for each end point. + +##### Creating and Event Job + +This tutorial will walk you through setting up an event job that will process one or more documents. After we create the event job, we will push a document to the event queue using an API call. The API call will also start the event job and copy our document from a source folder to a target folder. To get started we will need to create a source folder, target folder and a test document. + +###### Getting Started + +1. Create a source folder for your document. For example, `C:\SourceDocuments`. +2. Place a test document into this folder. +3. Create a target folder. For example, `C:\TargetFolder`. + +###### Creating a Federation Services Event Job + +**Step 1. Create a File System Connection** + +You will need a connection to your source and target repositories. Because our source and target repositories are the same, we only need to create one connection. + +1. Log into the **Federation Services Admin** tool (`http://(your server)/Federation-Services-admin`). +2. On the left-hand side expand **Connections** and choose **Integration**. +3. At the top left corner of the screen, click the button **Create Integration Connection**. Fill out the popup screen and click **Save**. This creates a connection to the File System that you can use as both a source and a target connection. + +After you click **Save**, another screen shows the connection, click **Save** again. + +**Step 2. Create an Event Job** + +A Federation Services Job is the process of moving or syncing content (including versions, ACL's, metadata) from one CMS (content management system) to another. Since Federation Services Jobs are specifically engineered for content management systems, moving content and metadata is just point and click. There are many Job Types as well as Job Tasks that can handle anything from data validation and cleansing to duplication detection. + +In the Federation Services Admin tool: + +1. Expand **Integration** on the left-hand menu and choose **List Jobs**. +2. On the right-hand side, click the button **Create New Job**. +3. Enter the data into the popup screen and click **Save**. The Repository Connection is the source system and the Output Connection is the target system. +4. For Job Type, select Event +5. Click **Save** on the popup, and you are presented with the edit screen for your job. +6. The source file path should be set to include the location of the files you want to push. In our case we will set it to `C:\SourceDocuments`. Any files in `SourceDocuments` or its subfolders will be able to be pushed. + + > **Info:** It is possible to set the File Path to a root drive such as `C:\\`. We do not recommend doing this as it would allow any file on that drive to be pushed. + +7. Next we need to enter the target folder. Click on FileSystem Connection-Output tab and enter the target folder where the file(s) will be copied (migrated) to: `C:\TargetFolder`. +8. We will leave the default values for everything else and click **Save**. + +This saves our event job, and we are ready to execute it. + +**Step 3. Execute the Event Job (Using an API call)** + +We have to tell the event job which document we want to process. This requires making an API call and passing two parameters, jobId and documentId. + +1. Find the job ID: + To get the jobId, open the job and on the Details page look for the ID field. + Edit or view the job we just created to see the job id. +2. Find the document ID: + To get the documentId, use the full path of the document, i.e. `C:/SourceDocuments/sampledoc.pdf`. + In the SourceDocuments folder we will be copying sampledoc.pdf. Therefore, the documentId will be the full path: `C:/SourceDocuments/sampledoc.pdf`. Note the forward slashes. +3. Construct an API url and call it. + +Construct the API URL: + +We will now call the API to push the document into the queue for processing. + +URL format: + +```text +http://{HOST}:{PORT}/3sixty-admin/api/event/service/pushevent?jobId=1631569493226&documentId=C:/SourceDocuments/sampledoc.pdf +``` + +Example curl command: + +```bash +curl -u username:password "http://localhost:8080/3sixty-admin/api/event/service/pushevent?jobId=1631569493226&documentId=C:/SourceDocuments/sampledoc.pdf" +``` + +Once the API is called, the document will be placed in a queue and the event job we created above will be started. + +The Source file will be copied to the destination folder TargetFolder. (note the full path of the source document is copied to the target folder.) + +You can continue to call the API with different document IDs, and they will be processed as soon as they are inserted into the queue. + +Also, note that the event job will continue running until you kill the job. + +To kill a job, on the left-hand menu under Admin, select Active Jobs - Select the trash can icon to kill the job. + +##### Event Types and Endpoints + +| Event Type | Endpoint | Method | +| ---------- | -------- | ------ | +| FILE_DOWNLOAD | /file | GET | +| FILE_DOWNLOAD | /inlinefile | GET | +| CREATE_DOCUMENT | /file | POST | +| UPDATE_DOCUMENT | /update | PUT | +| UPDATE_CONTENT | /updateContent | PUT | +| UPDATE_PROPERTIES | /updateProperties | PUT | +| CREATE_FOLDER | /folder | POST | +| DELETE_OBJECT | /delete | DELETE | +| STREAM_CONTENT | /contentStream | HEAD | +| STREAM_CONTENT | /contentStream | GET | +| FIND_PROPERTES | /properties | GET | +| DELETE_ACL | /acls | DELETE | +| GET_ACL | /acls | GET | +| EDIT_ACL | /acls | POST | +| VERSION_DOWNLOAD | /version/content | GET | +| FIND_VERSION_PROPERTIES | /version/properties | GET | +| CREATE_VERSION | /version | PUT | +| REVERT_VERSION | /version/revert | POST | +| DELETE_VERSION | /version | DELETE | +| LIST_VERSIONS | /listversions | GET | + +#### Job Mappings + +Federation Services Mapping gives you the ability to map your content types and metadata from one system to another. Before you start, be sure you are familiar with creating jobs and discovery. Both are integral to mapping. + +##### Overview + +In this tutorial we will explain how mapping works in Federation Services. Where you can create your map types, aspects, fields and calculated fields. How to update mappings in mass using Mapping Templates. How to export and import mappings. And complex scenarios such as mapping type hierarchies. + +##### Creating Mappings + +Federation Services Mapping gives you the ability to map your content types and metadata from one system to another. There are two places in Federation Services where you can set up mappings: + +* [Reusable Mappings](#reusable-mappings) +* [Mappings Tab](#mappings-tab) + +###### Reusable Mappings + +From the **Integration** menu on the left-hand side of the Admin Page select **Job Mappings**. +The **Job Mappings** menu item lets you create reusable mappings that you can then add to a job. This is especially useful when you have a lot of jobs with the same mappings. This way, you can edit one Job Mapping, and it will then be updated for all jobs that use that mapping. You can also download the JSON representation of the mapping to use for mappings import on another system. + +###### Mappings Tab + +The Mappings tab in a job is great when you need a one-off mapping that other jobs won't use or if your mapping only applies to one job. + +###### Mapping Types + +There are several things you can map as seen below: + +* **Field Mappings** allow you to map metadata fields from the source to the target. The names and data types can change from the source to the target by setting the Target type. +* **Aspect Mappings** allow you to map aspects for output systems that support them. Some systems, like OpenText Content Management System call these Categories. Aspects represent a collection of metadata field. You can typically have more than one aspect on a document. +* **Type Mappings** allow you to map the source type to a target type. These do not have to be the same name. +* **Calculated Fields** allow you to set constant values by surrounding them in single quotes (') or using the Federation Services [Expressions Language](#federation-services-expression-language). + +> **Info:** Calculated fields are processed before tasks and field/aspect mappings. If you wish to further use the product of a calculated field for you will need to create a separate mapping using the calculated fields output as the source. + +###### Discovery Within Mappings + +Mappings make heavy use of discovery information. Discovery allows you to pick your types and fields from drop-down lists instead of typing them out. It also knows the data types of each field. This allows for a much faster and less error-prone method of mapping types, aspects, and fields. + +###### Audit Mappings + +Audit mappings allow you to add field names and values to the Federation Services audit. These can later be used to create reports for analytics and/or validation. By default, Federation Services selects normal file system attributes to audit. These include file id, file name, created/modified dates, and author. A red eye is not being audited. Green is being audited. Simply clicking on the eye will change it to being audited or not. + +###### Calculated Fields + +Calculated fields allow you to hard code values or use functions. +If you find the function calls getting too complex, we strongly suggest using a [Job Task](#event-job-configurations) instead. Calculated fields are designed to be simple. Complex examples that have multiple levels of function calls are prone to error and tasks are designed for complex logic, unlike calculated fields. + +###### Importing and Exporting Mappings + +To export a mapping, go to the **Job Mapping** page, and select the **export** icon with the down arrow on it. +Click **Export Mappings** to save the mappings as a json file. +To import mappings go to the **Mappings tab** in the integration job and click on the green **Import** button. + +You can import multiple mappings into the same job. Just click on the Import button and cut and paste the JSON from the export into the text area provided. + +Example of a JSON format for import mapping under the mappings tab in the job config. + +```json +{"mappings":[ +{"sourceType":"TEXT","watch":false,"mappingType":"TYPE_MAPPING","targetType":"TEXT","source":"Email","position":0,"target":"duotAF9"} +, +{"sourceType":"TEXT","watch":false,"mappingType":"ASPECT_MAPPING","targetType":"TEXT","source":"Email","position":1,"target":"cAF739"} +, +{"sourceType":"TEXT","watch":false,"mappingType":"FIELD_MAPPING","targetType":"TEXT","source":"Email.Subject","position":2,"target":"tAF723"} +, +{"sourceType":"TEXT","watch":false,"mappingType":"FIELD_MAPPING","targetType":"TEXT","source":"Email.To","position":3,"target":"tAF722"} +, +{"sourceType":"TEXT","watch":false,"mappingType":"FIELD_MAPPING","targetType":"CHECKBOX","source":"hasPii","position":15,"target":"tAF701"} +]} +``` + +##### Mapping Groups + +Mapping groups allow you to group integration job mappings into logical groups that you can then manage together. + +###### Creating Mapping Groups + +Creating a mapping group is easy. You just give it a name, click the Add Mapping Group button, and then select mappings from the list. You can use the search box to filter the list. + +###### Using Mapping Groups + +In the job's Mappings tab your mapping groups will show up in the Select Additional Mappings drop-down. Read Only versions of the mappings will appear at the bottom of the page, so you won't have to leave to confirm the content of each mapping in the group. + +##### Properties File Discovery + +If you ever have the situation where Discovery can't automatically find your fields, but you know they will be there, then you can create your own mappings with a properties file. + +In some systems, like email headers or iManage, fields can be dynamic and so Discovery can't find them. To add your own fields, do the following: + +1. Create a properties file that will contain your fields. An example can be found in your installation: + + ```text + tomcat/webapps/3sixty-admin/WEB-INF/classes/propertiesFileDiscoverySample.properties + ``` + +2. Edit this file, or the one you created if it's different: + + ```text + # Fields Types + # CHECKBOX,DATETIME,TEXT,TEXTAREA,INTEGER,LONG,DECIMAL,DOUBLE,URI,READONLY,BINARY,ANY + # + # Format + # type.field=field type + # If they key has a space in it, replace the space with the unicode value: + # u0020 + # Historicalu0020Documents.field=CHECKBOX + document.name=TEXT + document.description=TEXTAREA + document.createddate=DATETIME + folder.name=TEXT + folder.isversion=CHECKBOX + ``` + +3. Create a properties file discovery instance and point it to your properties file. Run it and your types and fields should show up, and now you can use them in job mappings. + +##### Federation Services Expression Language + +Federation Services uses a version of the JEval project to handle expressions. Expressions can be used in many places in Federation Services. Specifically they are used for calculated fields on the mapping page, but tasks and connectors can use them in their configuration pages too. The filter task is another good example. + +An expression allows you to create values based on some formula or set of function calls. This can be used in a host of use cases to solve many problems including: + +1. Formatting data +2. Value based on result of a decision +3. Setting default values +4. Creating data from other data + +**Expression Basics** + +An expression is just a series of Strings, Numbers, Function Calls, and Operators put together by the administrator resulting in a value. + +###### Strings or Numbers or Booleans + +Strings are surrounded with ' '. If something is not surrounded with a ', then it's treated as a number. This will result in an error if you try to convert a string to a number. + +'Mark' is a string + +Mark is a number, but will cause an error. + +'0' is a String + +0 Is the number 0. + +Booleans result in 1.0 or 0.0 where 1.0 is true and 0.0 is false. + +'mark' == 'mark' would result in 1.0, or true. Whereas + +'mark' == 'nathan' would result in 0.0. + +###### Variables + +Variables are either part of the Repository Document, Version History, or Fields from a Repository. +**Info:** You access a variable using the following format: **'#{rd.path}'** + +Tasks search for `#{` when detecting calculated field. The first portion identifies where to find the data. +**Repository Document**== rd +**Version History**== version +**Fields**== field or nothing + +Examples: + +`#{rd.mimetype}` + +`#{version.label}` + +Where document is the type: + +`#{document.myfield}`, which is exactly the same as `#{field.document.myfield}` + +See below for a full reference of all rd and version variables available. + +###### Function Calls + +You call functions with no ' ' such as: + +`now()` + +Most functions are camel case. So first letter is lower case, start of each syllable after that is upper case: + +`toLower()`, `startsWith()`, etc.. + +###### String Functions + +Full list of String functions with example: + +`startsWith('test.pdf', 'test', 0)` +`substring('test.pdf', 3, length('test.pdf'))` +`toUpperCase('test.pdf')` +`indexOf('test.pdf', '.', 0)` +`length('test.pdf')` +`replace('test.pdf', 'p', 'x')` +`concat('test.pdf', 'test.xml')` +`equals('test.pdf', 'test.PDF')` +`equalsIgnoreCase('test.pdf', 'test.PDF')` +`compareToIgnoreCase('test.pdf', 'test.xml')` +`compareTo('test.pdf', 'test.xml')` +`charAt('test.pdf', 1)` +`endsWith('test.pdf', '.xml')` +`toLowerCase('Hello World!')` +`trim('abc ') + 'd'` +`lastIndexOf('abcabcabc', 'abc', 8)` +`eval(1 + 2)` + +###### Math Functions + +Full list of math functions with example: + +`asin(1)` +`atan(2.2)` +`atan2(2.2, 2.3)` +`ceil(2.2)` +`cos(2.1)` +`exp(2.2)` +`floor(2.2)` +`IEEEremainder(2, 6)` +`log(2)` +`max(2.2, 3.5)` +`min(2.2, 6.6)` +`pow(2, 5)` +`random(6)` +`rint(2)` +`round(2)` +`sin(2)` +`sqrt(9)` +`tan(2)` +`toDegrees(45)` +`toRadians(44)` +`abs(-1)` + +###### Custom Functions + +If the first argument is blank, use the second argument. + +`isblank('#{rd.path}', '/my/default/path')` + +Returns the date at the time the job is run + +`now()` + +If the first date string is not a valid date, it will use the second date string as the default. This can be now(), another hard coded String, or some other function or set of functions. + +`toDate('Date String', 'Default Date')` + +###### Creating your own custom functions + +**Operators** + +The normal Boolean, number, and string operators for Java work with Federation Services Expressions: + +`+` +`-` +`&&` +`!` +`||` +`/` +`==` +`)` +`(` +`)=` +`(=` +`%` +`*` +`!=` + +###### Repository Document Variables + +All variables with Federation Services Variable Resolvers are case-insensitive. + +###### Repository Document + +`CreatedDate` +`ModifiedDate` +`FileName` +`FileLength` +`ID` +`MimeType` +`ObjectType` +`Path` +`3SixtySourceRepositoryID` + +###### Version + +`totalVersions` +`label` +`seriesId` +`isLatest` +`isMajor` +`listId` + +###### Examples + +`#{rd.CreatedDate}` +`#{rd.ModifiedDate}` +`#{rd.FileName}` +`#{rd.FileLength}` +`#{rd.ID}` +`#{rd.MimeType}` +`#{rd.ObjectType}` +`#{rd.Path}` +`#{rd.3SixtySourceRepositoryID}` +`#{version.totalVersions}` +`#{version.label}` +`#{version.seriesId}` +`#{version.isLatest}` +`#{version.isMajor}` +`#{version.listId}` + +###### Custom Fields you need to prepend with field + +`#{field.myObject.myCustomField}` + +`#{rd.filename}` + `_` + `version.label` + +`#{mytype.claimid}` + `_` + `#{mypolicy.policynumber}` + +Filters expect a Boolean result, 1.0 or 0.0. So you can do things like: + +`#{rd.mimeType} == text/html` + +###### Nested Functions + +You can also nest functions. A good example is toDate: + +`toDate('#{rd.createddate}', now())` + +This results in `rd.created` date being formatted into UTC format, but if for some reason Federation Services detects an invalid date it will use the result of `now()` instead. + +###### Migration Manager Variables + +**Variable name**: job.lastrundate +**Description**: This variable is substituted by the last successful job run date. If the job is run for the first time, it substitutes with 1st January, 1990 +**Example**: SELECT * FROM mydatabase.events where created_at > CONVERT(DATE_FORMAT('#{job.lastrundate}', '%Y%m%d'), char); + +#### Schedule Jobs + +Federation Services allows users to schedule integration jobs and job groups to run at a time period that may be more effective for the servers running them. Jobs can be scheduled to run at set times as well as set intervals. By minutes, hours, days, weeks etc. + +##### Creating a Scheduled Job + +**To create a scheduled job:** + +1. Select Schedule Jobs from the navigation menu under the Integration section. +2. Select the Create New Job Schedule button at the top of the page. +3. Give your scheduled job a **name**. +4. Fill out the Configuration Fields (descriptions below). +5. Click the **Update Configuration** button once you are done configuring the scheduled job for it to start running at the set time and interval. + +> **Note:** If the schedule on a running job changes, that job will be aborted and the new schedule will take effect immediately. + +##### Configuration Fields + +* **Schedule Name**: Name of the schedule. +* **Run Schedule**: Sets the schedule to run. +* **Run Jobs in Parallel**: If using a Job Group, run all the jobs simultaneously. +* **Schedule Begin Date**: The date for this schedule to begin running. **The date range still needs to be set on jobs**. + * If the date is before the current date and time, the schedule will run immediately if Run Schedule is set to On. +* **Schedule End Date**: The date for this schedule to stop running. **The date range still needs to be set on a jobs**. + * If the date is before the current date and time, the schedule will inform you and set Run Schedule to Off. +* **Interval Between Runs**: How often the schedule will run. **An interval of fewer than 3 minutes is not recommended**. +* **Job/JobGroup**: Sets whether to run a Job or a Job Group. If Job Group is selected, you will be able to choose the run order for jobs in the group. + +##### Job Status + +At the top of the scheduled job you can see the current status. + +* **Current Status**: `Unsaved` until **Update Configuration** button is pressed. Then `OFF`, `WAITING`, or `RUNNING`. +* **Time until next run**: As it reads. If this runs to zero, it will not refresh unless the schedule is closed and reopened. Will Display as `NA` if performing a single run (interval set to `0`) or the job is currently running. + +#### List Jobs + +A Federation Services Job is the process of moving or syncing content(including versions, ACL's, metadata) from one CMS (content management system) to another. Since Federation Services Jobs are specifically engineered for content management systems, moving content and metadata is just point and click. There are many Job types as well as Job Tasks that can handle anything from data validation and cleansing to duplication detection. + +The List jobs page shows the jobs created. The available Job Types are: + +* Sync +* Simple Migration +* Incremental Migration +* Event +* Polling + +##### Job Types + +There are several Job Types available depending on the use case. + +* **Simple Migration**: Unlike Sync Jobs, deletions are not processed and content state is not recorded locally other than normal Job Auditing. **Simple Migration** uses manually entered timestamps whereas **Incremental Migration** will increment timestamps for each job run. +* **Incremental Migration**: Same as Simple Migration except at the start of each job run the query timestamps will be incremental automatically to read documents that were added or modified since the last run started. +* **Manage In Place**: Creates a shortcut to the file allows users to access files in source repos from Alfresco or Objective ECM without having to move the files allowing users to manage all of their content in place. This type of migration is only available for the Objective ECM Connector and Alfresco Connector at this time. +* **Polling**: A simple migration that runs continuously, the job processes at a specified interval and then sleeps until the next processing time. While it sleeps, the status of this job will be `Waiting`. +* **Event**: This type of job acts as a listeners for certain Content Service events, in order to run individual documents through a job, without starting and stopping the job. They can be triggered through a push event or by an event configuration. While not running, these jobs will show the status `Ready`. + +##### Job Groups + +To access Job Groups, go to the group section in the left sidebar and select Job Groups. From here you can view and create Job Groups. When creating a job, users are given an option to either create a new Job group or assign the job to an existing job group. + +* To create a new job group check the **Create a new job group for the job** check box and enter a name for the new job group. If no name is entered Federation Services will default to the name of the job as the Job Group name +* To add the job to an existing group, Select the group from the **Job Group** drop down. This will add this job to that group once created. + +###### Creating a Job Group + +To access Job Groups, go to the group section in the left sidebar and select **Job Groups**. From here you can view and create Job Groups. + +1. Click **Create New Job Group**. +2. Fill in the **group's name**. +3. Select which **jobs** you want included in the group. You can use the search box to filter the available jobs list. +4. Click **Save**. + +##### Job Configuration Fields + +**Standard Options** + +* **ID**: The unique identity of this Job. If running jobs using the RESTful interface or command line, this is the Job ID to enter. +* **Name**: Descriptive Name of the Job that will be displayed throughout the UI. +* **Content Service Connector**: If using a Content Service Connector, set it here, and it will be appended to every record processed. This field is required for Federation Integration jobs. +* **Repository Connection**: The Repository Connection used for this Job. +* **Output Connection**: The Output Connection used for this Job. +* **Type**: The type of Federation Services Job. +* **Job Tags**: Another option for separating jobs into groups. If any jobs have tags, they will appear as a filtering option when listing jobs. Tags are case sensitive. +* **Include documents modified after this date and time**: Referred to as "Start Time", this time will be used to check the last modified date of files before processing them. +* **Include documents modified before this date and time**: Referred to as "End Time", this time will be used to check the last modified date of files before processing them. + +START AND END TIME +These values are only set by users for Simple Migrations. For Incremental Migrations, they are calculated based on when the job was last run. Event and Polling jobs don't use them at all + +##### Notifications + +Notifications will only function is email is enabled. This allows the user to set conditions in which the listed email addresses will receive confirm status reports when a job completes. + +##### Auditing + +* **Audit**: Where to write audit data too. Note that **Job Restart** and **Document Search** will only work if Mongo is selected. + * **Mongo**: Audit to the Mongo Database or SQL Database if running in SQL mode. + * **Log4j**: Audit to the 3sixty-admin.log + * **None**: Auditing is turned off. + +* **Record Audit When**: The audit level or what to audit. + * **All (Read, Written, Skipped, Deleted and Failed)**: Full Auditing + * **Failures Only**: Audit only those records that fail during a job run. + * **Failed and Deleted**: Audit a record that failed during the job run or was deleted from a **Sync Job**. + * **Failed and Skipped**: Audit a record that failed during the job run or was skipped. + * **Written, Failed and Deleted**: Audit a record that failed during the Job run or was deleted from a **Sync Job** or written by the Output Connection. + * **Written, Failed, Skipped and Deleted** : Audit a record that failed during the Job run or was skipped or deleted from a **sync job** or written by the Output Connection. + +##### Advanced Options + +* **Repository Connection Thread Count**: The number of individual workers which will process and queue documents. Implementation may vary in certain systems. +* **Output Connection Thread Count**: The number of individual workers which will process and post documents. Implementation may vary in certain systems. +* **Batch Size**: If greater than 0, Documents will be assigned a batch ID. Batch Ids are a combination of the job id and the job run id (the timestamp of when the job was started), plus the batch number. The batchId will also be set as the highest parent folder for the document. (For example, `/home/simflofy` will become `{batchId}/home/simflofy`). Some connectors have their own batch configuration, which is compatible with this field. +* **Max Queue Size**: Limits the number of documents that can be queued at once, making repository workers wait. This can slow down output speeds, which may be useful if your output repository can be throttled. +* **Max Errors Allowed**: Maximum errors before the job stops. Leave 0 for unlimited errors. +* **Process Relationships** : Check this to tell Target Connector to process Document Relationships. This feature only works for the CMIS Connector. +* **Include Hash** : Check to tell Repository Connector to create hash of content if possible. +* **Repository and Output Time Zone**: These values will be used to adjust date fields (Created, Modified, and Mapped) to the appropriate timezone for their destination. +* **Chain Job**: Select a job to run after this one completes. +* **Chain Job Wait Interval**: Amount of time to wait after job completes before starting next job in format: 5s 5m 5h 5d +* **History Retention**: How long to keep the Job Run History for this job before the Job History Clean up Service clears the content. + +#### Job Tasks + +Job tasks provide a processing pipeline for documents and metadata. This means doing things like: + +1. Filtering content out or in based on rules, such as metadata values. +2. Cleaning up file names or file paths. +3. Re-Parenting based on rules. +4. Extracting metadata from paths. +5. Adding metadata from third parties such as Databases, Rest APIs, OCR Engines, etc.. +6. Transforming documents from one mime type to another, such as Word to PDF. +7. Transforming metadata. +8. PII - Personally Identifiable Information - detection. +9. De-Duplication. + +##### Adding Tasks to Jobs + +There are over 30 tasks available out of the box and Federation Services is adding more all the time. This is the most popular extension point in Federation Services. + +You can choose and configure job tasks on a per-job basis from the Tasks tab in any given Job. + +You can re-order the pipeline by dragging and dropping the tasks. You can delete tasks or add new tasks. + +The default recommended thread count is 1. + +These tasks run in order, meaning if something is changed with the documents or metadata in one task, then the following tasks will see those changes. + +##### Task Groups + +Users can create task groups for tasks they will use often so they do not have to constantly create them for every job. When you select "Yes" under use a task group, a second box will pop up. + +**Run Group Task Options**: + +Select before or after to let Federation Services know when to run the tasks in the group. Selecting before will run the group tasks prior to any addition tasks listed in the job, while selecting after will run the tasks after the others. + +In the drop down provided, select the Task group you would like to run with this job. Once selected you will see a list of all the tasks in the group. Click on the eye icon to view the details of each task. + +#### Run and Monitor Jobs + +The Run and Monitor Jobs page is where you can monitor the progress of your integration jobs. From this page you can see the status of your jobs. How many files have been migrated. When the job was last ran and any errors that might have occurred during the integration. + +> **Note:** When migrating documents with multiple versions, if a version in that series fails for any reason, the subsequent versions will not be processed. They will instead be 'Skipped' and previously uploaded versions will be cleaned up/deleted. + +##### How to Run and Monitor Jobs + +Under the **Integration** section in the navigation menu click **Run and Monitor Jobs**. On this screen, jobs can be stopped, started, and errors run. + +Jobs can be filtered by Job Groups if you wish to focus on a specific set of integration jobs. See the following article for instructions on how to set the Job Groups up and use the drop-down to filter the job list by the group selected. + +Set **Refresh** times for job runs. The page will refresh in the time period selected to show the updated job status. + +Use the **Search** field to filter the job list for specific jobs. + +Use the **Show entries** drop-down to select how many jobs get listed on each page. + +The list of jobs displayed will tell the user the job status, how long the job took to run, how many files have been read, written, have errors, removed and skipped. + +##### Reviewing Job Errors + +If any errors occurred during the job run, you can click on the error count to get to the error report page. From the error report you will be able to see the cause of the errors and download them as a csv if needed. For additional debugging instructions see the following article: [Federation Services Logging Instructions]({% link federation-services/latest/admin/index.md%}#logging). + +##### Resuming and Restarting Jobs + +**Resuming a job**: Usable when a job is aborted. Reruns the job, but a special task is added that will skip documents which had errors in the previous run. +**Run Errors**: Available when a job fails or is aborted. Only the errored documents will be processed. + +### Advanced Configurations + +#### PII Detection and Reporting + +While doing a document migration or synchronisation it may be prudent to check the document, or it's metadata for PII. You can also crawl you content simply for PII by using our reporting output connector with any repository connector that we support. + +The PII Scan feature allows the user to select a configured repository connector and job, then scan the repository for Personally Identifiable Information (Pii). + +This can include phone numbers, social security numbers, proper names, and addresses. + +A temporary job is created using the repository configuration of the selected job. + +> **Important:** File size limit is 95MB + +##### Running the PII Scan + +Under Analytics select PII Scan and complete the PII Scan page: + +* Select the repository connection you want to scan +* Select the Job to scan for PII +* Optional + * Start Date: Select a date to start searching for PII. If left blank the Job start time will be used + * Exclude Binaries + * Define list of properties. The default is all properties. + * Notify of completion by email. +* Select the **Scan for PII** button + +##### Viewing PII Data + +Once the PII scan runs, users can view the PII report in the Discovery UI by either: + +* Clicking on the link provided in the Scan complete notification box. +* Selecting **PII Data Viewer** in the left navigation pane on the home page of the Discovery UI. + +#### Document Duplication Detection and Reporting + +There may be a need to identify duplicate documents in your enterprise and Federation Services allows you to identify these duplicate documents in a variety of ways. + +One way to identify duplicate documents is by using the Duplication Check Job Task which allows you to log, skip or fail documents that are duplicates. This works well for large scale integrations when combining a number of legacy source systems into one new enterprise content management system. + +Another way to identify duplicate documents would be by leveraging Federation Services's Reporting Output Connector. Using the reporting output connector you can read content in from any source system Federation Services supports and report on the content that is found. One of these reports is a hash of each document seen. Using this hash plus MongoDB's aggregation framework we can generate a CSV or JSON reports of all duplicate records. You can obtain the hash of a document by including the Hash Generator Job Task in your Job Tasks. + +After crawling your source system and outputting to the Federation Services Reporting Connector you can now run the following commands against MongoDB. Start my typing mongo in your terminal: + +Depending on how many documents you found during the crawl > 100,000, you may need to add docHash index. + +```text +db.tsRecordProcessed.createIndex( { docHash: 1 } ) +``` + +Next we group by docHash and output to a new collection named duplicates (you can name the new output collection anything you like): + +```text +db.tsRecordProcessed.aggregate([{$group:{_id:"$docHash",docs:{$push:"$doc_id"},doc_names:{$push:"$doc_name"}}},{$project:{docs:1,doc_names:1,numDocs:{$size:"$docs"}}},{$match:{numDocs:{$gt:1}}},{$out:"duplicates"}]) +``` + +You can now export de-dupes collection to CSV or JSON using `mongoexport`: + +```text +mongoexport --db simflofy --collection duplicates --fields _id,docs,doc_names +--username user --password "pass" --type=csv --out duplicates.csv +``` + +#### Stuck Jobs + +If a job is running and the **Abort** does not stop the job in an appropriate amount of time, the job can be killed manually through an Admin page. See [Active Jobs]({% link federation-services/latest/admin/index.md%}#active-jobs) for more information. + +### Federation Services Job Flow + +![Job Flow]({% link federation-services/images/job-flow.png %}) + +## Task List + +Tasks are run for each document that has been read. A number of tasks can be set to remove documents from the queue if they don't fit certain criteria. Documents removed this way will not be processed by any following tasks. It should be noted that Calculated Fields are calculated before tasks, while Fields Mappings are handled after tasks. + +### Commonly Used + +#### Duplication Detection + +This task checks the chosen field to find duplicate documents during the job run. It takes the selected actions against the document if a duplicate one exists. To see how each repository handles duplicates and versioning check the individual connector page. + +When the duplication check is run multiple times, the original file will not be marked as duplicate. + +##### Configuration + +**Field to Compare**: The field whose value will be used to check for duplicates. If this value is found in any other document it will be considered a duplicate. The default is the File Content Hash. + +* File Content Hash +* Document Type +* Document Source Id +* Document URI +* Version ID +* Version Series Id + +If you wish to compare file hashes (a sort of fingerprint for a document), you will need to precede this task with a [Hash Value Generator Task](#hash-value-generator). + +**Duplication Check Scope**: + +* **Run Job**: Check the documents associated with this job run only +* **Job**: Check all documents ever ran for that job +* **Enterprise**: Check all documents ever processed through 3Sixty + +**Action**: What to do if a document is found. + +* Audit and continue +* Skip the document +* Fail the job + +##### Tagging Duplicate Documents + +Metadata can be added through mapping to tag documents discovered as duplicates when the Action field is set to Audit and Continue. + +The fields that can be added are: + +* **isDuplicate**: true (if duplicate found) or false (if not) +**Important:** When using the Duplication Detection task in a job the user must make sure that if they are mapping the "isDuplicate" field that they set the Target type to String and not Boolean or they will receive an error that they cannot change text to boolean. If this error is received the user has to drop the index and run the job again. +* **baseParentID**: doc ID of the original document +* **duplicationParentID**: comma separated list of doc IDs of the documents that it found duplicates against - blank if no duplicate detected +* **duplicationScope**: blank if no duplicate detected, and +* **duplicationCriteria**: which fields the duplicate was considered against; depends on what was selected below - blank if no duplicate detected + +#### Filename Cleanse + +This task uses regex (Regular Expressions) to alter filenames. + +Common use cases are clearing unwanted characters, such as whitespace, or non-alphanumeric characters. + +* **Regex to Match**: The regex pattern to search for in the filename. + +The default value matches any character that isn't a letter, number, space or period an unlimited number of times. + +* **Replacement**: Replacement for matches. + +EXAMPLE - ALPHANUMERICS + +The pattern for alphanumeric characters is `[a-zA-Z0-9]`, or if you wish to include underscores `\w`. + +To select for non-alphanumeric characters we add the carat (^) before the pattern, so `^[a-zA-Z0-9]`. + +The carat character simply translates to "Not", so it negates whatever is after it. + +EXAMPLE - CLEARING UNWANTED SPACES + +The pattern `\s` is regex shorthand for "spaces". If you're worried about tabs, line breaks etc. add an asterisk (*) after the pattern for what is called "greedy" selection. + +Adding this as your regex and setting the replacement as `''`. + +#### Filename Extraction + +Extracts the file name from another field using regex (Regular Expressions). It will set the file name to the value that matches the regex. + +* **Regex to match:** The regex to match and convert to and set as the file name. +* **Data Field:** The repository document field to match the regex on. + +EXAMPLE - ALPHANUMERICS + +The pattern for alphanumeric characters is `[a-zA-Z0-9]`, or if you wish to include underscores `\w`. + +To select for non-alphanumeric characters we add the carat (^) before the pattern, so `^[a-zA-Z0-9]`. + +The carat character simply translates to "Not", so it negates whatever is after it. + +EXAMPLE - CLEARING UNWANTED SPACES + +The pattern `\s` is regex shorthand for "spaces". If you're worried about tabs, line breaks etc. add an asterisk (*) after the pattern for what is called "greedy" selection. + +Adding this as your regex and setting the replacement as `''`. + +#### Folder Path Cleanse + +This task uses Regular Expressions (regex) to alter Folder Names. Functionally identical to Filename Cleanse Task, except that is changes the document parent path. + +**Regex to Match:** The regex pattern to search for in the Folder Name. + +The default value matches any character that isn't a letter, number, space or period an unlimited number of times. + +**Replacement:** Replacement for matches. + +#### Obsolete Detection + +The obsolete task can be used to identify obsolete documents when reading them from the source repository. This can be used either in the federation view for identifying documents that are obsolete based on the definition set in the task for the job by adding metadata or skipping/processing the documents which are obsolete. You can define what obsolete means for your organisation - you can define it based on the date created or updated and the content before what timeframe is considered as obsolete. + +> **Note:** The Obsolete Detection tasks uses the system time of the 3Sixty server when calculating date/time scenarios. + +##### Fields + +* Before when will the files be considered obsolete +* Before +* Custom Date +* Action + +##### Metadata + +* isObsolete - Yes/No +* obsoleteField - Date Created or Date Updated +* obsoleteBefore - date after which the content is considered obsolete + +#### Override Filename + +The task uses the 3Sixty Expression Language to override the file name of each document. The functionally of this task is identical to the [Override Folder Path](#override-folder-path) task. + +##### Configuration + +* **Pattern**: List the fields you want to use to rename the file +* **Deep Change**: If the file has versions, update their names as well. + +#### Override Folder Path + +Add the Override Folder Path task from the drop-down on your job. + +A sample pattern has been provided for you by default. You can also leverage the 3Sixty expression language when modifying your path. More information on the Expression Language can be found [here](#federation-services-expression-language). Click the Done button when you have finished modifying your job task. + +The example pattern is: + +```text +'/' + '#{rd.filename}' + '/simflofy' +``` + +Using the Expression Language you can see that **rd**. are internal 3Sixty Fields. + +However, you may want to use metadata from the source system to generate your path. + +Use **field** in place of **rd** to accomplish this or **leave off the prefix entirely**. + +The best way to put your path together is to know what fields are available and what the field values look like. We suggest running the BFS output with no mappings and Include Un-Mapped Properties set to True. This will generate a xml file such as: + +```xml + +Alfresco Ingestion.pptx +document +test3Sixty_Partners +, +en-US +123 +legal +23 + +``` + +Now let's say we want the actual folder path to be a combination of folderpath + Culture + Category + Customer ID. To do that we just reference each field like: + +```text +'/' + '#{rd.path}' + '/' + '#{document.Culture}'+'/' + +'#{document.Category}'+'/' + '#{document.CustomerId}' +``` + +#### PII Detection + +The PII Detection Job Task is uses regex expressions to detect PII in any document or metadata passing through 3Sixty. The regex expressions are stored in the form of a .properties file. + +> **Caution:** File size limit is 95MB. + +PII FLAG +This task will always add the boolean field hasPii for the purposes of mapping and analysis. + +DEFAULT FILE LOCATION + +The default file is located at `3sixty-admin/WEB-INF/classes/simflofy-pii- detection.properties`: + +* **Field To Mark**: The output metadata property to store PII detected. The value of this field will be a map + +```text +{ +"PhoneNumber": 20, +"Names": 200 +} +``` + +* **Break up PII data into individuals fields**: Instead of adding the PII as a map, 3Sixty will break it up as individual fields for easier mapping/processing. +* **Prefix for PII fields**: If breaking up PII data, the prefix to use for each field. If left blank 'pii' will be used. +* **Fields To Check**: Source properties and/or document to check for PII. Use ALL_PROPS to check all properties, BINARY to check the document (extracted via Tika) or individual property names. + +In this case, the above fields will come across as + +**pii.phonenumber** and **pii.names** + +#### Rename File On Duplicate File Path + +Functions similarly to the [Duplication Check](#duplication-detection) task, except if it finds a duplicate, it will rename the file using the supplied pattern. + +#### Tika Text Extractor + +[Apache Tika](https://tika.apache.org/) is an open-source tool used to extract text from documents. 3Sixty most commonly uses it to extract text during indexing for federated search. + +For this feature to work on larger files, memory pool settings of 4GB is required, 8GB recommended. This can be updated in the Java tab of your Apache Tomcat Properties window. + +> **Caution:** File size limit is 95MB. + +* **Tika Content Field**: The field where the task will put the extracted content. +* **Max Content Length (B)**: Set the max content length which is checked before processing. The job will not process documents over this size. Set to 0 to process documents of any length. +* **File Extensions to Extract**: Comma delimited list of file extensions to process or leave blank to process all. The extensions are checked at the same time as content length. +**Fail Document on Extraction Error**: Fail the Document if there is an Extraction Error during processing. +* **Remove Content After Extraction**: Remove the content from the documents. This will happen even if the document exceeds the maximum length. +* **Stage on Filesystem**: Stage content on the filesystem for extracting text or set to false to use in memory. + +#### Trivial Detection + +The trivial task can be used to identify content that is trivial in nature (as it holds no importance from a corporate knowledge perspective). The definition of trivial depends on your organisation. You can set whether you want to filter on documents of certain sizes or if you want to filter out files with certain extensions or document types. For example, dmg, and exe are installers and may hold no corporate importance so you may want to skip such content from being registered as a record, you can now do so by adding them to the filtered list of extensions. + +##### Configuration + +You can add several filters to include documents that meet all the stated criteria. + +* Filter on document' below a specific size +* Filter files below size (bytes) +* Filter on document's above a specified size +* Filter files above size (bytes) +* Filter on file extension +* Filter on document type + +Once the filters are selected you can then determine what action should be taken with the files that meet the selected criteria. + +* Audit and Continue +* Skip the files +* Fail the job + +##### Metadata + +The trivial detection task also includes the following default set of metadata: + +* **isTrivial** - Yes/No +* **ignoreSizeBelow** - content ignored below size in bytes +* **ignoreSizeAbove** - content ignored above size in bytes +* **ignoreExtensions** - comma separated list of extensions that were listed in the criteria +* **ignoreDocTypes** - comma separated list of doc types that were listed in the criteria + +### General + +#### Basic JDBC + +This task is for a scenario where if you have extra metadata that points to an external source repository like a JDBC Database 3Sixty will merge that data into your documents as they are being read. + +##### Configuration + +* **User Name**: JDBC User Name +* **Password**: JDBC Password +* **Driver Class**: The driver for the JDBC database. A number of possible drivers are listed here. + + The Database Driver Class supports: + * com.microsoft.sqlserver.jdbc.SQLServerDriver + * oracle.jdbc.driver.OracleDriver + +> **Caution:** Ensure that your driver jar file is in the `3sixty-admin/WEB-INF/lib` folder at start-up. + +* **JDBC Url**: Url to connect to the database. Each type of database uses a different format. Refer to the linked table for formats. + + JDBC Url examples: + * jdbc:sqlserver://localhost:1433;encrypt=false;databaseName=Objdemo + * jdbc:oracle:thin:@dos1029ecm01.eng12.ocl:1521:ora + +* **ID Field**: The field (without table name) which will be used to name binaries queried from the database. +* **Query**: The query to execute. All results will be added to the document in the format [tableName].[fieldName] + +> **Note:** The query can insert expresions. And the query will only return one document. + +#### Buffer Binaries to File System + +This task will buffer files to temporary directory. In this case the value of the System Property `java.io.tmpdir`. The task takes a timeout which will fail the document if it does not complete staging in the given amount of time. The default is 10 seconds, but for larger files (100+ MB), we recommend 60 seconds. + +#### Convert Array Value To String + +Converts a property on a repository document from an array to a String. + +##### Configuration + +* **Delimiter**: The delimiter to place in between values of the Array. If left empty will default to space +* **Property Name**: The array repository document property to convert into a String. The new String property will have the same name. This field cannot be an expression. + +#### Convert String to Boolean + +The String to Boolean Task is designed to check the value of a string and return true of it matches the expected value. This is a quick way to convert a string field into a Boolean and is used to manipulate data as it is being processed. You also have the option to specify whether the match should be case-sensitive or not. + +Here's an example: + +In the above example, we are going to check the field **dc:availability**. If the string value of that field equals **available (Expected Value)** the `dc:availability` field will be updated to a **true** (boolean). As we elected not to use case sensitivity, the string **AvailAble** would also return `true`. Otherwise, a boolean `false` value will be stored. + +#### Convert To UTC + +This task will convert date fields to the given format, with the given offset. + +##### Configuration + +* **Date Fields to Convert**: A comma delimited list of repository fields or the output of calculated field. + * If you do not supply field names, the task will attempt to process all the Job's Date/Time mappings. Note: only calculated field mappings are available to job processors. +* **Offset**: Timezone offset. +* **Date Time Format**: Final format for the field you're converting. +* **Define Date Time Format Check box**: Check to define an output format, uncheck to return default format (i.e. 2019-11-05T16:00:00Z) + +#### Date Based Folder Path + +This task takes ones of the date fields on the Repository Document and uses it to generate the parent folder path for the document. This mimics how Alfresco stores its data in the filesystem + +##### Configuration + +* **Repository Document Field**: the field to use for the path - can be any date field +* **Pattern**: The pattern used to break down the date into a folder path + +The default is `/yyyy/M/dd/kk/mm/ss/` + +In this case, `kk` is used for hours. + +##### Example + +For the document `file.txt`, if you set the field to use the modified date `'#{rd.modifieddate}'` and the date is `1999-04-20T12:01:23`, then your path with the default pattern will be: + +`/1999/4/20/12/01/23/file.txt` + +#### Field Lookup + +This task is intended to allow users the ability to perform a look-up operation and update the matching fields of the repository documents. This task was originally created for integrations in which certain field values could only be obtained by importing them from an external source. + +* **Task Name**: Name of the Lookup Job Task +* **Delimiter**: Denotes the delimiter character if values are not in list format. +* **Property Field**: Path Uses preset configurations to evaluate values against the path + * File Name Uses preset configurations to evaluate values against the file name + * Other Property Evaluates a property entered by the user against the given values +* **Property Name**: A specific property entered by the user. This property will be used only if Other Property is selected from the property field drop-down list. +* **Values**: Key=Value listing to be used as the source data for the lookup operation. +* **Look for an exact match**: If set to true, properties that have an exact (whole case) match will be updated. If set to false, properties that contain the entered value(s) will be updated. For instance, if set to true the value 123 will only have a match with 123. If false, a match will be identified if 123 is present in any part of the field and only that portion will be updated with the new value. + +3Sixty can utilise any properties that are associated with a repository document. We recommend running a BFS output job with no mappings and Include Un-Mapped Properties set to True. This will generate a xml file similar to the example below and allow you to see what properties are available for your documents: + +```text + +3Sixty Overview.doc +document +test3Sixty_Setup +en-US +123456 +training + +``` + +In the example above you will notice that the **document.Customer** field has a numerical value associated with it, but not the actual customer name. The task will allow you to import a list of customer IDs along with their associated customer names and update those values as desired. + +The updated values will then be available in subsequent job tasks. For instance, you could then use override folder path task to build out a folder structure with the updated values. Using the scenario above, you could build out a folder for each customer by name instead of numerical value. + +#### HTTP + +The purpose of this task is to execute a GET or POST HTTP call for each repository document. If the status is any of the following, then processing will continue, if not, the document will be skipped. + +200 OK +201 Created +202 Accepted +203 Non-Authoritative Information +204 No Content +205 Reset Content +206 Partial Content +207 Multi-Status (WebDAV) +208 Already Reported (WebDAV) +226 IM Used (HTTP Delta encoding) + +##### Configuration + +* **Username/Password**: Credentials to access the endpoint +* **Action URL**: The endpoint being contacted, without parameters +* **POST or GET**: Selects the HTTP Method +* **Request parameters**: In the form of `param1=value1&m2=value2` + * The 'values' can be dynamically created using the [Expression Language](#federation-services-expression-language) +* **Send body with request**: The body can be raw text and can use the Expression language. + * If the text begins with the symbols `[` or `{`, then the body will be need to be valid JSON +* **Action to take if the call does not return 200 (OK)**: Continue, Skip or Fail are the options +* **Timeout in milliseconds**: How long to wait for the call to execute before attempting to continue. + * If the timeout is reached, the action selected will be used. + +#### JavaScript Processing + +This task is a custom operation that allows the user to ask 3Sixty to do things that are not already available in the software. 3Sixty's JavaScript Task allows you to run JavaScript against a repository document during processing. The task uses the ECMA 5.1 specification to execute the JavaScript against the native Java API. Currently, only one root object is exposed called rd (repository document). Any method that can be called against the repository document can be called using JavaScript syntax. + +**Fields that are also available:** + +Variable Name : Variable +The Job ID : jobId +The Job Run ID : jobRunId + +The variable **result** is automatically declared in each run of the JavaScript task, and its return value can be used to control which documents continue processing. + +The task only supports single quotes for strings. Double quotes will cause errors due to how the content of the script is saved to the database. + +> **Caution:** When creating the database table name please note that it must be all lowercase. + +#### Pause + +This task can be useful when outputting to a repository with rate limits, such as Box or SharePoint. + +* **Pause in seconds**: How long to pause for each document. + +#### Remove Mappings + +Removes mappings from a repository document if the field has no values. + +* **Source Fields**: Comma delimited list of the mappings to remove if it has no values. + +#### Two Way Sync + +The Two Way Sync Job Task is to filter out any unnecessary documents when doing an incremental sync between two systems. Documents can be filtered by matching MD5 Hash or If the document was just seen in the last run by the other sync Job. + +##### Configuration + +For Two Way Sync you will need to set up two Incremental Migration jobs and chain one Job after the other. You will want to put the Job that should win on a collision as the first Job in the chain. + +On each Job add the TWO Way Sync Job Task and, if using the MD5 Hash option, you will need to add the MD5 Hash Job Task before the Two Way Sync Job Task. + +* **Check Last Run**: If this document was just moved by the other Job in the Sync to this Repository, then let's skip it. If you want to sync it back (maybe after a rule/formula set to false). +* **Compare MD5 Checksums**: Check MD5 Hash of this Document and the Last Document moved by the synced Job. If set to true and MD5 Hashes match, then skip this Document. +* **Job ID of Other Job**: The Job ID of the other chained Job in this Two Way Sync + +### Metadata + +#### Join Mongo Document Metadata + +The purposes of this task is to retrieve metadata from an outside mongo database during a migration, adding it to the repository document before mappings are performed. + +This task is called a "join" because it checks for a value on both the Repository Document and in the Mongo Document. + +* The **checked field on the Repository Document** can be either a standard field mapping, or it can be calculated using the [Expression Language](#federation-services-expression-language). +* If either checked field is missing, the process will be skipped. +* If the values of the checked field matches, the comma delimited list of fields will be added from the Mongo Document, **in lowercase**. +* They can then be added as normal field mappings in a job mapping, as Field mappings take place after Tasks. +* This task supports multiple fields to check on the Mongo document and repository document +* Users can sort the order in which the fields are checked + +##### Configuration + +Fill in the following fields to configure this task. Some fields come with default configurations. Update them as necessary. + +* Task Name +* The fields you're checking for on the mongo document (comma separated) + * Default: doc_id,doc_name +* The fields you're checking for on the repository document + * '#{rd.id}' + * '#{rd.filename}' +Each line contains one field. The number of fields must match the ones you are checking on in the Mongo document. +* Comma delimited list of fields to add to the repository documents, should the fields match +* Mongo field to be used for sorting followed by a comma and sort order + * docCreated:1 +The Sort order can be +1 for ascending or -1 for descending. +* The MongoDB Url + * localhost +* The Mongo Port + * 27017 +* The mongo database to query + * admin +* The mongo collection to query + * collection +* The mongo user, leave blank if no authentication is set +* The mongo password, leave blank if no authentication is set + +#### Metadata Extraction - EML + +An EML file is an email message saved by an email application, such as Microsoft Outlook or Apple Mail. It contains the content of the message, along with the subject, sender, recipient(s), and date of the message. EML files may also store one or more email attachments, which are files sent with the message. + +This task extracts metadata from emails and adds as fields to the repository document. These extracted fields appear as: + +* **Email.Subject**: The subject line of the email. +* **Email.From**: The 'from' line of the email. +* **Email.To**: The 'to' line of the email. +* **Email.Body**: The body of the email. +* **Email.CC**: The CC line of the email. +* **Email.BCC**: The BCC line of the email. +* **Email.EmailList**: Space separated list of To, From and CC addresses. +* **Email.InternetMessageId**: The message ID of the email. +* **Email.Size**: The size of the email. +* **Email.HasAttachments**: Whether the email has attachments or not. +* **Email.Attachments**: Comma delimited list of email attachments by name. Blank if none. +* **Email.AttachmentCount**: The number of attachments in this email. +* **Email.DateTimeSent**: The date time the email was sent. +* **Email.DateTimeCreated**: The date time the email was created. +* **Email.LastModifiedTime**: The modified date time of the email. +* **Email.DateTimeReceived**: The date and time the email was received. + +#### Metadata Extraction - Path + +This task will extract the metadata from the file and add it as fields to the repository document. + +##### Configuration + +* **Path Field**: Which field to use to extract metadata. Options are: + * Repository ID (for repos that use the entire path as an ID, such as Filesystem, or Amazon S3) + * Parent Path, for repos that don't use paths as ID. +* **Path Rules**: Comma delimited list of rules to extract. The format is `[New Field Name]=#{Location}`: + * Location takes the form of an integer, starting at 0 for the root folder. + * Additionally, `'filename'`,`'parent'`,and `'grandparent'` with **quotes included can be used. + +#### Output Metadata As JSON + +This task fully converts each document to a json object and exports to it to the configured path on the local filesystem where 3Sixty is running. + +* **Output Path**: Folder where the json files will be written. Path will be created if it does not exist. + +File name pattern = `[filename].document.metadata.json` + +Folder name pattern = `[foldername].folder.metadata.json` + +#### Replace Metadata + +This task will perform a Regex search on the configured metadata field and replaces it with supplied text. + +* **Source Metadata Field**: The field to check. +* **Regex to Match**: A regular expression to use as the first argument of a Java String.replaceAll() method. +* **Replacement Text**: The text to use as the second argument of the replaceAll() method. + +#### Metadata from Properties File - Filesystem + +If there is a separate properties file then 3Sixty will get the metadata from that file. This only works for a File Systems connector. Configure this task by completing the following fields. + +* Properties filename +* Skip files with no property file found in hierarchy + +### File + +#### Attach Content Binaries + +This task is designed to grab a binary from the filesystem given a path set in the form field. The task will look for a file of the same name. + +* Expressions should be used to set the path dynamically. ie `/path/to/` + `#{rd.FileName}` +* If there is no file at the specified path, the documents will be skipped. +* If there is an error reading the file, an error will be noted in the tasks/job run. +* If the task does not detect the use of an expression through the characters `'${'`, it will search the document metadata for a field which contains the absolute path to the file. + +#### Attach Content - External Repo + +This task is for a scenario in which the source contains document metadata and also contains the file path to it's content. + +This allows the user to read metadata and attach the file to it that matches the metadata field given. + +##### Configuration + +* Enter the field that references the Object Id for the file content. +* If you include metadata 3Sixty will combine the properties between the two files + +> **Note:** The text input does not currently process expressions. + +#### Attach Content - File System + +This task is designed to grab a binary from the filesystem given a path set in the form field. The task will look for a file of the same name. + +##### Configuration + +* Expressions should be used to set the path dynamically. ie `/path/to/` + `#{rd.FileName}` +* If there is no file at the specified path, the documents will be skipped. +* If there is an error reading the file, an error will be noted in the tasks/job run. +* If the task does not detect the use of an expression through the characters `'${'`, it will search the document metadata for a field which contains the absolute path to the file. + +#### Attach Content - FTP + +Sets the binary of a document to a binary found on an FTP server at the location found using the Path Expression. + +* **Username**: The username needed to log in to your FTP server +* **Password**: The password needed to log in to your FTP server +* **Host URL**: The URL of the FTP server +* **Encrypt Data**: Sets whether to encrypt the data connection to the FTP server with TLS. Note that Use FTPS must be checked if you use this. +* **Use FTPS**: Sets whether to use FTP with SSL protocol. +* **Is Implicit**: Sets whether to use FTP implicit SSL or FTP explicit SSL +* **EPSV With IPV4**: Sets whether to use EPSV with IPV4. +* **Server Port**: The port your FTP server is listening on +* **Thread Count**: Number of FTP poster threads + +#### Attach Content - S3 + +Attaches a binary to the repository document from an S3 bucket. + +* **S3 Access Key**: The access key for your S3 connection +* **Client Secret**: The client secret for your S3 Connection +* **Base Folder Path**: A base path to be prepended to your key +* **S3 Bucket**: The bucket to search for the binary. Also, list items either all have periods or none of them do. +* **Key Field**: The field on the repo document that contains the key for S3 bucket lookup. +* **S3 Region**: The region of your S3 bucket + +#### Filter Expression + +The filter expression task allows you to remove files based on the expression used. The task has two fields, the **task name** and the **filter expression**. The task name is arbitrary but should identify the type of filter you're creating. + +**Filter Expression** + +The filter expression can use any of the 3Sixty [Expression Language](#federation-services-expression-language) components to form simple or more complex expressions for evaluation by 3Sixty. + +> **Note:** If the expression evaluates to `true`, the document will continue to be processed. + +For example: If you want to exclude the OS level file Thumbs.db in your job, you can filter those files out using the following statement: `!equalsIgnoreCase('#{rd.filename}', 'Thumbs.db')` + +The above example will find all the files that have the name `Thumbs.db` and set the expression to `false` for the documents. Therefore, all files with the name `Thumbs.db` will be skipped. + +#### Generate Thumbnail + +Generates a thumbnail for a repository document and adds it as a rendition. + +> **Note:** This task currently only supports jpg, png, bmp, wbmp, and gif. + +* **Resize Width**: The width of the thumbnail image in pixels +* **Action**: The integration action to take following thumbnail generation +* **Types of Thumb Nails**: List of comma delimited file extensions to support + +#### Hash Value Generator + +Creates a hash of the document content and sets it on the repository document. Can be used in tandem with the [Duplication Check](#duplication-detection) task to find duplicates. + +* **Staging**: Where to stage the data locally, while creating the MD5 Hash. +* **Algorithm**: The type of hash to use. MD5 is the default hash, but SHA hashes are available + +Federation Services can generate Hash for any File Size. But users are provided with the option to add File Size limit while generating Hash. If the user does not want to generate a Hash for a file of a particular size, then they can put it in megabytes. + +#### HTML to PDF + +This task takes a single argument, which is a file path to an XHTML stylesheet ( *.xsl). + +The binary stream is taken from each repository document and converts it to a pdf using the template. + +#### Property XML Parser Job + +This task will take an XML file and use the content to create metadata fields. + +* **Field to Parse**: If the content of the file is the xml to parse, use **BINARY**. If the xml appears in a field, use the field name. This is a required feild. + +The xml is expected in the following form: + +```xml + +Comment Text Here +fieldValue1 +fieldValue2 + +``` + +* The root element is named as such for the example. The task searches for "entry" children. +* Comment is an optional field and will be added as **comment** to the document properties. + +#### Remove Renditions Matching Binary MimeType + +This task takes no arguments. It will remove all renditions that have the same MimeType as the Original Document Binary. + +#### Skip Blank Filename + +Skips a file during migration if its file name is blank. + +No additional Task Configurations needed. + +#### Skip on Empty Field + +This task will skip a document if the supplied fields are all blank. + +#### Text to PDF + +This task takes no arguments, and simply converts text binaries from a Repository Document into a PDF file on output. If the mimetype of the document is not 'text/plain', it will be skipped. + +#### Text/HTML to EML + +This task takes the content of an document and converts it into email. + +#### Unzip + +This task will unzip any compressed files during the migration process and send the documents directly to the output connector. Documents that are queued this way will not increment Read, but will increment processed. + +##### Configuration Fields + +* **File staging location**: The location unzipped files are stored temporarily while processing +* **Skip the zip file after unzip**: Check this box to skip the zip file during processing. If the box is unchecked the zip file will be included in the document transfer + +> **Caution:** When unzipping files to an ECM output location, if the zip file has the same file name as another document in the folder, the file will not unzip to that location as ECM doesn't allow folders to be created with the same name as a file. It will result in a duplication error. + +### Text Extraction + +#### AWS Textract + +This task will extract text from PNGs, JPGs, and PDFs and stores the text on the repository document in the **simflofy_ai_text** field. + +##### Configuration + +* **Authentication Connection**: An Amazon authentication connection with your Amazon AWS credentials + +#### Google Vision Text Extraction + +Extracts text from .tiff, .pdf and .gif files and stores it on the repository document in the **simflofy_ai_texts** field. + +* **Authentication Connector**: Your authentication connection for Google You can find it in the url while edit or view page for the connection + +#### Tesseract Text Extraction + +PREREQUISITE +This task requires Tesseract to be installed on the system that Federation Services is running on. + +This task uses Tesseract OCR to scan for text from images and PDF files, saving that text to a field in the repository documented called simflofy_ai_texts. Supported formats are .png, .jpg, .pdf, .tiff, .gif, and .bmp. PDFs are saved on a per-page basis to **simflofy_ai_texts**. + +> **Note:** Tesseract OCR will be an optional dependency of Federation Services. + +##### Configuration + +* **Tessdata Directory**: The path to your Tessdata folder. This folder should have the trained data of the language you plan to OCR. +* **Tesseract Library**: The path to your Tesseract library folder containing the proper library files for your OS. +* **Engine Mode**: Select which engine Tesseract should use, legacy or LTSM. Ensure that ensure is installed before selecting it, or leave it on the default config for it to detect your engine. +* **Page Segmentation Mode**: By default Tesseract expects a page of text. You can change the way it segments a page if your images differ from this. +* **Tesseract Language Code**: The language code for the installed trained data in your Tessdata directory. This is in ISO 639-1/T format and is the letters before the .trained data extension for the trained data file. +* **Use HOCR**: Whether to use HOCR. When enabled, text will be output in HTML format rather than as raw text. + +### Image Analysis + +#### AWS Image Recognition + +Detects real world objects in images and adds these labels to the repository document on the field **simflofy_ai_labels** using the AWS Rekognition system. + +For your reference, these are 'MinConfidence' and 'MaxLabels' [here](https://docs.aws.amazon.com/rekognition/latest/dg/what-is.html){:target="_blank"}. This page is what this task uses. + +##### Configuration + +* **Minimum Threshold**: The minimum confidence threshold for labels to return following label detection. Labels with a confidence level lower than this will not be returned. +* **Max Number of labels**: The maximum number of recognised labels to be returned, by highest confidence. +* **Auth conn**: Your Amazon AWS credentials +* **Max number of labels**: The number of labels you want to return + +#### Google Vision Image Labels + +Detects real world objects in images and adds these labels to the repository document on the field **simflofy_ai_labels** using Google Vision. + +* **Max Number of labels**: The maximum number of recognised labels to be returned +* **Authentication connection**: Your authentication connection for Google. You can find it in the url while edit or view page for the connection + +#### Watson Image Analysis + +Uses IBM Watson Image Analysis to analyse an image, adding its response to a specified field. + +* **The IAM API**: Key for IBM Cloud. See instructions [here](https://cloud.ibm.com/docs/account?topic=account-userapikey&interface=ui){:target="_blank"} on how to get it. +* **Collection ID**: If left blank, 3Sixty will create one +* **Collection Name**: Name of the collection to create. If left blank, will be new-training-collection with the date appended. +* **Training Mode**: Images will be used in conjunction with the training json to train your analysable. In this mode, no analysis will be performed. +* **The training json**: Required for training mode. The format is {"dog":[25,35,105,215]}. Array order is top, left, width, height with object type as the key. +* **Field that contains the image urls**: If left blank the file content will be used. + +### Alfresco + +#### Alfresco Job Run History Nodes + +The purpose of this task is to get the Alfresco Node Reference from the Current Job Run History, in order to update an existing document from a previous Job run in Alfresco, rather than creating a new one. + +It's used in **Incremental** or jobs where the Alfresco connector is being used. This task uses the Source Repository ID from the Repository the document is pulled from, in order to find the document in the Job Run History. + +##### Configuration + +**Set up:** There are no configuration options for this task. It uses the Document's Source Repository ID in order to find the node Reference in Alfresco. +**Exception/Requirements:** Since the Source Repository ID is used, any source repositories that use a Path Based Source ID will not work if the path of the document changes. + +#### Alfresco Property Mapping Nodes + +This task is for getting existing node references in an Alfresco instance, in order to update them, rather than create a new one if the existing file has moved from its original ingestion location. +It's used in jobs where the Alfresco Output connector is used. Typically, in incremental or sync jobs, where changes to a file from a source system need to make it to the node it previously integrated to. + +##### Configuration + +**How to set up**: Provide the query JSON object, which is then sent to Alfresco which will return the matching Alfresco Node Reference, which we'll use to update the document. + +**Exceptions / requirements**: If the query is too vague, and matches more than one node/document, then none of the documents will be updated. The query has to uniquely find a single node/document in Alfresco. + +### ACL + +#### CMIS ACL modification + +This task is meant to be used with a CMIS Repository connection. It will use the Repository Document id, and gather the current ACL for the document. It will then generate a new ACL based on the parameters. This task establishes a session upon initialisation, and keeps it open until the job run is complete. + +The principal lists are pipe (`|`) delimited, to account for LDAP style principals. You will need to know the exact principal ids of the ACEs (Access Control Entries). The task works by cycling through the current ACEs and a series of if-then logic to construct a new ACL. + +##### Configuration + +* **User name**: CMIS server user name +* **Password**: CMIS server password +* **Connection URL**: CMIS server url +* **Repository ID**: CMIS repository ID +* **Pipe (`|`) delimited list of principals to ignore from each document**: A list of principals to ignore and not add modifications to. The 'ignore' list will bypass any modification to a matching ACE and add it directly back to the new ACL. +* **Pipe (`|`) delimited list of principals to remove from each document**: A list of principals to be removed from the ACL. The remove list will skip over a matching ACE, leaving it out. +* **Comma delimited list of principals to add to each document**: A list of principals to be added to the ACL. The add list is checked separately and will generate a new ACE will the selected permissions. +* **Permission to add to the principals**: Not ignored ACEs and added ACEs will have this permission added to them in the ACL. + * Read + * Write + * All + +#### FileNet ACL Modification + +The purpose of this task is change the permission lists of integrated documents in the IBM FileNet Repository. + +* **Authentication Connector ID**: The ID of your P8 Authentication connection is available in the Authentications Connection under the **Integration** menu. You can find it the url of the edit or view page for the connection +* **Change List**: Pipe (`|`) delimited list of principals to change from each document. +* **Permissions to Change**: Access level for the changed permissions. +* **Add List**: Pipe (`|`) delimited list of principals to add to each document +* **Permissions to Add**: The access level to add to the new permissions. +* **Removal List**: Pipe (`|`) delimited list of principals to remove from each document. + +Note that any permission not added to these lists will be ignored. + +#### File System ACL Extraction + +Extracts ACLs from the Windows or Linux filesystem document and adds them to the repository document. + +* **File System Operating System**: The operating system that these files are being read from. +* **Append _DENY to Deny ACL Type permissions**: Appends **_DENY** to the end of an extracted permission if it's of the type DENY, in case you want to track this later on. + +This task will have some different behaviour depending on your operating system. In a POSIX environment (macOS or Linux) permissions may be added as the field `document.permissions` with the permissions in a semicolon(;) delimited list, if any exist. + +If the filesystem supplies an owner, it will be added as `simflofy.owner`. + +Additionally, simflofy will create a permission map of the principals and their permissions. It will set is as the **originalPermissions** field: + +```text +Map> permissions = new Map<>(); +//process acls +rd.setOriginalPermissions(permissions); +``` + +Finally, if any User Defined File Attributes (extended attributes), they will be added as a semicolon delimited list in the field `simflofy.userattributes`. + +#### Generic ACL Mapper + +The generic ACL mapper job task allows you to create simple rules for matching principles and permissions from one system to another. ACLs will need to be extracted from each document. This task reads the **originalPermissions** field of the document and sets the **transformedPermissions** field. + +LIMITED USAGE +Only the Azure Blob, CMIS, and Alfresco Connectors can use this task. For all other acl mapping, a [JavaScript](#javascript-processing) task is required. + +* Process Files and Process Folders tells the task what to process. +* Mapping Rules: These rules will map the role/permissions on the left with the ones you want to match on the right. + * Permissions on the right will be from the source and those on the left will be for the target. + * Both side of a rule can be a comma delimited list. + * Each rule must end with a semicolon (;) +* Authority Clean up: A comma delimited list of principals to remove as part of the task. +* Enabling parsing: Enable parsing for multiple permissions to be assigned to an authority after mapping? + * For example, [Write]=WRITE_DATA with this box checked will allow 'Write' to be added on as an extra permission to an authority's newly mapped permissions. + +### Classifier + +#### IBM Watson Natural Language Classification + +Uses IBM Watson Natural Language classifier to analyse and label text into categories. This uses Watson's Natural Language Classifier APIs. +* **The IAM API Key for IBM Cloud**: See instructions [here](https://cloud.ibm.com/docs/account?topic=account-userapikey&interface=ui){:target="_blank"} on how to get it. +* **The Classifier ID**: The ID of you classifier, created in Watson. +* **Field to process If left blank**: the task will search for the field 'content'. +* **Field to store the Watson response**: If left blank, the field name will be 'nlc'. +* **Comma delimited list of file extensions**: Which content types to process or leave blank to process all. + +### Others + +#### Index User Groups + +Used for Search Security to index user and group information onto each document. This task adds two metadata fields to each document in order to restrict or allow access to documents indexed through this task. + +* **Select User Groups To Index**: The selected user groups will be added to the field simflofyUserGroups as well as adding a mapping. +* **Select Users to Index**: The selected users will be to the field simflofyUsers as well as adding a mapping. + +#### Lookup Destination Id From Job Run History + +**Purpose**: Getting the rd destination Id from the Current Job Run History, in order to update an existing document from a previous Job run, rather than creating a new one. +**Use Case**: It's used in **Incremental** or **Sync** jobs. This task uses the Source Repository ID from the Repository the document is pulled from, in order to find the document in the Job Run History. +**Set up**: There are no configuration options for this task. It uses the Document's Source Repository ID in order to find the rd destination Id. +**Exception/Requirements**: Since the Source Repository ID is used, any source repositories that use a Path Based Source ID will not work if the path of the document changes. + +#### Remove Empty Fields + +This task will remove any empty fields from the metadata of the document if there is no set value in those fields. + +## Audit Reports + +Federation Services Reports can provide documentation and results from each time a job has been run. In this section you will find overviews, set up instructions, and use cases of the various reports you can use to see what's going on with your data. These reports can be found under the Auditing section in the left sidebar. + +### Job Run History + +The Job Run History page allows you to search collections of audits based on the job, depending on what types of audits were selected in the Job Configuration(link). A Job Run History contains, at least, the Name, Size, Mimetype, and source ID of each audited document. + +Downloading the audit report will include more fields such as the path of the document's parent, as well as its new id and any audited mappings. If the audits are for errors or skips, the reasons will be included. + +This list can be filtered by selecting a job from the Jobs drop-down as well as entering start and/or end dates for the time period you want to search for. You can also search for a specific job run id. + +Click on the eye icon next to the job to view the full details of the job run. This page will give you more information on the particular job. Including a list of records, details on the run, and general statistics on the data. + +> **Tip:** Tip: Users can access a specific sets of audits for a job by clicking on the processed/read/error numbers in the [Run and Monitor Jobs](#run-and-monitor-jobs) page. + +#### Records + +The Records tab will give you a list of all of the documents that have been processed through this job run. This list can be filtered by record type. Allowing the user to view records that have been: processed, read, deleted, errors, error summary, skipped, and duplicates. You can use the search field to filter the list by record content such as document name and content type. + +#### Details + +The Details tab will give you all of the details about the job run. + +Job Details: Job ID, Job Name, Job Status, Status Message, Job start and end time, Total time, Query From and to time, Records processed per sec, number of records read, written, in error and skipped, and the Federation Services server port number. + +#### Stats + +Clicking on Stats tab will provide a basic performance report. + +In the figure, the input is tracked as the blue line, the output as yellow. This can help determine the "bottleneck" if the job performance is not as expected. It also shows the bytes per second allowing for the debugging of network throughput issues. + +#### Deleting Job Run History + +To delete individual job run histories, you can simply delete them while viewing them, or, in 3.1.1+ a button will be available in the Job Run History table. + +#### Automatically Deleting Job Run History + +Federation Services has a background service that will check for job run histories of a certain age, and remove them. This service can be configured through the Federation Services Global Properties. + +History retention is on a per-job basis and can be configured under the **Advanced Options** section in the job's **Details** tab. + +### Document Search + +Search job run history for specific documents. Results will contain a link to the document's details page, containing a full history for that document across all job runs. + +#### Filter by Record Type + +AUDITING: + +Auditing of record types is set in the Auditing menu in a job's **Details** tab + +* **Processed**: Documents that completed processing +* **Read**: Documents added to the queue for processing. **Not Audited By default** +* **Errors**: Documents that had errors +* **Skipped**: Documents that were skipped due to falling outside the time range, or by a processor +* **Duplicate**: Detected duplicates. Requires a Duplicate Detection Task. + +#### Filter by Job + +Choose the job you want to filter by or search all jobs + +#### Filter by Field Value + +* **No field**: Selecting this option will perform an open search for all documents in the selected job +* **Job Run ID** +* **Output Document URI**: Similar to document ID, but for file paths, backslashes may be converted to forward slashes +* **Source Document ID**: The document ID, as it appeared when read. +* **Document Name** +* **Document Type**: Not the same as Content Type, this refers to a document's type in the repository +* **Batch ID**: Only applicable if batching was enabled +* **Version ID**: Only applicable if versions were retrieved +* **Document Hash**: Only applicable if a hash value was generated using the Hash Value Generator Task +* **Size Greater Than (B)** +* **Size Less Than (B)** +* **New ID**: Only applicable for Processed records. + +TABLE SEARCH + +The **results** table also has a search field to further narrow down the results + +#### Exporting + +You have the option of exporting the current page or entire result set as a CSV file, using the buttons at the top of the page. Will only activate if there are search results. + +### Mapping Audits + +Mapping audits are a way to track the values of individual mappings on a per job run basis + +#### Enabling Mapping Audits + +There are two ways to enable mapping audits. + +1. In the **Mappings** tab of your job. Click the eyeball next to any mapping. A green eye means the mapping is being "watched", and its values will be track +2. In the **Details** tab of your job, under the **Auditing** section, check **Audit all Mappings**. This will collect the audit data for every mapping on the job, including additional mappings from Job Mappings and Mapping Groups + +#### Viewing audit data + +Under the **Audit Reports** menu in the sidebar, click **Mapping Audits**. If there are no jobs with audited mappings, you should see a message saying so. Otherwise, you will be presented with a drop-down of jobs with mapping audits. + +* Once you select the job, a drop-down with all job runs with audits will appear. +* Once you select your job run, a drop-down containing the audited mappings will appear. +* When you select an audited mapping, a table will appear showing you a count of the final values for that mapping. + +These audits can be exported using the **Export as CSV** button. + +#### Example: Content Type Breakdown + +If you add a **calculated field** with the source **'#{rd.mimetype}'** (see the [Federation Services Expression Language](#federation-services-expression-language)) and audit it, you will be able to see a breakdown of all content types (pdf, docx) for documents in the job. + +#### Example: Auditing a PII Job + +If you add a [PII Detection Task](#pii-detection-and-reporting) to a job, the field **hasPii** is automatically added to each document. You can add this as the source of a **field mapping** and audit it. + +When viewing the mapping in the Mapping Audits page, you will get a breakdown of how many documents in the job contained PII. + +### Search Audit + +Search audits are collected by all search API endpoints. This includes searches performed through Discovery. In this page you can view the audits for the last week. For a broader view, these reports can be retrieved through the [Audit Report Service REST API](https://api.simflofy.com/#/Audit Report Service){:target="_blank"}. + +### Event Audit + +All API actions in Federation Services are audited. This page allows you to see those audits using search criteria. + +**Types of Event Audits** + +* BATCH_DOWNLOAD +* CREATE_DOCUMENT +* UPDATE_DOCUMENT +* UPDATE_PROPERTIES +* UPDATE_CONTENT +* CREATE_FOLDER +* CREATE_VERSION +* DELETE_VERSION +* REVERT_VERSION +* FOLDER_ITEMS +* FILE_DOWNLOAD +* FILE_HEADER +* VERSION_DOWNLOAD +* FIND_VERSION_PROPERTIES +* FIND_PROPERTIES +* STREAM_CONTENT +* EDIT_PROPERTIES +* DELETE_OBJECT +* TYPE_DEFINITION +* GET_ACL +* DELETE_ACL +* EDIT_ACL +* FILE_ITEM +* ROOT_FOLDER +* REPOSITORY_INFO +* CHECKOUT +* CHECKIN +* GET_TYPES +* ID_BY_PATH +* LIST_CONNECTIONS +* DROP_COLLECTION +* LIST_VERSIONS