outWriter.close();
} else if (requestType == RequestType.STATIC_FILE) {
serveStaticResources((ResourceRequest) request,
(ResourceResponse) response);
} else {
Application application = null;
boolean transactionStarted = false;
boolean requestStarted = false;
try {
// TODO What about PARAM_UNLOADBURST & redirectToApplication??
/* Find out which application this request is related to */
application = findApplicationInstance(request, requestType);
if (application == null) {
return;
}
/*
* Get or create an application context and an application
* manager for the session
*/
PortletApplicationContext2 applicationContext = PortletApplicationContext2
.getApplicationContext(request.getPortletSession());
applicationContext.setResponse(response);
PortletCommunicationManager applicationManager = applicationContext
.getApplicationManager(application);
if (response instanceof RenderResponse
&& applicationManager.dummyURL == null) {
/*
* The application manager needs an URL to the dummy page.
* See the PortletCommunicationManager.sendUploadResponse
* method for more information.
*/
ResourceURL dummyURL = ((RenderResponse) response)
.createResourceURL();
dummyURL.setResourceID("DUMMY");
applicationManager.dummyURL = dummyURL.toString();
}
/* Update browser information from request */
updateBrowserProperties(applicationContext.getBrowser(),
request);
/*
* Call application requestStart before Application.init() is
* called (bypasses the limitation in TransactionListener)
*/
if (application instanceof PortletRequestListener) {
((PortletRequestListener) application).onRequestStart(
request, response);
requestStarted = true;
}
/* Start the newly created application */
startApplication(request, application, applicationContext);
/*
* Transaction starts. Call transaction listeners. Transaction
* end is called in the finally block below.
*/
applicationContext.startTransaction(application, request);
transactionStarted = true;
/* Notify listeners */
// Finds the window within the application
Window window = null;
synchronized (application) {
if (application.isRunning()) {
switch (requestType) {
case FILE_UPLOAD:
// no window
break;
case APPLICATION_RESOURCE:
// use main window - should not need any window
window = application.getMainWindow();
break;
default:
window = applicationManager.getApplicationWindow(
request, this, application, null);
}
// if window not found, not a problem - use null
}
}
// TODO Should this happen before or after the transaction
// starts?
if (request instanceof RenderRequest) {
applicationContext.firePortletRenderRequest(application,
window, (RenderRequest) request,
(RenderResponse) response);
} else if (request instanceof ActionRequest) {
applicationContext.firePortletActionRequest(application,
window, (ActionRequest) request,
(ActionResponse) response);
} else if (request instanceof EventRequest) {
applicationContext.firePortletEventRequest(application,
window, (EventRequest) request,
(EventResponse) response);
} else if (request instanceof ResourceRequest) {
applicationContext.firePortletResourceRequest(application,
window, (ResourceRequest) request,
(ResourceResponse) response);
}
/* Handle the request */
if (requestType == RequestType.FILE_UPLOAD) {
applicationManager.handleFileUpload(
(ActionRequest) request, (ActionResponse) response);
return;
} else if (requestType == RequestType.UIDL) {
// Handles AJAX UIDL requests
applicationManager.handleUidlRequest(
(ResourceRequest) request,
(ResourceResponse) response, this, window);
return;
} else {
/*
* Removes the application if it has stopped
*/
if (!application.isRunning()) {
endApplication(request, response, application);
return;
}
handleOtherRequest(request, response, requestType,
application, window, applicationContext,
applicationManager);
}
} catch (final SessionExpiredException e) {
// TODO Figure out a better way to deal with
// SessionExpiredExceptions
System.err.println("Session has expired");
e.printStackTrace(System.err);
} catch (final GeneralSecurityException e) {
// TODO Figure out a better way to deal with
// GeneralSecurityExceptions
System.err
.println("General security exception, should never happen");
e.printStackTrace(System.err);
} catch (final Throwable e) {
handleServiceException(request, response, application, e);
} finally {
// Notifies transaction end
try {
if (transactionStarted) {
((PortletApplicationContext2) application.getContext())
.endTransaction(application, request);
}
} finally {
if (requestStarted) {
((PortletRequestListener) application).onRequestEnd(