- adding support for alerts

- allowing overriding of label and specification of alert using xs:appinfo and inner alfresco:label, alfresco:alert tags. 



git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/BRANCHES/WCM-DEV2/root@4027 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
This commit is contained in:
Ariel Backenroth
2006-10-05 05:55:22 +00:00
parent 54ac87ef6b
commit e8643d2003
5 changed files with 3219 additions and 3139 deletions

View File

@@ -182,6 +182,17 @@ public class SchemaFormBuilder
*/
public static final String XFORMS_NS_PREFIX = "xforms:";
/**
* Alfresco namespace declaration.
*/
public static final String ALFRESCO_NS =
"http://www.alfresco.org/alfresco";
/**
* Alfresco prefix
*/
public static final String ALFRESCO_NS_PREFIX = "alfresco:";
/**
* Chiba namespace declaration.
*/
@@ -914,30 +925,9 @@ public class SchemaFormBuilder
return result;
}
/**
* __UNDOCUMENTED__
*
* @param xForm __UNDOCUMENTED__
* @param annotation __UNDOCUMENTED__
* @return __UNDOCUMENTED__
*/
protected Element addHintFromDocumentation(final Document xForm,
private String extractPropertyFromAnnotation(final String namespace,
final String elementName,
final XSAnnotation annotation)
{
if (annotation == null)
return null;
final Text text = this.extractDocumentation(annotation);
if (text == null)
return null;
final Element hintElement =
xForm.createElementNS(XFORMS_NS,
SchemaFormBuilder.XFORMS_NS_PREFIX + "hint");
this.setXFormsId(hintElement);
hintElement.appendChild(xForm.importNode(text, true));
return hintElement;
}
private Text extractDocumentation(final XSAnnotation annotation)
{
if (annotation == null)
return null;
@@ -945,22 +935,15 @@ public class SchemaFormBuilder
final Document doc = DOMUtil.newDocument(true, false);
annotation.writeAnnotation(doc, XSAnnotation.W3C_DOM_DOCUMENT);
final NodeList d = doc.getElementsByTagNameNS(SchemaFormBuilder.XMLSCHEMA_NS,
"documentation");
final NodeList d = doc.getElementsByTagNameNS(namespace, elementName);
if (d.getLength() == 0)
return null;
final Text result = doc.createTextNode("");
for (int i = 0; i < d.getLength(); i++)
{
//get text value
final String text = DOMUtil.getTextNodeAsString((Element)d.item(i));
result.appendData(text);
if (i < d.getLength() - 1)
result.appendData(" ");
}
if (d.getLength() > 1)
LOGGER.warn("expect exactly one value for " + namespace +
":" + elementName +
". found " + d.getLength());
final String result = DOMUtil.getTextNodeAsString(d.item(0));
LOGGER.debug(namespace + ":" + elementName + " = " + result);
return result;
}
@@ -2267,6 +2250,9 @@ public class SchemaFormBuilder
LOGGER.debug("addSimpleType for " + controlType.getName() +
" (owningElementName=" + owningElementName + ")");
if (owner != null)
LOGGER.debug("*************** owner is " + owner.getClass() +
" name is " + owner.getName() + " ****************");
// create the <xforms:bind> element and add it to the model.
Element bindElement = xForm.createElementNS(XFORMS_NS,
SchemaFormBuilder.XFORMS_NS_PREFIX + "bind");
@@ -2322,10 +2308,12 @@ public class SchemaFormBuilder
bindId = bindId2;
}
String caption = createCaption(owningElementName);
final String caption = owner != null ? createCaption(owner) : createCaption(owningElementName);
Element formControl = this.createFormControl(xForm,
schema,
caption,
controlType,
owner,
bindId,
bindElement,
o);
@@ -2638,8 +2626,10 @@ public class SchemaFormBuilder
}
private Element createFormControl(final Document xForm,
final XSModel schema,
final String caption,
final XSTypeDefinition controlType,
final XSObject owner,
final String bindId,
final Element bindElement,
final Occurs o)
@@ -2703,20 +2693,22 @@ public class SchemaFormBuilder
//
// e.g. Please provide a valid value for 'Address'. 'Address' is a mandatory decimal field.
//
// Element alertElement = (Element)
// formControl.appendChild(xForm.createElementNS(XFORMS_NS,
// SchemaFormBuilder.XFORMS_NS_PREFIX + "alert"));
// this.setXFormsId(alertElement);
//
// StringBuffer alert =
// new StringBuffer("Please provide a valid value for '" + caption + "'.");
//
// Element enveloppe = xForm.getDocumentElement();
// alert.append(" '" + caption +
// "' is " + (o.minimum == 0 ? "an optional" : "a required") + " '" +
// createCaption(this.getXFormsTypeName(enveloppe, controlType)) +
// "' value.");
// alertElement.appendChild(xForm.createTextNode(alert.toString()));
final Element alertElement = xForm.createElementNS(XFORMS_NS,
SchemaFormBuilder.XFORMS_NS_PREFIX + "alert");
formControl.appendChild(alertElement);
this.setXFormsId(alertElement);
final Element envelope = xForm.getDocumentElement();
String alert = this.extractPropertyFromAnnotation(ALFRESCO_NS,
"alert",
this.getAnnotation(owner));
if (alert == null)
alert = ("Please provide a valid value for '" + caption + "'." +
" '" + caption +
"' is " + (o.minimum == 0 ? "an optional" : "a required") + " '" +
createCaption(this.getXFormsTypeName(envelope, schema, controlType)) +
"' value.");
alertElement.appendChild(xForm.createTextNode(alert));
return formControl;
}
@@ -2781,8 +2773,7 @@ public class SchemaFormBuilder
namespaces.put(SchemaFormBuilder.XFORMS_NS_PREFIX, SchemaFormBuilder.XFORMS_NS);
namespaces.put(SchemaFormBuilder.XLINK_NS_PREFIX, SchemaFormBuilder.XLINK_NS);
namespaces.put(SchemaFormBuilder.XMLEVENTS_NS_PREFIX, SchemaFormBuilder.XMLEVENTS_NS);
namespaces.put(SchemaFormBuilder.XMLSCHEMA_INSTANCE_NS_PREFIX,
SchemaFormBuilder.XMLSCHEMA_INSTANCE_NS);
namespaces.put(SchemaFormBuilder.XMLSCHEMA_INSTANCE_NS_PREFIX, SchemaFormBuilder.XMLSCHEMA_INSTANCE_NS);
for (String nsPrefix : namespaces.keySet())
{
this.addNamespace(envelopeElement, nsPrefix, namespaces.get(nsPrefix));
@@ -2838,11 +2829,17 @@ public class SchemaFormBuilder
return groupElement;
}
public String createCaption(final String text,
final XSObject o)
{
return this.createCaption(text, this.getAnnotation(o));
}
public String createCaption(final String text,
final XSAnnotation annotation)
{
final Text t = this.extractDocumentation(annotation);
return (t != null ? t.getNodeValue() : text);
final String s = this.extractPropertyFromAnnotation(ALFRESCO_NS, "label", annotation);
return s != null ? s : this.createCaption(text);
}
/**
@@ -2890,7 +2887,7 @@ public class SchemaFormBuilder
// TODO: Improve i18n/l10n of caption - may have to use
// a custom <appinfo> element in the XML Schema to do this.
//
return createCaption(attribute.getName());
return createCaption(attribute.getName(), attribute);
}
public String createCaption(XSAttributeUse attribute)
@@ -2898,7 +2895,7 @@ public class SchemaFormBuilder
// TODO: Improve i18n/l10n of caption - may have to use
// a custom <appinfo> element in the XML Schema to do this.
//
return createCaption(attribute.getAttrDeclaration().getName());
return createCaption(attribute.getAttrDeclaration().getName(), attribute);
}
/**
@@ -2916,7 +2913,7 @@ public class SchemaFormBuilder
// TODO: Improve i18n/l10n of caption - may have to use
// a custom <appinfo> element in the XML Schema to do this.
//
return createCaption(element.getName());
return createCaption(element.getName(), element);
}
/**
@@ -2930,16 +2927,15 @@ public class SchemaFormBuilder
// TODO: Improve i18n/l10n of caption - may have to use
// a custom <appinfo> element in the XML Schema to do this.
//
if (element instanceof XSElementDeclaration) {
return createCaption(((XSElementDeclaration) element).getName());
} else if (element instanceof XSAttributeDeclaration) {
return createCaption(((XSAttributeDeclaration) element).getName());
} else if (element instanceof XSAttributeUse) {
return createCaption(((XSAttributeUse) element).getAttrDeclaration().getName());
} else
if (element instanceof XSElementDeclaration)
return createCaption((XSElementDeclaration)element);
if (element instanceof XSAttributeDeclaration)
return createCaption((XSAttributeDeclaration)element);
if (element instanceof XSAttributeUse)
return createCaption((XSAttributeUse)element);
LOGGER.warn("WARNING: createCaption: element is not an attribute nor an element: "
+ element.getClass().getName());
return null;
}
@@ -3255,17 +3251,29 @@ public class SchemaFormBuilder
*/
public Element createHint(Document xForm, XSObject node)
{
XSAnnotation annotation = null;
if (node instanceof XSElementDeclaration)
annotation = ((XSElementDeclaration)node).getAnnotation();
else if (node instanceof XSAttributeDeclaration)
annotation = ((XSAttributeDeclaration)node).getAnnotation();
else if (node instanceof XSAttributeUse)
annotation = ((XSAttributeUse)node).getAttrDeclaration().getAnnotation();
final XSAnnotation annotation = this.getAnnotation(node);
if (annotation == null)
return null;
final String s = this.extractPropertyFromAnnotation(ALFRESCO_NS, "hint", annotation);
if (s == null)
return null;
final Element hintElement =
xForm.createElementNS(XFORMS_NS,
SchemaFormBuilder.XFORMS_NS_PREFIX + "hint");
this.setXFormsId(hintElement);
hintElement.appendChild(xForm.createTextNode(s));
return hintElement;
}
return (annotation != null
? addHintFromDocumentation(xForm, annotation)
: null);
private XSAnnotation getAnnotation(final XSObject o)
{
return (o instanceof XSElementDeclaration
? ((XSElementDeclaration)o).getAnnotation()
: (o instanceof XSAttributeDeclaration
? ((XSAttributeDeclaration)o).getAnnotation()
: (o instanceof XSAttributeUse
? ((XSAttributeUse)o).getAttrDeclaration().getAnnotation()
: null)));
}
/**
@@ -3465,11 +3473,17 @@ public class SchemaFormBuilder
registry.getDOMImplementation("XS-Loader");
final XSLoader schemaLoader = xsImpl.createXSLoader(null);
return schemaLoader.load(in);
} catch (ClassNotFoundException x) {
}
catch (ClassNotFoundException x)
{
throw new FormBuilderException(x);
} catch (InstantiationException x) {
}
catch (InstantiationException x)
{
throw new FormBuilderException(x);
} catch (IllegalAccessException x) {
}
catch (IllegalAccessException x)
{
throw new FormBuilderException(x);
}
}

View File

@@ -1,5 +1,6 @@
<jsp:root version="1.2"
xmlns:jsp="http://java.sun.com/JSP/Page"
xmlns:alfresco="http://www.alfresco.org/alfresco"
xmlns:c="http://java.sun.com/jsp/jstl/core"
xmlns:pr="http://www.alfresco.org/pr">
<jsp:directive.page language="java" contentType="text/html; charset=UTF-8"/>
@@ -13,7 +14,9 @@
<jsp:attribute name="value"><c:out value="${companyFooter.href}"/></jsp:attribute>
<jsp:body>
<xs:annotation>
<xs:documentation><c:out value="${companyFooter.name}"/></xs:documentation>
<xs:appinfo>
<alfresco:label><c:out value="${companyFooter.name}"/></alfresco:label>
</xs:appinfo>
</xs:annotation>
</jsp:body>
</jsp:element>

View File

@@ -1,13 +1,44 @@
<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:alfresco="http://www.alfresco.org/alfresco"
elementFormDefault="qualified">
<xs:simpleType name="five_string_values">
<xs:restriction base="xs:string">
<xs:enumeration value="one"/>
<xs:enumeration value="two"/>
<xs:enumeration value="three"/>
<xs:enumeration value="four"/>
<xs:enumeration value="five"/>
<xs:enumeration value="one">
<xs:annotation>
<xs:appinfo>
<alfresco:label>1 - eno</alfresco:label>
</xs:appinfo>
</xs:annotation>
</xs:enumeration>
<xs:enumeration value="two">
<xs:annotation>
<xs:appinfo>
<alfresco:label>2 - owt</alfresco:label>
</xs:appinfo>
</xs:annotation>
</xs:enumeration>
<xs:enumeration value="three">
<xs:annotation>
<xs:appinfo>
<alfresco:label>3 - eerht</alfresco:label>
</xs:appinfo>
</xs:annotation>
</xs:enumeration>
<xs:enumeration value="four">
<xs:annotation>
<xs:appinfo>
<alfresco:label>4 - ruof</alfresco:label>
</xs:appinfo>
</xs:annotation>
</xs:enumeration>
<xs:enumeration value="five">
<xs:annotation>
<xs:appinfo>
<alfresco:label>5 - evif</alfresco:label>
</xs:appinfo>
</xs:annotation>
</xs:enumeration>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="ten_string_values">
@@ -38,7 +69,14 @@
<xs:element name="components">
<xs:complexType>
<xs:sequence>
<xs:element name="required_textfield" type="xs:string" minOccurs="1" maxOccurs="1"/>
<xs:element name="required_textfield" type="xs:string" minOccurs="1" maxOccurs="1">
<xs:annotation>
<xs:appinfo>
<alfresco:label>A Required String</alfresco:label>
<alfresco:alert>Please enter a non zero length string</alfresco:alert>
</xs:appinfo>
</xs:annotation>
</xs:element>
<xs:element name="optional_textfield" type="xs:string" minOccurs="0" maxOccurs="1"/>
<xs:element name="prefilled_textfield" type="xs:string" minOccurs="0" maxOccurs="1" default="i am the default value"/>
<xs:element name="integer" type="xs:integer"/>
@@ -49,7 +87,14 @@
<xs:element name="combobox" type="ten_string_values"/>
<xs:element name="list_of_five" type="five_number_list"/>
<xs:element name="list_of_ten" type="ten_number_list"/>
<xs:element name="list_of_ten_select_three" type="ten_number_list_select_three"/>
<xs:element name="list_of_ten_select_three" type="ten_number_list_select_three">
<xs:annotation>
<xs:appinfo>
<alfresco:label>10 select 3</alfresco:label>
<alfresco:alert>Please select at least 3 items from the list.</alfresco:alert>
</xs:appinfo>
</xs:annotation>
</xs:element>
<xs:element name="textarea" type="xs:anyType"/>
<xs:element name="checkbox_default_true" type="xs:boolean" default="true"/>
<xs:element name="checkbox_default_false" type="xs:boolean" default="false"/>

View File

@@ -15,6 +15,7 @@
<xs:element name="one-to-inf" type="xs:string" minOccurs="1" maxOccurs="unbounded"/>
<xs:element name="zero-to-inf" type="xs:string" minOccurs="0" maxOccurs="unbounded"/>
<xs:element name="one-to-five" type="xs:string" minOccurs="1" maxOccurs="5"/>
<xs:element name="three-to-five" type="xs:string" minOccurs="3" maxOccurs="5"/>
<xs:element name="zero-to-five" type="xs:string" minOccurs="0" maxOccurs="5"/>
<xs:element name="one-to-five-multi" type="multi-input" minOccurs="1" maxOccurs="5"/>
<xs:element name="zero-to-five-multi" type="multi-input" minOccurs="0" maxOccurs="5"/>

View File

@@ -122,11 +122,28 @@ dojo.declare("alfresco.xforms.Widget",
}
return null;
},
_getAlertNode: function()
{
var labels = this.node.getElementsByTagName("alert");
for (var i = 0; i < labels.length; i++)
{
dojo.debug("parent " + labels[i].parentNode.nodeName +
" o " + this.node.nodeName);
if (labels[i].parentNode == this.node)
return labels[i];
}
return null;
},
getLabel: function()
{
var node = this._getLabelNode();
return node ? dojo.dom.textContent(node) : "";
},
getAlert: function()
{
var node = this._getAlertNode();
return node ? dojo.dom.textContent(node) : "";
},
_updateDisplay: function()
{
// this.domContainer.style.backgroundColor =
@@ -1206,7 +1223,7 @@ dojo.declare("alfresco.xforms.XForm",
msg += "<br/><ul>";
for (var j = 0; j < invalid.length; j++)
{
msg += "<li>" + invalid[j].getLabel() + "</li>";
msg += "<li>" + invalid[j].getAlert() + "</li>";
}
msg += "</ul>";
_show_error(msg);