Skip to content

Commit

Permalink
Add method addListener in WebServer
Browse files Browse the repository at this point in the history
  • Loading branch information
decebals committed Oct 25, 2016
1 parent 14fbb1d commit f206154
Show file tree
Hide file tree
Showing 7 changed files with 81 additions and 9 deletions.
25 changes: 21 additions & 4 deletions pippo-core/src/main/java/ro/pippo/core/AbstractWebServer.java
Expand Up @@ -15,17 +15,27 @@
*/
package ro.pippo.core;

import javax.servlet.ServletContextListener;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;

/**
* @author Decebal Suiu
*/
public abstract class AbstractWebServer<T extends WebServerSettings> implements WebServer {
public abstract class AbstractWebServer<T extends WebServerSettings> implements WebServer<T> {

protected PippoFilter pippoFilter;
protected String pippoFilterPath;

protected PippoSettings pippoSettings;
private T settings;

protected List<Class<? extends ServletContextListener>> listeners;

public AbstractWebServer() {
listeners = new CopyOnWriteArrayList<>();
}

protected abstract T createDefaultSettings();

@Override
Expand All @@ -43,7 +53,7 @@ public PippoFilter getPippoFilter() {
}

@Override
public WebServer setPippoFilter(PippoFilter pippoFilter) {
public WebServer<T> setPippoFilter(PippoFilter pippoFilter) {
this.pippoFilter = pippoFilter;

return this;
Expand All @@ -55,7 +65,7 @@ public String getPippoFilterPath() {
}

@Override
public WebServer setPippoFilterPath(String pippoFilterPath) {
public WebServer<T> setPippoFilterPath(String pippoFilterPath) {
PippoFilter.validateFilterUrlPattern(pippoFilterPath);

this.pippoFilterPath = pippoFilterPath;
Expand All @@ -64,10 +74,17 @@ public WebServer setPippoFilterPath(String pippoFilterPath) {
}

@Override
public WebServer init(PippoSettings pippoSettings) {
public WebServer<T> init(PippoSettings pippoSettings) {
this.pippoSettings = pippoSettings;

return this;
}

@Override
public WebServer<T> addListener(Class<? extends ServletContextListener> listener) {
listeners.add(listener);

return this;
}

}
17 changes: 14 additions & 3 deletions pippo-core/src/main/java/ro/pippo/core/WebServer.java
Expand Up @@ -15,6 +15,8 @@
*/
package ro.pippo.core;

import javax.servlet.ServletContextListener;

/**
* @author Decebal Suiu
*/
Expand All @@ -24,7 +26,7 @@ public interface WebServer<T extends WebServerSettings> {

PippoFilter getPippoFilter();

WebServer setPippoFilter(PippoFilter pippoFilter);
WebServer<T> setPippoFilter(PippoFilter pippoFilter);

String getPippoFilterPath();

Expand All @@ -35,12 +37,21 @@ public interface WebServer<T extends WebServerSettings> {
* @param pippoFilterPath
* @return
*/
WebServer setPippoFilterPath(String pippoFilterPath);
WebServer<T> setPippoFilterPath(String pippoFilterPath);

WebServer init(PippoSettings pippoSettings);
WebServer<T> init(PippoSettings pippoSettings);

void start();

void stop();

/**
* Add a {@link ServletContextListener} programmatically.
* The preferred approach is to use {@link WebServerInitializer}.
*
* @param listener
* @return
*/
WebServer addListener(Class<? extends ServletContextListener> listener);

}
12 changes: 12 additions & 0 deletions pippo-core/src/main/java/ro/pippo/core/WebServerInitializer.java
Expand Up @@ -25,8 +25,20 @@
*/
public interface WebServerInitializer {

/**
* This will be invoked before any of the filters and servlets are initialized.
* It acquires the reference to {@code ServletContext} and makes use of the methods addServlet(),
* addMapping(), setInitParameters() and addFilter() for dynamically adding web components.
*
* @param servletContext
*/
void init(ServletContext servletContext);

/**
* This will be invoked after all the servlets and filters have been destroyed.
*
* @param servletContext
*/
void destroy(ServletContext servletContext);

}
Expand Up @@ -46,6 +46,8 @@
import java.util.concurrent.TimeUnit;

/**
* Must have a zero-argument constructor so that they can be instantiated during loading.
*
* @author Decebal Suiu
*/
@MetaInfServices(WebServer.class)
Expand All @@ -55,8 +57,15 @@ public class JettyServer extends AbstractWebServer<JettySettings> {

private Server server;

private final ExecutorService executor = Executors.newSingleThreadExecutor();
private final CountDownLatch startLatch = new CountDownLatch(1);
private final ExecutorService executor;
private final CountDownLatch startLatch;

public JettyServer() {
super();

executor = Executors.newSingleThreadExecutor();
startLatch = new CountDownLatch(1);
}

@Override
public void start() {
Expand Down Expand Up @@ -162,6 +171,15 @@ protected ServletContextHandler createPippoHandler() {
// add initializers
handler.addEventListener(new PippoServletContextListener());

// all listeners
listeners.forEach(listener -> {
try {
handler.addEventListener(listener.newInstance());
} catch (InstantiationException | IllegalAccessException e) {
throw new PippoRuntimeException(e);
}
});

return handler;
}

Expand Down
Expand Up @@ -27,6 +27,7 @@
import ro.pippo.core.WebServer;
import ro.pippo.core.WebServerSettings;

import javax.servlet.ServletContextListener;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
Expand All @@ -42,6 +43,8 @@
* <p/>
* TjwsServer uses PippoServlet.
*
* TjwsServer doesn't support {@link ServletContextListener}.
*
* @author James Moger
*/
@MetaInfServices(WebServer.class)
Expand Down Expand Up @@ -105,6 +108,11 @@ public void stop() {
}
}

@Override
public WebServer<WebServerSettings> addListener(Class<? extends ServletContextListener> listener) {
throw new PippoRuntimeException("This feature is not available for this server type");
}

@Override
protected WebServerSettings createDefaultSettings() {
return new WebServerSettings(pippoSettings);
Expand Down
Expand Up @@ -119,6 +119,9 @@ protected void internalStart() {
// add initializers
context.addApplicationListener(PippoServletContextListener.class.getName());

// add listeners
listeners.forEach(listener -> context.addApplicationListener(listener.getName()));

try {
String version = tomcat.getClass().getPackage().getImplementationVersion();
log.info("Starting Tomcat Server {} on port {}", version, getSettings().getPort());
Expand Down
Expand Up @@ -176,6 +176,9 @@ protected DeploymentManager createPippoDeploymentManager() throws ServletExcepti
// add initializers
info.addListener(new ListenerInfo(PippoServletContextListener.class));

// add listeners
listeners.forEach(listener -> info.addListener(new ListenerInfo(listener)));

ServletInfo defaultServlet = new ServletInfo("DefaultServlet", DefaultServlet.class);
defaultServlet.addMapping("/");

Expand Down

0 comments on commit f206154

Please sign in to comment.