001/* 002 * #%L 003 * Netarchivesuite - heritrix 3 monitor 004 * %% 005 * Copyright (C) 2005 - 2018 The Royal Danish Library, 006 * the National Library of France and the Austrian National Library. 007 * %% 008 * This program is free software: you can redistribute it and/or modify 009 * it under the terms of the GNU Lesser General Public License as 010 * published by the Free Software Foundation, either version 2.1 of the 011 * License, or (at your option) any later version. 012 * 013 * This program is distributed in the hope that it will be useful, 014 * but WITHOUT ANY WARRANTY; without even the implied warranty of 015 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 016 * GNU General Lesser Public License for more details. 017 * 018 * You should have received a copy of the GNU General Lesser Public 019 * License along with this program. If not, see 020 * <http://www.gnu.org/licenses/lgpl-2.1.html>. 021 * #L% 022 */ 023 024package dk.netarkivet.heritrix3.monitor.resources; 025 026import java.io.IOException; 027import java.util.List; 028import java.util.Locale; 029 030import javax.servlet.ServletContext; 031import javax.servlet.ServletOutputStream; 032import javax.servlet.http.HttpServletRequest; 033import javax.servlet.http.HttpServletResponse; 034 035import org.apache.commons.lang.StringEscapeUtils; 036import org.netarchivesuite.heritrix3wrapper.ScriptResult; 037 038import com.antiaction.common.filter.Caching; 039import com.antiaction.common.templateengine.TemplateBuilderFactory; 040 041import dk.netarkivet.heritrix3.monitor.Heritrix3JobMonitor; 042import dk.netarkivet.heritrix3.monitor.NASEnvironment; 043import dk.netarkivet.heritrix3.monitor.NASUser; 044import dk.netarkivet.heritrix3.monitor.Pagination; 045import dk.netarkivet.heritrix3.monitor.ResourceAbstract; 046import dk.netarkivet.heritrix3.monitor.ResourceManagerAbstract; 047import dk.netarkivet.heritrix3.monitor.HttpLocaleHandler.HttpLocale; 048 049public class H3FrontierDeleteResource implements ResourceAbstract { 050 051 private NASEnvironment environment; 052 053 protected int R_FRONTIER_DELETE = -1; 054 055 @Override 056 public void resources_init(NASEnvironment environment) { 057 this.environment = environment; 058 } 059 060 @Override 061 public void resources_add(ResourceManagerAbstract resourceManager) { 062 R_FRONTIER_DELETE = resourceManager.resource_add(this, "/job/<numeric>/frontier-delete/", false); 063 } 064 065 @Override 066 public void resource_service(ServletContext servletContext, NASUser nas_user, HttpServletRequest req, HttpServletResponse resp, HttpLocale httpLocale, int resource_id, List<Integer> numerics, String pathInfo) throws IOException { 067 if (NASEnvironment.contextPath == null) { 068 NASEnvironment.contextPath = req.getContextPath(); 069 } 070 if (NASEnvironment.servicePath == null) { 071 NASEnvironment.servicePath = req.getContextPath() + req.getServletPath() + "/"; 072 } 073 String method = req.getMethod().toUpperCase(); 074 if (resource_id == R_FRONTIER_DELETE) { 075 if ("GET".equals(method) || "POST".equals(method)) { 076 frontier_delete(req, resp, httpLocale, numerics, "POST".equals(method)); 077 } 078 } 079 } 080 081 public void frontier_delete(HttpServletRequest req, HttpServletResponse resp, HttpLocale httpLocale, List<Integer> numerics, boolean bPost) throws IOException { 082 Locale locale = httpLocale.locale; 083 resp.setContentType("text/html; charset=UTF-8"); 084 ServletOutputStream out = resp.getOutputStream(); 085 Caching.caching_disable_headers(resp); 086 087 TemplateBuilderFactory<MasterTemplateBuilder> masterTplBuilderFactory = TemplateBuilderFactory.getInstance(environment.templateMaster, "master.tpl", "UTF-8", MasterTemplateBuilder.class); 088 MasterTemplateBuilder masterTplBuilder = masterTplBuilderFactory.getTemplateBuilder(); 089 090 StringBuilder sb = new StringBuilder(); 091 String tmpStr; 092 String q = null; 093 094 tmpStr = req.getParameter("q"); 095 if (tmpStr != null && tmpStr.length() > 0 && !tmpStr.equalsIgnoreCase(".*")) { 096 q = tmpStr; 097 } else { 098 q = ""; 099 } 100 101 String initials = req.getParameter("initials"); 102 if (initials == null) { 103 initials = ""; 104 } 105 106 String showStr = req.getParameter("show"); 107 String deleteStr = req.getParameter("delete"); 108 109 long jobId = numerics.get(0); 110 Heritrix3JobMonitor h3Job = environment.h3JobMonitorThread.getRunningH3Job(jobId); 111 112 if (h3Job != null && h3Job.isReady()) { 113 sb.append("<form class=\"form-horizontal\" action=\"?\" name=\"insert_form\" method=\"post\" enctype=\"application/x-www-form-urlencoded\" accept-charset=\"utf-8\">\n"); 114 sb.append("<label for=\"q\">URL regex:</label>"); 115 sb.append("<input type=\"text\" id=\"q\" name=\"q\" value=\"" + q + "\" placeholder=\"regex\" style=\"display:inline;width:350px;\">\n"); 116 sb.append("<button type=\"submit\" name=\"show\" value=\"1\" class=\"btn btn-success\"><i class=\"icon-white icon-thumbs-up\"></i> Show number of matches</button>\n"); 117 sb.append(" "); 118 if (bPost && deleteStr != null && "1".equals(deleteStr) && (initials == null || initials.length() == 0)) { 119 //sb.append("<span style=\"text-color: red;\">Initials required to delete from the frontier queue!</span><br />\n"); 120 sb.append("<div class=\"notify notify-red\"><span class=\"symbol icon-error\"></span> Initials required to delete from the frontier queue!</div>"); 121 } 122 sb.append("<label for=\"initials\">User initials:</label>"); 123 sb.append("<input type=\"text\" id=\"initials\" name=\"initials\" value=\"" + initials + "\" placeholder=\"initials\">\n"); 124 sb.append("<button type=\"submit\" name=\"delete\" value=\"1\" class=\"btn btn-danger\"><i class=\"icon-white icon-trash\"></i> Delete matches</button>\n"); 125 sb.append("</form>\n"); 126 127 if (bPost) { 128 String script = environment.NAS_GROOVY_SCRIPT; 129 if (showStr != null && "1".equals(showStr)) { 130 if (q == null || q.length() == 0) { 131 script += "\n"; 132 script += "getNumberOfUrlsInFrontier()"; 133 script += "\n"; 134 } else { 135 script += "\n"; 136 script += "getNumberOfMatchedUrlsInFrontier '" + q + "'"; 137 script += "\n"; 138 } 139 } 140 if (deleteStr != null && "1".equals(deleteStr) && initials != null && initials.length() > 0) { 141 script += "\n"; 142 script += "initials = \"" + initials + "\""; 143 script += "\n"; 144 script += "deleteFromFrontier '" + q + "'"; 145 script += "\n"; 146 } 147 ScriptResult scriptResult = h3Job.h3wrapper.ExecuteShellScriptInJob(h3Job.jobResult.job.shortName, "groovy", script); 148 if (scriptResult != null && scriptResult.script != null) { 149 if (scriptResult.script.failure) { 150 if (scriptResult.script.stackTrace != null) { 151 sb.append("<h5>Script failed with the following stacktrace:</h5>\n"); 152 sb.append("<pre>\n"); 153 sb.append(StringEscapeUtils.escapeHtml(scriptResult.script.stackTrace)); 154 sb.append("</pre>\n"); 155 } else if (scriptResult.script.exception != null) { 156 sb.append("<h5>Script failed with the following message:</h5>\n"); 157 sb.append("<pre>\n"); 158 sb.append(StringEscapeUtils.escapeHtml(scriptResult.script.exception)); 159 sb.append("</pre>\n"); 160 } else { 161 sb.append("<b>Unknown script failure!</b></br>\n"); 162 } 163 sb.append("<h5>Raw script result Xml:</h5>\n"); 164 sb.append("<pre>"); 165 sb.append(StringEscapeUtils.escapeHtml(new String(scriptResult.response, "UTF-8"))); 166 sb.append("</pre>"); 167 } else { 168 sb.append("<div style=\"float:left;margin: 20px 0px;\">\n"); 169 /* 170 sb.append("<span>Matching lines: "); 171 sb.append(lines); 172 sb.append(" URIs</span>\n"); 173 */ 174 sb.append("</div>\n"); 175 sb.append("<div style=\"clear:both;\"></div>"); 176 sb.append("<div>\n"); 177 sb.append("<pre>\n"); 178 if (scriptResult != null && scriptResult.script != null) { 179 if (scriptResult.script.htmlOutput != null) { 180 sb.append("<fieldset><!--<legend>htmlOut</legend>-->"); 181 sb.append(scriptResult.script.htmlOutput); 182 sb.append("</fieldset><br />\n"); 183 } 184 if (scriptResult.script.rawOutput != null) { 185 sb.append("<fieldset><!--<legend>rawOut</legend>-->"); 186 sb.append("<pre>"); 187 sb.append(scriptResult.script.rawOutput); 188 sb.append("</pre>"); 189 sb.append("</fieldset><br />\n"); 190 } 191 } 192 sb.append("</pre>\n"); 193 sb.append("</div>\n"); 194 sb.append("</form>"); 195 } 196 } else { 197 sb.append("<b>Script did not return any response!</b><br/>\n"); 198 } 199 } 200 } else { 201 sb.append("Job "); 202 sb.append(jobId); 203 sb.append(" is not running."); 204 } 205 206 StringBuilder menuSb = masterTplBuilder.buildMenu(new StringBuilder(), req, locale, h3Job); 207 208 masterTplBuilder.insertContent("Job " + jobId + " Frontier", menuSb.toString(), httpLocale.generateLanguageLinks(), 209 "Job " + jobId + " Frontier", sb.toString(), "").write(out); 210 211 out.flush(); 212 out.close(); 213 } 214 215}