package br.ufmg.dcc.labsoft.aserg.modularitycheck.bugparser.parser; import java.io.BufferedWriter; import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.io.Writer; import java.util.ArrayList; import java.util.Set; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.swt.SWT; import org.eclipse.swt.widgets.Display; import org.jdom.JDOMException; import br.ufmg.dcc.labsoft.aserg.modularitycheck.bugparser.model.bug.Bug; import br.ufmg.dcc.labsoft.aserg.modularitycheck.bugparser.model.bug.linker.BugLinker; import br.ufmg.dcc.labsoft.aserg.modularitycheck.bugparser.model.bug.parser.BugzillaXMLParser; import br.ufmg.dcc.labsoft.aserg.modularitycheck.bugparser.model.bug.parser.JiraParser; import br.ufmg.dcc.labsoft.aserg.modularitycheck.bugparser.model.bug.parser.TigrisParser; import br.ufmg.dcc.labsoft.aserg.modularitycheck.bugparser.model.source.git.GITManager; import br.ufmg.dcc.labsoft.aserg.modularitycheck.bugparser.model.source.svn.SVNManager; import br.ufmg.dcc.labsoft.aserg.modularitycheck.bugparser.util.FileUtils; public class Parser { // Repository manager: public static final int MANAGER_GIT = 1; public static final int MANAGER_SVN = 2; // Repository type: public static final int TYPE_BUGZILLA = 1; public static final int TYPE_TIGRIS = 3; public static final int TYPE_JIRA = 2; public static String line; /** * @param args Configurações do repositório. * args[0] -> endereço do repositório SVN. * args[1] -> endereço do arquivo bugzilla ou jira. * args[2] -> data de início da análise. * args[3] -> data de fim da análise. * args[4] -> tipo de repositório (BUGZILLA: 0, TIGRIS: 1, JIRA: 2). * args[5] -> tipo de repositório (GIT: 1, SVN: 2) */ public static boolean parse(String [] args) { File[] files = new File(args[1]).listFiles(); int type = Integer.parseInt(args[4]); int manager = Integer.parseInt(args[5]); BugLinker bugLinker = null; ArrayList<String> list = new ArrayList<String>(); for (int i = 0; i < files.length; i++) { if (files[i].getName().endsWith(".xml")) list.add(files[i].getAbsolutePath()); } String[] fileName = new String[list.size()]; for (int i = 0; i < list.size(); i++) fileName[i] = list.get(i); if (manager == MANAGER_GIT) { switch (type) { case TYPE_BUGZILLA: bugLinker = new BugLinker(new GITManager(args[0], args[2], args[3]), new BugzillaXMLParser(fileName)); break; case TYPE_JIRA: bugLinker = new BugLinker(new GITManager(args[0], args[2], args[3]), new JiraParser(fileName)); break; case TYPE_TIGRIS: bugLinker = new BugLinker(new GITManager(args[0], args[2], args[3]), new TigrisParser(fileName)); break; default: break; } } else if (manager == MANAGER_SVN) { switch (type) { case TYPE_BUGZILLA: bugLinker = new BugLinker(new SVNManager(args[0].trim(), args[2], args[3]), new BugzillaXMLParser(fileName)); break; case TYPE_JIRA: bugLinker = new BugLinker(new SVNManager(args[0].trim(), args[2], args[3]), new JiraParser(fileName)); break; case TYPE_TIGRIS: bugLinker = new BugLinker(new SVNManager(args[0].trim(), args[2], args[3]), new TigrisParser(fileName)); break; default: break; } } Set<Bug> linkedBugs = null; try { if (bugLinker != null) { System.out.println("Getting bugs..."); linkedBugs = bugLinker.getLinkedBugs(); } } catch (JDOMException e) { line = e.getMessage(); Display.getDefault().syncExec(new Runnable() { @Override public void run() { MessageDialog.open(SWT.ERROR, Display.getDefault() .getActiveShell(), "Error Parser", line, SWT.OK); } }); return false; } catch (IOException e) { Display.getDefault().syncExec(new Runnable() { @Override public void run() { MessageDialog.open(SWT.ERROR, Display.getDefault() .getActiveShell(), "Error Parser", line, SWT.OK); } }); return false; } File xml_location = new File(fileName[0]).getParentFile(); File commentsFolder = new File(xml_location, "comments"); FileUtils.deleteRecursive(commentsFolder); File filesFolder = new File(xml_location, "files"); FileUtils.deleteRecursive(filesFolder); filesFolder.mkdir(); commentsFolder.mkdir(); if(linkedBugs == null) triggerErrorMessage(); else if(linkedBugs.size() == 0) triggerErrorIssues(); else { for (Bug bug : linkedBugs) { Writer writer; try { System.out.println(bug.getId()); writer = new BufferedWriter(new FileWriter(new File(commentsFolder, bug.getId()))); writer.append(bug.getText()); writer.append(System.getProperty("line.separator")); writer.flush(); writer.close(); } catch (IOException e) {e.printStackTrace();} try { writer = new BufferedWriter(new FileWriter(new File(filesFolder, bug.getId()))); for (String modifiedFile : bug.getModifiedFiles()) writer.append(modifiedFile + System.getProperty("line.separator")); writer.flush(); writer.close(); } catch (IOException e) {e.printStackTrace();} } return true; } return false; } private static void triggerErrorIssues() { Display.getDefault().syncExec(new Runnable() { @Override public void run() { MessageDialog.open(SWT.ERROR, Display.getDefault() .getActiveShell(), "Error Parser", "There are no commits linked to issue reports", SWT.OK); } }); return; } private static void triggerErrorMessage() { Display.getDefault().syncExec(new Runnable() { @Override public void run() { MessageDialog.open(SWT.ERROR, Display.getDefault() .getActiveShell(), "Error Parser", "There are no commits on this repository or path not found: 404 Not Found", SWT.OK); } }); return; } }