/*
*
* Copyright (C) 2007-2015 Licensed to the Comunes Association (CA) under
* one or more contributor license agreements (see COPYRIGHT for details).
* The CA licenses this file to you under the GNU Affero General Public
* License version 3, (the "License"); you may not use this file except in
* compliance with the License. This file is part of kune.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
package cc.kune.core.server.rack;
import javax.servlet.Filter;
import javax.servlet.http.HttpServlet;
import cc.kune.core.server.rack.dock.RegexDock;
import cc.kune.core.server.rack.dock.RegexMatcher;
import cc.kune.core.server.rack.filters.gwts.GWTServiceFilter;
import cc.kune.core.server.rack.filters.rest.CORSServiceFilter;
import cc.kune.core.server.rack.filters.rest.RESTServiceFilter;
import cc.kune.core.server.rack.filters.servlet.ServletServiceFilter;
import com.google.gwt.user.client.rpc.RemoteService;
import com.google.inject.Module;
public class RackBuilder {
public static class RackDockBuilder {
private final Rack rack;
private final String regex;
public RackDockBuilder(final Rack rack, final String regex) {
this.rack = rack;
this.regex = regex;
}
public RackDockBuilder install(final Filter... filters) {
for (final Filter filter : filters) {
final RegexDock dock = new RegexDock(regex);
dock.setFilter(filter);
rack.add(dock);
}
return this;
}
}
private final Rack rack;
public RackBuilder() {
this.rack = new Rack();
}
public RackBuilder add(final Class<? extends ContainerListener> listener) {
rack.add(listener);
return this;
}
public RackDockBuilder at(final String regex) {
return new RackDockBuilder(rack, regex);
}
public RackBuilder exclude(final String... excludes) {
for (final String exclude : excludes) {
rack.addExclusion(new RegexMatcher(exclude));
}
return this;
}
public Rack getRack() {
return rack;
}
public void installCORSServices(final String root, final Class<?>... serviceClasses) {
for (final Class<?> serviceClass : serviceClasses) {
final String simpleName = serviceClass.getSimpleName();
final String pattern = root + simpleName + "/(.*)$";
final RegexDock dock = new RegexDock(pattern);
dock.setFilter(new CORSServiceFilter(pattern, serviceClass));
rack.add(dock);
}
}
public RackBuilder installGWTServices(final String root,
final Class<? extends RemoteService>... serviceClasses) {
for (final Class<? extends RemoteService> serviceClass : serviceClasses) {
final String simpleName = serviceClass.getSimpleName();
final RegexDock dock = new RegexDock(root + simpleName + "$");
dock.setFilter(new GWTServiceFilter(serviceClass));
rack.add(dock);
}
return this;
}
public void installRESTServices(final String root, final Class<?>... serviceClasses) {
for (final Class<?> serviceClass : serviceClasses) {
final String simpleName = serviceClass.getSimpleName();
final String pattern = root + simpleName + "/(.*)$";
final RegexDock dock = new RegexDock(pattern);
dock.setFilter(new RESTServiceFilter(pattern, serviceClass));
rack.add(dock);
}
}
public void installServlet(final String root, final Class<? extends HttpServlet>... servletClasses) {
for (final Class<? extends HttpServlet> servletClass : servletClasses) {
final String simpleName = servletClass.getSimpleName();
final RegexDock dock = new RegexDock(root + simpleName + "$");
dock.setFilter(new ServletServiceFilter(servletClass));
rack.add(dock);
}
}
public RackBuilder use(final Module... list) {
for (final Module m : list) {
rack.add(m);
}
return this;
}
}