📄 executequery.java
字号:
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)
{
// This looks like a broken Mac where the line endings are confused
log.debug("Using Broken Safari POST mode"); //$NON-NLS-1$
// Iterators insist that we call hasNext() before we next()
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.remove(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 HttpServletRequest.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 paramMap The string/string map to convert
* @return The call details the methods we are calling
* @throws IOException If the parsing of input parameter fails
*/
private Calls parseParameters(Map paramMap) throws IOException
{
Calls calls = new Calls();
// XML mode is common to all calls
calls.setXhrMode(Boolean.valueOf((String) paramMap.remove(ConversionConstants.INBOUND_KEY_XMLMODE)).booleanValue());
// 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$
}
// Extract the ids, scriptnames and methodnames
for (int callNum = 0; callNum < callCount; callNum++)
{
Call call = new Call();
calls.addCall(call);
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];
call.getInboundContext().createInboundVariable(callNum, key, type, value);
it.remove();
}
}
}
if (paramMap.size() != 0)
{
paramMap.remove(ConversionConstants.BROKEN_SAFARI2);
if (paramMap.size() != 0)
{
log.warn("Entries left over in parameter map"); //$NON-NLS-1$
}
}
return calls;
}
/**
* Find the method the best matches the method name and parameters
* @param call The function call we are going to make
* @return A matching method, or null if one was not found.
*/
private Method findMethod(Call call)
{
if (call.getScriptName() == null)
{
throw new IllegalArgumentException(Messages.getString("ExecuteQuery.MissingClassParam")); //$NON-NLS-1$
}
if (call.getMethodName() == null)
{
throw new IllegalArgumentException(Messages.getString("ExecuteQuery.MissingMethodParam")); //$NON-NLS-1$
}
Creator creator = creatorManager.getCreator(call.getScriptName());
Method[] methods = creator.getType().getMethods();
List available = new ArrayList();
methods:
for (int i = 0; i < methods.length; i++)
{
// Check method name and access
if (methods[i].getName().equals(call.getMethodName()))
{
// Check number of parameters
if (methods[i].getParameterTypes().length == call.getInboundContext().getParameterCount())
{
// Clear the previous conversion attempts (the param types
// will probably be different)
call.getInboundContext().clearConverted();
// Check parameter types
for (int j = 0; j < methods[i].getParameterTypes().length; j++)
{
Class paramType = methods[i].getParameterTypes()[j];
if (!converterManager.isConvertable(paramType))
{
// Give up with this method and try the next
continue methods;
}
}
available.add(methods[i]);
}
}
}
// Pick a method to call
if (available.size() > 1)
{
log.warn("Warning multiple matching methods. Using first match."); //$NON-NLS-1$
}
// At the moment we are just going to take the first match, for a
// later increment we might pack the best implementation
if (available.isEmpty())
{
return null;
}
return (Method) available.get(0);
}
/**
* Convert an exception into an outbound variable
* @param converted The conversion context
* @param th The exception to be converted
* @return A new outbound exception
*/
private OutboundVariable convertException(OutboundContext converted, Throwable th)
{
try
{
if (converterManager.isConvertable(th.getClass()))
{
return converterManager.convertOutbound(th, converted);
}
}
catch (ConversionException 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 + " = \"" + jsutil.escapeJavaScript(th.getMessage()) + "\";"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
return ov;
}
/**
* The means by which we strip comments
*/
private JavascriptUtil jsutil = new JavascriptUtil();
/**
* The log stream
*/
private static final Logger log = Logger.getLogger(ExecuteQuery.class);
/**
* The converter manager that decides how parameters are converted
*/
private ConverterManager converterManager = null;
/**
* The DefaultCreatorManager to which we delegate creation of new objects.
*/
private CreatorManager creatorManager = null;
/**
* The security manager
*/
private AccessControl accessControl = null;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -