/* * 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(); } } }); } } }