/*
* Copyright 2007 Xu, Chuan <xuchuan@gmail.com>
*
* This file is part of ZOJ.
*
* ZOJ is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either revision 3 of the License, or (at your option) any later revision.
*
* ZOJ is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along with ZOJ. if not, see
* <http://www.gnu.org/licenses/>.
*/
package cn.edu.zju.acm.onlinejudge.judgeservice;
import java.io.ByteArrayOutputStream;
import java.io.DataOutputStream;
import java.io.IOException;
public class JudgeClientCommandsFactory {
private static int CMD_PING = 100;
private static int CMD_JUDGE = 1;
private static int CMD_DATA = 2;
private static int CMD_COMPILE = 3;
private static int CMD_TESTCASE = 4;
private static int CMD_INFO = 6;
public static byte[] createPingCommand() {
ByteArrayOutputStream buf = new ByteArrayOutputStream();
DataOutputStream out = new DataOutputStream(buf);
try {
out.writeInt(JudgeClientCommandsFactory.CMD_PING);
out.flush();
} catch (IOException e) {
// Impossible
e.printStackTrace();
}
return buf.toByteArray();
}
public static byte[] createInfoCommand() {
ByteArrayOutputStream buf = new ByteArrayOutputStream();
DataOutputStream out = new DataOutputStream(buf);
try {
out.writeInt(JudgeClientCommandsFactory.CMD_INFO);
out.flush();
} catch (IOException e) {
// Impossible
e.printStackTrace();
}
return buf.toByteArray();
}
public static byte[] createJudgeCommand(long problemId, int problemRevision, long submissionId) {
CommandBuilder builder = new CommandBuilder();
builder.appendInt(JudgeClientCommandsFactory.CMD_JUDGE);
builder.appendInt((int) submissionId);
builder.appendInt((int) problemId);
builder.appendInt(problemRevision);
return builder.getBytes();
}
public static byte[] createDataCommand(int size) {
CommandBuilder builder = new CommandBuilder();
builder.appendInt(JudgeClientCommandsFactory.CMD_DATA);
builder.appendInt(size);
return builder.getBytes();
}
public static byte[] createCompileCommand(int compiler, int size) {
CommandBuilder builder = new CommandBuilder();
builder.appendInt(JudgeClientCommandsFactory.CMD_COMPILE);
builder.appendInt(compiler);
builder.appendInt(size);
return builder.getBytes();
}
public static byte[] createTestCaseCommand(int testcase, int timeLimit, int memoryLimit, int outputLimit) {
CommandBuilder builder = new CommandBuilder();
builder.appendInt(JudgeClientCommandsFactory.CMD_TESTCASE);
builder.appendInt(testcase);
builder.appendInt(timeLimit);
builder.appendInt(memoryLimit);
builder.appendInt(outputLimit);
return builder.getBytes();
}
private static class CommandBuilder {
ByteArrayOutputStream buf = new ByteArrayOutputStream();
DataOutputStream out = new DataOutputStream(this.buf);
int checksum = 0;
public byte[] getBytes() {
try {
this.appendInt(this.checksum);
this.out.flush();
} catch (IOException e) {
// Impossible
e.printStackTrace();
}
return this.buf.toByteArray();
}
public int getCheckSum(int value) {
return (value & 0xff) + (value >> 8 & 0xff) + (value >> 16 & 0xff) + (value >> 24 & 0xff);
}
public void appendInt(int value) {
try {
this.checksum += this.getCheckSum(value);
this.out.writeInt(value);
} catch (IOException e) {
// Impossible
e.printStackTrace();
}
}
}
}