]> Dogcows Code - chaz/vimcoder/blob - src/com/dogcows/Editor.java
improved C++ driver template
[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.*;
11
12 import com.topcoder.client.contestant.ProblemComponentModel;
13 import com.topcoder.shared.language.Language;
14 import com.topcoder.shared.problem.DataType;
15 import com.topcoder.shared.problem.Renderer;
16 import com.topcoder.shared.problem.TestCase;
17
18 /**
19 * @author Charles McGarvey
20 *
21 */
22 public class Editor
23 {
24 private String id;
25 private String name;
26 private File sourceFile;
27 private File directory;
28
29
30 private static final Map<String,String> languageExtension = new HashMap<String,String>();
31 static
32 {
33 languageExtension.put("Java", "java");
34 languageExtension.put("C++", "cc");
35 languageExtension.put("C#", "cs");
36 languageExtension.put("VB", "vb");
37 languageExtension.put("Python", "py");
38 }
39
40
41 public Editor(ProblemComponentModel component,
42 Language language,
43 Renderer renderer) throws IOException
44 {
45 this.id = String.valueOf(component.getProblem().getProblemID());
46 this.name = component.getClassName();
47
48 File topDir = new File(System.getProperty("user.home"), ".vimcoder");
49 if (!topDir.isDirectory())
50 {
51 if (!topDir.mkdirs()) throw new IOException(topDir.getPath());
52 }
53
54 this.directory = new File(topDir, id);
55 if (!directory.isDirectory())
56 {
57 if (!directory.mkdirs()) throw new IOException(directory.getPath());
58 }
59
60 String lang = language.getName();
61 String ext = languageExtension.get(lang);
62
63 HashMap<String,String> terms = new HashMap<String,String>();
64 terms.put("RETURNTYPE", component.getReturnType().getDescriptor(language).replaceAll("\\s+", ""));
65 terms.put("CLASSNAME", name);
66 terms.put("METHODNAME", component.getMethodName());
67 terms.put("METHODPARAMS", getMethodParams(component.getParamTypes(),
68 component.getParamNames(),
69 language));
70 terms.put("METHODPARAMNAMES", Utility.join(component.getParamNames(), ", "));
71 terms.put("METHODPARAMSTREAMIN", Utility.join(component.getParamNames(), " >> "));
72 terms.put("METHODPARAMSTREAMOUT", Utility.join(component.getParamNames(), " << "));
73 terms.put("METHODPARAMDECLARES", getMethodParamDeclarations(component.getParamTypes(),
74 component.getParamNames(),
75 language));
76
77 File problemFile = new File(directory, "Problem.html");
78 if (!problemFile.canRead())
79 {
80 FileWriter writer = new FileWriter(problemFile);
81 try
82 {
83 writer.write(renderer.toHTML(language));
84 }
85 catch (Exception exception)
86 {
87 }
88 writer.close();
89 }
90
91 sourceFile = new File(directory, name + "." + ext);
92 if (!sourceFile.canRead())
93 {
94 String text = Utility.expandTemplate(Utility.readResource(lang + "Template"),
95 terms);
96 FileWriter writer = new FileWriter(sourceFile);
97 writer.write(text);
98 writer.close();
99 }
100
101 File testcaseFile = new File(directory, "testcases.txt");
102 if (!testcaseFile.canRead())
103 {
104 StringBuilder text = new StringBuilder();
105 if (component.hasTestCases())
106 {
107 for (TestCase testCase : component.getTestCases())
108 {
109 text.append(testCase.getOutput() + System.getProperty("line.separator"));
110 for (String input : testCase.getInput())
111 {
112 text.append(input + System.getProperty("line.separator"));
113 }
114 }
115 }
116 FileWriter writer = new FileWriter(testcaseFile);
117 writer.write(text.toString());
118 writer.close();
119 }
120
121 File driverFile = new File(directory, "driver." + ext);
122 if (!driverFile.canRead())
123 {
124 String text = Utility.expandTemplate(Utility.readResource(lang + "Driver"),
125 terms);
126 FileWriter writer = new FileWriter(driverFile);
127 writer.write(text);
128 writer.close();
129 }
130
131 File makeFile = new File(directory, "Makefile");
132 {
133 String text = Utility.expandTemplate(Utility.readResource(lang + "Makefile"),
134 terms);
135 FileWriter writer = new FileWriter(makeFile);
136 writer.write(text);
137 writer.close();
138 }
139 }
140
141 public void setSource(String source) throws Exception
142 {
143 FileWriter writer = new FileWriter(new File(directory, name));
144 writer.write(source);
145 writer.close();
146 doVimCommand("--remote-tab-silent", sourceFile.getPath());
147 }
148
149 public String getSource() throws IOException
150 {
151 return Utility.readFile(sourceFile) + "\n// Edited by " + VimCoder.version + "\n// " + VimCoder.website + "\n\n";
152 }
153
154
155 private void doVimCommand(String command, String argument) throws Exception
156 {
157 String[] arguments = {argument};
158 doVimCommand(command, arguments);
159 }
160
161 private void doVimCommand(String command, String[] arguments) throws Exception
162 {
163 String[] exec = {"gvim", "--servername", "VimCoder" + id,
164 command};
165 exec = Utility.concat(exec, arguments);
166 Process child = Runtime.getRuntime().exec(exec, null, directory);
167
168 long expire = System.currentTimeMillis() + 500;
169 while (System.currentTimeMillis() < expire)
170 {
171 try
172 {
173 int exitCode = child.exitValue();
174 if (exitCode != 0) throw new Exception("Vim process returned exit code " + exitCode + ".");
175 break;
176 }
177 catch (IllegalThreadStateException exception)
178 {
179 }
180 Thread.yield();
181 }
182 }
183
184 private String getMethodParams(DataType[] types,
185 String[] names,
186 Language language)
187 {
188 StringBuilder text = new StringBuilder();
189
190 text.append(types[0].getDescriptor(language).replaceAll("\\s+", "") + " " + names[0]);
191 for (int i = 1; i < names.length; ++i)
192 {
193 text.append(", " + types[i].getDescriptor(language).replaceAll("\\s+", "") + " " + names[i]);
194 }
195
196 return text.toString();
197 }
198
199 private String getMethodParamDeclarations (DataType[] types,
200 String[] names,
201 Language language)
202 {
203 StringBuilder text = new StringBuilder();
204
205 for (int i = 0; i < names.length; ++i)
206 {
207 text.append(types[i].getDescriptor(language).replaceAll("\\s+", "") + "\t" + names[i] + ";" + System.getProperty("line.separator"));
208 }
209
210 return text.toString();
211 }
212 }
213
This page took 0.039659 seconds and 4 git commands to generate.