package io.onedev.server.plugin.report.html; import java.io.File; import java.nio.charset.StandardCharsets; import java.util.concurrent.Callable; import org.apache.wicket.behavior.AttributeAppender; import org.apache.wicket.markup.ComponentTag; import org.apache.wicket.markup.head.IHeaderResponse; import org.apache.wicket.markup.head.JavaScriptHeaderItem; import org.apache.wicket.markup.head.OnLoadHeaderItem; import org.apache.wicket.markup.html.WebMarkupContainer; import org.apache.wicket.markup.html.basic.Label; import org.apache.wicket.request.cycle.RequestCycle; import org.apache.wicket.request.mapper.parameter.PageParameters; import io.onedev.commons.utils.FileUtils; import io.onedev.commons.utils.LockUtils; import io.onedev.server.model.Build; import io.onedev.server.security.SecurityUtils; import io.onedev.server.web.page.project.builds.detail.BuildDetailPage; @SuppressWarnings("serial") public class HtmlReportPage extends BuildDetailPage { private static final String PARAM_REPORT = "report"; private final String reportName; public HtmlReportPage(PageParameters params) { super(params); reportName = params.get(PARAM_REPORT).toString(); } @Override protected void onInitialize() { super.onInitialize(); String startPage = LockUtils.read(getBuild().getReportLockKey(JobHtmlReport.DIR), new Callable<String>() { @Override public String call() throws Exception { File startPageFile = new File(getBuild().getReportDir(JobHtmlReport.DIR), reportName + "/" + JobHtmlReport.START_PAGE); if (startPageFile.exists()) return FileUtils.readFileToString(startPageFile, StandardCharsets.UTF_8); else return null; } }); if (startPage != null) { PageParameters params = HtmlReportDownloadResource.paramsOf(getProject(), getBuild().getNumber(), reportName, startPage); CharSequence startPageUrl = RequestCycle.get().urlFor(new HtmlReportDownloadResourceReference(), params); add(new WebMarkupContainer("htmlReport") { @Override public void renderHead(IHeaderResponse response) { super.renderHead(response); response.render(JavaScriptHeaderItem.forReference(new HtmlReportResourceReference())); String script = String.format("onedev.server.htmlReport.onWindowLoad('%s');", getMarkupId(true)); response.render(OnLoadHeaderItem.forScript(script)); } }.add(AttributeAppender.append("src", startPageUrl.toString()))); } else { add(new Label("htmlReport", "No html report published") { @Override protected void onComponentTag(ComponentTag tag) { super.onComponentTag(tag); tag.setName("div"); } }.add(AttributeAppender.append("class", "alert alert-warning"))); } } @Override protected boolean isPermitted() { return SecurityUtils.canAccessReport(getBuild(), reportName); } public String getReportName() { return reportName; } public static PageParameters paramsOf(Build build, String reportName) { PageParameters params = paramsOf(build); params.add(PARAM_REPORT, reportName); return params; } }