[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. |