de.inren.frontend.application.InRenApplication.java Source code

Java tutorial

Introduction

Here is the source code for de.inren.frontend.application.InRenApplication.java

Source

/**
 * Copyright 2014 the original author or authors.
 *
 * 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 de.inren.frontend.application;

import java.util.Locale;
import java.util.Map;
import java.util.MissingResourceException;

import org.apache.wicket.Component;
import org.apache.wicket.Localizer;
import org.apache.wicket.Page;
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.metadata.MetaDataRoleAuthorizationStrategy;
import org.apache.wicket.devutils.inspector.RenderPerformanceListener;
import org.apache.wicket.markup.html.IPackageResourceGuard;
import org.apache.wicket.markup.html.SecurePackageResourceGuard;
import org.apache.wicket.markup.html.WebPage;
import org.apache.wicket.markup.html.panel.FeedbackPanel;
import org.apache.wicket.model.IModel;
import org.apache.wicket.protocol.http.WebApplication;
import org.apache.wicket.protocol.http.request.WebClientInfo;
import org.apache.wicket.request.IRequestCycle;
import org.apache.wicket.request.IRequestHandler;
import org.apache.wicket.request.IRequestMapper;
import org.apache.wicket.request.Request;
import org.apache.wicket.request.Response;
import org.apache.wicket.request.Url;
import org.apache.wicket.request.cycle.AbstractRequestCycleListener;
import org.apache.wicket.request.cycle.RequestCycle;
import org.apache.wicket.spring.injection.annot.SpringBean;
import org.apache.wicket.spring.injection.annot.SpringComponentInjector;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;
import org.wicketstuff.annotation.scan.AnnotatedMountScanner;

import de.agilecoders.wicket.core.Bootstrap;
import de.agilecoders.wicket.core.settings.BootstrapSettings;
import de.agilecoders.wicket.themes.markup.html.bootswatch.BootswatchTheme;
import de.agilecoders.wicket.themes.markup.html.bootswatch.BootswatchThemeProvider;
import de.inren.frontend.application.security.InRenAuthorizationStrategy;
import de.inren.frontend.common.dns.DnsUtil;
import de.inren.frontend.storehouse.picture.PictureResource;
import de.inren.security.BasicAuthenticationSession;
import de.inren.security.SignInPage;
import de.inren.service.Initializable;
import de.inren.service.security.ComponentAccessService;
import de.inren.service.user.UserService;

/**
 * 
 * @author Ingo Renner
 *
 */
public class InRenApplication extends AuthenticatedWebApplication {

    private final static Logger log = LoggerFactory.getLogger(InRenApplication.class);

    public static final String THUMBNAIL_IMAGE_PATH = "thumb";
    public static final String PREVIEW_IMAGE_PATH = "perview";
    public static final String LAYOUT_IMAGE_PATH = "layout";
    public static final String IMAGE_PAGE_PATH = "image";

    @SpringBean
    UserService userService;

    @SpringBean
    ComponentAccessService componentAccessService;

    private ApplicationStatus applicationStatus = new ApplicationStatus();

    public InRenApplication() {
        super();
    }

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

    @Override
    public Class<? extends WebPage> getHomePage() {
        return HomePage.class;
    }

    @Override
    public void init() {
        super.init();

        /* Spring injection. */
        this.getComponentInstantiationListeners().add(new SpringComponentInjector(this));

        /* Performance measurement */
        if (false) {
            getComponentInstantiationListeners().add(new RenderPerformanceListener());
        }

        configureBootstrap();

        initializeServices();

        getSecuritySettings().setAuthorizationStrategy(new MetaDataRoleAuthorizationStrategy(this));

        initializeFailSafeLocalize();
        new AnnotatedMountScanner().scanPackage("de.inren").mount(this);

        mountResource("/" + PictureResource.PICTURE_RESOURCE + "/${" + PictureResource.ID + "}/${"
                + PictureResource.SIZE + "}", PictureResource.asReference());

        // Access to Images by url
        // mount(createImageURIRequestTargetUrlCodingStrategy());
        // mount(createLayoutURIRequestTargetUrlCodingStrategy());
        // mount(createThumbnailURIRequestTargetUrlCodingStrategy());

        // Render hints in html to navigate from firebug to eclipse
        // WicketSource.configure(this);

        // TODO gehrt ins codeflower package. => Init fr Wicket
        // module/packages machen.
        final IPackageResourceGuard packageResourceGuard = getResourceSettings().getPackageResourceGuard();
        if (packageResourceGuard instanceof SecurePackageResourceGuard) {
            ((SecurePackageResourceGuard) packageResourceGuard).addPattern("+*.json");
            ((SecurePackageResourceGuard) packageResourceGuard).addPattern("+**.ttf");
        }

        /** for ajax progressbar on upload */
        getApplicationSettings().setUploadProgressUpdatesEnabled(true);

        // I don't like messy html code.
        this.getMarkupSettings().setStripWicketTags(true);
        this.getMarkupSettings().setStripComments(true);

        // This application can be reached from internet, but you must know the
        // right port.
        // So I like to know who else besides me tries to connect.

        getRequestCycleListeners().add(new AbstractRequestCycleListener() {
            @Override
            public void onBeginRequest(RequestCycle cycle) {
                WebClientInfo ci = new WebClientInfo(cycle);
                log.debug("Request info: " + ci.getProperties().getRemoteAddress() + ", "
                        + ("".equals(DnsUtil.lookup(ci.getProperties().getRemoteAddress())) ? ""
                                : DnsUtil.lookup(ci.getProperties().getRemoteAddress()) + ", ")
                        + (cycle.getRequest().getUrl().getPath() == null
                                || "".equals(cycle.getRequest().getUrl().getPath()) ? ""
                                        : cycle.getRequest().getUrl().getPath() + ", ")
                        + ci.getUserAgent());
            }
        });

        getSecuritySettings().setAuthorizationStrategy(new InRenAuthorizationStrategy());

        // MetaDataRoleAuthorizationStrategy.authorize(AdminOnlyPage.class,
        // Roles.ADMIN);
        // mountPage("admin", AdminOnlyPage.class);

        // TODO das funzzt nur auf Class

        // LIST<COMPONENTACCESS> COMPONENTACCESS =
        // COMPONENTACCESSSERVICE.GETCOMPONENTACCESSLIST();
        // FOR (COMPONENTACCESS CA : COMPONENTACCESS) {
        // COLLECTION<ROLE> ROLES = CA.GETGRANTEDROLES();
        // STRINGBUFFER ROLESTRING = NEW STRINGBUFFER();
        // FOR (ROLE ROLE : ROLES) {
        // ROLESTRING.APPEND(ROLE);
        // }
        // METADATAROLEAUTHORIZATIONSTRATEGY.AUTHORIZE(CA.GETNAME(),
        // ROLESTRING.TOSTRING());
        // }
    }

    /**
     * Collect all services by spring and let them initialize. After that, we
     * have a clean environment to work with.
     **/
    protected void initializeServices() {
        Map<String, Initializable> services = getApplicationContext().getBeansOfType(Initializable.class);
        log.info("Services = " + (services == null ? "no services found." : services.keySet()));

        if (services != null) {
            for (Initializable service : services.values()) {
                try {
                    service.init();
                } catch (Exception e) {
                    log.error("failed to initialize service", e);
                }
            }
        }
    }

    private ApplicationContext getApplicationContext() {
        return WebApplicationContextUtils.getRequiredWebApplicationContext(getServletContext());
    }

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

    @Override
    public Session newSession(final Request request, final Response response) {
        Session session = super.newSession(request, response);
        applicationStatus.addSession(session);
        return session;
    }

    @Override
    protected Class<? extends WebPage> getSignInPageClass() {
        return SignInPage.class;
    }

    private void configureBootstrap() {
        BootstrapSettings settings = new BootstrapSettings();
        settings.setThemeProvider(new BootswatchThemeProvider(BootswatchTheme.Journal));
        Bootstrap.install(this, settings);

    }

    /**
     * I'm lazy some times. Don't throw exceptions when properties are missing,
     * just remind me with a default value (the key+locale).
     */
    private void initializeFailSafeLocalize() {
        Localizer localizer = new Localizer() {

            @Override
            public String getString(String key, Component component, IModel<?> model, Locale locale, String style,
                    String defaultValue) throws MissingResourceException {
                try {
                    return super.getString(key, component, model, locale, style, defaultValue);
                } catch (MissingResourceException e) {
                    String variation = (component != null ? component.getVariation() : null);
                    String cacheKey = getCacheKey(key, component, locale, style, variation);
                    log.info("######### Missing: cacheKey=[" + cacheKey + "] " + e.getMessage());
                    final String text = key + (locale == null ? "" : locale.getLanguage());
                    return "[" + text + "]";
                }
            }

        };
        this.getResourceSettings().setLocalizer(localizer);
    }

    public FeedbackPanel getFeedbackPanel(Page page) {
        return (FeedbackPanel) page.visitChildren(new FeedbackPanelVisitor());
    }

    public String getThumbnailUrl(String id, RequestCycle rc) {
        return createPicteResourceUrl(rc, id, THUMBNAIL_IMAGE_PATH);
    }

    public String getPreviewUrl(String id, RequestCycle rc) {
        return createPicteResourceUrl(rc, id, PREVIEW_IMAGE_PATH);
    }

    public String getLayoutUrl(String id, RequestCycle rc) {
        return createPicteResourceUrl(rc, id, LAYOUT_IMAGE_PATH);
    }

    private String createPicteResourceUrl(RequestCycle rc, String id, String size) {
        return rc.getRequest().getContextPath() + "/" + PictureResource.PICTURE_RESOURCE + "/" + id + "/" + size;
    }

    private IRequestMapper createImageURIRequestTargetUrlCodingStrategy() {

        IRequestMapper mapper = new IRequestMapper() {

            @Override
            public IRequestHandler mapRequest(Request request) {
                IRequestHandler handler = new IRequestHandler() {

                    @Override
                    public void respond(IRequestCycle requestCycle) {
                        // TODO Auto-generated method stub

                    }

                    @Override
                    public void detach(IRequestCycle requestCycle) {
                        // TODO Auto-generated method stub

                    }
                };
                // TODO Auto-generated method stub
                return null;
            }

            @Override
            public int getCompatibilityScore(Request request) {
                // TODO Auto-generated method stub
                return 0;
            }

            @Override
            public Url mapHandler(IRequestHandler requestHandler) {
                // TODO Auto-generated method stub
                return null;
            }
        };
        return mapper;
    }

    public ApplicationStatus getApplicationStatus() {
        return applicationStatus;
    }

    public void setApplicationStatus(ApplicationStatus applicationStatus) {
        this.applicationStatus = applicationStatus;
    }

    // return new URIRequestTargetUrlCodingStrategy("/" + IMAGE_PAGE_PATH) {
    // @Override
    // public IRequestTarget decode(RequestParameters requestParameters) {
    // // Get request URI
    // String uri = getURI(requestParameters);
    // Long id;
    // try {
    // id = Long.valueOf(uri);
    // } catch (NumberFormatException e) {
    // id = 0L;
    // }
    // final File imageFile;
    // final String name;
    // if (id > 0L) {
    // Picture pic = pictureService.loadPicture(id);
    // imageFile = pictureModificationService.getImage(pic.getDigest());
    // name = pic.getFilename();
    // } else {
    // imageFile =
    // pictureModificationService.getImage(PictureModificationService.FILE_NOT_FOUND_DIGEST);
    // name = PictureModificationService.FILE_NOT_FOUND_NAME;
    // }
    // return new ImageResourceStreamRequestTarget(new FileResourceStream(new
    // org.apache.wicket.util.file.File(imageFile)), 0) {
    // @Override
    // public String getFileName() {
    // return name;
    // }
    // };
    // }
    //
    // @Override
    // public boolean matches(IRequestTarget requestTarget) {
    // if (requestTarget instanceof ImageResourceStreamRequestTarget) {
    // return ((ImageResourceStreamRequestTarget)
    // requestTarget).getImageTypeId() == 0;
    // }
    // return false;
    // }
    // };
    // }
    //
    // private URIRequestTargetUrlCodingStrategy
    // createLayoutURIRequestTargetUrlCodingStrategy() {
    // return new URIRequestTargetUrlCodingStrategy("/" + LAYOUT_IMAGE_PATH) {
    // @Override
    // public IRequestTarget decode(RequestParameters requestParameters) {
    // // Get request URI
    // String uri = getURI(requestParameters);
    // Long id;
    // try {
    // id = Long.valueOf(uri);
    // } catch (NumberFormatException e) {
    // id = 0L;
    // }
    // final File imageFile;
    // final String name;
    // if (id > 0L) {
    // Picture pic = pictureService.loadPicture(id);
    // imageFile = pictureModificationService.getLayoutImage(pic.getDigest());
    // name = pic.getFilename();
    // } else {
    // imageFile =
    // pictureModificationService.getLayoutImage(PictureModificationService.FILE_NOT_FOUND_DIGEST);
    // name = PictureModificationService.FILE_NOT_FOUND_NAME;
    // }
    // return new ImageResourceStreamRequestTarget(new FileResourceStream(new
    // org.apache.wicket.util.file.File(imageFile)), 1) {
    // @Override
    // public String getFileName() {
    // return name + ".png";
    // }
    // };
    // }
    //
    // @Override
    // public boolean matches(IRequestTarget requestTarget) {
    // if (requestTarget instanceof ImageResourceStreamRequestTarget) {
    // return ((ImageResourceStreamRequestTarget)
    // requestTarget).getImageTypeId() == 1;
    // }
    // return false;
    // }
    // };
    // }
    //
    // private URIRequestTargetUrlCodingStrategy
    // createThumbnailURIRequestTargetUrlCodingStrategy() {
    // return new URIRequestTargetUrlCodingStrategy("/" + THUMBNAIL_IMAGE_PATH)
    // {
    // @Override
    // public IRequestTarget decode(RequestParameters requestParameters) {
    // // Get request URI
    // String uri = getURI(requestParameters);
    // Long id;
    // try {
    // id = Long.valueOf(uri);
    // } catch (NumberFormatException e) {
    // id = 0L;
    // }
    // final File imageFile;
    // final String name;
    // if (id > 0L) {
    // Picture pic = pictureService.loadPicture(id);
    // imageFile =
    // pictureModificationService.getThumbnailImage(pic.getDigest());
    // name = pic.getFilename();
    // } else {
    // imageFile =
    // pictureModificationService.getThumbnailImage(PictureModificationService.FILE_NOT_FOUND_DIGEST);
    // name = PictureModificationService.FILE_NOT_FOUND_NAME;
    // }
    // return new ImageResourceStreamRequestTarget(new FileResourceStream(new
    // org.apache.wicket.util.file.File(imageFile)), 2) {
    // @Override
    // public String getFileName() {
    // return name + ".png";
    // }
    // };
    // }
    //
    // @Override
    // public boolean matches(IRequestTarget requestTarget) {
    // if (requestTarget instanceof ImageResourceStreamRequestTarget) {
    // return ((ImageResourceStreamRequestTarget)
    // requestTarget).getImageTypeId() == 2;
    // }
    // return false;
    // }
    // };
    // }

}