Java tutorial
/* * Copyright (C) 2015 Ilmo Euro <ilmo.euro@gmail.com> * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package fi.ilmoeuro.membertrack.ui; import fi.ilmoeuro.membertrack.auth.ui.MtSignInPage; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; import de.agilecoders.wicket.webjars.WicketWebjars; import de.agilecoders.wicket.webjars.settings.WebjarsSettings; import fi.ilmoeuro.membertrack.auth.ui.PasswordResetPage; import fi.ilmoeuro.membertrack.db.DataSourceInitializer; import fi.ilmoeuro.membertrack.db.DatabaseInitializer; import fi.ilmoeuro.membertrack.db.DebugServer; import fi.ilmoeuro.membertrack.holvi.HolviSynchronizer; import fi.ilmoeuro.membertrack.membership.Memberships; import fi.ilmoeuro.membertrack.membership.db.DbMemberships; import fi.ilmoeuro.membertrack.membership.ui.MembershipsPage; import fi.ilmoeuro.membertrack.person.Persons; import fi.ilmoeuro.membertrack.person.db.DbPersons; import fi.ilmoeuro.membertrack.plumbing.JavaScriptInBodyDecorator; import fi.ilmoeuro.membertrack.plumbing.WicketDateConverter; import fi.ilmoeuro.membertrack.service.Services; import fi.ilmoeuro.membertrack.service.db.DbServices; import fi.ilmoeuro.membertrack.session.SessionRunner; import fi.ilmoeuro.membertrack.session.UnitOfWork; import fi.ilmoeuro.membertrack.session.db.DbSessionRunner; import fi.ilmoeuro.membertrack.session.db.DbUnitOfWork; import fi.ilmoeuro.membertrack.statistics.ui.StatisticsPage; import java.io.FileNotFoundException; import java.io.IOException; import java.io.Serializable; import java.time.LocalDate; import lombok.Data; import lombok.Getter; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.wicket.Application; import org.apache.wicket.ConverterLocator; import org.apache.wicket.IConverterLocator; import org.apache.wicket.Page; import org.apache.wicket.RuntimeConfigurationType; import org.apache.wicket.authroles.authentication.AbstractAuthenticatedWebSession; import org.apache.wicket.authroles.authentication.AuthenticatedWebApplication; import org.apache.wicket.markup.html.WebPage; import org.jooq.DSLContext; @Slf4j @RequiredArgsConstructor public final class MtApplication extends AuthenticatedWebApplication { public static @Data class Config implements Serializable { private static final long serialVersionUID = 0l; boolean debug; } @Getter private final fi.ilmoeuro.membertrack.config.Config config; @Getter private final SessionRunner<DSLContext> sessionRunner; private final UnitOfWork.Factory<DSLContext> uowFactory; private final Persons.Factory<DSLContext> personsFactory; private final Services.Factory<DSLContext> servicesFactory; private final Memberships.Factory<DSLContext> membershipsFactory; private final DataSourceInitializer dsInitializer; private final DatabaseInitializer dbInitializer; private final DebugServer debugServer; private final HolviSynchronizer<DSLContext> holviSynchronizer; private final ObjectMapper objectMapper; private final Config appConfig; public MtApplication() throws FileNotFoundException, IOException { super(); config = fi.ilmoeuro.membertrack.config.Config.load(); objectMapper = new ObjectMapper(); objectMapper.registerModule(new JavaTimeModule()); sessionRunner = new DbSessionRunner(config.getSessionRunner()); uowFactory = new DbUnitOfWork.Factory(); personsFactory = new DbPersons.Factory(); servicesFactory = new DbServices.Factory(); membershipsFactory = new DbMemberships.Factory(); dsInitializer = new DataSourceInitializer(config.getDataSourceInitializer()); dbInitializer = new DatabaseInitializer(config.getDatabaseInitializer()); debugServer = new DebugServer(config.getDebugServer()); holviSynchronizer = new HolviSynchronizer<>(objectMapper, config.getHolviSynchronizer(), sessionRunner, uowFactory, personsFactory, servicesFactory, membershipsFactory); appConfig = config.getApplication(); } @Override public void init() { super.init(); setHeaderResponseDecorator(new JavaScriptInBodyDecorator()); WebjarsSettings webjarsSettings = new WebjarsSettings(); WicketWebjars.install(this, webjarsSettings); getMarkupSettings().setStripWicketTags(true); mountPage("/login", MtSignInPage.class); mountPage("/memberships", MembershipsPage.class); mountPage("/statistics", StatisticsPage.class); mountPage("/passwordreset", PasswordResetPage.class); dsInitializer.init(); sessionRunner.exec(dbInitializer::init); debugServer.start(); holviSynchronizer.start(); } @Override protected void onDestroy() { log.info("Stopping Holvi synchronizer"); holviSynchronizer.stop(); log.info("Stopping DB debug server"); debugServer.stop(); log.info("Stopping DataSource initializer"); dsInitializer.stop(); super.onDestroy(); } @SuppressWarnings("unchecked") public static MtApplication get() { try { return (MtApplication) Application.get(); } catch (ClassCastException ex) { String error = "Called get() from wrong app"; log.error(error, ex); throw new RuntimeException(error, ex); } } @Override protected IConverterLocator newConverterLocator() { ConverterLocator locator = new ConverterLocator(); locator.set(LocalDate.class, new WicketDateConverter()); return locator; } @Override public Class<? extends Page> getHomePage() { return MembershipsPage.class; } @Override protected Class<? extends AbstractAuthenticatedWebSession> getWebSessionClass() { return MtSession.class; } @Override protected Class<? extends WebPage> getSignInPageClass() { return MtSignInPage.class; } @Override public RuntimeConfigurationType getConfigurationType() { if (appConfig.isDebug()) { return RuntimeConfigurationType.DEVELOPMENT; } else { return RuntimeConfigurationType.DEPLOYMENT; } } }