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("&nbsp;");
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}