/*
* 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 com.bunjlabs.fuga;
import com.bunjlabs.fuga.configuration.Configuration;
import com.bunjlabs.fuga.dependency.DependencyManager;
import com.bunjlabs.fuga.dependency.InjectException;
import com.bunjlabs.fuga.i18n.MessagesManager;
import com.bunjlabs.fuga.handlers.DefaultErrorHandler;
import com.bunjlabs.fuga.handlers.DefaultRequestHandler;
import com.bunjlabs.fuga.handlers.ErrorHandler;
import com.bunjlabs.fuga.handlers.RequestHandler;
import com.bunjlabs.fuga.network.HttpServer;
import com.bunjlabs.fuga.network.netty.NettyHttpServer;
import com.bunjlabs.fuga.resources.ResourceManager;
import com.bunjlabs.fuga.router.Router;
import com.bunjlabs.fuga.services.ServiceManager;
import com.bunjlabs.fuga.sessions.SessionManager;
import com.bunjlabs.fuga.sessions.SessionService;
import com.bunjlabs.fuga.views.DummyViewRenderer;
import com.bunjlabs.fuga.views.ViewRenderer;
import java.net.InetSocketAddress;
import java.net.SocketAddress;
import java.util.concurrent.TimeUnit;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
/**
* A Fuga Application.
*/
public abstract class FugaApp {
private final Logger log = LogManager.getLogger(this);
private final DependencyManager dependencyManager;
private final ResourceManager resourceManager;
private final Configuration configuration;
private final Router router;
private final SessionManager sessionManager;
private final ServiceManager serviceManager;
private final MessagesManager messagesManager;
private ViewRenderer viewRenderer;
private RequestHandler requestHandler;
private ErrorHandler errorHandler;
private HttpServer httpserver;
private SocketAddress addr;
/**
* Creates a new FugaApp.
*/
public FugaApp() {
this.dependencyManager = new DependencyManager();
this.resourceManager = new ResourceManager();
this.configuration = new Configuration(this);
this.router = new Router(this);
this.sessionManager = new SessionManager(this);
this.serviceManager = new ServiceManager(this);
this.messagesManager = new MessagesManager(this);
}
/**
* Starts application.
*/
private void start() throws Exception {
log.info("Fuga Framework {}", configuration.get("fuga.version", "(version is unknown)"));
dependencyManager.register(
this,
resourceManager,
configuration,
router,
sessionManager,
serviceManager,
messagesManager,
dependencyManager
);
setViewRenderer(DummyViewRenderer.class);
setRequestHandler(DefaultRequestHandler.class);
setErrorHandler(DefaultErrorHandler.class);
prepare();
messagesManager.load();
serviceManager.register(SessionService.class, configuration.getInt("fuga.sessions.refreshtime"), TimeUnit.SECONDS);
addr = new InetSocketAddress(configuration.get("fuga.http.bindhost"), configuration.getInt("fuga.http.bindport"));
httpserver = new NettyHttpServer(addr, this);
httpserver.start();
}
/**
* Returns the current dependency manager.
*
* @return the dependency manager.
*/
public DependencyManager getDependencyManager() {
return dependencyManager;
}
/**
* Returns the current resource manager.
*
* @return the current resource manager.
*/
public ResourceManager getResourceManager() {
return resourceManager;
}
/**
* Returns the current configuration.
*
* @return the current configuration.
*/
public Configuration getConfiguration() {
return configuration;
}
/**
* Returns the current router.
*
* @return the current router.
*/
public Router getRouter() {
return router;
}
/**
* Returns the current service manager.
*
* @return the current service manager.
*/
public ServiceManager getServiceManager() {
return serviceManager;
}
/**
* Returns the current session manager.
*
* @return the current session manager.
*/
public SessionManager getSessionManager() {
return sessionManager;
}
/**
* Returns the current messages manager.
*
* @return the current messages manager.
*/
public MessagesManager getMessagesManager() {
return messagesManager;
}
/**
* Returns the current view renderer.
*
* @return the current view renderer.
*/
public ViewRenderer getViewRenderer() {
return viewRenderer;
}
/**
* Set current view renderer object.
*
* @param renderer View renderer object.
*/
public void setViewRenderer(ViewRenderer renderer) {
this.viewRenderer = renderer;
dependencyManager.register(ViewRenderer.class, renderer);
}
/**
* Set current view renderer class.
*
* @param rendererClass View renderer class.
* @throws InjectException if unable to inject dependencies
*/
public void setViewRenderer(Class<? extends ViewRenderer> rendererClass) throws InjectException {
this.viewRenderer = dependencyManager.registerAndInject(rendererClass);
}
/**
* Returns the current request handler.
*
* @return the current request handler.
*/
public RequestHandler getRequestHandler() {
return requestHandler;
}
/**
* Set current request handler object.
*
* @param requestHandler Request handler object.
*/
public void setRequestHandler(RequestHandler requestHandler) {
this.requestHandler = requestHandler;
dependencyManager.register(RequestHandler.class, requestHandler);
}
/**
*
* Set current request handler class.
*
* @param requestHandlerClass Request handler class.
* @throws InjectException if unable to inject dependencies
*/
public void setRequestHandler(Class<? extends RequestHandler> requestHandlerClass) throws InjectException {
this.requestHandler = dependencyManager.registerAndInject(requestHandlerClass);
}
/**
* Returns the current error handler.
*
* @return the current error handler.
*/
public ErrorHandler getErrorHandler() {
return errorHandler;
}
/**
* Set current error handler object.
*
* @param errorHandler Error handler object.
*/
public void setErrorHandler(ErrorHandler errorHandler) {
this.errorHandler = errorHandler;
dependencyManager.register(ErrorHandler.class, errorHandler);
}
/**
* Set current error handler class.
*
* @param errorHandlerClass Error handler class.
* @throws InjectException if unable to inject dependencies
*/
public void setErrorHandler(Class<? extends ErrorHandler> errorHandlerClass) throws InjectException {
this.errorHandler = dependencyManager.registerAndInject(errorHandlerClass);
}
/**
* Initialization method.
*
* @throws Exception if any error occurred
*/
public abstract void prepare() throws Exception;
/**
* Helper method that starts the application by given application class.
*
* @param appClass Aapplication class.
*/
public static void launch(Class<? extends FugaApp> appClass) {
try {
FugaApp app = appClass.newInstance();
app.start();
} catch (RuntimeException ex) {
throw ex;
} catch (Exception ex) {
throw new RuntimeException(ex);
}
}
}