view artifact-database/src/main/java/org/dive4elements/artifactdatabase/rest/RestApp.java @ 562:05caf2e731d0

Allow to add additional restful services via configuration.
author gernotbelger
date Wed, 10 Oct 2018 20:07:58 +0200
parents 415df0fc4fa1
children
line wrap: on
line source
/*
 * Copyright (c) 2010 by Intevation GmbH
 *
 * This program is free software under the LGPL (>=v2.1)
 * Read the file LGPL.txt coming with the software for details
 * or visit http://www.gnu.org/licenses/ if it does not exist.
 */

package org.dive4elements.artifactdatabase.rest;

import java.util.Map;
import java.util.Map.Entry;
import java.util.concurrent.ConcurrentMap;

import org.dive4elements.artifacts.ArtifactDatabase;
import org.restlet.Application;
import org.restlet.Context;
import org.restlet.Restlet;
import org.restlet.routing.Router;

/**
 * This is the core REST application that binds the serveral resources
 * used to manage the artifact database to the HTTP server provided
 * by the Restlet framework.
 *
 * @author <a href="mailto:sascha.teichmann@intevation.de">Sascha L. Teichmann</a>
 */
public class RestApp extends Application {

    /**
     * The central artifact database instance to work with.
     */
    private final ArtifactDatabase database;

    /**
     * Constructor to create REST appliction bound to a specific
     * artifact database.
     *
     * @param database
     *            The artifact database to be used.
     */
    public RestApp(final ArtifactDatabase database) {
        this.database = database;
    }

    /**
     * Overwrites the createRoot() method of Application to
     * build the resource tree to form the exposed server URLs.
     *
     * @return The root of the URL tree exposed by the HTTP server.
     */
    @Override
    public Restlet createRoot() {

        final Context context = getContext();

        final ConcurrentMap<String, Object> map = context.getAttributes();
        map.put("database", this.database);

        final Router router = new Router(context);

        router.attach(ServicesResource.PATH, ServicesResource.class);
        router.attach(ServiceResource.PATH, ServiceResource.class);
        router.attach(FactoriesResource.PATH, FactoriesResource.class);
        router.attach(CreateResource.PATH, CreateResource.class);
        router.attach(ArtifactResource.PATH, ArtifactResource.class);
        router.attach(ArtifactOutResource.PATH, ArtifactOutResource.class);
        router.attach(ExportResource.PATH, ExportResource.class);
        router.attach(ImportResource.PATH, ImportResource.class);
        router.attach(CreateUserResource.PATH, CreateUserResource.class);
        router.attach(ListUsersResource.PATH, ListUsersResource.class);
        router.attach(UserResource.PATH, UserResource.class);
        router.attach(FindUserResource.PATH, FindUserResource.class);
        router.attach(CreateCollectionResource.PATH, CreateCollectionResource.class);
        router.attach(ListCollectionsResource.PATH, ListCollectionsResource.class);
        router.attach(CollectionResource.PATH, CollectionResource.class);
        router.attach(CollectionOutResource.PATH, CollectionOutResource.class);

        /* register any additional services */
        final Map<String, Class<?>> restServices = this.database.getRestServices();
        for (final Entry<String, Class<?>> entry : restServices.entrySet())
            router.attach(entry.getKey(), entry.getValue());

        return router;
    }
}

http://dive4elements.wald.intevation.org