import java.net.*;
import java.io.*;
/** When this class is built, it returns a value
* immediately, but this value returns false for isDone
* and null for getQueries. Meanwhile, it starts a Thread
* to request an array of query strings from the server,
* reading them in one fell swoop by means of an
* ObjectInputStream. Once they've all arrived, they
* are placed in the location getQueries returns,
* and the isDone flag is switched to true.
* Used by the ShowQueries applet.
*
* Taken from Core Web Programming Java 2 Edition
* from Prentice Hall and Sun Microsystems Press,
* May be freely used or adapted.
*/
public class QueryCollection implements Runnable {
private String[] queries;
private String[] tempQueries;
private boolean isDone = false;
private URL dataURL;
public QueryCollection(String urlSuffix, URL currentPage) {
try {
// Only the URL suffix need be supplied, since
// the rest of the URL is derived from the current page.
String protocol = currentPage.getProtocol();
String host = currentPage.getHost();
int port = currentPage.getPort();
dataURL = new URL(protocol, host, port, urlSuffix);
Thread queryRetriever = new Thread(this);
queryRetriever.start();
} catch(MalformedURLException mfe) {
isDone = true;
}
}
public void run() {
try {
tempQueries = retrieveQueries();
queries = tempQueries;
} catch(IOException ioe) {
tempQueries = null;
queries = null;
}
isDone = true;
}
public String[] getQueries() {
return(queries);
}
public boolean isDone() {
return(isDone);
}
private String[] retrieveQueries() throws IOException {
URLConnection connection = dataURL.openConnection();
// Make sure browser doesn't cache this URL, since
// I want different queries for each request.
connection.setUseCaches(false);
// Use ObjectInputStream so I can read a String[]
// all at once.
ObjectInputStream in =
new ObjectInputStream(connection.getInputStream());
try {
// The return type of readObject is Object, so
// I need a typecast to the actual type.
String[] queryStrings = (String[])in.readObject();
return(queryStrings);
} catch(ClassNotFoundException cnfe) {
return(null);
}
}
}