?? dwrpplainjsmarshaller.java
字號:
/**
* Send a script to the browser
* @param out The stream to write to
* @param script The script to send
* @throws IOException If the write fails
*/
protected void sendScript(PrintWriter out, String script) throws IOException
{
if (script.trim().length() == 0)
{
return;
}
synchronized (out)
{
out.println(ConversionConstants.SCRIPT_START_MARKER);
out.println(script);
out.println(ConversionConstants.SCRIPT_END_MARKER);
if (out.checkError())
{
throw new IOException("Error flushing buffered stream"); //$NON-NLS-1$
}
}
}
/**
* iframe mode starts as HTML, so get into script mode
* @return A script prefix
*/
protected String getOutboundMimeType()
{
return MimeConstants.MIME_PLAIN;
}
/**
* iframe mode starts as HTML, so get into script mode
* @param out The stream to write to
* @throws IOException If the write fails
*/
protected void sendOutboundScriptPrefix(PrintWriter out) throws IOException
{
}
/**
* @param out The stream to write to
* @throws IOException If the write fails
*/
protected void sendOutboundScriptSuffix(PrintWriter out) throws IOException
{
}
/**
* Convert an exception into an outbound variable
* @param th The exception to be converted
* @param converted The conversion context
* @return A new outbound exception
*/
private OutboundVariable convertException(Throwable th, OutboundContext converted)
{
try
{
if (converterManager.isConvertable(th.getClass()))
{
return converterManager.convertOutbound(th, converted);
}
}
catch (MarshallException ex)
{
log.warn("Exception while converting. Exception to be converted: " + th, ex); //$NON-NLS-1$
}
// So we will have to create one for ourselves
OutboundVariable ov = new OutboundVariable();
String varName = converted.getNextVariableName();
ov.setAssignCode(varName);
ov.setInitCode("var " + varName + " = \"" + JavascriptUtil.escapeJavaScript(th.getMessage()) + "\";"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
return ov;
}
/**
* Parse an inbound request into a Calls object
* @param req The original browser's request
* @return A parsed set of calls
* @throws IOException If reading from the request body stream fails
*/
private ParseResponse parseRequest(HttpServletRequest req) throws IOException
{
ParseResponse parseResponse = new ParseResponse();
if (req.getMethod().equals("GET")) //$NON-NLS-1$
{
parseResponse.setAllParameters(parseGet(req));
}
else
{
parseResponse.setAllParameters(parsePost(req));
}
parseParameters(parseResponse);
return parseResponse;
}
/**
* Parse an HTTP POST request to fill out the scriptName, methodName and
* paramList properties. This method should not fail unless it will not
* be possible to return any sort of error to the user. Failure cases should
* be handled by the <code>checkParams()</code> method.
* @param req The original browser's request
* @return The equivalent of HttpServletRequest.getParameterMap() for now
* @throws IOException If reading from the request body stream fails
*/
private Map parsePost(HttpServletRequest req) throws IOException
{
Map paramMap = new HashMap();
// I've had reports of data loss in Tomcat 5.0 that relate to this bug
// http://issues.apache.org/bugzilla/show_bug.cgi?id=27447
// See mails to users@dwr.dev.java.net:
// Subject: "Tomcat 5.x read-ahead problem"
// From: CAKALIC, JAMES P [AG-Contractor/1000]
// It would be more normal to do the following:
// BufferedReader in = req.getReader();
BufferedReader in = new BufferedReader(new InputStreamReader(req.getInputStream()));
while (true)
{
String line = in.readLine();
if (line == null)
{
break;
}
if (line.indexOf('&') != -1)
{
// If there are any &s then this must be iframe post and all the
// parameters have got dumped on one line, split with &
log.debug("Using iframe POST mode"); //$NON-NLS-1$
StringTokenizer st = new StringTokenizer(line, "&"); //$NON-NLS-1$
while (st.hasMoreTokens())
{
String part = st.nextToken();
part = LocalUtil.decode(part);
parsePostLine(part, paramMap);
}
}
else
{
// Horay, this is a normal one!
parsePostLine(line, paramMap);
}
}
// If there is only 1 param then this must be a broken Safari. All
// the parameters have got dumped on one line split with \n
// See: http://bugzilla.opendarwin.org/show_bug.cgi?id=3565
// https://dwr.dev.java.net/issues/show_bug.cgi?id=93
// http://jira.atlassian.com/browse/JRA-8354
// http://developer.apple.com/internet/safari/uamatrix.html
if (paramMap.size() == 1)
{
log.debug("Using Broken Safari POST mode"); //$NON-NLS-1$
// This looks like a broken Mac where the line endings are confused
// Iterators insist that we call hasNext() before we start
Iterator it = paramMap.keySet().iterator();
if (!it.hasNext())
{
throw new IllegalStateException("No entries in non empty map!"); //$NON-NLS-1$
}
// So get the first
String key = (String) it.next();
String value = (String) paramMap.get(key);
String line = key + ConversionConstants.INBOUND_DECL_SEPARATOR + value;
StringTokenizer st = new StringTokenizer(line, "\n"); //$NON-NLS-1$
while (st.hasMoreTokens())
{
String part = st.nextToken();
part = LocalUtil.decode(part);
parsePostLine(part, paramMap);
}
}
return paramMap;
}
/**
* Sort out a single line in a POST request
* @param line The line to parse
* @param paramMap The map to add parsed parameters to
*/
private void parsePostLine(String line, Map paramMap)
{
if (line.length() == 0)
{
return;
}
int sep = line.indexOf(ConversionConstants.INBOUND_DECL_SEPARATOR);
if (sep == -1)
{
log.warn("Missing separator in POST line: " + line); //$NON-NLS-1$
}
else
{
String key = line.substring(0, sep);
String value = line.substring(sep + ConversionConstants.INBOUND_DECL_SEPARATOR.length());
paramMap.put(key, value);
}
}
/**
* Parse an HTTP GET request to fill out the scriptName, methodName and
* paramList properties. This method should not fail unless it will not
* be possible to return any sort of error to the user. Failure cases should
* be handled by the <code>checkParams()</code> method.
* @param req The original browser's request
* @return Simply HttpRequest.getParameterMap() for now
* @throws IOException If the parsing fails
*/
private Map parseGet(HttpServletRequest req) throws IOException
{
Map convertedMap = new HashMap();
Map paramMap = req.getParameterMap();
for (Iterator it = paramMap.keySet().iterator(); it.hasNext();)
{
String key = (String) it.next();
String[] array = (String[]) paramMap.get(key);
if (array.length == 1)
{
convertedMap.put(key, array[0]);
}
else
{
throw new IOException(Messages.getString("ExecuteQuery.MultiValues", key)); //$NON-NLS-1$
}
}
return convertedMap;
}
/**
* Fish out the important parameters
* @param parseResponse The call details the methods we are calling
* @throws IOException If the parsing of input parameter fails
*/
private void parseParameters(ParseResponse parseResponse) throws IOException
{
Map paramMap = parseResponse.getAllParameters();
Calls calls = new Calls();
parseResponse.setCalls(calls);
// Work out how many calls are in this packet
String callStr = (String) paramMap.remove(ConversionConstants.INBOUND_CALL_COUNT);
int callCount;
try
{
callCount = Integer.parseInt(callStr);
}
catch (NumberFormatException ex)
{
throw new IOException(Messages.getString("ExecuteQuery.BadCallCount", callStr)); //$NON-NLS-1$
}
List inboundContexts = parseResponse.getInboundContexts();
// Extract the ids, scriptnames and methodnames
for (int callNum = 0; callNum < callCount; callNum++)
{
Call call = new Call();
calls.addCall(call);
InboundContext inctx = new InboundContext();
inboundContexts.add(inctx);
String prefix = ConversionConstants.INBOUND_CALLNUM_PREFIX + callNum + ConversionConstants.INBOUND_CALLNUM_SUFFIX;
// The special values
call.setId((String) paramMap.remove(prefix + ConversionConstants.INBOUND_KEY_ID));
call.setScriptName((String) paramMap.remove(prefix + ConversionConstants.INBOUND_KEY_SCRIPTNAME));
call.setMethodName((String) paramMap.remove(prefix + ConversionConstants.INBOUND_KEY_METHODNAME));
// Look for parameters to this method
for (Iterator it = paramMap.entrySet().iterator(); it.hasNext();)
{
Map.Entry entry = (Map.Entry) it.next();
String key = (String) entry.getKey();
if (key.startsWith(prefix))
{
String data = (String) entry.getValue();
String[] split = LocalUtil.splitInbound(data);
String value = split[LocalUtil.INBOUND_INDEX_VALUE];
String type = split[LocalUtil.INBOUND_INDEX_TYPE];
inctx.createInboundVariable(callNum, key, type, value);
it.remove();
}
}
}
paramMap.remove(ConversionConstants.INBOUND_KEY_HTTP_SESSIONID);
// Maybe we should check the value of this against the cookie value
String scriptSessionId = (String) paramMap.remove(ConversionConstants.INBOUND_KEY_SCRIPT_SESSIONID);
parseResponse.setScriptSessionId(scriptSessionId);
String page = (String) paramMap.remove(ConversionConstants.INBOUND_KEY_PAGE);
parseResponse.setPage(page);
parseResponse.setSpareParameters(paramMap);
}
/* (non-Javadoc)
* @see org.directwebremoting.Marshaller#isConvertable(java.lang.Class)
*/
public boolean isConvertable(Class paramType)
{
return converterManager.isConvertable(paramType);
}
/**
* Accessor for the DefaultCreatorManager that we configure
* @param converterManager The new DefaultConverterManager
*/
public void setConverterManager(ConverterManager converterManager)
{
this.converterManager = converterManager;
}
/**
* Accessor for the DefaultCreatorManager that we configure
* @param creatorManager The new DefaultConverterManager
*/
public void setCreatorManager(CreatorManager creatorManager)
{
this.creatorManager = creatorManager;
}
/**
* Accessor for the security manager
* @param accessControl The accessControl to set.
*/
public void setAccessControl(AccessControl accessControl)
{
this.accessControl = accessControl;
}
/**
* How we convert parameters
*/
protected ConverterManager converterManager = null;
/**
* How we create new beans
*/
protected CreatorManager creatorManager = null;
/**
* The security manager
*/
protected AccessControl accessControl = null;
/**
* How we stash away the request
*/
protected static final String ATTRIBUTE_REQUEST = "org.directwebremoting.dwrp.request"; //$NON-NLS-1$
/**
* How we stash away the conduit
*/
protected static final String ATTRIBUTE_CONDUIT = "org.directwebremoting.dwrp.conduit"; //$NON-NLS-1$
/**
*
*/
protected static final String ATTRIBUTE_PARSE_RESPONSE = "org.directwebremoting.dwrp.parseResponse"; //$NON-NLS-1$
/**
* The log stream
*/
protected static final Logger log = Logger.getLogger(DwrpPlainJsMarshaller.class);
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -