eu.esdihumboldt.hale.server.webtransform.war.pages.StatusPage.java Source code

Java tutorial

Introduction

Here is the source code for eu.esdihumboldt.hale.server.webtransform.war.pages.StatusPage.java

Source

/*
 * Copyright (c) 2012 Data Harmonisation Panel
 * 
 * All rights reserved. This program and the accompanying materials are made
 * available under the terms of the GNU Lesser General Public License as
 * published by the Free Software Foundation, either version 3 of the License,
 * or (at your option) any later version.
 * 
 * You should have received a copy of the GNU Lesser General Public License
 * along with this distribution. If not, see <http://www.gnu.org/licenses/>.
 * 
 * Contributors:
 *     Data Harmonisation Panel <http://www.dhpanel.eu>
 */

package eu.esdihumboldt.hale.server.webtransform.war.pages;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.Serializable;
import java.util.Arrays;
import java.util.List;

import javax.servlet.http.HttpServletResponse;

import org.apache.wicket.ajax.AbstractAjaxTimerBehavior;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.link.DownloadLink;
import org.apache.wicket.markup.html.list.ListItem;
import org.apache.wicket.markup.html.list.ListView;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.LoadableDetachableModel;
import org.apache.wicket.request.http.flow.AbortWithHttpErrorCodeException;
import org.apache.wicket.request.mapper.parameter.PageParameters;
import org.apache.wicket.spring.injection.annot.SpringBean;
import org.apache.wicket.util.time.Duration;
import org.eclipse.core.runtime.jobs.Job;
import org.joda.time.format.DateTimeFormat;

import eu.esdihumboldt.hale.common.headless.WorkspaceService;
import eu.esdihumboldt.hale.common.headless.transform.AbstractTransformationJob;
import eu.esdihumboldt.hale.common.headless.transform.TransformationWorkspace;
import eu.esdihumboldt.hale.server.webapp.components.JobPanel;
import eu.esdihumboldt.hale.server.webapp.pages.BasePage;
import eu.esdihumboldt.hale.server.webapp.util.PageDescription;

/**
 * Page showing the status of a transformation.
 * 
 * @author Simon Templer
 */
@PageDescription(parent = TransformationsPage.class, title = "Status")
public class StatusPage extends BasePage {

    private static final long serialVersionUID = -2711157942139206024L;

    /**
     * Name of the parameter specifying the workspace identifier.
     */
    public static final String PARAMETER_WORKSPACE = "workspace";

    @SpringBean
    private WorkspaceService workspaces;

    /**
     * Create a status page with the given page parameters.
     * 
     * @param parameters the page parameters
     */
    public StatusPage(PageParameters parameters) {
        super(parameters);
    }

    @Override
    protected void addControls(boolean loggedIn) {
        super.addControls(loggedIn);

        final String workspaceId = getPageParameters().get(PARAMETER_WORKSPACE).toOptionalString();
        if (workspaceId == null || workspaceId.isEmpty()) {
            throw new AbortWithHttpErrorCodeException(HttpServletResponse.SC_NOT_FOUND,
                    "Workspace ID not specified.");
        }

        try {
            workspaces.getWorkspaceFolder(workspaceId);
        } catch (FileNotFoundException e) {
            throw new AbortWithHttpErrorCodeException(HttpServletResponse.SC_NOT_FOUND,
                    "Workspace does not exist.");
        }

        final IModel<TransformationWorkspace> workspace = new LoadableDetachableModel<TransformationWorkspace>() {

            private static final long serialVersionUID = 2600444242247550094L;

            @Override
            protected TransformationWorkspace load() {
                return new TransformationWorkspace(workspaceId);
            }
        };

        // job panel
        final Serializable family = AbstractTransformationJob.createFamily(workspaceId);
        final JobPanel jobs = new JobPanel("jobs", family, true);
        add(jobs);

        // status
        final Label status = new Label("status", new LoadableDetachableModel<String>() {

            private static final long serialVersionUID = -4351763182104835300L;

            @Override
            protected String load() {
                if (workspace.getObject().isTransformationFinished()) {
                    if (workspace.getObject().isTransformationSuccessful()) {
                        return "Transformation completed.";
                    } else {
                        return "Transformation failed.";
                    }
                } else {
                    if (Job.getJobManager().find(family).length > 0) {
                        return "Transformation is running:";
                    } else {
                        return "No transformation running.";
                    }
                }
            }
        });
        status.setOutputMarkupId(true);
        add(status);

        // result
        final WebMarkupContainer result = new WebMarkupContainer("result");
        result.setOutputMarkupId(true);
        add(result);

        final WebMarkupContainer update = new WebMarkupContainer("update") {

            private static final long serialVersionUID = -2591480922683644827L;

            @Override
            public boolean isVisible() {
                return workspace.getObject().isTransformationFinished();
            }

        };
        result.add(update);

        // result : report
        File reportFile = workspace.getObject().getReportFile();
        DownloadLink report = new DownloadLink("log", reportFile, reportFile.getName());
        update.add(report);

        // result : file list
        IModel<? extends List<File>> resultFilesModel = new LoadableDetachableModel<List<File>>() {

            private static final long serialVersionUID = -7971872898614031331L;

            @Override
            protected List<File> load() {
                return Arrays.asList(workspace.getObject().getTargetFolder().listFiles());
            }

        };
        final ListView<File> fileList = new ListView<File>("file", resultFilesModel) {

            private static final long serialVersionUID = -8045643864251639540L;

            @Override
            protected void populateItem(ListItem<File> item) {
                // download link
                DownloadLink download = new DownloadLink("download", item.getModelObject(),
                        item.getModelObject().getName());
                item.add(download);

                // file name
                download.add(new Label("name", item.getModelObject().getName()));
            }

        };
        update.add(fileList);

        // leaseEnd
        String leaseEnd;
        try {
            leaseEnd = workspaces.getLeaseEnd(workspaceId).toString(DateTimeFormat.mediumDateTime());
        } catch (IOException e) {
            leaseEnd = "unknown";
        }
        add(new Label("leaseEnd", leaseEnd));

        boolean transformationFinished = workspace.getObject().isTransformationFinished();
        if (transformationFinished) {
            // disable job timer
            jobs.getTimer().stopOnNextUpdate();
        } else {
            // timer
            add(new AbstractAjaxTimerBehavior(Duration.milliseconds(1500)) {

                private static final long serialVersionUID = -3726349470723024150L;

                @Override
                protected void onTimer(AjaxRequestTarget target) {
                    if (workspace.getObject().isTransformationFinished()) {
                        // update status and result
                        target.add(status);
                        target.add(result);

                        // stop timers
                        stop(target);
                        jobs.getTimer().stopOnNextUpdate();
                    }
                }
            });
        }
    }

}