public void encodeBegin(FacesContext facesContextOrg, UIComponent component) throws IOException {
UIPage page = (UIPage) component;
// invoke prepareRender
TobagoFacesContext facesContext;
if (facesContextOrg instanceof TobagoFacesContext) {
facesContext = (TobagoFacesContext) facesContextOrg;
} else {
facesContext = new TobagoFacesContext(facesContextOrg);
}
RenderUtils.prepareRendererAll(facesContext, page);
LayoutContext layoutContext = new LayoutContext(page);
layoutContext.layout();
TobagoResponseWriter writer = HtmlRendererUtils.getTobagoResponseWriter(facesContext);
// reset responseWriter and render page
facesContext.setResponseWriter(writer);
ResponseUtils.ensureNoCacheHeader(facesContext);
if (LOG.isDebugEnabled()) {
for (Object o : page.getAttributes().entrySet()) {
Map.Entry entry = (Map.Entry) o;
LOG.debug("*** '" + entry.getKey() + "' -> '" + entry.getValue() + "'");
}
}
Application application = facesContext.getApplication();
ViewHandler viewHandler = application.getViewHandler();
String viewId = facesContext.getViewRoot().getViewId();
String formAction = viewHandler.getActionURL(facesContext, viewId);
formAction = facesContext.getExternalContext().encodeActionURL(formAction);
String contentType = writer.getContentTypeWithCharSet();
ResponseUtils.ensureContentTypeHeader(facesContext, contentType);
String clientId = page.getClientId(facesContext);
final ClientProperties client = VariableResolverUtils.resolveClientProperties(facesContext);
final ProjectStage projectStage = TobagoConfig.getInstance(facesContext).getProjectStage();
final boolean developmentMode = projectStage == ProjectStage.Development;
final boolean debugMode = client.isDebugMode() || developmentMode;
final boolean productionMode = !debugMode && projectStage == ProjectStage.Production;
boolean calculateScrollbarWeight = false;
int clientLogSeverity = 2;
if (debugMode) {
String severity = (String) facesContext.getExternalContext().getRequestMap().get(CLIENT_DEBUG_SEVERITY);
LOG.info("get " + CLIENT_DEBUG_SEVERITY + " = " + severity);
if (severity != null) {
try {
int index = severity.indexOf(';');
if (index == -1) {
index = severity.length();
}
clientLogSeverity = Integer.parseInt(severity.substring(0, index));
} catch (NumberFormatException e) {/* ignore; use default*/ }
}
}
if (!facesContext.isAjax()) {
HtmlRendererUtils.renderDojoDndSource(facesContext, component);
String title = (String) page.getAttributes().get(Attributes.LABEL);
writer.startElement(HtmlElements.HEAD, null);
if (debugMode) {
writer.writeJavascript("var TbgHeadStart = new Date();");
}
// meta
// this is needed, because websphere 6.0? ignores the setting of the content type on the response
writer.startElement(HtmlElements.META, null);
writer.writeAttribute(HtmlAttributes.HTTP_EQUIV, "Content-Type", false);
writer.writeAttribute(HtmlAttributes.CONTENT, contentType, false);
writer.endElement(HtmlElements.META);
// title
writer.startElement(HtmlElements.TITLE, null);
writer.writeText(title != null ? title : "");
writer.endElement(HtmlElements.TITLE);
final Theme theme = client.getTheme();
// style files
for (String styleFile : theme.getStyleResources(productionMode)) {
writeStyle(facesContext, writer, styleFile);
}
for (String styleFile : facesContext.getStyleFiles()) {
writeStyle(facesContext, writer, styleFile);
}
String icon = page.getApplicationIcon();
if (icon != null) {
// XXX unify with image renderer
if (ResourceManagerUtils.isAbsoluteResource(icon)) {
// absolute Path to image : nothing to do
} else {
icon = ResourceManagerUtils.getImageWithPath(facesContext, icon);
}
writer.startElement(HtmlElements.LINK, null);
if (icon.endsWith(".ico")) {
writer.writeAttribute(HtmlAttributes.REL, "shortcut icon", false);
writer.writeAttribute(HtmlAttributes.HREF, icon, false);
} else {
// XXX IE only supports ICO files for favicons
writer.writeAttribute(HtmlAttributes.REL, "icon", false);
writer.writeAttribute(HtmlAttributes.TYPE, MimeTypeUtils.getMimeTypeForFile(icon), false);
writer.writeAttribute(HtmlAttributes.HREF, icon, false);
}
writer.endElement(HtmlElements.LINK);
}
// style sniplets
Set<String> styleBlocks = facesContext.getStyleBlocks();
if (styleBlocks.size() > 0) {
writer.startElement(HtmlElements.STYLE, null);
for (String cssBlock : styleBlocks) {
writer.write(cssBlock);
}
writer.endElement(HtmlElements.STYLE);
}
if (debugMode) {
boolean hideClientLogging = true;
String severity = (String) facesContext.getExternalContext().getRequestMap().get(CLIENT_DEBUG_SEVERITY);
LOG.info("get " + CLIENT_DEBUG_SEVERITY + " = " + severity);
if (severity != null) {
try {
int index = severity.indexOf(';');
if (index == -1) {
index = severity.length();
}
clientLogSeverity = Integer.parseInt(severity.substring(0, index));
} catch (NumberFormatException e) {/* ignore; use default*/ }
hideClientLogging = !severity.contains("show");
}
// the jquery ui is used in moment only for the logging area...
facesContext.getOnloadScripts().add(0, "new LOG.LogArea({hide: " + hideClientLogging + "});");
}
// render remaining script tags
for (String scriptFile: theme.getScriptResources(productionMode)) {
encodeScript(facesContext, writer, scriptFile);
}
for (String scriptFile : facesContext.getScriptFiles()) {
encodeScript(facesContext, writer, scriptFile);
}
// focus id
String focusId = page.getFocusId();
if (focusId != null) {
writer.startJavascript();
writer.write("Tobago.focusId = '");
writer.write(focusId);
writer.write("';");
writer.endJavascript();
}
if (component.getFacets().containsKey(Facets.ACTION)) {
UIComponent command = component.getFacet(Facets.ACTION);
if (command != null && command.isRendered()) {
int duration = ComponentUtils.getIntAttribute(command, Attributes.DELAY, 100);
boolean transition = ComponentUtils.getBooleanAttribute(command, Attributes.TRANSITION);
String target = ComponentUtils.getStringAttribute(command, Attributes.TARGET);
String action
= HtmlRendererUtils.createSubmitAction(command.getClientId(facesContext), transition, target, null);
facesContext.getOnloadScripts().add("setTimeout(\"" + action + "\", " + duration + ");\n");
}
}
calculateScrollbarWeight
= client.getVerticalScrollbarWeight() == null || client.getHorizontalScrollbarWeight() == null;
if (calculateScrollbarWeight) {
facesContext.getOnloadScripts().add(
"Tobago.calculateScrollbarWeights('" + clientId + ComponentUtils.SUB_SEPARATOR + "scrollbarWeight" + "');");
} else {
facesContext.getOnloadScripts().add(
"Tobago.Config.set('Tobago', 'verticalScrollbarWeight', '"
+ client.getVerticalScrollbarWeight().getPixel() + "');");
facesContext.getOnloadScripts().add(
"Tobago.Config.set('Tobago', 'horizontalScrollbarWeight', '"
+ client.getHorizontalScrollbarWeight().getPixel() + "');");
}
UIComponent command = null;
if (component.getFacets().containsKey(Facets.RESIZE_ACTION)) {
Deprecation.LOG.warn("Please use 'resize' instead of 'resizeAction' as facet.");
UIComponent facet = component.getFacet(Facets.RESIZE_ACTION);
if (facet instanceof UICommand) {
command = facet;
} else if (facet instanceof UIForm && facet.getChildCount() == 1) {
Deprecation.LOG.warn("Please don't use a form, but a command with immediate=true instead.");
command = (UIComponent) facet.getChildren().get(0);
}
}
if (component.getFacets().containsKey(Facets.RESIZE)) {
UIComponent facet = component.getFacet(Facets.RESIZE);
if (facet instanceof UICommand) {
command = facet;
} else if (facet instanceof UIForm && facet.getChildCount() == 1) {
Deprecation.LOG.warn("Please don't use a form, but a command with immediate=true instead.");
command = (UIComponent) facet.getChildren().get(0);
}
}
if (command != null && command.isRendered()) {
final CommandRendererHelper helper = new CommandRendererHelper(facesContext, (AbstractUICommandBase) command);
if (!helper.isDisabled()) {
writer.writeJavascript("Tobago.resizeAction = function() {\n" + helper.getOnclick() + "\n};\n");
}
}
writer.startJavascript();
// onload script
writeEventFunction(writer, facesContext.getOnloadScripts(), "load", false);
// onunload script
writeEventFunction(writer, facesContext.getOnunloadScripts(), "unload", false);
// onexit script
writeEventFunction(writer, facesContext.getOnexitScripts(), "exit", false);
writeEventFunction(writer, facesContext.getOnsubmitScripts(), "submit", true);
int debugCounter = 0;
for (String scriptBlock : facesContext.getScriptBlocks()) {
if (LOG.isDebugEnabled()) {
LOG.debug("write scriptblock " + ++debugCounter + " :\n" + scriptBlock);
}
writer.write(scriptBlock);
writer.write('\n');
}
writer.endJavascript();
writer.endElement(HtmlElements.HEAD);
}
String defaultActionId = page.getDefaultActionId() != null ? page.getDefaultActionId() : "";
writer.startElement(HtmlElements.BODY, page);
writer.writeAttribute(HtmlAttributes.ONLOAD, "Tobago.init('" + clientId + "');", false);
// writer.writeAttribute("onunload", "Tobago.onexit();", null);
writer.writeIdAttribute(clientId);
writer.writeClassAttribute(Classes.create(page));
writer.startJavascript();
writer.write("Tobago.pngFixBlankImage = '");
writer.write(ResourceManagerUtils.getImageWithPath(facesContext, "image/blank.gif"));
writer.write("';\n");
writer.write("Tobago.OVERLAY_BACKGROUND = '");
writer.write(ResourceManagerUtils.getImageWithPath(facesContext, "image/tobago-overlay-background.png"));
writer.write("';\n");
writer.write("Tobago.OVERLAY_WAIT = '");
writer.write(ResourceManagerUtils.getImageWithPath(facesContext, "image/tobago-overlay-wait.gif"));
writer.write("';\n");
writer.endJavascript();
/*
if (debugMode) {
final String[] jsFiles = new String[]{
"script/logging.js"
};
final String[] jsCommand = new String[]{"new LOG.LogArea({hide: " + hideClientLogging + "});"};
HtmlRendererUtils.writeScriptLoader(facesContext, jsFiles, jsCommand);
writer.writeJavascript("TbgTimer.startBody = new Date();");
}
*/
if (debugMode) {
writer.writeJavascript("TbgTimer.startBody = new Date();");
}
writer.startElement(HtmlElements.FORM, page);
writer.writeAttribute(HtmlAttributes.ACTION, formAction, true);
writer.writeIdAttribute(page.getFormId(facesContext));
writer.writeAttribute(HtmlAttributes.METHOD, getMethod(page), false);
String enctype = facesContext.getEnctype();
if (enctype != null) {
writer.writeAttribute(HtmlAttributes.ENCTYPE, enctype, false);
}
// TODO: enable configuration of 'accept-charset'
writer.writeAttribute(HtmlAttributes.ACCEPT_CHARSET, AbstractUIPage.FORM_ACCEPT_CHARSET, false);
// TODO evaluate 'accept' attribute usage
//writer.writeAttribute(HtmlAttributes.ACCEPT, );
writer.startElement(HtmlElements.INPUT, null);
writer.writeAttribute(HtmlAttributes.TYPE, "hidden", false);
writer.writeNameAttribute(clientId + ComponentUtils.SUB_SEPARATOR + "form-action");
writer.writeIdAttribute(clientId + ComponentUtils.SUB_SEPARATOR + "form-action");
writer.writeAttribute(HtmlAttributes.VALUE, defaultActionId, true);
writer.endElement(HtmlElements.INPUT);
writer.startElement(HtmlElements.INPUT, null);
writer.writeAttribute(HtmlAttributes.TYPE, "hidden", false);
writer.writeNameAttribute(clientId + ComponentUtils.SUB_SEPARATOR + "context-path");
writer.writeIdAttribute(clientId + ComponentUtils.SUB_SEPARATOR + "context-path");
writer.writeAttribute(HtmlAttributes.VALUE, facesContext.getExternalContext().getRequestContextPath(), true);
writer.endElement(HtmlElements.INPUT);
writer.startElement(HtmlElements.INPUT, null);
writer.writeAttribute(HtmlAttributes.TYPE, "hidden", false);
writer.writeNameAttribute(clientId + ComponentUtils.SUB_SEPARATOR + "action-position");