/**
*
* Copyright
* 2009-2015 Jayway Products AB
* 2016-2017 Föreningen Sambruk
*
* Licensed under AGPL, Version 3.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.gnu.org/licenses/agpl.txt
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package se.streamsource.streamflow.web.rest.resource;
import org.qi4j.api.injection.scope.Service;
import org.qi4j.api.injection.scope.Structure;
import org.qi4j.api.injection.scope.Uses;
import org.qi4j.api.object.ObjectBuilderFactory;
import org.qi4j.api.structure.Module;
import org.qi4j.library.rest.EntitiesResource;
import org.qi4j.library.rest.EntityResource;
import org.qi4j.library.rest.IndexResource;
import org.qi4j.library.rest.SPARQLResource;
import org.restlet.Context;
import org.restlet.Restlet;
import org.restlet.resource.Directory;
import org.restlet.resource.ServerResource;
import org.restlet.routing.Filter;
import org.restlet.routing.Router;
import org.restlet.routing.Template;
import se.streamsource.dci.restlet.server.CommandQueryRestlet;
import se.streamsource.dci.restlet.server.ExtensionMediaTypeFilter;
import se.streamsource.dci.restlet.server.ResourceFinder;
import se.streamsource.streamflow.web.application.defaults.AvailabilityFilter;
import se.streamsource.streamflow.web.application.defaults.AvailabilityService;
import se.streamsource.streamflow.web.application.security.AuthenticationFilter;
import se.streamsource.streamflow.web.application.security.AuthenticationFilterService;
import se.streamsource.streamflow.web.rest.resource.admin.ConsoleServerResource;
import se.streamsource.streamflow.web.rest.resource.admin.LoggingServerResource;
import se.streamsource.streamflow.web.rest.resource.admin.SolrSearchServerResource;
import se.streamsource.streamflow.web.rest.resource.events.ApplicationEventsServerResource;
import se.streamsource.streamflow.web.rest.resource.events.DomainEventsServerResource;
/**
* Router for the Streamflow REST API.
*/
public class APIRouter
extends Router
{
private ObjectBuilderFactory factory;
private AuthenticationFilterService filterService;
public APIRouter(@Uses Context context, @Structure Module module,
@Service AuthenticationFilterService filterService,
@Service AvailabilityService availabilityService ) throws Exception
{
super(context);
this.factory = module.objectBuilderFactory();
this.filterService = filterService;
Restlet cqr = factory.newObjectBuilder(CommandQueryRestlet.class).use(getContext()).newInstance();
Filter availabilityFilter = factory.newObjectBuilder( AvailabilityFilter.class ).use( getContext(), cqr, availabilityService ).newInstance();
Filter authenticationFilter = factory.newObjectBuilder(AuthenticationFilter.class).use(getContext(), availabilityFilter, this.filterService).newInstance();
Filter noCacheFilter = new NoCacheFilter(context, authenticationFilter);
Filter performanceLoggingFilter = new PerformanceLoggingFilter(context, noCacheFilter);
attachDefault(new ExtensionMediaTypeFilter(getContext(), performanceLoggingFilter));
// Events
attach("/events/domain", new ExtensionMediaTypeFilter(getContext(), createServerResourceFinder(DomainEventsServerResource.class)), Template.MODE_STARTS_WITH);
attach("/events/application", new ExtensionMediaTypeFilter(getContext(), createServerResourceFinder(ApplicationEventsServerResource.class)), Template.MODE_STARTS_WITH);
// Admin resources
Router adminRouter = new Router(getContext());
adminRouter.attach("/entity", createServerResourceFinder(EntitiesResource.class));
adminRouter.attach("/entity/{identity}", createServerResourceFinder(EntityResource.class));
adminRouter.attach("/query", new PerformanceLoggingFilter(context, createServerResourceFinder(SPARQLResource.class)), Template.MODE_STARTS_WITH);
adminRouter.attach("/index", createServerResourceFinder(IndexResource.class));
adminRouter.attach("/console", createServerResourceFinder(ConsoleServerResource.class));
adminRouter.attach("/search", createServerResourceFinder(SolrSearchServerResource.class));
adminRouter.attach("/log", LoggingServerResource.class);
attach("/admin/tools", new ExtensionMediaTypeFilter(getContext(), adminRouter));
{
Directory dir = new Directory(getContext(), "clap://thread/static/admin/");
dir.setIndexName("index.html");
attach("/admin/", dir);
}
{
Directory dir = new Directory(getContext(), "clap://thread/static/crystal/");
dir.setIndexName("index.html");
attach("/statistics/", dir);
}
// Version info
Directory directory = new Directory(getContext(), "clap://thread/static/");
directory.setListingAllowed(true);
attach("/static", factory.newObjectBuilder(AuthenticationFilter.class).use(getContext(), directory, this.filterService).newInstance());
}
private Restlet createServerResourceFinder(Class<? extends ServerResource> resource)
{
return createServerResourceFinder(resource, true);
}
private Restlet createServerResourceFinder(Class<? extends ServerResource> resource, boolean secure)
{
ResourceFinder finder = factory.newObject(ResourceFinder.class);
finder.setTargetClass(resource);
if (secure)
{
return factory.newObjectBuilder(AuthenticationFilter.class).use(getContext(), finder, this.filterService).newInstance();
} else
return finder;
}
}