1. General

This guide describes how to manage an already installed appNG platform with appNGizer.

1.1. appNGizer setup

1.1.1. Shared secret

REST clients that use appNGizer must establish a session. This is done by sending a sharedSecret via POST request to the login URL. A successful login response will contain a session cookie, that the client must accept and provide in all subsequent requests.

The sharedSecret will be preset to a default value during the first start of the appNG platform. If the manager application is installed, administrators can look up the value in the Platform properties tab.

In headless installations an individual value can be set with the appNG CLI.

% ./appng update-property -n platform.sharedSecret -v <sharedSecret>

1.1.2. Login

Method: POST

The tailing slash is mandatory otherwise the request gets redirected as GET request to that location and the authentication procedure is not performed!
The login request is the only one, that must be sent with the header Content-Type=text/plain. All other PUT and POST requests have to use the header Content-Type=text/xml.

Request Body: (plain text format!)

<sharedSecret>

Response Body:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<appngizer version="0.12.0" self="http://localhost:8080/appNGizer/" xmlns="http://www.appng.org/schema/appngizer">
        <links>
                <link name="site" self="http://localhost:8080/appNGizer/site" />
                <link name="application" self="http://localhost:8080/appNGizer/application" />
                <link name="subject" self="http://localhost:8080/appNGizer/subject" />
                <link name="group" self="http://localhost:8080/appNGizer/group" />
                <link name="repository" self="http://localhost:8080/appNGizer/repository" />
                <link name="platform" self="http://localhost:8080/appNGizer/platform" />
        </links>
</appngizer>

1.2. HTTP methods and return codes

1.2.1. GET

Retrieves a resource/ a list of resources.

Return codes:

  • 200 (OK) - if the resource has been successfully retrieved

  • 404 (Not found) - if such a resource does not exist

  • 500 (Internal Server error) - if an error occurred

1.2.2. POST

Creates a new resources.

Return codes:

  • 201 (Created) - if everthing went well

  • 409 (Conflict) - if such a resource already exists

  • 500 (Internal Server error) - if an error occurred

1.2.3. PUT

Updates an existing resources.

Return codes:

  • 200 (OK) - if the resource has been updated

  • 303 (See Other) - if the location of the resource has changed due to the update

  • 404 (Not found) - if such a resource does not exist

  • 409 (Conflict) - if such a resource already exists

  • 500 (Internal Server error) - if an error occurred

1.2.4. DELETE

Updates an existing resource.

Return codes:

  • 204 (No Content) - if the resource has been deleted

  • 404 (Not found) - if such a resource does not exist

  • 500 (Internal Server error) - if an error occurred

1.3. Schema and namespace

The XSD schema for appNGizer is available at

The namespace to be used is http://www.appng.org/schema/appngizer.

2. Home

2.1. Show appNGizer Home

Method: GET

Response Body:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<appngizer version="0.12.0" self="http://localhost:8080/appNGizer/" xmlns="http://www.appng.org/schema/appngizer">
        <links>
                <link name="site" self="http://localhost:8080/appNGizer/site" />
                <link name="application" self="http://localhost:8080/appNGizer/application" />
                <link name="subject" self="http://localhost:8080/appNGizer/subject" />
                <link name="group" self="http://localhost:8080/appNGizer/group" />
                <link name="repository" self="http://localhost:8080/appNGizer/repository" />
                <link name="platform" self="http://localhost:8080/appNGizer/platform" />
        </links>
</appngizer>

3. Platform

Method: GET

Response Body:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<platform xmlns="http://www.appng.org/schema/appngizer" self="http://localhost:8080/appNGizer/platform">
    <links>
        <link name="database" self="http://localhost:8080/appNGizer/platform/database"/>
        <link name="property" self="http://localhost:8080/appNGizer/platform/property"/>
        <link name="reload" self="http://localhost:8080/appNGizer/platform/reload"/>
        <link name="system" self="http://localhost:8080/appNGizer/platform/system"/>
        <link name="environment" self="http://localhost:8080/appNGizer/platform/environment"/>
    </links>
</platform>

3.1. Database

3.1.1. Show database status

Method: GET

Response Body:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<database xmlns="http://www.appng.org/schema/appngizer" self="http://localhost:8080/appNGizer/platform/database">
    <links>
        <link name="initialize" self="http://localhost:8080/appNGizer/platform/database/initialize"/>
    </links>
    <type>MYSQL</type>
    <dbVersion>MySQL 5.6.29-76.2-log</dbVersion>
    <driver>com.mysql.jdbc.Driver</driver>
    <url>jdbc:mysql://localhost:3306/appng</url>
    <ok>true</ok>
    <versions>
        <version version="2.8.2" state="Success" description="alter sites granted" checksum="-2124797671" installed="2016-08-01T11:54:08.000+02:00"/>
        <version version="2.8.1" state="Success" description="add repository strict" checksum="-637161553" installed="2016-08-01T11:54:07.000+02:00"/>
        <version version="2.8" state="Success" description="add template" checksum="1443237131" installed="2016-08-01T11:54:07.000+02:00"/>
        <version version="2.7.1" state="Success" description="modify datetime" checksum="-238501285" installed="2016-08-01T11:54:07.000+02:00"/>
        <version version="2.7" state="Success" description="modify resource name" checksum="-410225045" installed="2016-08-01T11:54:05.000+02:00"/>
        <version version="2.6" state="Success" description="drop-site-parentId" checksum="-628397585" installed="2016-08-01T11:54:05.000+02:00"/>
        <version version="2.5" state="Success" description="add quartz sched time" checksum="-1887151531" installed="2016-08-01T11:54:04.000+02:00"/>
        <version version="2.4" state="Success" description="migrate to platform" checksum="-356840062" installed="2016-08-01T11:54:04.000+02:00"/>
        <version version="2.3" state="Success" description="add sites granted" checksum="562840097" installed="2016-08-01T11:54:00.000+02:00"/>
        <version version="2.2" state="Success" description="Add validation query column" checksum="-406328953" installed="2016-08-01T11:54:00.000+02:00"/>
        <version version="2.1" state="Success" description="Add active column" checksum="2085895145" installed="2016-08-01T11:54:00.000+02:00"/>
        <version version="2.0" state="Success" description="set subject email nullable" checksum="-200093527" installed="2016-08-01T11:53:59.000+02:00"/>
        <version version="1.9" state="Success" description="Add remote repository name" checksum="-1230423146" installed="2016-08-01T11:53:59.000+02:00"/>
        <version version="1.8" state="Success" description="Add managed column" checksum="1109092965" installed="2016-08-01T11:53:59.000+02:00"/>
        <version version="1.7" state="Success" description="modify property description" checksum="-242497654" installed="2016-08-01T11:53:58.000+02:00"/>
        <version version="1.6" state="Success" description="Add Min and MaxConnections" checksum="-1788286290" installed="2016-08-01T11:53:58.000+02:00"/>
        <version version="1.5" state="Success" description="Add plugin timestamp appngversion" checksum="1676943241" installed="2016-08-01T11:53:58.000+02:00"/>
        <version version="1.4" state="Success" description="Add DatabaseConnection" checksum="318992837" installed="2016-08-01T11:53:57.000+02:00"/>
        <version version="1.3" state="Success" description="Set site folder" checksum="2024773474" installed="2016-08-01T11:53:57.000+02:00"/>
        <version version="1.2" state="Success" description="Let PluginRepository name be unique" checksum="-743274501" installed="2016-08-01T11:53:56.000+02:00"/>
        <version version="1.1" state="Success" description="Quartz initial setup" checksum="1726445701" installed="2016-08-01T11:53:56.000+02:00"/>
        <version version="1.0" state="Success" description="appNG initial setup" checksum="-644756127" installed="2016-08-01T11:53:55.000+02:00"/>
    </versions>
</database>

3.1.2. Initialize database

Method: POST

Response Body:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<database xmlns="http://www.appng.org/schema/appngizer" self="http://localhost:8080/appNGizer/platform/database">
    <links>
        <link name="initialize" self="http://localhost:8080/appNGizer/platform/database/initialize"/>
    </links>
    <type>MYSQL</type>
    <dbVersion>MySQL 5.6.29-76.2-log</dbVersion>
    <driver>com.mysql.jdbc.Driver</driver>
    <url>jdbc:mysql://localhost:3306/appng</url>
    <ok>true</ok>
    <versions>
        <version version="2.8.2" state="Success" description="alter sites granted" checksum="-2124797671" installed="2016-08-01T11:54:08.000+02:00"/>
        <version version="2.8.1" state="Success" description="add repository strict" checksum="-637161553" installed="2016-08-01T11:54:07.000+02:00"/>
        <version version="2.8" state="Success" description="add template" checksum="1443237131" installed="2016-08-01T11:54:07.000+02:00"/>
        <version version="2.7.1" state="Success" description="modify datetime" checksum="-238501285" installed="2016-08-01T11:54:07.000+02:00"/>
        <version version="2.7" state="Success" description="modify resource name" checksum="-410225045" installed="2016-08-01T11:54:05.000+02:00"/>
        <version version="2.6" state="Success" description="drop-site-parentId" checksum="-628397585" installed="2016-08-01T11:54:05.000+02:00"/>
        <version version="2.5" state="Success" description="add quartz sched time" checksum="-1887151531" installed="2016-08-01T11:54:04.000+02:00"/>
        <version version="2.4" state="Success" description="migrate to platform" checksum="-356840062" installed="2016-08-01T11:54:04.000+02:00"/>
        <version version="2.3" state="Success" description="add sites granted" checksum="562840097" installed="2016-08-01T11:54:00.000+02:00"/>
        <version version="2.2" state="Success" description="Add validation query column" checksum="-406328953" installed="2016-08-01T11:54:00.000+02:00"/>
        <version version="2.1" state="Success" description="Add active column" checksum="2085895145" installed="2016-08-01T11:54:00.000+02:00"/>
        <version version="2.0" state="Success" description="set subject email nullable" checksum="-200093527" installed="2016-08-01T11:53:59.000+02:00"/>
        <version version="1.9" state="Success" description="Add remote repository name" checksum="-1230423146" installed="2016-08-01T11:53:59.000+02:00"/>
        <version version="1.8" state="Success" description="Add managed column" checksum="1109092965" installed="2016-08-01T11:53:59.000+02:00"/>
        <version version="1.7" state="Success" description="modify property description" checksum="-242497654" installed="2016-08-01T11:53:58.000+02:00"/>
        <version version="1.6" state="Success" description="Add Min and MaxConnections" checksum="-1788286290" installed="2016-08-01T11:53:58.000+02:00"/>
        <version version="1.5" state="Success" description="Add plugin timestamp appngversion" checksum="1676943241" installed="2016-08-01T11:53:58.000+02:00"/>
        <version version="1.4" state="Success" description="Add DatabaseConnection" checksum="318992837" installed="2016-08-01T11:53:57.000+02:00"/>
        <version version="1.3" state="Success" description="Set site folder" checksum="2024773474" installed="2016-08-01T11:53:57.000+02:00"/>
        <version version="1.2" state="Success" description="Let PluginRepository name be unique" checksum="-743274501" installed="2016-08-01T11:53:56.000+02:00"/>
        <version version="1.1" state="Success" description="Quartz initial setup" checksum="1726445701" installed="2016-08-01T11:53:56.000+02:00"/>
        <version version="1.0" state="Success" description="appNG initial setup" checksum="-644756127" installed="2016-08-01T11:53:55.000+02:00"/>
    </versions>
</database>

3.2. Reload platform

This action will asynchronously restart the whole web-application, making also appNGizer temporarily unavailable!

Method: POST

Response Headers: 303 (See other)

3.3. System environment

Method: GET

Response Body:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<properties xmlns="http://www.appng.org/schema/appngizer" self="/platform/environment">
     <property name="HOME">
        <value>/home/johndoe</value>
    </property>
    <property name="LANG">
        <value>de_DE.UTF-8</value>
    </property>
</properties>

3.4. System properties

Method: GET

Response Body:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<properties xmlns="http://www.appng.org/schema/appngizer" self="/platform/system">
    <property name="appng.node.id">
        <value>appNG-001</value>
    </property>
    <property name="file.encoding">
        <value>UTF-8</value>
    </property>
    <property name="file.separator">
        <value>/</value>
    </property>
    <property name="java.home">
        <value>/usr/lib/jvm/java-8-openjdk-amd64/jre</value>
    </property>
</properties>

3.5. Properties

3.5.1. List Properties

Method: GET

Response Body:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<properties self="http://localhost:8080/appNGizer/platform/property" xmlns="http://www.appng.org/schema/appngizer">
        <property name="applicationDir" self="http://localhost:8080/appNGizer/platform/property/applicationDir">
                <value>/applications</value>
                <defaultValue>/applications</defaultValue>
                <description>The folder used for installing file-based-applications, relative to the webapp-root</description>
        </property>
        <property name="cacheApplicationFolder" self="http://localhost:8080/appNGizer/platform/property/cacheApplicationFolder">
                <value>application</value>
                <defaultValue>application</defaultValue>
                <description>The folder for the application-cache, relative to platform.cacheFolder. Applications might use this
                        folder to cache temporary data.</description>
        </property>
        <property name="cacheFolder" self="http://localhost:8080/appNGizer/platform/property/cacheFolder">
                <value>cache</value>
                <defaultValue>cache</defaultValue>
                <description>The cache folder, relative to WEB-INF. Contains the platform.cacheFolder and the
                        platform.cacheApplicationFolder.</description>
        </property>
        <property name="cacheImageFolder" self="http://localhost:8080/appNGizer/platform/property/cacheImageFolder">
                <value>image</value>
                <defaultValue>image</defaultValue>
                <description>The folder used for caching images, within the application-cache</description>
        </property>
        <property name="cachePlatformFolder" self="http://localhost:8080/appNGizer/platform/property/cachePlatformFolder">
                <value>platform</value>
                <defaultValue>platform</defaultValue>
                <description>The folder for the platform-cache, relative to platform.cacheFolder. The platform cache is used by appNG
                        to cache application resources.</description>
        </property>
</properties>

3.5.2. Create Property

Method: POST

Request Body:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<property name="myCustomProperty" xmlns="http://www.appng.org/schema/appngizer">
        <defaultValue>42</defaultValue>
        <description>The answer to life, the universe and everything</description>
</property>

Response Body:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!-- TODO insert example -->

3.5.3. Update Property

Method: PUT

Request Body:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<property name="myCustomProperty" xmlns="http://www.appng.org/schema/appngizer">
        <value>57</value>
        <defaultValue>42</defaultValue>
        <description>The real answer to life, the universe and everything</description>
</property>

Response Body:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<property name="myCustomProperty" self="http://localhost:8080/appNGizer/platform/property/myCustomProperty" xmlns="http://www.appng.org/schema/appngizer">
    <value>57</value>
    <defaultValue>42</defaultValue>
    <description>The real answer to life, the universe and everything</description>
</property>

3.5.4. Delete Property

Method: DELETE

Request Body: -none-

Response Body:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<property name="myCustomProperty" self="http://localhost:8080/appNGizer/platform/property/myCustomProperty" xmlns="http://www.appng.org/schema/appngizer">
    <value>57</value>
    <defaultValue>42</defaultValue>
    <description>The real answer to life, the universe and everything</description>
</property>

4. Applications

4.1. List applications

Method: GET

Response Body:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<applications self="http://localhost:8080/appNGizer/application" xmlns="http://www.appng.org/schema/appngizer">
        <application name="appng-manager" self="http://localhost:8080/appNGizer/application/appng-manager">
                <displayName>Manager</displayName>
                <core>true</core>
                <fileBased>false</fileBased>
                <hidden>false</hidden>
                <version>0.12.1</version>
        </application>
        <application name="appng-authentication" self="http://localhost:8080/appNGizer/application/appng-authentication">
                <displayName>Authentication</displayName>
                <core>true</core>
                <fileBased>false</fileBased>
                <hidden>true</hidden>
                <version>0.11.0</version>
        </application>
        <application name="appng-scheduler" self="http://localhost:8080/appNGizer/application/appng-scheduler">
                <displayName>Scheduler</displayName>
                <core>true</core>
                <fileBased>false</fileBased>
                <hidden>false</hidden>
                <version>0.11.2</version>
        </application>
        <application name="appng-webutils" self="http://localhost:8080/appNGizer/application/appng-webutils">
                <displayName>Webutils</displayName>
                <core>false</core>
                <fileBased>true</fileBased>
                <hidden>false</hidden>
                <version>0.11.0</version>
        </application>
</applications>

4.2. Show application

Method: GET

Response Body:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<application name="appng-manager" self="http://localhost:8080/appNGizer/application/appng-manager" xmlns="http://www.appng.org/schema/appngizer">
    <links>
        <link name="role" self="http://localhost:8080/appNGizer/application/appng-manager/role"/>
        <link name="permission" self="http://localhost:8080/appNGizer/application/appng-manager/permission"/>
        <link name="property" self="http://localhost:8080/appNGizer/application/appng-manager/property"/>
    </links>
    <displayName>Manager</displayName>
    <core>true</core>
    <fileBased>false</fileBased>
    <hidden>false</hidden>
    <version>0.12.1</version>
</application>

4.3. Update application

Method: PUT

Request-Body:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<application name="appng-manager" xmlns="http://www.appng.org/schema/appngizer">
    <displayName>appNG Manager</displayName>
    <core>false</core>
    <fileBased>true</fileBased>
    <hidden>true</hidden>
    <version>0.12.1</version>
</application>

4.5. Roles

4.5.1. List roles

Method: GET

Response Body:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<roles self="http://localhost:8080/appNGizer/application/appng-manager/role" xmlns="http://www.appng.org/schema/appngizer">
    <role name="Platform Administrator" self="http://localhost:8080/appNGizer/application/appng-manager/role/Platform%20Administrator">
        <application>appng-manager</application>
        <description>Administrator with all permissions</description>
    </role>
    <role name="User Manager" self="http://localhost:8080/appNGizer/application/appng-manager/role/User%20Manager">
        <application>appng-manager</application>
        <description>A role for managing groups,users and roles with their permissions</description>
    </role>
    <role name="Site Manager" self="http://localhost:8080/appNGizer/application/appng-manager/role/Site%20Manager">
        <application>appng-manager</application>
        <description></description>
    </role>
    <role name="Debugger" self="http://localhost:8080/appNGizer/application/appng-manager/role/Debugger">
        <application>appng-manager</application>
        <description>Enables debugging output</description>
    </role>
</roles>

4.5.2. Show role

Method: GET

Response Body:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<role name="Platform Administrator" self="http://localhost:8080/appNGizer/application/appng-manager/role/Platform%20Administrator" xmlns="http://www.appng.org/schema/appngizer">
        <application>appng-manager</application>
        <description>Administrator with all permissions</description>
        <permissions>
                <permission name="site.databases">
                        <application>appng-manager</application>
                        <description>Show the site's databases</description>
                </permission>
                <permission name="application.property.edit">
                        <application>appng-manager</application>
                        <description>Edit a application property</description>
                </permission>
                <permission name="site.application.property.delete">
                        <application>appng-manager</application>
                        <description>Delete a property for a site's application</description>
                </permission>
        </permissions>
</role>

4.5.3. Create role

Method: POST

Request Body:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<role name="Editor" xmlns="http://www.appng.org/schema/appngizer">
    <application>appng-manager</application>
    <description>Editor role</description>
    <permissions>
        <permission name="site.databases" />
        <permission name="subject.list" />
        <permission name="page.subjects" />
    </permissions>
</role>

4.5.4. Update role

Method: PUT

Request Body:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<role name="Editor" xmlns="http://www.appng.org/schema/appngizer">
        <application>appng-manager</application>
        <description>Editor role</description>
        <permissions>
                <permission name="site.databases" />
                <permission name="application.property.edit" />
                <permission name="site.application.property.delete" />
        </permissions>
</role>

4.5.5. Delete role

Returns 501 (Not Implemented)

4.6. Permissions

4.6.1. List permissions

Method: GET

Response Body:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<permissions self="http://localhost:8080/appNGizer/application/appng-manager/permission" xmlns="http://www.appng.org/schema/appngizer">
        <permission name="application.delete">
                <application>appng-manager</application>
                <description>Delete a application</description>
        </permission>
        <permission name="application.dictionary">
                <application>appng-manager</application>
                <description>Show a application's dictionary</description>
        </permission>
        <permission name="application.edit">
                <application>appng-manager</application>
                <description>Edit a application</description>
        </permission>
        <permission name="application.list">
                <application>appng-manager</application>
                <description>List all applications</description>
        </permission>
        <permission name="application.properties">
                <application>appng-manager</application>
                <description>Show a application's properties</description>
        </permission>
</permissions>

4.6.2. Create permission

4.6.3. Update permission

4.6.4. Delete permission

4.7. Properties

See [Create Role] ==== List properties ==== Create property ==== Update property ==== Delete property

5. Site

5.1. List sites

Method: GET

Response Body:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<sites self="http://localhost:8080/appNGizer/site" xmlns="http://www.appng.org/schema/appngizer">
    <site name="appng" self="http://localhost:8080/appNGizer/site/appng">
        <active>true</active>
        <host>localhost</host>
        <domain>http://localhost:8080</domain>
    </site>
    <site name="localhost" self="http://localhost:8080/appNGizer/site/localhost">
        <active>true</active>
        <host>127.0.0.1</host>
        <domain>http://127.0.0.1:8080</domain>
        <description>I am local!</description>
    </site>
</sites>

5.2. Show site

Method: GET

Response Body:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<site name="localhost" self="http://localhost:8080/appNGizer/site/localhost" xmlns="http://www.appng.org/schema/appngizer">
    <active>true</active>
    <host>localhost</host>
    <domain>http://localhost:8080</domain>
    <properties self="http://localhost:8080/appNGizer/site/localhost/property"/>
    <applications self="http://localhost:8080/appNGizer/site/localhost/application"/>
</site>

5.3. Create site

Method: POST

Request Body:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<site name="localhost" xmlns="http://www.appng.org/schema/appngizer">
        <active>true</active>
        <host>127.0.0.1</host>
        <domain>http://127.0.0.1:8080</domain>
        <description>I am local!</description>
</site>

Response Body: -none-

5.4. Update site

Method: PUT

Request Body:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<site name="localhost" xmlns="http://www.appng.org/schema/appngizer">
        <active>true</active>
        <host>127.0.0.2</host>
        <domain>http://127.0.0.2:8081</domain>
        <description>I am local, man!</description>
</site>

Response Body:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<site name="localhost" self="http://localhost:8080/appNGizer/site/localhost" xmlns="http://www.appng.org/schema/appngizer">
    <active>true</active>
    <host>127.0.0.2</host>
    <domain>http://127.0.0.2:8081</domain>
    <description>I am local, man!</description>
</site>

5.5. Delete site

Method: DELETE

Request Body: -none-

Response Body: -none-

5.6. Reload site

Method: PUT

Request Body: -none-

Response Body: -none-

5.7. Properties

5.7.1. List properties

Method: GET

Request Body: -none-

Response Body:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<properties xmlns="http://www.appng.org/schema/appngizer" self="http://localhost:8080/appNGizer/site/manager/property">
    <property name="appendTabId" self="http://localhost:8080/appNGizer/site/manager/property/appendTabId">
        <value>false</value>
        <defaultValue>false</defaultValue>
        <description>If set to true, the name of the currently selected tab is being appended to the URL as a get-parameter. Addresses the issue that IE loses the anchor on a redirect.</description>
    </property>
    <property name="assetsDir" self="http://localhost:8080/appNGizer/site/manager/property/assetsDir">
        <value>/assets</value>
        <defaultValue>/assets</defaultValue>
        <description>A semicolon-separated list of folder-names (relative to 'wwwDir') containing static resources such as images or pdfs</description>
    </property>
    <property name="authApplication" self="http://localhost:8080/appNGizer/site/manager/property/authApplication">
        <value>appng-authentication</value>
        <defaultValue>appng-authentication</defaultValue>
        <description>The name of the application which is responsible for the authentication</description>
    </property>
    <property name="authLoginPage" self="http://localhost:8080/appNGizer/site/manager/property/authLoginPage">
        <value>webform, digestlogin</value>
        <defaultValue>webform</defaultValue>
        <description>The names of the login-pages (comma-separated) within the application defined in 'authApplication'. The number of comma-separated pages must be the same as in 'authLoginRef', because 'authLoginRef[n]' refers to 'authLoginPage[n]'!</description>
    </property>
    <property name="authLoginRef" self="http://localhost:8080/appNGizer/site/manager/property/authLoginRef">
        <value>webform, login</value>
        <defaultValue>webform</defaultValue>
        <description>The action names (comma-separated) for the pages defined in {@link #AUTH_LOGIN_PAGE}. The number of comma-separated names must be the same as in 'authLoginPage', because 'authLoginRef[n]' refers to 'authLoginPage[n]'!</description>
    </property>
</properties>

5.7.2. Create Property

Method: POST

Request Body:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<property name="myCustomProperty" xmlns="http://www.appng.org/schema/appngizer">
        <defaultValue>42</defaultValue>
        <description>The answer to life, the universe and everything</description>
</property>

Response Body:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<property xmlns="http://www.appng.org/schema/appngizer" name="myCustomProperty" self="http://localhost:8080/appNGizer/site/localhost/property/myCustomProperty">
    <value>42</value>
    <defaultValue>42</defaultValue>
    <description>The answer to life, the universe and everything</description>
</property>

5.7.3. Update Property

Method: PUT

Request Body:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<property name="myCustomProperty" xmlns="http://www.appng.org/schema/appngizer">
        <value>57</value>
        <defaultValue>42</defaultValue>
        <description>The real answer to life, the universe and everything</description>
</property>

Response Body:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<property xmlns="http://www.appng.org/schema/appngizer" name="myCustomProperty" self="http://localhost:8080/appNGizer/site/localhost/property/myCustomProperty">
    <value>57</value>
    <defaultValue>42</defaultValue>
    <description>The real answer to life, the universe and everything</description>
</property>

5.7.4. Delete property

Method: DELETE

Request Body: -none-

Response Body: -none-

5.8. Applications

5.8.1. List applications

Method: GET

Response Body:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<applications self="http://localhost:8080/appNGizer/site/appng/application" xmlns="http://www.appng.org/schema/appngizer">
    <application name="appng-authentication" self="http://localhost:8080/appNGizer/site/appng/application/appng-authentication">
        <displayName>Authentication</displayName>
        <core>true</core>
        <fileBased>false</fileBased>
        <hidden>true</hidden>
        <version>0.11.0</version>
    </application>
    <application name="appng-manager" self="http://localhost:8080/appNGizer/site/appng/application/appng-manager">
        <displayName>Manager</displayName>
        <core>true</core>
        <fileBased>false</fileBased>
        <hidden>false</hidden>
        <version>0.12.1</version>
    </application>
    <application name="appng-scheduler" self="http://localhost:8080/appNGizer/site/appng/application/appng-scheduler">
        <displayName>Scheduler</displayName>
        <core>true</core>
        <fileBased>false</fileBased>
        <hidden>false</hidden>
        <version>0.11.2</version>
    </application>
</applications>

5.8.2. Show application

Method: GET

Response Body:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<application name="appng-authentication" self="http://localhost:8080/appNGizer/site/appng/application/appng-authentication" xmlns="http://www.appng.org/schema/appngizer">
        <links>
                <link name="role" self="http://localhost:8080/appNGizer/application/appng-authentication/role" />
                <link name="permission" self="http://localhost:8080/appNGizer/application/appng-authentication/permission" />
                <link name="property" self="http://localhost:8080/appNGizer/site/localhost/application/appng-authentication/property" />
                <link name="grants" self="http://localhost:8080/appNGizer/site/localhost/application/appng-authentication/grants" />
        </links>
        <displayName>Authentication</displayName>
        <core>true</core>
        <fileBased>false</fileBased>
        <hidden>true</hidden>
        <version>0.11.0</version>
</application>

5.8.3. Application properties

List application properties

Method: GET

Response Body:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<properties self="http://localhost:8080/appNGizer/site/appng/application/appng-authentication/property" xmlns="http://www.appng.org/schema/appngizer">
        <property name="digestMaxValidity"
                self="http://localhost:8080/appNGizer/site/appng/application/appng-authentication/property/digestMaxValidity">
                <value>3</value>
                <defaultValue>3</defaultValue>
                <description>the maximum validity of a login digest in minutes</description>
        </property>
        <property name="enableDeeplinks"
                self="http://localhost:8080/appNGizer/site/appng/application/appng-authentication/property/enableDeeplinks">
                <value>true</value>
                <defaultValue>true</defaultValue>
                <description>set to true to forward the user to the originally requested page</description>
        </property>
        <property name="mailFrom" self="http://localhost:8080/appNGizer/site/appng/application/appng-authentication/property/mailFrom">
                <value>support@aiticon.de</value>
                <defaultValue>support@aiticon.de</defaultValue>
                <description>the sender address for emails send during passwort retrieval</description>
        </property>
        <property name="successPage"
                self="http://localhost:8080/appNGizer/site/appng/application/appng-authentication/property/successPage">
                <value>/appng-manager</value>
                <defaultValue>/appng-manager</defaultValue>
                <description>The path the user is forwarded to after successfull login</description>
        </property>
</properties>
Create application property

Method: POST

Request Body:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<property name="myCustomProperty" xmlns="http://www.appng.org/schema/appngizer">
        <defaultValue>42</defaultValue>
        <description>The answer to life, the universe and everything</description>
</property>

Response Body:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<property xmlns="http://www.appng.org/schema/appngizer" name="myCustomProperty" self="http://localhost:8080/appNGizer/site/appng/application/appng-authentication/property/myCustomProperty">
    <value>42</value>
    <defaultValue>42</defaultValue>
    <description>The answer to life, the universe and everything</description>
</property>
Update application property

Method: PUT

Request Body:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<property name="myCustomProperty" xmlns="http://www.appng.org/schema/appngizer">
        <value>57</value>
        <defaultValue>42</defaultValue>
        <description>The real answer to life, the universe and everything</description>
</property>

Response Body:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<property xmlns="http://www.appng.org/schema/appngizer" name="myCustomProperty" self="http://localhost:8080/appNGizer/site/appng/application/appng-authentication/property/myCustomProperty">
    <value>57</value>
    <defaultValue>42</defaultValue>
    <description>The real answer to life, the universe and everything</description>
</property>

5.8.4. Showing grants for a site

Method: GET

Response Body:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<grants xmlns="http://www.appng.org/schema/appngizer" self="http://localhost:8080/appNGizer/site/appng/application/appng-authentication/grants">
        <grant site="site-a">false</grant>
        <grant site="site-b">true</grant>
        <grant site="site-c">true</grant>
</grants>

5.8.5. Granting an application for other sites

Method: PUT

Request Body:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<grants xmlns="http://www.appng.org/schema/appngizer" self="http://localhost:8080/appNGizer/site/appng/application/appng-authentication/grants">
        <grant site="site-a">false</grant>
        <grant site="site-b">true</grant>
        <grant site="site-c">true</grant>
</grants>

Response Body:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<grants xmlns="http://www.appng.org/schema/appngizer" self="http://localhost:8080/appNGizer/site/appng/application/appng-authentication/grants">
        <grant site="site-a">false</grant>
        <grant site="site-b">true</grant>
        <grant site="site-c">true</grant>
</grants>

6. Repository

6.1. List Repositories

Method: GET

Response Body:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<repositories self="http://localhost:8080/appNGizer/repository" xmlns="http://www.appng.org/schema/appngizer">
        <repository name="Remote" self="http://localhost:8080/appNGizer/repository/Remote">
                <remoteName>pdev0-all</remoteName>
                <uri>http://appng.s-ait-p-dev0.aitintra.de/service/appng/appng-manager/soap/repositoryService</uri>
                <enabled>true</enabled>
                <strict>false</strict>
                <published>false</published>
                <type>REMOTE</type>
                <mode>ALL</mode>
        </repository>
        <repository name="Local" self="http://localhost:8080/appNGizer/repository/Local">
                <remoteName></remoteName>
                <uri>file:///local/repo/path</uri>
                <enabled>true</enabled>
                <strict>false</strict>
                <published>false</published>
                <type>LOCAL</type>
                <mode>ALL</mode>
        </repository>
</repositories>

6.2. Create repository

Method: POST

Request Body:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<repository name="Local" xmlns="http://www.appng.org/schema/appngizer">
    <remoteName></remoteName>
    <uri>file:///local/repo/path</uri>
    <enabled>true</enabled>
    <strict>false</strict>
    <published>false</published>
    <type>LOCAL</type>
    <mode>ALL</mode>
</repository>

Response Body: -none-

6.3. Update repository

Method: PUT

Request Body:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<repository name="Local" xmlns="http://www.appng.org/schema/appngizer">
    <remoteName></remoteName>
    <uri>file:///local/path</uri>
    <enabled>false</enabled>
    <strict>true</strict>
    <published>false</published>
    <type>LOCAL</type>
    <mode>STABLE</mode>
</repository>

Response Body:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<repository name="Local" self="http://localhost:8080/appNGizer/repository/Local" xmlns="http://www.appng.org/schema/appngizer">
    <remoteName></remoteName>
    <uri>file:///local/path</uri>
    <enabled>false</enabled>
    <strict>true</strict>
    <published>false</published>
    <type>LOCAL</type>
    <mode>STABLE</mode>
</repository>

6.4. Delete repository

Method: DELETE

Request Body: -none-

Response Body: -none-

6.5. Show repository with available packages

Method: GET

Response Body:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<repository name="Remote" self="http://localhost:8080/appNGizer/repository/Remote" xmlns="http://www.appng.org/schema/appngizer">
    <remoteName>pdev0-all</remoteName>
    <uri>http://appng.s-ait-p-dev0.aitintra.de/service/appng/appng-manager/soap/repositoryService</uri>
    <enabled>true</enabled>
    <strict>false</strict>
    <published>false</published>
    <type>REMOTE</type>
    <mode>ALL</mode>
    <packages>
        <package self="http://localhost:8080/appNGizer/repository/Remote/appng-authentication">
            <name>appng-authentication</name>
            <displayName>Authentication</displayName>
            <installed>true</installed>
            <release>0.11.0</release>
            <type>application</type>
        </package>
        <package self="http://localhost:8080/appNGizer/repository/Remote/appng-manager">
            <name>appng-manager</name>
            <displayName>Manager</displayName>
            <installed>true</installed>
            <snapshot>0.12.2-SNAPSHOT</snapshot>
            <release>0.12.1</release>
            <type>application</type>
        </package>
        <package self="http://localhost:8080/appNGizer/repository/Remote/appng-scheduler">
            <name>appng-scheduler</name>
            <displayName>Scheduler</displayName>
            <installed>true</installed>
            <snapshot>0.11.3-SNAPSHOT</snapshot>
            <release>0.11.2</release>
            <type>application</type>
        </package>
        <package self="http://localhost:8080/appNGizer/repository/Remote/appng-template">
            <name>appng-template</name>
            <displayName>appng</displayName>
            <installed>false</installed>
            <snapshot>0.14.3-SNAPSHOT</snapshot>
            <release>0.14.2</release>
            <type>template</type>
        </package>
    </packages>
</repository>

6.6. Install package

Method: PUT

Request Body:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<package xmlns="http://www.appng.org/schema/appngizer">
    <name>appng-authentication</name>
    <displayName>Authentication</displayName>
    <version>0.11.0</version>
    <timestamp>20170601-0751</timestamp>
</package>

Response Body:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<package xmlns="http://www.appng.org/schema/appngizer" name="appng-authentication" self="http://localhost:8080/appNGizer/repository/Local/appng-authentication/0.9.3">
        <name>appng-authentication</name>
        <displayName>Authentication</displayName>
        <installed>true</installed>
        <release>0.11.0</release>
        <type>application</type>
</package>

6.7. Upload package

Method: POST

Request A multipart/form-data encoded request with a parameter named file that contains the package archive.

Response Body:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<package xmlns="http://www.appng.org/schema/appngizer" name="appng-authentication" self="http://localhost:8080/appNGizer/repository/Local/appng-authentication/0.9.3">
        <name>appng-authentication</name>
        <displayName>Authentication</displayName>
        <installed>false</installed>
        <release>0.11.0</release>
        <type>application</type>
</package>

Response Code:

  • 405 (method not allowed) - if the repository is not a local repository

  • 400 (bad request) - if the file is not a valid archive

7. Groups

7.1. List Groups

Method: GET

Response Body:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<groups self="http://localhost:8080/appNGizer/groups" xmlns="http://www.appng.org/schema/appngizer">
    <group name="Administrator" self="http://localhost:8080/appNGizer/group/Administrator">
        <description>appNG administrator group</description>
    </group>
    <group name="Editor" self="http://localhost:8080/appNGizer/group/Editor">
        <description>group for editors</description>
    </group>
</groups>

7.2. Show group

Method: GET

Response Body:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<group name="Administrator" self="http://localhost:8080/appNGizer/group/Administrator" xmlns="http://www.appng.org/schema/appngizer">
    <description>appNG administrator group</description>
    <roles>
        <role name="Platform Administrator" self="http://localhost:8080/appNGizer/application/appng-manager/role/Platform%20Administrator">
            <application>appng-manager</application>
            <description>Administrator with all permissions</description>
        </role>
        <role name="Users" self="http://localhost:8080/appNGizer/application/appng-authentication/role/Users">
            <application>appng-authentication</application>
            <description>General role for all users</description>
        </role>
        <role name="Scheduler Admin" self="http://localhost:8080/appNGizer/application/appng-scheduler/role/Scheduler%20Admin">
            <application>appng-scheduler</application>
            <description>a super administrator with all permissions</description>
        </role>
    </roles>
</group>

7.3. Create group

Method: POST

Request Body:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<group name="Editor" xmlns="http://www.appng.org/schema/appngizer">
    <description>group for editors</description>
    <roles>
        <role name="Platform Administrator" >
            <application>appng-manager</application>
        </role>
        <role name="Users">
            <application>appng-authentication</application>
        </role>
        <role name="Scheduler Admin">
            <application>appng-scheduler</application>
        </role>
    </roles>
</group>

Response Body: -none-

7.5. Delete group

Method: DELETE

Response Body: -none-

8. Subjects

8.1. List subjects

Method: GET

Response Body:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<subjects self="http://localhost:8080/appNGizer/subjects" xmlns="http://www.appng.org/schema/appngizer">
    <subject name="admin" self="http://localhost:8080/appNGizer/subject/admin">
        <realName>appNG Administrator</realName>
        <email>admin@appng.org</email>
        <description>foo!</description>
        <timeZone>Europe/Berlin</timeZone>
        <language>en</language>
        <type>LOCAL_USER</type>
    </subject>
    <subject name="editor" self="http://localhost:8080/appNGizer/subject/editor">
        <realName>appNG Editor</realName>
        <email>editor@appng.org</email>
        <description>bar!</description>
        <timeZone>Europe/Berlin</timeZone>
        <language>de</language>
        <type>LOCAL_USER</type>
    </subject>
</subjects>

8.2. Show subject

Method: GET

Response Body:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<subject name="editor" xmlns="http://www.appng.org/schema/appngizer">
        <realName>appNG Editor</realName>
        <email>editor@appng.org</email>
        <description>bar!</description>
        <digest>$2a$13$GkdFoQDajx73NJMUoyb4mOWKQ7XtIbPnioVXHeJTn3oMPuaJX1iCu</digest>
        <timeZone>Europe/Berlin</timeZone>
        <language>de</language>
        <type>LOCAL_USER</type>
        <groups>
        <group name="Administrator" />
    </groups>
</subject>

8.3. Create subject

Method: POST

Request Body:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<subject name="editor" xmlns="http://www.appng.org/schema/appngizer">
        <realName>appNG Editor</realName>
        <email>editor@appng.org</email>
        <description>bar!</description>
        <digest>$2a$13$GkdFoQDajx73NJMUoyb4mOWKQ7XtIbPnioVXHeJTn3oMPuaJX1iCu</digest>
        <timeZone>Europe/Berlin</timeZone>
        <language>de</language>
        <type>LOCAL_USER</type>
        <groups>
                <group name="Administrator" />
        </groups>
</subject>

The <digest> needs to be a valid Bcrypt hash of the user’s password. Implementations of Bcrypt are available for many programming languages. When using Java, you can use the implementation of Spring Security. For Phyton, there’s also a bcrypt package available.

If the digest starts with the Bcrypt-prefix $2a$, it will be taken as is. Otherwise, it will be encrypted by appNGizer. If omitted, the user’s digest remains unchanged.

Response Body: -none-

8.4. Update subject

Method: PUT

Request Body:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<subject name="admin" xmlns="http://www.appng.org/schema/appngizer">
    <realName>appNG Admin</realName>
    <email>admin@appng.org</email>
    <description>bar!</description>
    <digest>$2a$13$GkdFoQDajx73NJMUoyb4mOWKQ7XtIbPnioVXHeJTn3oMPuaJX1iCu</digest>
    <timeZone>Europe/Madrid</timeZone>
    <language>es</language>
    <type>LOCAL_USER</type>
    <groups>
        <group name="Administrator" />
        <group name="Editor" />
    </groups>
</subject>

The same rules for the <digest> apply as for creating subjects. The response will always contain the encrypted version.

Response Body:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<subject name="admin" self="http://localhost:8080/appNGizer/subject/admin"  xmlns="http://www.appng.org/schema/appngizer">
    <realName>appNG Admin</realName>
    <email>admin@appng.org</email>
    <description>bar!</description>
    <digest>$2a$13$GkdFoQDajx73NJMUoyb4mOWKQ7XtIbPnioVXHeJTn3oMPuaJX1iCu</digest>
    <timeZone>Europe/Madrid</timeZone>
    <language>es</language>
    <type>LOCAL_USER</type>
    <groups>
        <group name="Administrator" self="http://localhost:8080/appNGizer/group/Administrator">
            <description>appNG administrator group</description>
        </group>
        <group name="Editor" self="http://localhost:8080/appNGizer/group/Editor">
            <description>group for editors</description>
        </group>
    </groups>
</subject>

8.5. Delete subject

Method: DELETE

Response Body: -none-