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;
{
private String id;
private String name;
-
private File sourceFile;
private File directory;
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())
String ext = languageExtension.get(lang);
HashMap<String,String> terms = new HashMap<String,String>();
- 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())
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<String,String> testTerms = new HashMap<String,String>();
- 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();
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);
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();