UIPortlet<S, C> uiPortlet = event.getSource();
log.trace("Serve Resource for portlet: " + uiPortlet.getPortletContext());
String resourceId = null;
//
PortalRequestContext context = (PortalRequestContext) event.getRequestContext();
HttpServletResponse response = context.getResponse();
//
try {
// Set the NavigationalState
String navState = context.getRequestParameter(ExoPortletInvocationContext.NAVIGATIONAL_STATE_PARAM_NAME);
if (navState != null) {
uiPortlet.setNavigationalState(ParametersStateString.create(navState));
}
//
ResourceInvocation resourceInvocation = uiPortlet.create(ResourceInvocation.class, context);
// set the resourceId to be used in case of a problem
resourceId = resourceInvocation.getResourceId();
//
PortletInvocationResponse portletResponse = uiPortlet.invoke(resourceInvocation);
//
int statusCode;
MultiValuedPropertyMap<String> transportHeaders;
String contentType;
String charset;
Object content;
if (!(portletResponse instanceof ContentResponse)) {
if (portletResponse instanceof ErrorResponse) {
ErrorResponse errorResponse = (ErrorResponse) portletResponse;
Throwable cause = errorResponse.getCause();
if (cause != null) {
log.trace("Got error response from portlet", cause);
} else if (errorResponse.getMessage() != null) {
log.trace("Got error response from portlet:" + errorResponse.getMessage());
} else {
log.trace("Got error response from portlet");
}
} else {
log.trace("Unexpected response type [" + portletResponse
+ "]. Expected a ContentResponse or an ErrorResponse.");
}
statusCode = HttpServletResponse.SC_INTERNAL_SERVER_ERROR;
contentType = null;
charset = null;
transportHeaders = null;
content = null;
} else {
//
ContentResponse piResponse = (ContentResponse) portletResponse;
ResponseProperties properties = piResponse.getProperties();
transportHeaders = properties != null ? properties.getTransportHeaders() : null;
// Look at status code if there is one and honour it
String status = transportHeaders != null ? transportHeaders.getValue(ResourceResponse.HTTP_STATUS_CODE)
: null;
if (status != null) {
try {
statusCode = Integer.parseInt(status);
} catch (NumberFormatException e) {
statusCode = HttpServletResponse.SC_INTERNAL_SERVER_ERROR;
}
} else {
statusCode = HttpServletResponse.SC_OK;
}
//
contentType = piResponse.getContentType();
charset = piResponse.getEncoding();
//
log.trace("Try to get a resource of type: " + contentType + " for the portlet: "
+ uiPortlet.getId());
if (piResponse.getChars() != null) {
content = piResponse.getChars();
} else if (piResponse.getBytes() != null) {
content = piResponse.getBytes();
} else {
content = null;
}
}
//
response.setStatus(statusCode);
// Set content type if any
if (contentType != null) {
response.setContentType(contentType);
}
// Set encoding
if (charset != null) {
response.setCharacterEncoding(charset);
}
// Send headers if any
if (transportHeaders != null) {
sendHeaders(transportHeaders, context);
}
// Send body if any
if (content instanceof String) {
context.getWriter().write((String) content);
} else if (content instanceof byte[]) {
byte[] bytes = (byte[]) content;
response.setContentLength(bytes.length);
OutputStream stream = response.getOutputStream();
try {