package dcj.examples;
import dcj.examples.ProblemSet;
import dcj.examples.Solver;
import java.lang.Runnable;
import java.io.*;
public class ThreadedSolver implements Runnable, Solver
{
// Protected implementation variables
protected ProblemSet currProblem = null;
protected OutputStream clientOut = null; // Destination for solutions
protected InputStream clientIn = null; // Source of problems
// Constructors
public ThreadedSolver(InputStream cin, OutputStream cout)
{
super();
clientIn = cin;
clientOut = cout;
}
public boolean Solve()
{
boolean success = true;
SimpleCmdInputStream sin = new SimpleCmdInputStream(clientIn);
String inStr = null;
try
{
System.out.println("Reading from client...");
inStr = sin.readString();
}
catch (IOException e)
{
System.out.println("Error reading data from client.");
return false;
}
if (inStr.compareTo("problem") == 0)
{
try
{
inStr = sin.readString();
}
catch (IOException e)
{
System.out.println("Error reading data from client.");
return false;
}
System.out.println("Got \"" + inStr + "\" from client.");
double problem = Double.valueOf(inStr).doubleValue();
ProblemSet p = new ProblemSet();
p.setValue(problem);
success = Solve(p);
}
else
{
System.out.println("Error reading problem from client.");
return false;
}
return success;
}
public boolean Solve(ProblemSet s)
{
boolean success = true;
if (s == null)
{
System.out.println("No problem to solve.");
return false;
}
System.out.println("Problem value = " + s.getValue());
// Solve problem here...
try
{
s.setSolution(Math.sqrt(s.getValue()));
}
catch (ArithmeticException e)
{
System.out.println("Badly-formed problem.");
success = false;
}
System.out.println("Problem solution = " + s.getSolution());
System.out.println("Sending solution to output...");
// Write the solution to the designated output destination
try
{
DataOutputStream dout = new DataOutputStream(clientOut);
dout.writeChars("solution=" + s.getSolution() + "\n");
}
catch (IOException e)
{
System.out.println("Error writing results to output.");
success = false;
}
return success;
}
public boolean Problem(ProblemSet s)
{ currProblem = s; return true; }
public boolean Iterations(int dummy) // Not used on this solver
{ return false; }
public void PrintResults(OutputStream os)
{
PrintStream pos = new PrintStream(os);
pos.println("Problem solution: " + currProblem.getSolution());
}
public void run()
{
System.out.println("ThreadedSolver::run()...");
Solve();
}
}
|