4 import java
.io
.BufferedReader
;
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
;
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
;
20 * @author Charles McGarvey
28 private File sourceFile
;
29 private File directory
;
32 private static final Map
<String
,String
> languageExtension
= new HashMap
<String
,String
>();
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");
43 public Editor(ProblemComponentModel component
,
45 Renderer renderer
) throws IOException
47 this.id
= String
.valueOf(component
.getProblem().getProblemID());
48 this.name
= component
.getClassName();
50 File topDir
= new File(System
.getProperty("user.home"), ".vimcoder");
51 if (!topDir
.isDirectory())
53 if (!topDir
.mkdirs()) throw new IOException(topDir
.getPath());
56 this.directory
= new File(topDir
, id
);
57 if (!directory
.isDirectory())
59 if (!directory
.mkdirs()) throw new IOException(directory
.getPath());
62 String lang
= language
.getName();
63 String ext
= languageExtension
.get(lang
);
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(),
72 terms
.put("METHODPARAMNAMES", Utilities
.join(component
.getParamNames(), ", "));
74 File problemFile
= new File(directory
, "Problem.html");
75 if (!problemFile
.canRead())
77 FileWriter writer
= new FileWriter(problemFile
);
80 writer
.write(renderer
.toHTML(language
));
82 catch (Exception exception
)
88 sourceFile
= new File(directory
, terms
.get("CLASSNAME") + "." + ext
);
89 if (!sourceFile
.canRead())
91 String text
= Utilities
.expandTemplate(Utilities
.readResource(lang
+ "Template"),
93 FileWriter writer
= new FileWriter(sourceFile
);
98 File driverFile
= new File(directory
, "driver" + "." + ext
);
99 if (!driverFile
.canRead())
101 StringBuilder testCases
= new StringBuilder();
102 if (component
.hasTestCases())
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())
109 testTerms
.put("TESTOUTPUT", "\"" + Utilities
.quote(testCase
.getOutput()) + "\"");
110 testTerms
.put("TESTINPUTS", Utilities
.join(testCase
.getInput(), ", "));
111 testCases
.append(Utilities
.expandTemplate(template
, testTerms
));
114 terms
.put("TESTCASES", testCases
.toString());
116 String text
= Utilities
.expandTemplate(Utilities
.readResource(lang
+ "Driver"),
118 FileWriter writer
= new FileWriter(driverFile
);
123 File makeFile
= new File(directory
, "Makefile");
125 String text
= Utilities
.expandTemplate(Utilities
.readResource(lang
+ "Makefile"),
127 FileWriter writer
= new FileWriter(makeFile
);
133 public void setSource(String source
) throws IOException
135 FileWriter writer
= new FileWriter(new File(directory
, name
));
136 writer
.write(source
);
138 doVimCommand("--remote-tab-silent", sourceFile
.getPath());
141 public String
getSource() throws IOException
143 return Utilities
.readFile(sourceFile
) + "\n// Edited by " + VimCoder
.version
+ "\n// " + VimCoder
.website
+ "\n\n";
147 private boolean doVimCommand(String command
, String argument
)
149 String
[] arguments
= {argument
};
150 return doVimCommand(command
, arguments
);
153 private boolean doVimCommand(String command
, String
[] arguments
)
157 String
[] exec
= {"gvim", "--servername", "VimCoder" + id
,
159 exec
= Utilities
.concat(exec
, arguments
);
160 Runtime
.getRuntime().exec(exec
, null, directory
);
162 catch (IOException exception
)
164 System
.out
.println("Failed to launch external vim process. :-(");
169 private String
getMethodParams(DataType
[] types
, String
[] names
, Language language
)
171 StringBuilder text
= new StringBuilder();
173 text
.append(types
[0].getDescriptor(language
) + " " + names
[0]);
174 for (int i
= 1; i
< names
.length
; ++i
)
176 text
.append(", " + types
[i
].getDescriptor(language
) + " " + names
[i
]);
179 return text
.toString();