ingo@100: /*
ingo@100: * Copyright (c) 2010 by Intevation GmbH
ingo@100: *
ingo@100: * This program is free software under the LGPL (>=v2.1)
ingo@100: * Read the file LGPL.txt coming with the software for details
ingo@100: * or visit http://www.gnu.org/licenses/ if it does not exist.
ingo@100: */
ingo@100:
teichmann@475: package org.dive4elements.artifactdatabase.rest;
sascha@19:
gernotbelger@562: import java.util.Map;
gernotbelger@562: import java.util.Map.Entry;
sascha@20: import java.util.concurrent.ConcurrentMap;
sascha@20:
gernotbelger@562: import org.dive4elements.artifacts.ArtifactDatabase;
sascha@19: import org.restlet.Application;
ingo@79: import org.restlet.Context;
sascha@19: import org.restlet.Restlet;
sascha@19: import org.restlet.routing.Router;
sascha@19:
sascha@19: /**
sascha@88: * This is the core REST application that binds the serveral resources
sascha@88: * used to manage the artifact database to the HTTP server provided
sascha@88: * by the Restlet framework.
sascha@19: *
sascha@77: * @author Sascha L. Teichmann
sascha@19: */
gernotbelger@562: public class RestApp extends Application {
gernotbelger@562:
sascha@88: /**
sascha@88: * The central artifact database instance to work with.
sascha@88: */
gernotbelger@562: private final ArtifactDatabase database;
sascha@264:
sascha@88: /**
sascha@88: * Constructor to create REST appliction bound to a specific
sascha@88: * artifact database.
sascha@88: *
gernotbelger@562: * @param database
gernotbelger@562: * The artifact database to be used.
sascha@88: */
gernotbelger@562: public RestApp(final ArtifactDatabase database) {
sascha@19: this.database = database;
sascha@19: }
sascha@19:
sascha@88: /**
sascha@88: * Overwrites the createRoot() method of Application to
sascha@88: * build the resource tree to form the exposed server URLs.
sascha@88: *
sascha@88: * @return The root of the URL tree exposed by the HTTP server.
sascha@88: */
sascha@88: @Override
sascha@19: public Restlet createRoot() {
sascha@19:
gernotbelger@562: final Context context = getContext();
sascha@20:
gernotbelger@562: final ConcurrentMap map = context.getAttributes();
gernotbelger@562: map.put("database", this.database);
sascha@20:
gernotbelger@562: final Router router = new Router(context);
gernotbelger@562:
gernotbelger@562: router.attach(ServicesResource.PATH, ServicesResource.class);
gernotbelger@562: router.attach(ServiceResource.PATH, ServiceResource.class);
gernotbelger@562: router.attach(FactoriesResource.PATH, FactoriesResource.class);
gernotbelger@562: router.attach(CreateResource.PATH, CreateResource.class);
gernotbelger@562: router.attach(ArtifactResource.PATH, ArtifactResource.class);
sascha@29: router.attach(ArtifactOutResource.PATH, ArtifactOutResource.class);
gernotbelger@562: router.attach(ExportResource.PATH, ExportResource.class);
gernotbelger@562: router.attach(ImportResource.PATH, ImportResource.class);
gernotbelger@562: router.attach(CreateUserResource.PATH, CreateUserResource.class);
gernotbelger@562: router.attach(ListUsersResource.PATH, ListUsersResource.class);
gernotbelger@562: router.attach(UserResource.PATH, UserResource.class);
gernotbelger@562: router.attach(FindUserResource.PATH, FindUserResource.class);
gernotbelger@562: router.attach(CreateCollectionResource.PATH, CreateCollectionResource.class);
gernotbelger@562: router.attach(ListCollectionsResource.PATH, ListCollectionsResource.class);
gernotbelger@562: router.attach(CollectionResource.PATH, CollectionResource.class);
gernotbelger@562: router.attach(CollectionOutResource.PATH, CollectionOutResource.class);
gernotbelger@562:
gernotbelger@562: /* register any additional services */
gernotbelger@562: final Map> restServices = this.database.getRestServices();
gernotbelger@562: for (final Entry> entry : restServices.entrySet())
gernotbelger@562: router.attach(entry.getKey(), entry.getValue());
sascha@19:
sascha@19: return router;
sascha@19: }
gernotbelger@562: }