/*
* Copyright 2013 JBoss Inc
*
* Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
*
* 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 org.overlord.rtgov.devsvr;
import java.util.EnumSet;
import javax.servlet.DispatcherType;
import org.eclipse.jetty.security.ConstraintMapping;
import org.eclipse.jetty.security.ConstraintSecurityHandler;
import org.eclipse.jetty.security.HashLoginService;
import org.eclipse.jetty.security.SecurityHandler;
import org.eclipse.jetty.security.authentication.BasicAuthenticator;
import org.eclipse.jetty.server.handler.ContextHandlerCollection;
import org.eclipse.jetty.servlet.ServletContextHandler;
import org.eclipse.jetty.servlet.ServletHolder;
import org.eclipse.jetty.util.security.Constraint;
import org.eclipse.jetty.util.security.Credential;
import org.jboss.errai.bus.server.servlet.DefaultBlockingServlet;
import org.jboss.weld.environment.servlet.BeanManagerResourceBindingListener;
import org.jboss.weld.environment.servlet.Listener;
import org.overlord.commons.dev.server.DevServerEnvironment;
import org.overlord.commons.dev.server.ErraiDevServer;
import org.overlord.commons.dev.server.MultiDefaultServlet;
import org.overlord.commons.dev.server.discovery.ErraiWebAppModuleFromMavenDiscoveryStrategy;
import org.overlord.commons.dev.server.discovery.JarModuleFromIDEDiscoveryStrategy;
import org.overlord.commons.dev.server.discovery.JarModuleFromMavenDiscoveryStrategy;
import org.overlord.commons.dev.server.discovery.WebAppModuleFromIDEDiscoveryStrategy;
import org.overlord.commons.gwt.server.filters.GWTCacheControlFilter;
import org.overlord.commons.gwt.server.filters.ResourceCacheControlFilter;
import org.overlord.commons.ui.header.OverlordHeaderDataJS;
import org.overlord.rtgov.ui.server.RtgovUI;
import org.overlord.rtgov.ui.server.servlet.SituationsExportServlet;
import com.google.common.collect.Lists;
/**
* A dev server for DTGov.
* @author eric.wittmann@redhat.com
*/
public class RTGovUIDevServer extends ErraiDevServer {
/**
* Main entry point.
* @param args
*/
public static void main(String [] args) throws Exception {
RTGovUIDevServer devServer = new RTGovUIDevServer(args);
devServer.go();
}
/**
* Constructor.
* @param args
*/
public RTGovUIDevServer(String [] args) {
super(args);
}
/**
* @see org.overlord.commons.dev.server.DevServer#serverPort()
*/
@Override
protected int serverPort() {
return 8080;
}
/**
* @see org.overlord.commons.dev.server.DevServer#preConfig()
*/
@Override
protected void preConfig() {
// Don't do any resource caching!
System.setProperty("overlord.resource-caching.disabled", "true");
}
/**
* @see org.overlord.commons.dev.server.ErraiDevServer#getErraiModuleId()
*/
@Override
protected String getErraiModuleId() {
return "rtgov-ui";
}
/**
* @see org.overlord.commons.dev.server.DevServer#createDevEnvironment()
*/
@Override
protected DevServerEnvironment createDevEnvironment() {
return new RTGovUIDevServerEnvironment(args);
}
/**
* @see org.overlord.commons.dev.server.DevServer#addModules(org.overlord.commons.dev.server.DevServerEnvironment)
*/
@Override
protected void addModules(DevServerEnvironment environment) {
environment.addModule("rtgov-ui",
new WebAppModuleFromIDEDiscoveryStrategy(RtgovUI.class),
new ErraiWebAppModuleFromMavenDiscoveryStrategy(RtgovUI.class));
environment.addModule("overlord-commons-uiheader",
new JarModuleFromIDEDiscoveryStrategy(OverlordHeaderDataJS.class, "src/main/resources/META-INF/resources"),
new JarModuleFromMavenDiscoveryStrategy(OverlordHeaderDataJS.class, "/META-INF/resources"));
}
/**
* @see org.overlord.commons.dev.server.DevServer#addModulesToJetty(org.overlord.commons.dev.server.DevServerEnvironment, org.eclipse.jetty.server.handler.ContextHandlerCollection)
*/
@Override
protected void addModulesToJetty(DevServerEnvironment environment, ContextHandlerCollection handlers) throws Exception {
super.addModulesToJetty(environment, handlers);
/* *********
* RTGov UI
* ********* */
ServletContextHandler rtgovUI = new ServletContextHandler(ServletContextHandler.SESSIONS);
rtgovUI.setContextPath("/rtgov-ui");
rtgovUI.setWelcomeFiles(new String[] { "index.html" });
rtgovUI.setResourceBase(environment.getModuleDir("rtgov-ui").getCanonicalPath());
rtgovUI.setInitParameter("errai.properties", "/WEB-INF/errai.properties");
rtgovUI.setInitParameter("login.config", "/WEB-INF/login.config");
rtgovUI.setInitParameter("users.properties", "/WEB-INF/users.properties");
rtgovUI.addEventListener(new Listener());
rtgovUI.addEventListener(new BeanManagerResourceBindingListener());
rtgovUI.addFilter(GWTCacheControlFilter.class, "/app/*", EnumSet.of(DispatcherType.REQUEST));
rtgovUI.addFilter(ResourceCacheControlFilter.class, "/css/*", EnumSet.of(DispatcherType.REQUEST));
rtgovUI.addFilter(ResourceCacheControlFilter.class, "/images/*", EnumSet.of(DispatcherType.REQUEST));
rtgovUI.addFilter(ResourceCacheControlFilter.class, "/js/*", EnumSet.of(DispatcherType.REQUEST));
rtgovUI.addFilter(org.overlord.rtgov.ui.server.filters.LocaleFilter.class, "/*", EnumSet.of(DispatcherType.REQUEST));
// Servlets
ServletHolder erraiServlet = new ServletHolder(DefaultBlockingServlet.class);
erraiServlet.setInitOrder(1);
rtgovUI.addServlet(erraiServlet, "*.erraiBus");
ServletHolder headerDataServlet = new ServletHolder(OverlordHeaderDataJS.class);
headerDataServlet.setInitParameter("app-id", "rtgov-ui");
rtgovUI.addServlet(headerDataServlet, "/js/overlord-header-data.js");
// File resources
ServletHolder resources = new ServletHolder(new MultiDefaultServlet());
resources.setInitParameter("resourceBase", "/");
resources.setInitParameter("resourceBases", environment.getModuleDir("rtgov-ui").getCanonicalPath()
+ "|" + environment.getModuleDir("overlord-commons-uiheader").getCanonicalPath());
resources.setInitParameter("dirAllowed", "true");
resources.setInitParameter("pathInfoOnly", "false");
String[] fileTypes = new String[] { "html", "js", "css", "png", "gif" };
for (String fileType : fileTypes) {
rtgovUI.addServlet(resources, "*." + fileType);
}
ServletHolder servletHolder = new ServletHolder(SituationsExportServlet.class);
servletHolder.setInitOrder(2);
rtgovUI.addServlet(servletHolder, "/situations/export");
rtgovUI.setSecurityHandler(createSecurityHandler());
handlers.addHandler(rtgovUI);
}
/**
* Creates a basic auth security handler.
*/
private SecurityHandler createSecurityHandler() {
HashLoginService hashLoginService = new HashLoginService();
for (String user : Lists.newArrayList("testuser_1","testuser_2","admin_1","admin_2")) {
String[] roles = new String[] { "ROLE_USER" };
if (user.startsWith("admin"))
roles = new String[] { "ROLE_ADMIN" };
hashLoginService.putUser(user, Credential.getCredential(user), roles);
}
hashLoginService.setName("RTGovRealm");
Constraint constraint = new Constraint();
constraint.setName(Constraint.__BASIC_AUTH);
constraint.setRoles(new String[] { "ROLE_USER", "ROLE_ADMIN" });
constraint.setAuthenticate(true);
String[] protectedMethods = new String[] { "GET", "HEAD", "POST", "PUT", "DELETE", "TRACE", "CONNECT" };
ConstraintSecurityHandler csh = new ConstraintSecurityHandler();
csh.setAuthenticator(new BasicAuthenticator());
csh.setRealmName("RTGovRealm");
for (String method : protectedMethods) {
ConstraintMapping cm = new ConstraintMapping();
cm.setConstraint(constraint);
cm.setPathSpec("/*");
cm.setMethod(method);
csh.addConstraintMapping(cm);
}
csh.setLoginService(hashLoginService);
return csh;
}
/**
* @see org.overlord.commons.dev.server.DevServer#postStart(org.overlord.commons.dev.server.DevServerEnvironment)
*/
@Override
protected void postStart(DevServerEnvironment environment) throws Exception {
System.out.println("---------- DONE ---------------");
System.out.println("Now try: \n http://localhost:"+serverPort()+"/rtgov-ui/index.html");
System.out.println("---------------------------------");
}
}