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: }