}
@SuppressWarnings({ "rawtypes", "unchecked" })
ExtDirectResponse handleMethodCall(ExtDirectRequest directRequest, HttpServletRequest request,
HttpServletResponse response, Locale locale) {
ExtDirectResponse directResponse = new ExtDirectResponse(directRequest);
MethodInfo methodInfo = MethodInfoCache.INSTANCE.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());
}
}
} catch (Exception e) {
log.error("Error calling method: " + directRequest.getMethod(), e.getCause() != null ? e.getCause() : e);
directResponse.setResult(handleException(methodInfo, directResponse, e, request));
}
} else {
log.error("Error invoking method '" + directRequest.getAction() + "." + directRequest.getMethod()
+ "'. Method or Bean not found");
handleMethodNotFoundError(directResponse, directRequest.getAction(), directRequest.getMethod());