]> Dogcows Code - chaz/vimcoder/blob - src/com/dogcows/Editor.java
don't wait on vim processes
[chaz/vimcoder] / src / com / dogcows / Editor.java
1
2 package com.dogcows;
3
4 import java.io.BufferedReader;
5 import java.io.File;
6 import java.io.FileReader;
7 import java.io.FileWriter;
8 import java.io.IOException;
9 import java.io.InputStream;
10 import java.util.HashMap;
11 import java.util.Map;
12
13 import com.topcoder.client.contestant.ProblemComponentModel;
14 import com.topcoder.shared.language.Language;
15 import com.topcoder.shared.problem.DataType;
16 import com.topcoder.shared.problem.Renderer;
17 import com.topcoder.shared.problem.TestCase;
18
19 /**
20 * @author Charles McGarvey
21 *
22 */
23 public class Editor
24 {
25 private String id;
26 private String name;
27
28 private File sourceFile;
29 private File directory;
30
31
32 private static final Map<String,String> languageExtension = new HashMap<String,String>();
33 static
34 {
35 languageExtension.put("Java", "java");
36 languageExtension.put("C++", "cc");
37 languageExtension.put("C#", "cs");
38 languageExtension.put("VB", "vb");
39 languageExtension.put("Python", "py");
40 }
41
42
43 public Editor(ProblemComponentModel component,
44 Language language,
45 Renderer renderer) throws IOException
46 {
47 this.id = String.valueOf(component.getProblem().getProblemID());
48 this.name = component.getClassName();
49
50 File topDir = new File(System.getProperty("user.home"), ".vimcoder");
51 if (!topDir.isDirectory())
52 {
53 if (!topDir.mkdirs()) throw new IOException(topDir.getPath());
54 }
55
56 this.directory = new File(topDir, id);
57 if (!directory.isDirectory())
58 {
59 if (!directory.mkdirs()) throw new IOException(directory.getPath());
60 }
61
62 String lang = language.getName();
63 String ext = languageExtension.get(lang);
64
65 HashMap<String,String> terms = new HashMap<String,String>();
66 terms.put("RETURNTYPE", component.getReturnType().getDescriptor(language));
67 terms.put("CLASSNAME", component.getClassName());
68 terms.put("METHODNAME", component.getMethodName());
69 terms.put("METHODPARAMS", getMethodParams(component.getParamTypes(),
70 component.getParamNames(),
71 language));
72 terms.put("METHODPARAMNAMES", Utilities.join(component.getParamNames(), ", "));
73
74 File problemFile = new File(directory, "Problem.html");
75 if (!problemFile.canRead())
76 {
77 FileWriter writer = new FileWriter(problemFile);
78 try
79 {
80 writer.write(renderer.toHTML(language));
81 }
82 catch (Exception exception)
83 {
84 }
85 writer.close();
86 }
87
88 sourceFile = new File(directory, terms.get("CLASSNAME") + "." + ext);
89 if (!sourceFile.canRead())
90 {
91 String text = Utilities.expandTemplate(Utilities.readResource(lang + "Template"),
92 terms);
93 FileWriter writer = new FileWriter(sourceFile);
94 writer.write(text);
95 writer.close();
96 }
97
98 File driverFile = new File(directory, "driver" + "." + ext);
99 if (!driverFile.canRead())
100 {
101 StringBuilder testCases = new StringBuilder();
102 if (component.hasTestCases())
103 {
104 HashMap<String,String> testTerms = new HashMap<String,String>();
105 testTerms.putAll(terms);
106 String template = Utilities.readResource(lang + "Test");
107 for (TestCase testCase : component.getTestCases())
108 {
109 testTerms.put("TESTOUTPUT", "\"" + Utilities.quote(testCase.getOutput()) + "\"");
110 testTerms.put("TESTINPUTS", Utilities.join(testCase.getInput(), ", "));
111 testCases.append(Utilities.expandTemplate(template, testTerms));
112 }
113 }
114 terms.put("TESTCASES", testCases.toString());
115
116 String text = Utilities.expandTemplate(Utilities.readResource(lang + "Driver"),
117 terms);
118 FileWriter writer = new FileWriter(driverFile);
119 writer.write(text);
120 writer.close();
121 }
122
123 File makeFile = new File(directory, "Makefile");
124 {
125 String text = Utilities.expandTemplate(Utilities.readResource(lang + "Makefile"),
126 terms);
127 FileWriter writer = new FileWriter(makeFile);
128 writer.write(text);
129 writer.close();
130 }
131 }
132
133 public void setSource(String source) throws IOException
134 {
135 FileWriter writer = new FileWriter(new File(directory, name));
136 writer.write(source);
137 writer.close();
138 doVimCommand("--remote-tab-silent", sourceFile.getPath());
139 }
140
141 public String getSource() throws IOException
142 {
143 return Utilities.readFile(sourceFile) + "\n// Edited by " + VimCoder.version + "\n// " + VimCoder.website + "\n\n";
144 }
145
146
147 private boolean doVimCommand(String command, String argument)
148 {
149 String[] arguments = {argument};
150 return doVimCommand(command, arguments);
151 }
152
153 private boolean doVimCommand(String command, String[] arguments)
154 {
155 try
156 {
157 String[] exec = {"gvim", "--servername", "VimCoder" + id,
158 command};
159 exec = Utilities.concat(exec, arguments);
160 Runtime.getRuntime().exec(exec, null, directory);
161 }
162 catch (IOException exception)
163 {
164 System.out.println("Failed to launch external vim process. :-(");
165 }
166 return false;
167 }
168
169 private String getMethodParams(DataType[] types, String[] names, Language language)
170 {
171 StringBuilder text = new StringBuilder();
172
173 text.append(types[0].getDescriptor(language) + " " + names[0]);
174 for (int i = 1; i < names.length; ++i)
175 {
176 text.append(", " + types[i].getDescriptor(language) + " " + names[i]);
177 }
178
179 return text.toString();
180 }
181 }
182
This page took 0.042597 seconds and 4 git commands to generate.