X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=src%2Fcom%2Fdogcows%2FVimCoder.java;h=1fb9bab8e774debc5ee7f753213b59a5217dc05a;hb=70fd7817176222991ace7906ecfd633c9b3eb272;hp=489e78960499154a4b657f59d0c657b9ee9a29ce;hpb=8a2b2bbbe6e13cee2f5118e1ce814bf17f058299;p=chaz%2Fvimcoder diff --git a/src/com/dogcows/VimCoder.java b/src/com/dogcows/VimCoder.java index 489e789..1fb9bab 100644 --- a/src/com/dogcows/VimCoder.java +++ b/src/com/dogcows/VimCoder.java @@ -23,269 +23,13 @@ public class VimCoder /** * */ - private final static String version = "VimCoder 0.1"; - private final static String website = "http://www.dogcows.com/vimcoder"; + public final static String version = "VimCoder 0.1"; + public final static String website = "http://www.dogcows.com/vimcoder"; private JPanel panel; private JTextArea logArea; private Editor editor; - - - private static final Map languageExtension = new HashMap(); - static - { - languageExtension.put("Java", "java"); - languageExtension.put("C++", "cc"); - languageExtension.put("C#", "cs"); - languageExtension.put("VB", "vb"); - languageExtension.put("Python", "py"); - } - - - private class Editor - { - private String id; - private String name; - - private File sourceFile; - private File directory; - - - public Editor(ProblemComponentModel component, Language language, Renderer renderer) throws IOException - { - this.id = String.valueOf(component.getProblem().getProblemID()); - this.name = component.getClassName(); - - File topDir = new File(System.getProperty("user.home"), ".vimcoder"); - if (!topDir.isDirectory()) - { - if (!topDir.mkdirs()) throw new IOException(topDir.getPath()); - } - - this.directory = new File(topDir, String.valueOf(component.getProblem().getProblemID())); - if (!directory.isDirectory()) - { - if (!directory.mkdirs()) throw new IOException(directory.getPath()); - } - - String lang = language.getName(); - String ext = languageExtension.get(lang); - - HashMap terms = new HashMap(); - terms.put("RETURNTYPE", component.getReturnType().getDescriptor(language)); - terms.put("CLASSNAME", component.getClassName()); - terms.put("METHODNAME", component.getMethodName()); - terms.put("METHODPARAMS", getMethodParams(component.getParamTypes(), component.getParamNames(), language)); - terms.put("METHODPARAMNAMES", join(component.getParamNames(), ", ")); - - File problemFile = new File(directory, "Problem.html"); - if (!problemFile.canRead()) - { - FileWriter writer = new FileWriter(problemFile); - try - { - writer.write(renderer.toHTML(language)); - } - catch (Exception exception) - { - } - writer.close(); - } - - sourceFile = new File(directory, terms.get("CLASSNAME") + "." + ext); - if (!sourceFile.canRead()) - { - String text = expandTemplate(readResource(lang + "Template"), terms); - FileWriter writer = new FileWriter(sourceFile); - writer.write(text); - writer.close(); - } - - File driverFile = new File(directory, "driver" + "." + ext); - if (!driverFile.canRead()) - { - StringBuilder testCases = new StringBuilder(); - if (component.hasTestCases()) - { - HashMap testTerms = new HashMap(); - testTerms.putAll(terms); - String template = readResource(lang + "Test"); - for (TestCase testCase : component.getTestCases()) - { - testTerms.put("TESTOUTPUT", "\"" + quote(testCase.getOutput()) + "\""); - testTerms.put("TESTINPUTS", join(testCase.getInput(), ", ")); - testCases.append(expandTemplate(template, testTerms)); - } - } - terms.put("TESTCASES", testCases.toString()); - - String text = expandTemplate(readResource(lang + "Driver"), terms); - FileWriter writer = new FileWriter(driverFile); - writer.write(text); - writer.close(); - } - - File makeFile = new File(directory, "Makefile"); - { - String text = expandTemplate(readResource(lang + "Makefile"), terms); - FileWriter writer = new FileWriter(makeFile); - writer.write(text); - writer.close(); - } - } - - public void setSource(String source) throws IOException - { - String actualSource = readFile(sourceFile); - if (!actualSource.equals(source)) - { - File actualFile = new File(directory, name); - FileWriter writer = new FileWriter(actualFile); - writer.write(source); - writer.close(); - } - doVimCommand("--remote-tab-silent", sourceFile.getPath()); - doVimCommand("--remote-send", ":if search('\\$CARAT\\\\$') != 0normal df$endif:redraw"); - } - - public String getSource() throws IOException - { - return readFile(sourceFile) + "\n// Edited by " + version + "\n// " + website + "\n\n"; - } - - public void setTextEnabled(boolean enable) - { - doVimCommand("--remote-send", ":set readonly:echo \"The contest is over.\""); - } - - - private boolean doVimCommand(String command, String argument) - { - String[] arguments = {argument}; - return doVimCommand(command, arguments); - } - - private boolean doVimCommand(String command, String[] arguments) - { - try - { - String[] exec = {"gvim", "--servername", "VimCoder" + id, command}; - exec = concat(exec, arguments); - - Process child = Runtime.getRuntime().exec(exec); - if (child.waitFor() == 0) - { - return true; - } - else - { - logError("vim command failed"); - } - } - catch (IOException exception) - { - logError("failed to launch external vim process"); - return false; - } - catch (InterruptedException exception) - { - logWarning("interrupted while waiting on vim process"); - } - return false; - } - - private String getMethodParams(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) - { - text.append(", " + types[i].getDescriptor(language) + " " + names[i]); - } - - return text.toString(); - } - - private String readFile(File file) throws IOException - { - StringBuilder text = new StringBuilder(); - - BufferedReader reader = new BufferedReader(new FileReader(file.getPath())); - try - { - String line = null; - - while ((line = reader.readLine()) != null) - { - text.append(line + System.getProperty("line.separator")); - } - } - finally - { - reader.close(); - } - - return text.toString(); - } - - private String readResource(String path) throws IOException - { - StringBuilder text = new StringBuilder(); - - InputStream stream = getClass().getResourceAsStream("resources/" + path); - if (stream != null) - { - try - { - byte[] buffer = new byte[4096]; - int numBytes = 0; - while (0 < (numBytes = stream.read(buffer))) text.append(new String(buffer, 0, numBytes)); - } - finally - { - stream.close(); - } - } - - return text.toString(); - } - - private String expandTemplate(String template, Map terms) - { - String text = template; - for (String key : terms.keySet()) - { - text = text.replaceAll("\\$" + key + "\\$", quote(terms.get(key))); - } - return text; - } - } - - - public static T[] concat(T[] a, T[] b) - { - T[] result = Arrays.copyOf(a, a.length + b.length); - System.arraycopy(b, 0, result, a.length, b.length); - return result; - } - - public static String join(String[] a, String glue) - { - if (a.length == 0) return ""; - StringBuilder result = new StringBuilder(); - result.append(a[0]); - for (int i = 1; i < a.length; ++i) result.append(glue).append(a[i]); - return result.toString(); - } - - public static String quote(String a) - { - a = a.replaceAll("\\\\", "\\\\\\\\"); - a = a.replaceAll("\"", "\\\\\\\""); - return a; - } public VimCoder() @@ -304,86 +48,116 @@ public class VimCoder public void startUsing() { - logArea.setText(""); + System.out.println("startUsing"); + Runnable task = new Runnable() + { + public void run() + { + logArea.setText(""); + } + }; + if (SwingUtilities.isEventDispatchThread()) + { + task.run(); + } + else + { + SwingUtilities.invokeLater(task); + } } public void stopUsing() { + System.out.println("stopUsing"); editor = null; } public JPanel getEditorPanel() { + System.out.println("getEditorPanel"); return panel; } - public String getSource() + public String getSource() throws Exception { + System.out.println("getSource"); try { String source = editor.getSource(); logInfo("Source code uploaded to server."); return source; } - catch (IOException exception) + catch (Exception exception) { - logError("failed to open file source file for reading"); - return ""; + logError("Failed to get source code: " + exception.getLocalizedMessage()); + throw exception; } } public void setSource(String source) { + System.out.println("setSource: " + source); try { editor.setSource(source); - logInfo("source set"); + logInfo("Source code downloaded from server."); } - catch (IOException exception) + catch (Exception exception) { - logError("failed setting the source"); + logError("Failed to save the source given by the server: " + exception.getLocalizedMessage()); return; } } - public void setProblemComponent(ProblemComponentModel component, Language language, Renderer renderer) + public void setProblemComponent(ProblemComponentModel component, + Language language, + Renderer renderer) { + System.out.println("setProblemComponent"); try { editor = new Editor(component, language, renderer); } - catch (IOException exception) + catch (Exception exception) { - logError("failed while loading the problem"); + logError("An error occured while loading the problem: " + exception.getLocalizedMessage()); } } - public void setTextEnabled(Boolean enable) - { - editor.setTextEnabled(enable); - } - - private void log(String what) + private void log(final String what) { - SimpleDateFormat format = new SimpleDateFormat("kk:mm:ss"); - String time = format.format(new Date()); - logArea.append(time + ", " + what); + Runnable task = new Runnable() + { + public void run() + { + SimpleDateFormat format = new SimpleDateFormat("kk:mm:ss"); + logArea.append(format.format(new Date()) + ", " + what); + } + }; + if (SwingUtilities.isEventDispatchThread()) + { + task.run(); + } + else + { + SwingUtilities.invokeLater(task); + } } private void logInfo(String what) { - log(" INFO: " + what + "\n"); + log(" INFO: " + what + System.getProperty("line.separator")); } private void logWarning(String what) { - log(" WARN: " + what + "\n"); + log(" WARN: " + what + System.getProperty("line.separator")); } private void logError(String what) { - log("ERROR: " + what + "\n"); + log("ERROR: " + what + System.getProperty("line.separator")); }