/*
* Copyright (C) 2009 eXo Platform SAS.
*
* This is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this software; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package org.exoplatform.webui.application;
import java.lang.reflect.UndeclaredThrowableException;
import java.util.LinkedHashSet;
import java.util.Locale;
import java.util.ResourceBundle;
import java.util.Set;
import java.util.UUID;
import org.exoplatform.resolver.ApplicationResourceResolver;
import org.exoplatform.resolver.ResourceResolver;
import org.exoplatform.web.application.Application;
import org.exoplatform.web.application.JavascriptManager;
import org.exoplatform.web.application.RequestContext;
import org.exoplatform.web.application.URLBuilder;
import org.exoplatform.webui.core.UIApplication;
import org.exoplatform.webui.core.UIComponent;
/**
* Created by The eXo Platform SAS May 7, 2006
*
* The main class to manage the request context in a webui environment
*
* It adds: - some access to the root UI component (UIApplication) - access to the request and response objects - information
* about the current state of the request - the list of object to be updated in an AJAX way - an access to the ResourceResolver
* bound to an uri scheme - the reference on the StateManager object
*/
public abstract class WebuiRequestContext extends RequestContext {
public static final char NAME_DELIMITER = '-';
protected UIApplication uiApplication_;
protected String sessionId_;
protected ResourceBundle appRes_;
private StateManager stateManager_;
private boolean responseComplete_ = false;
private boolean processRender_ = false;
private Set<UIComponent> uicomponentToUpdateByAjax;
public WebuiRequestContext(Application app) {
super(app);
}
protected WebuiRequestContext(RequestContext parentAppRequestContext, Application app_) {
super(parentAppRequestContext, app_);
}
public String getSessionId() {
return sessionId_;
}
protected void setSessionId(String id) {
sessionId_ = id;
}
public UIApplication getUIApplication() {
return uiApplication_;
}
public void setUIApplication(UIApplication uiApplication) throws Exception {
uiApplication_ = uiApplication;
appRes_ = null;
}
public ResourceBundle getApplicationResourceBundle() {
if (appRes_ == null) {
try {
Locale locale = getLocale();
appRes_ = getApplication().getResourceBundle(locale);
} catch (Exception e) {
throw new UndeclaredThrowableException(e);
}
}
return appRes_;
}
public String getActionParameterName() {
return WebuiRequestContext.ACTION;
}
public String getUIComponentIdParameterName() {
return UIComponent.UICOMPONENT;
}
@Override
public abstract URLBuilder<UIComponent> getURLBuilder();
public abstract String getRequestContextPath();
/**
* Returns the context path of the portal or null if it does not execute in the context of an aggregated portal request.
*
* @return the portal context path
*/
public abstract String getPortalContextPath();
public abstract <T> T getRequest();
public abstract <T> T getResponse();
public boolean isResponseComplete() {
return responseComplete_;
}
public void setResponseComplete(boolean b) {
responseComplete_ = b;
}
public abstract void sendRedirect(String url) throws Exception;
public boolean getProcessRender() {
return processRender_;
}
public void setProcessRender(boolean b) {
processRender_ = b;
}
public Set<UIComponent> getUIComponentToUpdateByAjax() {
return uicomponentToUpdateByAjax;
}
public void addUIComponentToUpdateByAjax(UIComponent uicomponent) {
if (uicomponentToUpdateByAjax == null) {
uicomponentToUpdateByAjax = new LinkedHashSet<UIComponent>();
}
uicomponentToUpdateByAjax.add(uicomponent);
}
public ResourceResolver getResourceResolver(String uri) {
Application app = getApplication();
RequestContext pcontext = this;
while (app != null) {
ApplicationResourceResolver appResolver = app.getResourceResolver();
ResourceResolver resolver = appResolver.getResourceResolver(uri);
if (resolver != null) {
return resolver;
}
pcontext = pcontext.getParentAppRequestContext();
if (pcontext != null) {
app = pcontext.getApplication();
} else {
app = null;
}
}
return null;
}
public StateManager getStateManager() {
return stateManager_;
}
public void setStateManager(StateManager manager) {
stateManager_ = manager;
}
public JavascriptManager getJavascriptManager() {
// Yes nasty cast
return ((WebuiRequestContext) getParentAppRequestContext()).getJavascriptManager();
}
public static String generateUUID(String prefix) {
String uuid = UUID.randomUUID().toString();
/* The following is equivalent to prefix.length() + 1 + uuid.length() - 4
* where
* + 1 is for the additional minus and
* -4 is for the number of minus signs removed from uuid
* you may want to look into the source of UUID.toString() to see that there are 4
* minus signs in a default UUID */
int uuidLen = uuid.length();
StringBuilder result = new StringBuilder(prefix.length() + uuidLen - 3);
result.append(prefix).append(NAME_DELIMITER);
for (int i = 0; i < uuidLen; i++) {
char ch = uuid.charAt(i);
if (ch != NAME_DELIMITER) {
result.append(ch);
}
}
return result.toString();
}
public static String stripUUIDSuffix(String name) {
int lastMinus = name.lastIndexOf(NAME_DELIMITER);
if (lastMinus >= 0) {
return name.substring(0, lastMinus);
} else {
return name;
}
}
}