org.hippoecm.frontend.PluginPage.java Source code

Java tutorial

Introduction

Here is the source code for org.hippoecm.frontend.PluginPage.java

Source

/*
 *  Copyright 2008-2015 Hippo B.V. (http://www.onehippo.com)
 *
 *  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 org.hippoecm.frontend;

import org.apache.wicket.Application;
import org.apache.wicket.Component;
import org.apache.wicket.behavior.Behavior;
import org.apache.wicket.markup.head.IHeaderResponse;
import org.apache.wicket.markup.head.JavaScriptHeaderItem;
import org.apache.wicket.markup.html.panel.EmptyPanel;
import org.apache.wicket.request.cycle.RequestCycle;
import org.apache.wicket.request.http.WebRequest;
import org.apache.wicket.request.http.WebResponse;
import org.apache.wicket.resource.CoreLibrariesContributor;
import org.hippoecm.frontend.behaviors.ContextMenuBehavior;
import org.hippoecm.frontend.behaviors.IContextMenu;
import org.hippoecm.frontend.dialog.DialogServiceFactory;
import org.hippoecm.frontend.dialog.IDialogService;
import org.hippoecm.frontend.model.event.IRefreshable;
import org.hippoecm.frontend.model.event.ObservableRegistry;
import org.hippoecm.frontend.observation.JcrObservationManager;
import org.hippoecm.frontend.plugin.IClusterControl;
import org.hippoecm.frontend.plugin.IServiceTracker;
import org.hippoecm.frontend.plugin.config.IClusterConfig;
import org.hippoecm.frontend.plugin.config.IPluginConfigService;
import org.hippoecm.frontend.plugin.config.impl.IApplicationFactory;
import org.hippoecm.frontend.plugin.config.impl.JavaPluginConfig;
import org.hippoecm.frontend.plugin.config.impl.PluginConfigFactory;
import org.hippoecm.frontend.plugin.impl.PluginContext;
import org.hippoecm.frontend.plugin.impl.PluginManager;
import org.hippoecm.frontend.service.IController;
import org.hippoecm.frontend.service.IRenderService;
import org.hippoecm.frontend.service.ServiceTracker;
import org.hippoecm.frontend.session.PluginUserSession;
import org.hippoecm.frontend.session.UserSession;
import org.hippoecm.frontend.util.WebApplicationHelper;
import org.hippoecm.hst.diagnosis.HDC;
import org.hippoecm.hst.diagnosis.Task;

public class PluginPage extends Home implements IServiceTracker<IRenderService> {

    private static final long serialVersionUID = 1L;

    private final int pageId;

    private final PluginManager mgr;
    private final PluginContext context;
    private IRenderService root;
    private final DialogServiceFactory dialogService;
    private final ObservableRegistry obRegistry;
    private final IPluginConfigService pluginConfigService;
    private final ContextMenuBehavior menuBehavior;

    public PluginPage() {
        this(PluginUserSession.get().getApplicationFactory());
    }

    public PluginPage(IApplicationFactory appFactory) {
        Task pageInitTask = null;

        try {
            if (HDC.isStarted()) {
                pageInitTask = HDC.getCurrentTask().startSubtask("PluginPage.init");
            }

            pageId = ((PluginUserSession) UserSession.get()).getPageId();

            add(new EmptyPanel("root"));

            mgr = new PluginManager(this);
            context = new PluginContext(mgr, new JavaPluginConfig("home"));
            context.connect(null);

            context.registerTracker(this, "service.root");

            pluginConfigService = new PluginConfigFactory(UserSession.get(), appFactory);
            context.registerService(pluginConfigService, IPluginConfigService.class.getName());

            obRegistry = new ObservableRegistry(context, null);
            obRegistry.startObservation();

            dialogService = new DialogServiceFactory("dialog");
            dialogService.init(context, IDialogService.class.getName());
            add(dialogService.getComponent());

            context.registerService(this, Home.class.getName());
            registerGlobalBehaviorTracker();

            add(menuBehavior = new ContextMenuBehavior());

            IClusterConfig pluginCluster = pluginConfigService.getDefaultCluster();
            IClusterControl clusterControl = context.newCluster(pluginCluster, null);
            clusterControl.start();

            IController controller = context.getService(IController.class.getName(), IController.class);

            if (controller != null) {
                WebRequest request = (WebRequest) RequestCycle.get().getRequest();
                controller.process(request.getRequestParameters());
            }
        } finally {
            if (pageInitTask != null) {
                pageInitTask.stop();
            }
        }
    }

    private void registerGlobalBehaviorTracker() {
        final String[] serviceIds = { context.getReference(this).getServiceId(), Behavior.class.getName() };
        for (String serviceId : serviceIds) {
            ServiceTracker<Behavior> tracker = new ServiceTracker<Behavior>(Behavior.class) {
                private static final long serialVersionUID = 1L;

                @Override
                public void onServiceAdded(Behavior behavior, String name) {
                    add(behavior);
                }

                @Override
                public void onRemoveService(Behavior behavior, String name) {
                    remove(behavior);
                }
            };
            context.registerTracker(tracker, serviceId);
        }
    }

    @Override
    public void renderHead(final IHeaderResponse response) {
        Task pageRenderHeadTask = null;

        try {
            if (HDC.isStarted()) {
                pageRenderHeadTask = HDC.getCurrentTask().startSubtask("PluginPage.renderHead");
            }

            super.renderHead(response);
            CoreLibrariesContributor.contribute(Application.get(), response);

            if (WebApplicationHelper.isDevelopmentMode()) {
                addDevelopmentModeCssClassToHtml(response);
            }
        } finally {
            if (pageRenderHeadTask != null) {
                pageRenderHeadTask.stop();
            }
        }
    }

    private static void addDevelopmentModeCssClassToHtml(final IHeaderResponse response) {
        final String script = "$('html').addClass('wicket-development-mode');";
        response.render(JavaScriptHeaderItem.forScript(script, "html-wicket-development-mode"));
    }

    public Component getComponent() {
        return this;
    }

    /**
     * Refresh the JCR session, i.e. invalidate (cached) subtrees for which an event has been received.
     */
    public void refresh() {
        // objects may be invalid after refresh, so reacquire them when needed
        detach();

        // refresh session
        JcrObservationManager.getInstance().refreshSession();
    }

    /**
     * Notify refreshables and listeners in the page for which events have been received.
     */
    public void processEvents() {
        Task pageProcessEventsTask = null;

        try {
            if (HDC.isStarted()) {
                pageProcessEventsTask = HDC.getCurrentTask().startSubtask("PluginPage.processEvents");
            }

            refresh();

            // re-evaluate models
            context.getServices(IRefreshable.class.getName(), IRefreshable.class)
                    .forEach(org.hippoecm.frontend.model.event.IRefreshable::refresh);

            // process JCR events
            JcrObservationManager.getInstance().processEvents();
        } finally {
            if (pageProcessEventsTask != null) {
                pageProcessEventsTask.stop();
            }

            setFlag(FLAG_RESERVED1, false);
        }
    }

    @Override
    protected void onInitialize() {
        Task initTask = null;

        try {
            if (HDC.isStarted()) {
                initTask = HDC.getCurrentTask().startSubtask("PluginPage.onInitialize");
            }

            super.onInitialize();
        } finally {
            if (initTask != null) {
                initTask.stop();
            }
        }
    }

    @Override
    protected void onBeforeRender() {
        Task beforeRenderTask = null;

        try {
            if (HDC.isStarted()) {
                beforeRenderTask = HDC.getCurrentTask().startSubtask("PluginPage.onBeforeRender");
            }

            super.onBeforeRender();
        } finally {
            if (beforeRenderTask != null) {
                beforeRenderTask.stop();
            }
        }
    }

    @Override
    protected void onAfterRender() {
        Task afterRenderTask = null;

        try {
            if (HDC.isStarted()) {
                afterRenderTask = HDC.getCurrentTask().startSubtask("PluginPage.onAfterRender");
            }

            super.onAfterRender();
        } finally {
            if (afterRenderTask != null) {
                afterRenderTask.stop();
            }
        }
    }

    public void render(PluginRequestTarget target) {
        Task pageRenderTask = null;

        try {
            if (HDC.isStarted()) {
                pageRenderTask = HDC.getCurrentTask().startSubtask("PluginPage.render");
            }

            if (root != null) {
                root.render(target);
            }

            dialogService.render(target);
            menuBehavior.checkMenus(target);
        } finally {
            if (pageRenderTask != null) {
                pageRenderTask.stop();
            }
        }
    }

    public void focus(IRenderService child) {
    }

    public void bind(IRenderService parent, String wicketId) {
    }

    public void unbind() {
    }

    public IRenderService getParentService() {
        return null;
    }

    public String getServiceId() {
        return null;
    }

    // DO NOT CALL THIS METHOD
    // Use the IPluginContext to access the plugin manager
    public final PluginManager getPluginManager() {
        return mgr;
    }

    @Override
    protected void setHeaders(WebResponse response) {
        response.setHeader("Pragma", "no-cache");
        // FF3 bug: no-store shouldn't be necessary
        response.setHeader("Cache-Control", "no-store, no-cache, max-age=0, must-revalidate"); // no-store
        response.setHeader("X-Frame-Options", "sameorigin");
    }

    public void addService(IRenderService service, String name) {
        root = service;
        root.bind(this, "root");
        replace(root.getComponent());
    }

    public void removeService(IRenderService service, String name) {
        replace(new EmptyPanel("root"));
        root.unbind();
        root = null;
    }

    public void updateService(IRenderService service, String name) {
    }

    @Override
    public int getPageId() {
        return pageId;
    }

    @Override
    public void onDetach() {
        Task detachTask = null;

        try {
            if (HDC.isStarted()) {
                detachTask = HDC.getCurrentTask().startSubtask("PluginPage.onDetach");
            }

            context.detach();
            super.onDetach();
        } finally {
            if (detachTask != null) {
                detachTask.stop();
            }
        }
    }

    public void showContextMenu(IContextMenu active) {
        menuBehavior.activate(active);
    }

    @Override
    public void collapseAllContextMenus() {
        menuBehavior.collapseAll();
    }

    @Override
    public void renderPage() {
        collapseAllContextMenus();
        super.renderPage();
    }
}