X-Git-Url: https://git.dogcows.com/gitweb?p=chaz%2Fvimcoder;a=blobdiff_plain;f=src%2Fcom%2Fdogcows%2FEditor.java;h=ddb7ccfe69043010dac3787b77a3bb15297efc4d;hp=dda5481fe2971f2173044d0758b8fdf887900adc;hb=70fd7817176222991ace7906ecfd633c9b3eb272;hpb=88f4c7d0844a4ce882caffb347f81fb70a0d2f98 diff --git a/src/com/dogcows/Editor.java b/src/com/dogcows/Editor.java index dda5481..ddb7ccf 100644 --- a/src/com/dogcows/Editor.java +++ b/src/com/dogcows/Editor.java @@ -7,8 +7,7 @@ import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.io.InputStream; -import java.util.HashMap; -import java.util.Map; +import java.util.*; import com.topcoder.client.contestant.ProblemComponentModel; import com.topcoder.shared.language.Language; @@ -24,7 +23,6 @@ public class Editor { private String id; private String name; - private File sourceFile; private File directory; @@ -44,8 +42,8 @@ public class Editor Language language, Renderer renderer) throws IOException { - this.id = String.valueOf(component.getProblem().getProblemID()); - this.name = component.getClassName(); + this.id = String.valueOf(component.getProblem().getProblemID()); + this.name = component.getClassName(); File topDir = new File(System.getProperty("user.home"), ".vimcoder"); if (!topDir.isDirectory()) @@ -63,13 +61,18 @@ public class Editor String ext = languageExtension.get(lang); HashMap terms = new HashMap(); - terms.put("RETURNTYPE", component.getReturnType().getDescriptor(language)); - terms.put("CLASSNAME", component.getClassName()); + terms.put("RETURNTYPE", component.getReturnType().getDescriptor(language).replaceAll("\\s+", "")); + terms.put("CLASSNAME", name); terms.put("METHODNAME", component.getMethodName()); terms.put("METHODPARAMS", getMethodParams(component.getParamTypes(), component.getParamNames(), language)); - terms.put("METHODPARAMNAMES", Utilities.join(component.getParamNames(), ", ")); + terms.put("METHODPARAMNAMES", Utility.join(component.getParamNames(), ", ")); + terms.put("METHODPARAMSTREAMIN", Utility.join(component.getParamNames(), " >> ")); + terms.put("METHODPARAMSTREAMOUT", Utility.join(component.getParamNames(), " << ")); + terms.put("METHODPARAMDECLARES", getMethodParamDeclarations(component.getParamTypes(), + component.getParamNames(), + language)); File problemFile = new File(directory, "Problem.html"); if (!problemFile.canRead()) @@ -85,36 +88,41 @@ public class Editor writer.close(); } - sourceFile = new File(directory, terms.get("CLASSNAME") + "." + ext); + sourceFile = new File(directory, name + "." + ext); if (!sourceFile.canRead()) { - String text = Utilities.expandTemplate(Utilities.readResource(lang + "Template"), + String text = Utility.expandTemplate(Utility.readResource(lang + "Template"), terms); FileWriter writer = new FileWriter(sourceFile); writer.write(text); writer.close(); } - File driverFile = new File(directory, "driver" + "." + ext); - if (!driverFile.canRead()) + File testcaseFile = new File(directory, "testcases.txt"); + if (!testcaseFile.canRead()) { - StringBuilder testCases = new StringBuilder(); + StringBuilder text = new StringBuilder(); if (component.hasTestCases()) { - HashMap testTerms = new HashMap(); - testTerms.putAll(terms); - String template = Utilities.readResource(lang + "Test"); for (TestCase testCase : component.getTestCases()) { - testTerms.put("TESTOUTPUT", "\"" + Utilities.quote(testCase.getOutput()) + "\""); - testTerms.put("TESTINPUTS", Utilities.join(testCase.getInput(), ", ")); - testCases.append(Utilities.expandTemplate(template, testTerms)); + text.append(testCase.getOutput() + System.getProperty("line.separator")); + for (String input : testCase.getInput()) + { + text.append(input + System.getProperty("line.separator")); + } } } - terms.put("TESTCASES", testCases.toString()); - - String text = Utilities.expandTemplate(Utilities.readResource(lang + "Driver"), - terms); + FileWriter writer = new FileWriter(testcaseFile); + writer.write(text.toString()); + writer.close(); + } + + File driverFile = new File(directory, "driver." + ext); + if (!driverFile.canRead()) + { + String text = Utility.expandTemplate(Utility.readResource(lang + "Driver"), + terms); FileWriter writer = new FileWriter(driverFile); writer.write(text); writer.close(); @@ -122,15 +130,15 @@ public class Editor File makeFile = new File(directory, "Makefile"); { - String text = Utilities.expandTemplate(Utilities.readResource(lang + "Makefile"), + String text = Utility.expandTemplate(Utility.readResource(lang + "Makefile"), terms); FileWriter writer = new FileWriter(makeFile); writer.write(text); writer.close(); } } - - public void setSource(String source) throws IOException + + public void setSource(String source) throws Exception { FileWriter writer = new FileWriter(new File(directory, name)); writer.write(source); @@ -140,40 +148,63 @@ public class Editor public String getSource() throws IOException { - return Utilities.readFile(sourceFile) + "\n// Edited by " + VimCoder.version + "\n// " + VimCoder.website + "\n\n"; + return Utility.readFile(sourceFile) + "\n// Edited by " + VimCoder.version + "\n// " + VimCoder.website + "\n\n"; } - private boolean doVimCommand(String command, String argument) + private void doVimCommand(String command, String argument) throws Exception { String[] arguments = {argument}; - return doVimCommand(command, arguments); + doVimCommand(command, arguments); } - private boolean doVimCommand(String command, String[] arguments) + private void doVimCommand(String command, String[] arguments) throws Exception { - try + String[] exec = {"gvim", "--servername", "VimCoder" + id, + command}; + exec = Utility.concat(exec, arguments); + Process child = Runtime.getRuntime().exec(exec, null, directory); + + long expire = System.currentTimeMillis() + 500; + while (System.currentTimeMillis() < expire) { - String[] exec = {"gvim", "--servername", "VimCoder" + id, - command}; - exec = Utilities.concat(exec, arguments); - Runtime.getRuntime().exec(exec, null, directory); + try + { + int exitCode = child.exitValue(); + if (exitCode != 0) throw new Exception("Vim process returned exit code " + exitCode + "."); + break; + } + catch (IllegalThreadStateException exception) + { + } + Thread.yield(); } - catch (IOException exception) + } + + private String getMethodParams(DataType[] types, + String[] names, + Language language) + { + StringBuilder text = new StringBuilder(); + + text.append(types[0].getDescriptor(language).replaceAll("\\s+", "") + " " + names[0]); + for (int i = 1; i < names.length; ++i) { - System.out.println("Failed to launch external vim process. :-("); + text.append(", " + types[i].getDescriptor(language).replaceAll("\\s+", "") + " " + names[i]); } - return false; + + return text.toString(); } - private String getMethodParams(DataType[] types, String[] names, Language language) + private String getMethodParamDeclarations (DataType[] types, + String[] names, + Language language) { StringBuilder text = new StringBuilder(); - text.append(types[0].getDescriptor(language) + " " + names[0]); - for (int i = 1; i < names.length; ++i) + for (int i = 0; i < names.length; ++i) { - text.append(", " + types[i].getDescriptor(language) + " " + names[i]); + text.append(types[i].getDescriptor(language).replaceAll("\\s+", "") + "\t" + names[i] + ";" + System.getProperty("line.separator")); } return text.toString();