/**
* Copyright (C) 2010 Orbeon, Inc.
*
* This program 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 program 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.
*
* The full text of the license is available at http://www.gnu.org/copyleft/lesser.html
*/
package org.orbeon.oxf.xforms.action.actions;
import org.orbeon.dom.Element;
import org.orbeon.dom.QName;
import org.orbeon.oxf.common.OXFException;
import org.orbeon.oxf.util.IndentedLogger;
import org.orbeon.oxf.xforms.XFormsConstants;
import org.orbeon.oxf.xforms.XFormsContainingDocument;
import org.orbeon.oxf.xforms.XFormsUtils;
import org.orbeon.oxf.xforms.action.XFormsAction;
import org.orbeon.oxf.xforms.action.XFormsActionInterpreter;
import org.orbeon.oxf.xforms.xbl.Scope;
import org.orbeon.oxf.xml.dom4j.Dom4jUtils;
import org.orbeon.saxon.om.Item;
import java.util.HashMap;
import java.util.Map;
/**
* 10.12 The message Element
*/
public class XFormsMessageAction extends XFormsAction {
private static final Map<QName, String> SUPPORTED_APPEARANCES = new HashMap<QName, String>();
private static final Map<QName, String> LOG_APPEARANCES = new HashMap<QName, String>();
static {
// Standard levels
SUPPORTED_APPEARANCES.put(XFormsConstants.XFORMS_MODAL_LEVEL_QNAME, "");
SUPPORTED_APPEARANCES.put(XFormsConstants.XFORMS_MODELESS_LEVEL_QNAME, "");
SUPPORTED_APPEARANCES.put(XFormsConstants.XFORMS_EPHEMERAL_LEVEL_QNAME, "");
// Extension levels
LOG_APPEARANCES.put(XFormsConstants.XXFORMS_LOG_DEBUG_LEVEL_QNAME, "");
LOG_APPEARANCES.put(XFormsConstants.XXFORMS_LOG_INFO_DEBUG_LEVEL_QNAME, "");
LOG_APPEARANCES.put(XFormsConstants.XXFORMS_LOG_WARN_DEBUG_LEVEL_QNAME, "");
LOG_APPEARANCES.put(XFormsConstants.XXFORMS_LOG_ERROR_DEBUG_LEVEL_QNAME, "");
SUPPORTED_APPEARANCES.putAll(LOG_APPEARANCES);
}
public void execute(XFormsActionInterpreter actionInterpreter, Element actionElement,
Scope actionScope, boolean hasOverriddenContext, Item overriddenContext) {
final XFormsContainingDocument containingDocument = actionInterpreter.containingDocument();
{
final String levelAttribute;
final QName levelQName;
{
final String tempLevelAttribute = actionElement.attributeValue(XFormsConstants.LEVEL_QNAME);
if (tempLevelAttribute == null) {
// "The default is "modal" if the attribute is not specified."
levelQName = XFormsConstants.XFORMS_MODAL_LEVEL_QNAME;
levelAttribute = levelQName.getName();
} else {
levelAttribute = tempLevelAttribute;
levelQName = Dom4jUtils.extractAttributeValueQName(actionElement, XFormsConstants.LEVEL_QNAME);
}
}
// Get message value
final String messageValue; {
final String elementValue = XFormsUtils.getElementValue(actionInterpreter.container(),
actionInterpreter.actionXPathContext(), actionInterpreter.getSourceEffectiveId(actionElement), actionElement, false, false, null);
// If we got a null consider the message to be an empty string
messageValue = elementValue != null ? elementValue : "";
}
if (LOG_APPEARANCES.get(levelQName) != null) {
// Special log appearance
final IndentedLogger indentedLogger = containingDocument.indentedLogger();
if (XFormsConstants.XXFORMS_LOG_DEBUG_LEVEL_QNAME.equals(levelQName)) {
indentedLogger.logDebug("xf:message", messageValue);
} else if (XFormsConstants.XXFORMS_LOG_INFO_DEBUG_LEVEL_QNAME.equals(levelQName)) {
indentedLogger.logInfo("xf:message", messageValue);
} else if (XFormsConstants.XXFORMS_LOG_WARN_DEBUG_LEVEL_QNAME.equals(levelQName)) {
indentedLogger.logWarning("xf:message", messageValue);
} else if (XFormsConstants.XXFORMS_LOG_ERROR_DEBUG_LEVEL_QNAME.equals(levelQName)) {
indentedLogger.logError("xf:message", messageValue);
}
} else if (SUPPORTED_APPEARANCES.get(levelQName) != null) {
// Any other supported appearance are sent to the client
final String level;
if (levelQName.getNamespacePrefix().equals("")) {
level = levelAttribute;
} else {
level = "{" + levelQName.getNamespaceURI() + "}" + levelQName.getName();
}
// Store message for sending to client
containingDocument.addMessageToRun(messageValue, level);
// NOTE: In the future, we *may* want to save and resume the event state before and after
// displaying a message, in order to possibly provide a behavior which is more consistent with what
// users may expect regarding actions executed after xf:message.
} else {
// Unsupported appearance
throw new OXFException("xf:message element's 'level' attribute must have value: 'ephemeral'|'modeless'|'modal'|'xxf:log-debug'|'xxf:log-info'|'xxf:log-warn'|'xxf:log-error'.");
}
}
}
}