package context.arch.util;
import context.arch.comm.CommunicationsObject;
import context.arch.comm.DataObject;
import context.arch.comm.language.ParserObject;
import context.arch.comm.language.InvalidDecoderException;
import context.arch.comm.language.DecodeException;
import context.arch.comm.protocol.HTTPClientSocket;
import context.arch.comm.protocol.RequestData;
import context.arch.comm.protocol.InvalidProtocolException;
import context.arch.comm.protocol.ProtocolException;
import context.arch.comm.RequestObject; //Agathe
import java.net.URL;
import java.net.MalformedURLException;
import java.io.IOException; //Agathe
/**
* This class takes a URL that is encoded in XML and creates a
* DataObject from it.
*
* @see context.arch.comm.DataObject
*/
public class XMLURLReader {
/**
* The default port for HTTP access
*/
public static final int HTTP_PORT = 80;
private String url; // url for the config file
private String host, path; // result of splitting the url
private int port;
private ParserObject p; // our parser
private CommunicationsObject c; // our comms handler
private DataObject d; // parser result
private String type = HTTPClientSocket.GET; // the request type we use
/**
* This constructor accepts a URL and creates the necessary objects to
* parse it.
*
* @param aUrl URL encoded in XML to parse
* @exception MalformedURLException if the given url can't be converted
* to a URL object
* @see context.arch.comm.language.ParserObject
*/
public XMLURLReader(String aUrl) throws MalformedURLException {
url = aUrl;
p = new ParserObject ();
/* Agathe: I changed the Communication so that it starts a pool
of threads - here I modified for it starts just one thread
*/
c = new CommunicationsObject (null, null, null,-1 , 1);
d = null;
URL u = null;
u = new URL (url); // convert to URL to split it
host = u.getHost();
port = u.getPort();
if (port < 0) {
port = HTTP_PORT;
}
path = u.getFile ();
}
/**
* This method returns a DataObject containing the parsed information
* from an XML-encoded URL.
*
* @return DataObject containing the parsed information
* @exception DecodeException if the URL can't be parsed correctly
*/
public DataObject getParsedData() throws DecodeException {
d = null;
try {
RequestData replydata = c.sendRequest(new RequestObject(null, path, host, port, "", type));
//RequestData replydata = c.sendRequest("", path, host, port, type);
d = p.decodeData(replydata.getData());
} catch (ProtocolException pe) {
System.out.println ("getParsedData caught an exception: "+pe);
throw new DecodeException ("XMLURLReader getParsedData ProtocolException");
} catch (InvalidProtocolException ipe) {
System.out.println ("getParsedData caught an exception: "+ipe);
throw new DecodeException ("XMLURLReader getParsedData InvalidProtocolException");
} catch (DecodeException de) {
System.out.println ("getParsedData caught an exception: "+de);
throw new DecodeException ("XMLURLReader getParsedData DecodeException");
} catch (InvalidDecoderException ide) {
System.out.println ("getParsedData caught an exception: "+ide);
throw new DecodeException ("XMLURLReader getParsedData InvalidDecoderException");
} catch (IOException io){
System.out.println("XMLURLReader caught IOException" + io);
}
return d;
}
}