/**
* 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.processor.handlers.xhtml;
import org.orbeon.oxf.xforms.XFormsConstants;
import org.orbeon.oxf.xforms.control.XFormsControl;
import org.orbeon.oxf.xforms.control.controls.XFormsSecretControl;
import org.orbeon.oxf.xml.*;
import org.xml.sax.*;
import org.xml.sax.helpers.AttributesImpl;
/**
* Handle xf:secret.
*/
public class XFormsSecretHandler extends XFormsControlLifecyleHandler {
private static final String HIDDEN_PASSWORD = "••••••••";
public XFormsSecretHandler() {
super(false);
}
protected void handleControlStart(String uri, String localname, String qName, Attributes attributes, String effectiveId, XFormsControl control) throws SAXException {
final XFormsSecretControl secretControl = (XFormsSecretControl) control;
final ContentHandler contentHandler = handlerContext.getController().getOutput();
final boolean isConcreteControl = secretControl != null;
final AttributesImpl containerAttributes = getEmptyNestedControlAttributesMaybeWithId(uri, localname, attributes, effectiveId, secretControl, true);
// Create xhtml:input
{
final String xhtmlPrefix = handlerContext.findXHTMLPrefix();
if (!isStaticReadonly(secretControl)) {
final String inputQName = XMLUtils.buildQName(xhtmlPrefix, "input");
containerAttributes.addAttribute("", "type", "type", XMLReceiverHelper.CDATA, "password");
containerAttributes.addAttribute("", "name", "name", XMLReceiverHelper.CDATA, effectiveId);
containerAttributes.addAttribute("", "value", "value", XMLReceiverHelper.CDATA,
handlerContext.isTemplate() || secretControl == null || secretControl.getExternalValue() == null ? "" : secretControl.getExternalValue());
// Handle accessibility attributes
handleAccessibilityAttributes(attributes, containerAttributes);
// Output all extension attributes
if (isConcreteControl) {
// Output xxf:* extension attributes
secretControl.addExtensionAttributesExceptClassAndAcceptForHandler(reusableAttributes, XFormsConstants.XXFORMS_NAMESPACE_URI);
}
if (isHTMLDisabled(secretControl))
outputDisabledAttribute(reusableAttributes);
if (isConcreteControl)
handleAriaAttributes(secretControl.isRequired(), secretControl.isValid(), containerAttributes);
// Output element
contentHandler.startElement(XMLConstants.XHTML_NAMESPACE_URI, "input", inputQName, containerAttributes);
contentHandler.endElement(XMLConstants.XHTML_NAMESPACE_URI, "input", inputQName);
} else {
// Output static read-only value
final String spanQName = XMLUtils.buildQName(xhtmlPrefix, "span");
containerAttributes.addAttribute("", "class", "class", "CDATA", "xforms-field");
contentHandler.startElement(XMLConstants.XHTML_NAMESPACE_URI, "span", spanQName, containerAttributes);
final String value = secretControl.getValue();
// TODO: Make sure that Ajax response doesn't send the value back
if (value != null && value.length() > 0)
contentHandler.characters(HIDDEN_PASSWORD.toCharArray(), 0, HIDDEN_PASSWORD.length());
contentHandler.endElement(XMLConstants.XHTML_NAMESPACE_URI, "span", spanQName);
}
}
}
}