[Jsimplebrowser-svn] SF.net SVN: jsimplebrowser: [49] trunk/core/src/main/java/com/software416/ jsi
Status: Alpha
Brought to you by:
rdimarco
|
From: <rdi...@us...> - 2007-08-13 22:51:19
|
Revision: 49
http://jsimplebrowser.svn.sourceforge.net/jsimplebrowser/?rev=49&view=rev
Author: rdimarco
Date: 2007-08-13 15:51:16 -0700 (Mon, 13 Aug 2007)
Log Message:
-----------
Added an XmlHttpRequest object.
Modified Paths:
--------------
trunk/core/src/main/java/com/software416/jsimplebrowser/RequestService.java
trunk/core/src/main/java/com/software416/jsimplebrowser/impl/RequestServiceImpl.java
trunk/core/src/main/java/com/software416/jsimplebrowser/impl/WindowImpl.java
Added Paths:
-----------
trunk/core/src/main/java/com/software416/jsimplebrowser/XmlHttpRequest.java
trunk/core/src/main/java/com/software416/jsimplebrowser/XmlHttpRequestReadyState.java
trunk/core/src/main/java/com/software416/jsimplebrowser/event/AbstractDOMEvent.java
trunk/core/src/main/java/com/software416/jsimplebrowser/event/ReadyStateChangedEvent.java
trunk/core/src/main/java/com/software416/jsimplebrowser/event/ReadyStateChangedEventListener.java
trunk/core/src/main/java/com/software416/jsimplebrowser/impl/XmlHttpRequestImpl.java
Modified: trunk/core/src/main/java/com/software416/jsimplebrowser/RequestService.java
===================================================================
--- trunk/core/src/main/java/com/software416/jsimplebrowser/RequestService.java 2007-08-13 21:08:29 UTC (rev 48)
+++ trunk/core/src/main/java/com/software416/jsimplebrowser/RequestService.java 2007-08-13 22:51:16 UTC (rev 49)
@@ -21,22 +21,14 @@
*/
@ImplementedBy(RequestServiceImpl.class)
public interface RequestService {
- /**
- * Make a Http request with the specified message body. Ofent used to make
- * AJAX calls.
- *
- * @param url The URL to connect to. Must be an absolute URL
- * @param requestBody The text that will be passed as the body context to the server
- * @return the response ID associated with the request
- */
- public String makeXmlHttpRequest(String url, String requestBody);
/**
* Make a request with a specified request method. Intended for internal use
* @param hm The HttpMethod that will be used to execute the request
* @return the response id.
*/
- String makeRequest(HttpMethod hm);
+ String makeAsyncRequest(HttpMethod hm);
+ HttpResponse makeSynchronousRequest(HttpMethod hm);
public void addRequestEventListener(RequestEventListener listener);
public void removeRequestEventListener(RequestEventListener listener);
Added: trunk/core/src/main/java/com/software416/jsimplebrowser/XmlHttpRequest.java
===================================================================
--- trunk/core/src/main/java/com/software416/jsimplebrowser/XmlHttpRequest.java (rev 0)
+++ trunk/core/src/main/java/com/software416/jsimplebrowser/XmlHttpRequest.java 2007-08-13 22:51:16 UTC (rev 49)
@@ -0,0 +1,47 @@
+//
+// Copyright (c) 2008, 416 Software, LLC.
+// All rights reserved. This program and the accompanying materials
+// are made available under the terms of the GNU General Public License v2.0
+// which accompanies this distribution, and is available at
+// http://www.gnu.org/licenses/gpl-2.0.txt
+//
+// Any non-Open Source projects interested in using this program may purchase
+// a commercial license by emailing sa...@41...
+//
+package com.software416.jsimplebrowser;
+
+import java.net.URISyntaxException;
+
+import org.w3c.dom.Document;
+import org.w3c.dom.events.EventListener;
+
+import com.google.inject.ImplementedBy;
+import com.software416.jsimplebrowser.impl.XmlHttpRequestImpl;
+
+/**
+ * Taken from the W3C XMLHTTPRequest description
+ * @link http://www.w3.org/TR/XMLHttpRequest/
+ * @author Rob Di Marco
+ */
+@ImplementedBy(XmlHttpRequestImpl.class)
+public interface XmlHttpRequest {
+ public void open(String method, String url) throws URISyntaxException;
+ public void open(String method, String url, boolean async) throws URISyntaxException;
+ public void open(String method, String url, boolean async, String user) throws URISyntaxException;
+ public void open(String method, String url, boolean async, String user, String password) throws URISyntaxException;
+ public void setRequestHeader(String header, String value);
+ public void send();
+ public void send(String data);
+ public void send(Document data);
+ public void abort();
+
+ public String getAllResponseHeaders();
+ public String getResponseHeader(String header);
+ public String getResponseText();
+ public String getResponseXML();
+ public short getReadyState();
+ public short getStatus();
+ public String getStatusText();
+
+ void onReadyStateChange(EventListener e);
+}
Added: trunk/core/src/main/java/com/software416/jsimplebrowser/XmlHttpRequestReadyState.java
===================================================================
--- trunk/core/src/main/java/com/software416/jsimplebrowser/XmlHttpRequestReadyState.java (rev 0)
+++ trunk/core/src/main/java/com/software416/jsimplebrowser/XmlHttpRequestReadyState.java 2007-08-13 22:51:16 UTC (rev 49)
@@ -0,0 +1,27 @@
+//
+// Copyright (c) 2007, 416 Software, LLC.
+// All rights reserved. This program and the accompanying materials
+// are made available under the terms of the GNU General Public License v2.0
+// which accompanies this distribution, and is available at
+// http://www.gnu.org/licenses/gpl-2.0.txt
+//
+// Any non-Open Source projects interested in using this program may purchase
+// a commercial license by emailing sa...@41...
+//
+package com.software416.jsimplebrowser;
+
+/**
+ * @author Rob Di Marco
+ */
+public enum XmlHttpRequestReadyState{
+ UNSENT((short)0), OPEN((short)1), SENT((short)2), LOADING((short)3), DONE((short)4);
+
+ private short _value;
+ private XmlHttpRequestReadyState(short value) {
+ _value = value;
+ }
+ public short getValue() {
+ return _value;
+ }
+}
+
Added: trunk/core/src/main/java/com/software416/jsimplebrowser/event/AbstractDOMEvent.java
===================================================================
--- trunk/core/src/main/java/com/software416/jsimplebrowser/event/AbstractDOMEvent.java (rev 0)
+++ trunk/core/src/main/java/com/software416/jsimplebrowser/event/AbstractDOMEvent.java 2007-08-13 22:51:16 UTC (rev 49)
@@ -0,0 +1,108 @@
+//
+// Copyright (c) 2007, 416 Software, LLC.
+// All rights reserved. This program and the accompanying materials
+// are made available under the terms of the GNU General Public License v2.0
+// which accompanies this distribution, and is available at
+// http://www.gnu.org/licenses/gpl-2.0.txt
+//
+// Any non-Open Source projects interested in using this program may purchase
+// a commercial license by emailing sa...@41...
+//
+package com.software416.jsimplebrowser.event;
+
+import org.w3c.dom.events.Event;
+import org.w3c.dom.events.EventTarget;
+
+/**
+ * @author Rob Di Marco
+ */
+public class AbstractDOMEvent implements Event {
+ private boolean _bubbles = true;
+ private boolean _cancelable = false;
+ private EventTarget _currentTarget;
+ private short _eventPhase = AT_TARGET;
+ private EventTarget _target;
+ private long _timeStamp;
+ private String _type;
+
+
+ public void initEvent(String eventTypeArg, boolean canBubbleArg, boolean cancelableArg) {
+ _type = eventTypeArg;
+ _bubbles = canBubbleArg;
+ _cancelable = cancelableArg;
+ }
+
+ /* (non-Javadoc)
+ * @see org.w3c.dom.events.Event#preventDefault()
+ */
+ public void preventDefault() {
+ // TODO Auto-generated method stub
+
+ }
+
+ /* (non-Javadoc)
+ * @see org.w3c.dom.events.Event#stopPropagation()
+ */
+ public void stopPropagation() {
+ // TODO Auto-generated method stub
+
+ }
+
+ public boolean getBubbles() {
+ return _bubbles;
+ }
+
+ public void setBubbles(boolean bubbles) {
+ _bubbles = bubbles;
+ }
+
+ public boolean getCancelable() {
+ return _cancelable;
+ }
+
+ public void setCancelable(boolean cancelable) {
+ _cancelable = cancelable;
+ }
+
+ public EventTarget getCurrentTarget() {
+ return _currentTarget;
+ }
+
+ public void setCurrentTarget(EventTarget currentTarget) {
+ _currentTarget = currentTarget;
+ }
+
+ public short getEventPhase() {
+ return _eventPhase;
+ }
+
+ public void setEventPhase(short eventPhase) {
+ _eventPhase = eventPhase;
+ }
+
+ public EventTarget getTarget() {
+ return _target;
+ }
+
+ public void setTarget(EventTarget target) {
+ _target = target;
+ }
+
+ public long getTimeStamp() {
+ return _timeStamp;
+ }
+
+ public void setTimeStamp(long timeStamp) {
+ _timeStamp = timeStamp;
+ }
+
+ public String getType() {
+ return _type;
+ }
+
+ public void setType(String type) {
+ _type = type;
+ }
+
+
+}
Added: trunk/core/src/main/java/com/software416/jsimplebrowser/event/ReadyStateChangedEvent.java
===================================================================
--- trunk/core/src/main/java/com/software416/jsimplebrowser/event/ReadyStateChangedEvent.java (rev 0)
+++ trunk/core/src/main/java/com/software416/jsimplebrowser/event/ReadyStateChangedEvent.java 2007-08-13 22:51:16 UTC (rev 49)
@@ -0,0 +1,36 @@
+//
+// Copyright (c) 2007, 416 Software, LLC.
+// All rights reserved. This program and the accompanying materials
+// are made available under the terms of the GNU General Public License v2.0
+// which accompanies this distribution, and is available at
+// http://www.gnu.org/licenses/gpl-2.0.txt
+//
+// Any non-Open Source projects interested in using this program may purchase
+// a commercial license by emailing sa...@41...
+//
+package com.software416.jsimplebrowser.event;
+
+import com.software416.jsimplebrowser.XmlHttpRequestReadyState;
+
+/**
+ * @author Rob Di Marco
+ */
+public class ReadyStateChangedEvent extends AbstractDOMEvent {
+ private XmlHttpRequestReadyState _oldState, _newState;
+ public ReadyStateChangedEvent() {
+ setCancelable(false);
+ setBubbles(false);
+ }
+ public XmlHttpRequestReadyState getNewState() {
+ return _newState;
+ }
+ public void setNewState(XmlHttpRequestReadyState newState) {
+ _newState = newState;
+ }
+ public XmlHttpRequestReadyState getOldState() {
+ return _oldState;
+ }
+ public void setOldState(XmlHttpRequestReadyState oldState) {
+ _oldState = oldState;
+ }
+}
Added: trunk/core/src/main/java/com/software416/jsimplebrowser/event/ReadyStateChangedEventListener.java
===================================================================
--- trunk/core/src/main/java/com/software416/jsimplebrowser/event/ReadyStateChangedEventListener.java (rev 0)
+++ trunk/core/src/main/java/com/software416/jsimplebrowser/event/ReadyStateChangedEventListener.java 2007-08-13 22:51:16 UTC (rev 49)
@@ -0,0 +1,18 @@
+//
+// Copyright (c) 2007, 416 Software, LLC.
+// All rights reserved. This program and the accompanying materials
+// are made available under the terms of the GNU General Public License v2.0
+// which accompanies this distribution, and is available at
+// http://www.gnu.org/licenses/gpl-2.0.txt
+//
+// Any non-Open Source projects interested in using this program may purchase
+// a commercial license by emailing sa...@41...
+//
+package com.software416.jsimplebrowser.event;
+
+/**
+ * @author Rob Di Marco
+ */
+public interface ReadyStateChangedEventListener {
+ public void onReadyStateChanged(ReadyStateChangedEvent e);
+}
Modified: trunk/core/src/main/java/com/software416/jsimplebrowser/impl/RequestServiceImpl.java
===================================================================
--- trunk/core/src/main/java/com/software416/jsimplebrowser/impl/RequestServiceImpl.java 2007-08-13 21:08:29 UTC (rev 48)
+++ trunk/core/src/main/java/com/software416/jsimplebrowser/impl/RequestServiceImpl.java 2007-08-13 22:51:16 UTC (rev 49)
@@ -12,7 +12,6 @@
import java.io.ByteArrayOutputStream;
import java.io.IOException;
-import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ExecutorService;
@@ -24,12 +23,10 @@
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpException;
import org.apache.commons.httpclient.HttpMethod;
-import org.apache.commons.httpclient.methods.PostMethod;
-import org.apache.commons.httpclient.methods.StringRequestEntity;
import org.apache.commons.io.IOUtils;
import com.google.inject.Singleton;
-import com.software416.jsimplebrowser.BrowserRuntimeException;
+import com.software416.jsimplebrowser.HttpResponse;
import com.software416.jsimplebrowser.RequestService;
import com.software416.jsimplebrowser.event.RequestEvent;
import com.software416.jsimplebrowser.event.RequestEventListener;
@@ -44,30 +41,43 @@
private List<RequestEventListener> _eventListeners = new ArrayList<RequestEventListener>();
private AtomicInteger _requestIdCounter = new AtomicInteger(1);
private ExecutorService _requestPool = new ThreadPoolExecutor(1, REQUEST_POOL_THREAD_COUNT, 60L, TimeUnit.SECONDS, new SynchronousQueue<Runnable>());
- public String makeRequest(final HttpMethod m) {
+ public String makeAsyncRequest(final HttpMethod m) {
final String requestId = String.valueOf(_requestIdCounter.addAndGet(1));
_requestPool.execute(new Runnable() {
-
public void run() {
- HttpResponseImpl ri = new HttpResponseImpl();
- ri.setRequestMethod(m);
-
- try {
- ri.setResponseCode(_client.executeMethod(m));
- ByteArrayOutputStream bos = new ByteArrayOutputStream();
- IOUtils.copy(m.getResponseBodyAsStream(), bos);
- ri.setResponseBody(bos.toByteArray());
- notifyOfRequestSuccess(requestId, m, ri);
- } catch (HttpException ex) {
- notifyOfRequestFailure(requestId, m, ex);
- } catch (IOException ex) {
- notifyOfRequestFailure(requestId, m, ex);
- }
- }
+ makeRequest(m, requestId);
+ }
});
return requestId;
}
+ /* (non-Javadoc)
+ * @see com.software416.jsimplebrowser.RequestService#makeSynchronousRequest(org.apache.commons.httpclient.HttpMethod)
+ */
+ public HttpResponse makeSynchronousRequest(HttpMethod hm) {
+ final String requestId = String.valueOf(_requestIdCounter.addAndGet(1));
+ return makeRequest(hm, requestId);
+ }
+
+ protected HttpResponseImpl makeRequest(final HttpMethod m, final String requestId) {
+
+ try {
+ HttpResponseImpl ri = new HttpResponseImpl();
+ ri.setRequestMethod(m);
+ ri.setResponseCode(_client.executeMethod(m));
+ ByteArrayOutputStream bos = new ByteArrayOutputStream();
+ IOUtils.copy(m.getResponseBodyAsStream(), bos);
+ ri.setResponseBody(bos.toByteArray());
+ notifyOfRequestSuccess(requestId, m, ri);
+ return ri;
+ } catch (HttpException ex) {
+ notifyOfRequestFailure(requestId, m, ex);
+ } catch (IOException ex) {
+ notifyOfRequestFailure(requestId, m, ex);
+ }
+ return null;
+ }
+
protected void notifyOfRequestSuccess(String requestId, HttpMethod request, HttpResponseImpl response) {
RequestSuccessEvent e = new RequestSuccessEvent();
e.setRequestId(requestId);
@@ -91,16 +101,6 @@
}
}
- public String makeXmlHttpRequest(String url, String requestBody) {
- PostMethod m = new PostMethod(url);
- try {
- m.setRequestEntity(new StringRequestEntity(requestBody, "text/plain",null));
- } catch (UnsupportedEncodingException ex) {
- throw new BrowserRuntimeException("Really weird encoding issue", ex);
- }
- return makeRequest(m);
- }
-
public void addRequestEventListener(RequestEventListener listener) {
_eventListeners.add(listener);
}
@@ -108,4 +108,5 @@
_eventListeners.remove(listener);
}
+
}
Modified: trunk/core/src/main/java/com/software416/jsimplebrowser/impl/WindowImpl.java
===================================================================
--- trunk/core/src/main/java/com/software416/jsimplebrowser/impl/WindowImpl.java 2007-08-13 21:08:29 UTC (rev 48)
+++ trunk/core/src/main/java/com/software416/jsimplebrowser/impl/WindowImpl.java 2007-08-13 22:51:16 UTC (rev 49)
@@ -90,7 +90,7 @@
protected String makeRequest(HttpMethod hm) {
_isWindowLoading = true;
- return _requestService.makeRequest(hm);
+ return _requestService.makeAsyncRequest(hm);
}
public void handleResponse(HttpResponse requestInfo) {
Added: trunk/core/src/main/java/com/software416/jsimplebrowser/impl/XmlHttpRequestImpl.java
===================================================================
--- trunk/core/src/main/java/com/software416/jsimplebrowser/impl/XmlHttpRequestImpl.java (rev 0)
+++ trunk/core/src/main/java/com/software416/jsimplebrowser/impl/XmlHttpRequestImpl.java 2007-08-13 22:51:16 UTC (rev 49)
@@ -0,0 +1,320 @@
+//
+// Copyright (c) 2007, 416 Software, LLC.
+// All rights reserved. This program and the accompanying materials
+// are made available under the terms of the GNU General Public License v2.0
+// which accompanies this distribution, and is available at
+// http://www.gnu.org/licenses/gpl-2.0.txt
+//
+// Any non-Open Source projects interested in using this program may purchase
+// a commercial license by emailing sa...@41...
+//
+package com.software416.jsimplebrowser.impl;
+
+import java.io.ByteArrayOutputStream;
+import java.io.UnsupportedEncodingException;
+import java.net.URISyntaxException;
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.xml.transform.TransformerConfigurationException;
+import javax.xml.transform.TransformerException;
+import javax.xml.transform.TransformerFactory;
+import javax.xml.transform.TransformerFactoryConfigurationError;
+import javax.xml.transform.dom.DOMSource;
+import javax.xml.transform.stream.StreamResult;
+
+import org.apache.commons.httpclient.URI;
+import org.apache.commons.httpclient.URIException;
+import org.apache.commons.httpclient.methods.EntityEnclosingMethod;
+import org.apache.commons.httpclient.methods.PostMethod;
+import org.apache.commons.httpclient.methods.PutMethod;
+import org.apache.commons.httpclient.methods.StringRequestEntity;
+import org.apache.commons.lang.StringUtils;
+import org.w3c.dom.Document;
+import org.w3c.dom.events.Event;
+import org.w3c.dom.events.EventException;
+import org.w3c.dom.events.EventListener;
+import org.w3c.dom.events.EventTarget;
+
+import com.google.inject.Inject;
+import com.software416.jsimplebrowser.BrowserRuntimeException;
+import com.software416.jsimplebrowser.HttpResponse;
+import com.software416.jsimplebrowser.RequestService;
+import com.software416.jsimplebrowser.Window;
+import com.software416.jsimplebrowser.XmlHttpRequest;
+import com.software416.jsimplebrowser.XmlHttpRequestReadyState;
+import com.software416.jsimplebrowser.event.ReadyStateChangedEvent;
+
+/**
+ * @author Rob Di Marco
+ */
+public class XmlHttpRequestImpl implements XmlHttpRequest, EventTarget{
+ private List<EventListener> _eventListeners = new ArrayList<EventListener>();
+ private XmlHttpRequestReadyState _state = XmlHttpRequestReadyState.UNSENT;
+ private EventListener _mandatoryListener = null;
+ private EntityEnclosingMethod _requestMethod;
+ private boolean _sendFlag = false;
+ private boolean _isAsync = true;
+ @Inject private Window _window = null;
+ @Inject private RequestService _requestService = null;
+
+ /* (non-Javadoc)
+ * @see com.software416.jsimplebrowser.XmlHttpRequest#abort()
+ */
+ public void abort() {
+ if (!_isAsync) {
+ throw new IllegalStateException("Request is not in the asynchronous request state");
+ }
+ if (_requestMethod.isRequestSent()) {
+ _requestMethod.abort();
+ }
+ if (!(_state == XmlHttpRequestReadyState.UNSENT || _state == XmlHttpRequestReadyState.DONE
+ ||(_state == XmlHttpRequestReadyState.OPEN && !_sendFlag))) {
+ changeReadyState(XmlHttpRequestReadyState.DONE);
+ }
+ changeReadyState(XmlHttpRequestReadyState.UNSENT);
+ }
+
+ /* (non-Javadoc)
+ * @see com.software416.jsimplebrowser.XmlHttpRequest#getAllResponseHeaders()
+ */
+ public String getAllResponseHeaders() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ /* (non-Javadoc)
+ * @see com.software416.jsimplebrowser.XmlHttpRequest#getResponseHeader(java.lang.String)
+ */
+ public String getResponseHeader(String header) {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ /* (non-Javadoc)
+ * @see com.software416.jsimplebrowser.XmlHttpRequest#getResponseText()
+ */
+ public String getResponseText() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ /* (non-Javadoc)
+ * @see com.software416.jsimplebrowser.XmlHttpRequest#getResponseXML()
+ */
+ public String getResponseXML() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ /* (non-Javadoc)
+ * @see com.software416.jsimplebrowser.XmlHttpRequest#getStatus()
+ */
+ public short getStatus() {
+ return (short)_requestMethod.getStatusCode();
+ }
+
+ /* (non-Javadoc)
+ * @see com.software416.jsimplebrowser.XmlHttpRequest#getStatusText()
+ */
+ public String getStatusText() {
+ return _requestMethod.getStatusText();
+ }
+
+ /* (non-Javadoc)
+ * @see com.software416.jsimplebrowser.XmlHttpRequest#open(java.lang.String, java.lang.String)
+ */
+ public void open(String method, String url) throws URISyntaxException {
+ open(method, url, true, null, null);
+ }
+
+ /* (non-Javadoc)
+ * @see com.software416.jsimplebrowser.XmlHttpRequest#open(java.lang.String, java.lang.String, boolean)
+ */
+ public void open(String method, String url, boolean async) throws URISyntaxException {
+ open(method, url, async, null, null);
+ }
+
+ /* (non-Javadoc)
+ * @see com.software416.jsimplebrowser.XmlHttpRequest#open(java.lang.String, java.lang.String, boolean, java.lang.String)
+ */
+ public void open(String method, String url, boolean async, String user) throws URISyntaxException {
+ open(method, url, async, user, null);
+ }
+
+ /* (non-Javadoc)
+ * @see com.software416.jsimplebrowser.XmlHttpRequest#open(java.lang.String, java.lang.String, boolean, java.lang.String, java.lang.String)
+ */
+ public void open(String method, String url, boolean async, String user, String password) throws URISyntaxException {
+ _requestMethod = validateMethodDefinition(method);
+ configureUrl(url, user, password);
+ _isAsync = async;
+ changeReadyState(XmlHttpRequestReadyState.OPEN);
+ }
+
+ protected void changeReadyState(XmlHttpRequestReadyState newState) {
+ XmlHttpRequestReadyState oldState = _state;
+ _state = newState;;
+ ReadyStateChangedEvent e = new ReadyStateChangedEvent();
+ e.setTarget(this);
+ e.setCurrentTarget(this);
+ e.setOldState(oldState);
+ e.setNewState(newState);
+ dispatchEvent(e);
+ }
+
+ /**
+ * Right now, we are ignoring the username and password. May want to revisit this.
+ */
+ protected void configureUrl(String url, String username, String password) throws URISyntaxException{
+ try {
+ URI uri;
+ if (_window != null && _window.getLocation() !=null) {
+ uri = new URI(new URI(_window.getLocation(), true), url, true);
+ } else {
+ uri = new URI(url, true);
+ }
+ _requestMethod.setURI(uri);
+ } catch (URIException ex) {
+ throw new URISyntaxException(url, ex.getMessage());
+ }
+ }
+
+ /**
+ * Validates that the method argument matches the Method production defined in section 5.1.1 of RFC 2616
+ * @param method The method to validate agains
+ * @link http://ietf.org/rfc/rfc2616
+ * @throws BrowserRuntimeException if the method definition is invalid
+ */
+ protected EntityEnclosingMethod validateMethodDefinition(String method) {
+ if (method == null) {
+ throw new BrowserRuntimeException("Syntax Error: no method specified: " + method);
+ } else if (method.equalsIgnoreCase("POST")) {
+ return new PostMethod();
+ } else if (method.equalsIgnoreCase("PUT")) {
+ return new PutMethod();
+ } else if (method.equalsIgnoreCase("GET")||method.equalsIgnoreCase("HEAD")
+ ||method.equalsIgnoreCase("DELETE")||method.equalsIgnoreCase("OPTIONS")|| method.equalsIgnoreCase("TRACE")
+ || method.equalsIgnoreCase("CONNECT")) {
+ throw new BrowserRuntimeException("Unsupported Method for HTTP Requests: " + method);
+ } else {
+ throw new BrowserRuntimeException("Syntax Error: invalid method: " + method);
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see com.software416.jsimplebrowser.XmlHttpRequest#send()
+ */
+ public void send() {
+ send((String)null);
+ }
+
+ /* (non-Javadoc)
+ * @see com.software416.jsimplebrowser.XmlHttpRequest#send(java.lang.String)
+ */
+ public void send(String data) {
+ if (data != null && StringUtils.isEmpty(_requestMethod.getRequestHeader("Content-Type").getValue())) {
+ throw new IllegalStateException("Trying to send a message with no content type");
+ }
+ validateRequestIsOpen();
+ if (_isAsync) {
+ _sendFlag = true;
+ }
+ //TODO Not supporting charsets or encoding. Probably should...
+ try {
+ _requestMethod.setRequestEntity(new StringRequestEntity(data, null, null));
+ } catch (UnsupportedEncodingException ex) {
+ throw new BrowserRuntimeException("Unusual encoding problem.", ex);
+ }
+ if (_isAsync) {
+ _requestService.makeAsyncRequest(_requestMethod);
+ } else {
+ HttpResponse resp = _requestService.makeSynchronousRequest(_requestMethod);
+ changeReadyState(XmlHttpRequestReadyState.DONE);
+ if (resp == null) {
+ throw new BrowserRuntimeException("Request could not be processed.");
+ }
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see com.software416.jsimplebrowser.XmlHttpRequest#send(org.w3c.dom.Document)
+ */
+ public void send(Document data) {
+ if (_requestMethod.getRequestHeader("Content-Type") == null) {
+ _requestMethod.setRequestHeader("Content-Type", "application/xml");
+ }
+ ByteArrayOutputStream out = new ByteArrayOutputStream();
+ try {
+ TransformerFactory.newInstance().newTransformer().transform(new DOMSource(data), new StreamResult(out));
+ send(out.toString("UTF-8"));
+ } catch (TransformerConfigurationException ex) {
+ throw new BrowserRuntimeException("Could not transform DOM to text", ex);
+ } catch (TransformerException ex) {
+ throw new BrowserRuntimeException("Could not transform DOM to text", ex);
+ } catch (TransformerFactoryConfigurationError ex) {
+ throw new BrowserRuntimeException("Could not transform DOM to text", ex);
+ } catch (UnsupportedEncodingException ex) {
+ throw new BrowserRuntimeException("Could not transform DOM to text", ex);
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see com.software416.jsimplebrowser.XmlHttpRequest#setRequestHeader(java.lang.String, java.lang.String)
+ */
+ public void setRequestHeader(String header, String value) {
+ validateRequestIsOpen();
+ _requestMethod.addRequestHeader(header, value);
+ }
+
+ private void validateRequestIsOpen() {
+ if (_state != XmlHttpRequestReadyState.OPEN) {
+ throw new IllegalStateException("Request is not in the open state!!! Current state is " + _state);
+ }
+ if (_sendFlag) {
+ throw new IllegalStateException("Already sending message");
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see com.software416.jsimplebrowser.XmlHttpRequest#getState()
+ */
+ public short getReadyState() {
+ return _state.getValue();
+ }
+
+
+ /* (non-Javadoc)
+ * @see org.w3c.dom.events.EventTarget#addEventListener(java.lang.String, org.w3c.dom.events.EventListener, boolean)
+ */
+ public void addEventListener(String type, EventListener listener, boolean useCapture) {
+ if (type.equalsIgnoreCase("readystatechange") && !_eventListeners.contains(listener)) {
+ _eventListeners.add(listener);
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.w3c.dom.events.EventTarget#dispatchEvent(org.w3c.dom.events.Event)
+ */
+ public boolean dispatchEvent(Event evt) throws EventException {
+ if (_mandatoryListener != null) {
+ _mandatoryListener.handleEvent(evt);
+ }
+ for (EventListener listener : _eventListeners) {
+ listener.handleEvent(evt);
+ }
+ return true;
+ }
+
+ /* (non-Javadoc)
+ * @see org.w3c.dom.events.EventTarget#removeEventListener(java.lang.String, org.w3c.dom.events.EventListener, boolean)
+ */
+ public void removeEventListener(String type, EventListener listener, boolean useCapture) {
+ _eventListeners.remove(listener);
+ }
+
+ public void onReadyStateChange(EventListener listener) {
+ _mandatoryListener = listener;
+ }
+
+}
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|