net.rrm.ehour.ui.EhourWebApplication.java Source code

Java tutorial

Introduction

Here is the source code for net.rrm.ehour.ui.EhourWebApplication.java

Source

/*
 * 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 2
 * 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, write to the Free Software
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 */

package net.rrm.ehour.ui;

import net.rrm.ehour.appconfig.EhourHomeUtil;
import net.rrm.ehour.appconfig.EhourSystemConfig;
import net.rrm.ehour.ui.admin.audit.AuditReportPage;
import net.rrm.ehour.ui.admin.backup.BackupDbPage;
import net.rrm.ehour.ui.admin.config.MainConfigPage;
import net.rrm.ehour.ui.common.converter.FloatConverter;
import net.rrm.ehour.ui.common.i18n.EhourHomeResourceLoader;
import net.rrm.ehour.ui.common.session.DevelopmentWebSession;
import net.rrm.ehour.ui.common.session.EhourWebSession;
import net.rrm.ehour.ui.login.page.Login;
import net.rrm.ehour.ui.login.page.Logout;
import net.rrm.ehour.ui.login.page.SessionExpiredPage;
import net.rrm.ehour.ui.manage.assignment.AssignmentManagePage;
import net.rrm.ehour.ui.manage.customer.CustomerManagePage;
import net.rrm.ehour.ui.manage.department.DepartmentManagePage;
import net.rrm.ehour.ui.manage.lock.LockManagePage;
import net.rrm.ehour.ui.manage.project.ProjectManagePage;
import net.rrm.ehour.ui.manage.user.ImpersonateUserPage;
import net.rrm.ehour.ui.manage.user.UserManagePage;
import net.rrm.ehour.ui.pm.ProjectManagerPage;
import net.rrm.ehour.ui.report.detailed.DetailedReportRESTResource;
import net.rrm.ehour.ui.report.detailed.DetailedReportRESTResource$;
import net.rrm.ehour.ui.report.page.ReportPage;
import net.rrm.ehour.ui.timesheet.export.TimesheetExportPage;
import net.rrm.ehour.ui.timesheet.page.MonthOverviewPage;
import net.rrm.ehour.ui.userprefs.page.UserPreferencePage;
import org.apache.log4j.Logger;
import org.apache.wicket.*;
import org.apache.wicket.authorization.IAuthorizationStrategy;
import org.apache.wicket.authorization.IUnauthorizedComponentInstantiationListener;
import org.apache.wicket.authorization.UnauthorizedInstantiationException;
import org.apache.wicket.authroles.authentication.AuthenticatedWebApplication;
import org.apache.wicket.authroles.authentication.AuthenticatedWebSession;
import org.apache.wicket.authroles.authorization.strategies.role.RoleAuthorizationStrategy;
import org.apache.wicket.markup.head.ResourceAggregator;
import org.apache.wicket.markup.head.StringHeaderItem;
import org.apache.wicket.markup.html.WebPage;
import org.apache.wicket.protocol.http.WebApplication;
import org.apache.wicket.request.Request;
import org.apache.wicket.request.Response;
import org.apache.wicket.request.cycle.PageRequestHandlerTracker;
import org.apache.wicket.request.resource.IResource;
import org.apache.wicket.request.resource.ResourceReference;
import org.apache.wicket.request.resource.caching.FilenameWithVersionResourceCachingStrategy;
import org.apache.wicket.request.resource.caching.IResourceCachingStrategy;
import org.apache.wicket.request.resource.caching.IStaticCacheableResource;
import org.apache.wicket.request.resource.caching.version.IResourceVersion;
import org.apache.wicket.spring.injection.annot.SpringComponentInjector;
import org.apache.wicket.util.time.Duration;
import org.springframework.security.authentication.AuthenticationManager;

import java.util.Comparator;

/**
 * Base config for wicket eHour webapp
 */

public class EhourWebApplication extends AuthenticatedWebApplication {
    private static final Logger LOGGER = Logger.getLogger(EhourWebApplication.class);

    private AuthenticationManager authenticationManager;
    private String version;
    private boolean initialized;

    private EhourSystemConfig ehourSystemConfig;

    private String build;
    private IAuthorizationStrategy authorizationStrategy;

    @Override
    public void init() {
        if (!initialized) {
            super.init();
            springInjection();

            setUACHeaderPriority();

            getMarkupSettings().setStripWicketTags(true);
            mountPages();
            mountResources();

            getRequestCycleSettings().setResponseRequestEncoding("UTF-8");
            setupSecurity();

            registerEhourHomeResourceLoader();

            getRequestCycleListeners().add(new PageRequestHandlerTracker());

            cacheStrategy();

            initialized = true;
        }

        if (isInTestMode()) {
            LOGGER.info("*** Running in test mode ***");
            getDebugSettings().setOutputComponentPath(true);
            getResourceSettings().setResourcePollFrequency(Duration.ONE_SECOND);
        }

        if (version != null) { // dont spoil the log during junit tests
            LOGGER.info(String.format("*** %s version %s started!", getAppName(), version));
        }
    }

    private void cacheStrategy() {
        IResourceCachingStrategy strategy = new FilenameWithVersionResourceCachingStrategy(new IResourceVersion() {
            @Override
            public String getVersion(IStaticCacheableResource resource) {
                return version;
            }
        });
        this.getResourceSettings().setCachingStrategy(strategy);
    }

    protected String getAppName() {
        return "eHour";
    }

    private boolean isInTestMode() {
        return Boolean.parseBoolean(System.getProperty("EHOUR_TEST", "false"));
    }

    private void setUACHeaderPriority() {
        final Comparator<? super ResourceAggregator.RecordedHeaderItem> defaultHeaderComparator = getResourceSettings()
                .getHeaderItemComparator();

        getResourceSettings().setHeaderItemComparator(new Comparator<ResourceAggregator.RecordedHeaderItem>() {
            @Override
            public int compare(ResourceAggregator.RecordedHeaderItem o1, ResourceAggregator.RecordedHeaderItem o2) {
                if (o1.getItem() instanceof StringHeaderItem && isIEHeader(o1))
                    return -1;
                else if (o2.getItem() instanceof StringHeaderItem && isIEHeader(o2))
                    return 1;
                else
                    return defaultHeaderComparator.compare(o1, o2);
            }

            private boolean isIEHeader(ResourceAggregator.RecordedHeaderItem o1) {
                StringHeaderItem headerItem = (StringHeaderItem) o1.getItem();

                return headerItem.getString().toString().contains("X-UA-Compatible");
            }
        });
    }

    protected void registerEhourHomeResourceLoader() {
        String absoluteTranslationsPath = EhourHomeUtil.getTranslationsDir(ehourSystemConfig.getEhourHome(),
                ehourSystemConfig.getTranslationsDir());
        EhourHomeResourceLoader resourceLoader = new EhourHomeResourceLoader(absoluteTranslationsPath);

        getResourceSettings().getResourceFinders().add(resourceLoader);
    }

    @Override
    public RuntimeConfigurationType getConfigurationType() {
        String development = RuntimeConfigurationType.DEVELOPMENT.name();
        String deployment = RuntimeConfigurationType.DEPLOYMENT.name();

        String configurationType = ehourSystemConfig.getConfigurationType();

        if (configurationType == null || (!configurationType.equalsIgnoreCase(deployment)
                && !configurationType.equalsIgnoreCase(development))) {
            LOGGER.warn("Invalid configuration type defined in ehour.properties. Valid values are " + deployment
                    + " or " + development);
            return RuntimeConfigurationType.DEVELOPMENT;
        }

        return RuntimeConfigurationType.valueOf(configurationType.toUpperCase());
    }

    protected void mountPages() {
        mountPage("/login", Login.class);
        mountPage("/logout", Logout.class);

        mountPage("/admin", MainConfigPage.class);
        mountPage("/admin/employee", UserManagePage.class);
        mountPage("/admin/department", DepartmentManagePage.class);
        mountPage("/admin/client", CustomerManagePage.class);
        mountPage("/admin/project", ProjectManagePage.class);
        mountPage("/admin/assignment", AssignmentManagePage.class);

        mountPage("/consultant/overview", MonthOverviewPage.class);

        mountPage("/consultant/exportmonth", TimesheetExportPage.class);

        mountPage("/report", ReportPage.class);

        mountPage("/audit", AuditReportPage.class);

        mountPage("/pm", ProjectManagerPage.class);

        mountPage("/prefs", UserPreferencePage.class);

        mountPage("/backup", BackupDbPage.class);

        mountPage("/op/lock", LockManagePage.class);

        mountPage("/admin/impersonate", ImpersonateUserPage.class);
    }

    private void mountResources() {
        mountResource("/rest/report/detailed", new ResourceReference("restReference") {

            DetailedReportRESTResource resource = DetailedReportRESTResource$.MODULE$.apply();

            @Override
            public IResource getResource() {
                return resource;
            }
        });
    }

    protected void springInjection() {
        getComponentInstantiationListeners().add(new SpringComponentInjector(this));
    }

    protected void setupSecurity() {
        getApplicationSettings().setPageExpiredErrorPage(SessionExpiredPage.class);

        authorizationStrategy = getAuthorizationStrategy();
        getSecuritySettings().setAuthorizationStrategy(authorizationStrategy);

        getSecuritySettings()
                .setUnauthorizedComponentInstantiationListener(new IUnauthorizedComponentInstantiationListener() {
                    public void onUnauthorizedInstantiation(final Component component) {
                        if (component instanceof Page) {
                            throw new RestartResponseAtInterceptPageException(Login.class);
                        } else {
                            throw new UnauthorizedInstantiationException(component.getClass());
                        }
                    }
                });
    }

    public IAuthorizationStrategy getAuthorizationStrategy() {
        return new RoleAuthorizationStrategy(this);
    }

    @Override
    public Session newSession(Request request, Response response) {
        if (ehourSystemConfig.isDisableAuth()) {
            System.err.println("*** eHour is configured to disable any authentication");
            System.err.println("*** Enable by setting ehour.disableAuth=false in your ehour.properties");
            System.err.println("*** DO NOT RUN IN PRODUCTION WITH THIS CONFIGURATION");
            return new DevelopmentWebSession(request);
        } else {
            return super.newSession(request, response);
        }
    }

    @Override
    protected IConverterLocator newConverterLocator() {
        ConverterLocator converterLocator = new ConverterLocator();
        converterLocator.set(Float.class, new FloatConverter());
        return converterLocator;
    }

    /**
     * Set the homepage
     */
    @Override
    public Class<? extends WebPage> getHomePage() {
        return MonthOverviewPage.class;
    }

    /**
     * The login page for unauthenticated clients
     */
    protected Class<? extends WebPage> getSignInPageClass() {
        return Login.class;
    }

    public AuthenticationManager getAuthenticationManager() {
        return authenticationManager;
    }

    @Override
    protected Class<? extends AuthenticatedWebSession> getWebSessionClass() {
        return EhourWebSession.class;
    }

    public void setAuthenticationManager(AuthenticationManager authenticationManager) {
        this.authenticationManager = authenticationManager;
    }

    public void setEhourSystemConfig(EhourSystemConfig ehourSystemConfig) {
        this.ehourSystemConfig = ehourSystemConfig;
    }

    public static EhourWebApplication get() {
        return (EhourWebApplication) WebApplication.get();
    }

    /**
     * @return the version
     */
    public String getVersion() {
        return version;
    }

    /**
     * @param version the version to set
     */
    public void setVersion(String version) {
        this.version = version;
    }

    public String geteHourHome() {
        return ehourSystemConfig.getEhourHome();
    }

    public void setBuild(String build) {
        this.build = build;
    }

    public String getBuild() {
        return build;
    }

    public Boolean isBookWholeWeekEnabled() {
        return ehourSystemConfig.isBookWholeWeekEnabled();
    }
}