/* * Copyright 2010 Jon S Akhtar (Sylvanaar) * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.sylvanaar.idea.errorreporting; import com.intellij.openapi.diagnostic.ErrorReportSubmitter; import com.intellij.openapi.diagnostic.IdeaLoggingEvent; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.diagnostic.SubmittedReportInfo; import com.intellij.openapi.ui.DialogWrapper; import org.jetbrains.annotations.NonNls; import java.awt.*; import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.net.URL; import java.net.URLConnection; import java.net.URLEncoder; import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.regex.PatternSyntaxException; import static com.intellij.openapi.diagnostic.SubmittedReportInfo.SubmissionStatus.*; /** * Created by IntelliJ IDEA. * User: Jon S Akhtar * Date: Sep 23, 2010 * Time: 1:20:24 PM */ public class BugzReport extends ErrorReportSubmitter { private static final Logger log = Logger.getInstance(BugzReport.class.getName()); @NonNls private static final String SERVER_URL = "https://sylvanaar.fogbugz.com/scoutSubmit.asp"; private String userName = "autosubmit"; private String project = "Lua for IDEA"; private String area = "Main"; private String description = null; private String extraInformation = null; private String email = null; private static final String DEFAULT_RESPONSE = "Thank you for your report."; public String submit() { if (this.description == null || this.description.length() == 0) throw new RuntimeException("Description"); if (this.project == null || this.project.length() == 0) throw new RuntimeException("Project"); if (this.area == null || this.area.length() == 0) throw new RuntimeException("Area"); String response = ""; //Create Post String String data; try { data = URLEncoder.encode("Description", "UTF-8") + "=" + URLEncoder.encode(description, "UTF-8"); data += "&" + URLEncoder.encode("ScoutProject", "UTF-8") + "=" + URLEncoder.encode(project, "UTF-8"); data += "&" + URLEncoder.encode("ScoutArea", "UTF-8") + "=" + URLEncoder.encode(area, "UTF-8"); data += "&" + URLEncoder.encode("ScoutUserName", "UTF-8") + "=" + URLEncoder.encode(userName, "UTF-8"); // data += "&" + URLEncoder.encode("ScoutDefaultMessage", "UTF-8") + "=" + URLEncoder.encode(DEFAULT_RESPONSE, "UTF-8"); if (extraInformation != null) data += "&" + URLEncoder.encode("Extra", "UTF-8") + "=" + URLEncoder.encode(extraInformation, "UTF-8"); if (email != null) data += "&" + URLEncoder.encode("Email", "UTF-8") + "=" + URLEncoder.encode(email, "UTF-8"); // Send Data To Page URL url = new URL(SERVER_URL); URLConnection conn = url.openConnection(); conn.setDoOutput(true); OutputStreamWriter wr = new OutputStreamWriter(conn.getOutputStream()); wr.write(data); wr.flush(); // Get The Response BufferedReader rd = new BufferedReader(new InputStreamReader(conn.getInputStream())); String line; while ((line = rd.readLine()) != null) { response += line; } } catch (Exception e) { e.printStackTrace(); } return response; } @Override public String getReportActionText() { return "Submit Error"; } @Override public SubmittedReportInfo submit(IdeaLoggingEvent[] ideaLoggingEvents, Component component) { // show modal error submission dialog PluginErrorSubmitDialog dialog = new PluginErrorSubmitDialog(component); dialog.prepare(); dialog.show(); // submit error to server if user pressed SEND int code = dialog.getExitCode(); if (code == DialogWrapper.OK_EXIT_CODE) { dialog.persist(); String description = dialog.getDescription(); String user = dialog.getUser(); return submit(ideaLoggingEvents, description, user, component); } // otherwise do nothing return null; } private SubmittedReportInfo submit(IdeaLoggingEvent[] ideaLoggingEvents, String description, String user, Component component) { this.description = ideaLoggingEvents[0].getThrowableText(); this.email = user; if (user == null) user = "<none>"; if (description == null) description = "<none>"; this.extraInformation = "\n\nDescription: " + description + "\n\n" + "User: " + user; for (IdeaLoggingEvent e : ideaLoggingEvents) this.extraInformation += "\n\n" + e.toString(); String result = submit(); log.info("Error submitted, response: " + result); String resultType = null; String resultText = null; try { Pattern regex = Pattern.compile("<([A-Z][A-Z0-9]*)[^>]*>(.*?)</\\1>", Pattern.DOTALL | Pattern.CASE_INSENSITIVE | Pattern.UNICODE_CASE); Matcher regexMatcher = regex.matcher(result); if (regexMatcher.find()) { resultType = regexMatcher.group(1); resultText = regexMatcher.group(2); } } catch (PatternSyntaxException ex) { // Syntax error in the regular expression } SubmittedReportInfo.SubmissionStatus status = NEW_ISSUE; if (resultType.equals("Error")) status = FAILED; else { if (resultText.trim().length() > 0) status = DUPLICATE; } return new SubmittedReportInfo(SERVER_URL, resultText, status); } }