@SuppressWarnings({ "rawtypes", "unchecked" })
ExtDirectResponse handleMethodCall(ExtDirectRequest directRequest,
HttpServletRequest request, HttpServletResponse response, Locale locale) {
ExtDirectResponse directResponse = new ExtDirectResponse(directRequest);
MethodInfo methodInfo = methodInfoCache.get(directRequest.getAction(),
directRequest.getMethod());
if (methodInfo != null) {
try {
directResponse.setStreamResponse(methodInfo.isStreamResponse());
Object result = processRemotingRequest(request, response, locale,
directRequest, methodInfo);
if (result != null) {
ModelAndJsonView modelAndJsonView = null;
if (result instanceof ModelAndJsonView) {
modelAndJsonView = (ModelAndJsonView) result;
result = modelAndJsonView.getModel();
}
if (methodInfo.isType(ExtDirectMethodType.FORM_LOAD)
&& !ExtDirectFormLoadResult.class.isAssignableFrom(result
.getClass())) {
ExtDirectFormLoadResult formLoadResult = new ExtDirectFormLoadResult(
result);
if (result instanceof JsonViewHint) {
formLoadResult.setJsonView(((JsonViewHint) result)
.getJsonView());
}
result = formLoadResult;
}
else if ((methodInfo.isType(ExtDirectMethodType.STORE_MODIFY) || methodInfo
.isType(ExtDirectMethodType.STORE_READ))
&& !ExtDirectStoreResult.class.isAssignableFrom(result
.getClass())
&& configurationService.getConfiguration()
.isAlwaysWrapStoreResponse()) {
if (result instanceof Collection) {
result = new ExtDirectStoreResult((Collection) result);
}
else {
result = new ExtDirectStoreResult(result);
}
}
else if (methodInfo.isType(ExtDirectMethodType.FORM_POST_JSON)) {
if (result instanceof ExtDirectFormPostResult) {
ExtDirectFormPostResult formPostResult = (ExtDirectFormPostResult) result;
result = formPostResult.getResult();
}
}
directResponse.setResult(result);
if (modelAndJsonView != null) {
directResponse.setJsonView(getJsonView(modelAndJsonView,
methodInfo.getJsonView()));
}
else {
directResponse.setJsonView(getJsonView(result,
methodInfo.getJsonView()));
}
}
else {
if (methodInfo.isType(ExtDirectMethodType.STORE_MODIFY)
|| methodInfo.isType(ExtDirectMethodType.STORE_READ)) {
directResponse.setResult(Collections.emptyList());
}
}
}