.. _architecture: Architecture ============ An EDG installation that has been extended with ``EDG-AF`` consists of: 1. The EDG server running in Tomcat or another servlet container 2. One or more ``EDG-AF`` apps running outside the EDG server 3. The EDG App Framework: code that connects ``EDG-AF`` apps with the EDG server The design is inspired by `Shopify apps `_. **1. EDG server** The EDG server is deployed in the `usual way `_, as a Java web application (.war) in a servlet container such as Tomcat. EDG-AF does not require any special configuration of the EDG server. EDG-AF apps manipulate the EDG server programmatically via the latter's public APIs. These are enabled by default, but the means of accessing them differs depending on the authentication system. See the `EDG developer documentation documentation `_ and the EDG client documentation for information on programmatic access to the EDG APIs. **2. EDG-AF Apps** An ``EDG-AF`` app is a web application that answers HTTP requests on certain paths. Only one path is required of all applications: GET /configuration which returns a JSON object describing the features an ``EDG-AF`` app supports (e.g., importers, jobs). See the :ref:`api` reference for the expected shape of this object. Depending on the configuration, additional paths may be requested. For example, if ``GET /configuration`` returns an importer configuration with ``"id": "example"``, then:: GET /importer/example should serve an HTML page with form inputs for the importer. **3. The EDG App Framework** EDG-AF apps are installed into an EDG Ecosystem by: #. Requesting ``/configuration`` to find out the features an ``EDG-AF`` app supports #. Generating an EDG project (.zip file) that connects to the ``EDG-AF`` app from EDG #. Uploading the EDG project to EDG The EDG project generated during the installation process makes use of integration points provided by the EDG core product for the ``EDG-AF`` app. For example, when an ``EDG-AF`` app includes an importer the installation process will generate RDF that defines an ``ImportPlugin`` as well as an SWP page for the importer. The SWP page will contain an embedded ``