Skip to content

Commit

Permalink
Move Initializers from PippoFilter to Application
Browse files Browse the repository at this point in the history
  • Loading branch information
gitblit committed Mar 4, 2015
1 parent 6a444d8 commit cab8700
Show file tree
Hide file tree
Showing 2 changed files with 78 additions and 39 deletions.
74 changes: 74 additions & 0 deletions pippo-core/src/main/java/ro/pippo/core/Application.java
Original file line number Diff line number Diff line change
Expand Up @@ -30,11 +30,21 @@
import ro.pippo.core.util.MimeTypes;
import ro.pippo.core.util.ServiceLocator;

import java.io.IOException;
import java.io.InputStreamReader;
import java.io.Reader;
import java.net.URL;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Properties;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import ro.pippo.core.util.StringUtils;

/**
* @author Decebal Suiu
Expand All @@ -55,6 +65,8 @@ public class Application {
private ControllerHandlerFactory controllerHandlerFactory;
private SessionFactory sessionFactory;

private List<Initializer> initializers;

private String uploadLocation = System.getProperty("java.io.tmpdir");
private long maximumUploadSize = -1L;

Expand All @@ -75,11 +87,38 @@ public Application(PippoSettings settings) {
this.mimeTypes = new MimeTypes(settings);
this.httpCacheToolkit = new HttpCacheToolkit(settings);
this.engines = new ContentTypeEngines();
this.initializers = new ArrayList<>();

registerContentTypeEngine(TextPlainEngine.class);
registerContentTypeEngine(JaxbEngine.class);
}

public final void start() {
initializers.addAll(getInitializers());
for (Initializer initializer : initializers) {
log.debug("Initializing '{}'", initializer.getClass().getName());
try {
initializer.init(this);
} catch (Exception e) {
log.error("Failed to initialize '{}'", initializer.getClass().getName(), e);
}
}

init();
}

public final void stop() {
destroy();
for (Initializer initializer : initializers) {
log.debug("Destroying '{}'", initializer.getClass().getName());
try {
initializer.destroy(this);
} catch (Exception e) {
log.error("Failed to destroy '{}'", initializer.getClass().getName(), e);
}
}
}

public void init() {
}

Expand Down Expand Up @@ -363,6 +402,41 @@ public Map<String, Object> getLocals() {
return locals;
}

private List<Initializer> getInitializers() {
try {
List<Initializer> initializers = new ArrayList<>();

ClassLoader classLoader = getClass().getClassLoader();
Enumeration<URL> resources = classLoader.getResources("pippo.properties");
while (resources.hasMoreElements()) {
URL resource = resources.nextElement();
log.debug("Read '{}'", resource.getFile());
Properties properties = new Properties();
try (Reader reader = new InputStreamReader(resource.openStream(), StandardCharsets.UTF_8)) {
properties.load(reader);
} catch (IOException e) {
log.error("Failed to read '{}'", resource.getFile(), e);
continue;
}

String initializerClassName = properties.getProperty("initializer");
if (StringUtils.isNullOrEmpty(initializerClassName)) {
log.warn("'{}' does not specify an 'initializer' setting!", resource.getFile());
} else {
log.debug("Found initializer '{}'", initializerClassName);
Class<Initializer> initializerClass = (Class<Initializer>) classLoader.loadClass(initializerClassName);

Initializer initializer = initializerClass.newInstance();
initializers.add(initializer);
}
}

return initializers;
} catch (IOException | InstantiationException | IllegalAccessException | ClassNotFoundException e) {
throw new PippoRuntimeException("Failed to locate Initializers", e);
}
}

@Override
public String toString() {
String toString = (getApplicationName() + " " + getApplicationVersion()).trim();
Expand Down
43 changes: 4 additions & 39 deletions pippo-core/src/main/java/ro/pippo/core/PippoFilter.java
Original file line number Diff line number Diff line change
Expand Up @@ -37,13 +37,9 @@
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.net.URI;
import java.net.URL;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Enumeration;
import java.util.List;
import java.util.Properties;

Expand Down Expand Up @@ -79,7 +75,6 @@ public class PippoFilter implements Filter {

private RouteContextFactory routeContextFactory;
private Application application;
private List<Initializer> initializers;
private String filterPath;

@Override
Expand Down Expand Up @@ -107,20 +102,13 @@ public void init(FilterConfig filterConfig) throws ServletException {
application.setContextPath(contextPath);
log.debug("Serving application on context path '{}'", contextPath);

initializers = new ArrayList<>();
log.debug("Initializing application '{}'", application);
application.start();

routeContextFactory = getRouteContextFactory();
initializers.add(routeContextFactory);
routeContextFactory.init(application);
log.debug("RouteContext factory is '{}'", routeContextFactory.getClass().getName());

initializers.addAll(getInitializers());
for (Initializer initializer : initializers) {
initializer.init(application);
}

log.debug("Initializing application '{}'", application);
application.init();

String runtimeMode = application.getRuntimeMode().toString().toUpperCase();
log.info("Pippo started ({})", runtimeMode);
} catch (Exception e) {
Expand Down Expand Up @@ -218,10 +206,7 @@ public void setFilterPath(String filterPath) {
public void destroy() {
if (application != null) {
try {
for (Initializer initializer : initializers) {
initializer.destroy(application);
}
application.destroy();
application.stop();

log.info("Pippo destroyed");
} finally {
Expand Down Expand Up @@ -332,26 +317,6 @@ private RouteContextFactory getRouteContextFactory() {
return factory;
}

private List<Initializer> getInitializers() throws Exception {
List<Initializer> initializers = new ArrayList<>();

ClassLoader classLoader = getClass().getClassLoader();
Enumeration<URL> urls = classLoader.getResources("pippo.properties");
while (urls.hasMoreElements()) {
URL url = urls.nextElement();
log.debug("Read '{}'", url.getFile());
Reader reader = new InputStreamReader(url.openStream(), "UTF-8");
Properties properties = new Properties();
properties.load(reader);
String initializerClassName = properties.getProperty("initializer");
log.debug("Found initializer '{}'", initializerClassName);
Class<Initializer> initializerClass = (Class<Initializer>) classLoader.loadClass(initializerClassName);
initializers.add(initializerClass.newInstance());
}

return initializers;
}

/**
* Simply reads a property resource file that contains the version of this
* Pippo build. Helps to identify the Pippo version currently running.
Expand Down

0 comments on commit cab8700

Please sign in to comment.