/*
* (C) Copyright 2006-2009 Nuxeo SAS (http://nuxeo.com/) and contributors.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the GNU Lesser General Public License
* (LGPL) version 2.1 which accompanies this distribution, and is available at
* http://www.gnu.org/licenses/lgpl.html
*
* This library 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
* Lesser General Public License for more details.
*
* Contributors:
* bstefanescu
*/
package org.nuxeo.ecm.webengine.gwt.dev;
import java.io.File;
import java.io.IOException;
import java.net.URL;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.nuxeo.common.utils.StringUtils;
import org.nuxeo.dev.NuxeoApp;
import org.nuxeo.ecm.platform.ui.web.auth.NuxeoAuthenticationFilter;
import org.nuxeo.ecm.webengine.gwt.GwtBundleActivator;
/**
* @author <a href="mailto:bs@nuxeo.com">Bogdan Stefanescu</a>
*/
public class NuxeoLauncher extends NuxeoAuthenticationFilter {
private static final Log log = LogFactory.getLog(NuxeoLauncher.class);
protected static NuxeoApp app;
protected static RedirectService redirect;
/**
* You can overwrite this to add your own pom artifacts in the graph.
*/
protected void initializeGraph(NuxeoApp app) {
// app.addPom("org.my", "my-artifact", "1.0", 1);
}
protected void buildDone(NuxeoApp app) {
}
protected void aboutToStartFramework(NuxeoApp app) {
}
/**
* You can overwrite this add custom initialization after nuxeo started.
*/
protected void frameworkStarted(NuxeoApp app) {
// do nothing
}
/**
* Gets a custom configuration for the Nuxeo to build. By default no custom
* configuration is used - but built-in configuration selected through
* profiles.
*
* @return null if no custom configuration is wanted.
*/
protected URL getConfiguration() {
return null;
}
/**
* Override this if you don't want to cache the nuxeo build.
*/
protected boolean useCache() {
return true;
}
@Override
public synchronized void init(FilterConfig config) throws ServletException {
if (app != null) {
return;
}
System.setProperty(GwtBundleActivator.GWT_DEV_MODE_PROP, "true");
app = createApplication(config);
Runtime.getRuntime().addShutdownHook(
new Thread("Nuxeo Server Shutdown") {
@Override
public void run() {
try {
if (app != null) {
app.shutdown();
}
} catch (Exception e) {
log.error(e, e);
}
}
});
super.init(config);
}
protected NuxeoApp createApplication(FilterConfig config)
throws ServletException {
URL cfg = getConfiguration();
String homeParam = config.getInitParameter("home");
String hostParam = config.getInitParameter("host");
String portParam = config.getInitParameter("port");
String profileParam = config.getInitParameter("profile");
String updatePolicy = config.getInitParameter("updatePolicy");
String offline = config.getInitParameter("offline");
String isolated = config.getInitParameter("isolated");
boolean isIsolated = Boolean.parseBoolean(isolated);
String redirectPrefix = config.getInitParameter("redirectPrefix");
String redirectTrace = config.getInitParameter("redirectTrace");
String redirectTraceContent = config.getInitParameter("redirectTraceContent");
File home = null;
String host = hostParam == null ? "localhost" : null;
int port = portParam == null ? 8081 : Integer.parseInt(portParam);
String profile = profileParam == null ? NuxeoApp.CORE_SERVER_541_SNAPSHOT
: profileParam;
if (homeParam == null) {
String userDir = System.getProperty("user.home");
String sep = userDir.endsWith("/") ? "" : "/";
home = new File(userDir + sep + ".nxserver-gwt");
} else {
homeParam = StringUtils.expandVars(homeParam,
System.getProperties());
home = new File(homeParam);
}
// start redirect service
redirect = new RedirectService(host, port);
if (redirectPrefix != null) {
redirect.setRedirectPrefix(redirectPrefix);
}
if (redirectTrace != null && Boolean.parseBoolean(redirectTrace)) {
redirect.setTrace(true);
}
if (redirectTraceContent != null
&& Boolean.parseBoolean(redirectTraceContent)) {
redirect.setTrace(true);
redirect.setTraceContent(true);
}
System.out.println("+---------------------------------------------------------");
System.out.println("| Nuxeo Server Profile: "
+ (profile == null ? "custom" : profile));
System.out.println("| Home Directory: " + home);
System.out.println("| HTTP server at: " + host + ":" + port);
System.out.println("| Use cache: " + useCache()
+ "; Snapshot update policy: " + updatePolicy + "; offline: "
+ offline);
System.out.println("+---------------------------------------------------------\n");
NuxeoApp.setHttpServerAddress(host, port);
try {
MyNuxeoApp app = new MyNuxeoApp(home, null, isIsolated);
if (updatePolicy != null) {
app.setUpdatePolicy(updatePolicy);
}
if (offline != null) {
app.setOffline(Boolean.parseBoolean(offline));
}
if (cfg == null) {
app.build(profile, useCache());
} else {
app.build(cfg, useCache());
}
System.setProperty("java.naming.factory.initial",
"org.nuxeo.runtime.jtajca.NamingContextFactory");
System.setProperty("java.naming.factory.url.pkgs",
"org.nuxeo.runtime.jtajca");
app.start();
return app;
} catch (Exception e) {
throw new ServletException(e);
}
}
public class MyNuxeoApp extends NuxeoApp {
public MyNuxeoApp(File home) throws Exception {
super(home, null, false);
}
public MyNuxeoApp(File home, ClassLoader cl) throws Exception {
super(home, cl, false);
}
public MyNuxeoApp(File home, ClassLoader cl, boolean isIsolated)
throws Exception {
super(home, cl, isIsolated);
}
@Override
protected void initializeGraph() throws Exception {
super.initializeGraph();
NuxeoLauncher.this.initializeGraph(this);
}
@Override
protected void aboutToStartFramework() throws Exception {
super.aboutToStartFramework();
NuxeoLauncher.this.aboutToStartFramework(this);
}
@Override
protected void buildDone() {
super.buildDone();
NuxeoLauncher.this.buildDone(this);
}
@Override
protected void frameworkStarted() throws Exception {
super.frameworkStarted();
NuxeoLauncher.this.frameworkStarted(this);
}
}
/**
* Checks for calls to nuxeo server to redirect them to avoid SOP errors.
*/
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
HttpServletRequest httpRequest = (HttpServletRequest) request;
if (httpRequest.getRequestURI().startsWith(redirect.getRedirectPrefix())) {
HttpServletResponse httpResponse = (HttpServletResponse) response;
redirect.redirect(httpRequest, httpResponse);
return;
}
super.doFilter(request, response, chain);
}
}