package nl.topicus.konijn;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import nl.topicus.konijn.data.dao.hibernate.NabaztagDao;
import nl.topicus.konijn.security.AuthenticatedSession;
import nl.topicus.konijn.security.UserRolesAuthorizer;
import nl.topicus.konijn.web.HomePage;
import nl.topicus.konijn.web.pages.CreateInit;
import nl.topicus.konijn.web.pages.home.RegisterPage;
import nl.topicus.konijn.web.pages.home.UserHomePage;
import nl.topicus.konijn.web.pages.security.LogoutPage;
import nl.topicus.konijn.xmpp.XMPPServerFactory;
import nl.topicus.konijn.xmpp.util.VysperDelegator;
import org.apache.log4j.Logger;
import org.apache.wicket.Application;
import org.apache.wicket.Page;
import org.apache.wicket.RuntimeConfigurationType;
import org.apache.wicket.Session;
import org.apache.wicket.authroles.authentication.AbstractAuthenticatedWebSession;
import org.apache.wicket.authroles.authentication.AuthenticatedWebApplication;
import org.apache.wicket.authroles.authorization.strategies.role.RoleAuthorizationStrategy;
import org.apache.wicket.guice.GuiceComponentInjector;
import org.apache.wicket.markup.html.WebPage;
import org.apache.wicket.request.Request;
import org.apache.wicket.request.Response;
import org.apache.wicket.settings.IRequestLoggerSettings;
import org.apache.wicket.util.time.Duration;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.impl.StdSchedulerFactory;
import com.google.inject.Inject;
import com.google.inject.Injector;
/**
* Bunny wicket application
*
* @author Joost Limburg
*
*/
public class WicketApplication extends AuthenticatedWebApplication {
static final Logger LOGGER = Logger.getLogger(WicketApplication.class);
private Injector injector = null;
private Scheduler scheduler;
private GuiceComponentInjector gInjector;
private XMPPServerFactory xmppFactory;
@Inject
private NabaztagDao nabDao;
public VysperDelegator getDelegatorInstance() {
return new VysperDelegator(nabDao);
}
/**
* Constructor
*/
public WicketApplication() {
// xmppFactory = Guice.createInjector().getInstance(
// XMPPServerFactory.class);
}
public XMPPServerFactory getXmppFactory() {
return xmppFactory;
}
protected GuiceComponentInjector getGuiceInjector() {
return gInjector;
}
@Override
protected void init() {
super.init();
RuntimeConfigurationType type = this.getConfigurationType();
// Get the logger
if (type.equals(RuntimeConfigurationType.DEVELOPMENT)) {
LOGGER.info("You are in DEVELOPMENT mode");
getResourceSettings().setResourcePollFrequency(Duration.ONE_SECOND);
getDebugSettings().setComponentUseCheck(true);
getMarkupSettings().setStripWicketTags(false);
} else if (type.equals(RuntimeConfigurationType.DEPLOYMENT)) {
LOGGER.info("You are in DEPLOYMENT mode");
getResourceSettings().setResourcePollFrequency(null);
getDebugSettings().setComponentUseCheck(false);
getMarkupSettings().setStripWicketTags(true);
}
IRequestLoggerSettings reqLogger = Application.get()
.getRequestLoggerSettings();
Application.get().getMarkupSettings().setStripWicketTags(true);
// Security
getSecuritySettings().setAuthorizationStrategy(
new RoleAuthorizationStrategy(new UserRolesAuthorizer()));
// Enable the logger
reqLogger.setRequestLoggerEnabled(true);
// Injector injector = Guice.createInjector(new Module());
// setup the properties...
InitialContext context = null;
try {
context = new InitialContext();
} catch (NamingException e) {
e.printStackTrace();
}
try {
injector = (Injector) context.lookup("com.google.inject.Injector");
} catch (NamingException e) {
e.printStackTrace();
}
gInjector = new GuiceComponentInjector(this, injector);
getComponentInstantiationListeners().add(gInjector);
xmppFactory = injector.getInstance(XMPPServerFactory.class);
xmppFactory.start(gInjector);
gInjector.inject(this);
mountPage("init", CreateInit.class);
mountPage("logout", LogoutPage.class);
mountPage("home", UserHomePage.class);
mountPage("main", HomePage.class);
mountPage("register", RegisterPage.class);
// Start scheduler
try {
// Grab the Scheduler instance from the Factory
Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
// and start it off
scheduler.start();
} catch (SchedulerException se) {
se.printStackTrace();
}
}
/*
* (non-Javadoc)
*
* @see org.apache.wicket.Application#getHomePage()
*/
@Override
public Class<? extends Page> getHomePage() {
return HomePage.class;
}
public void onDestroy() {
System.out.println(">>> Stopping XMPP Server");
if (xmppFactory != null) {
xmppFactory.stop();
} else {
System.out.println(">>> XMPP Server was already dead.");
}
if (scheduler != null) {
try {
scheduler.shutdown();
} catch (SchedulerException e) {
e.printStackTrace();
}
}
super.onDestroy();
}
@Override
protected Class<? extends WebPage> getSignInPageClass() {
return HomePage.class;
}
@Override
protected Class<? extends AbstractAuthenticatedWebSession> getWebSessionClass() {
return AuthenticatedSession.class;
}
@Override
public Session newSession(Request request, Response response) {
Session s = new AuthenticatedSession(request);
gInjector.inject(s);
return s;
}
}