diff --git a/source/java/org/alfresco/web/forms/xforms/FormBuilderException.java b/source/java/org/alfresco/web/forms/xforms/FormBuilderException.java
index 3eff8a4d30..98988bd1b6 100644
--- a/source/java/org/alfresco/web/forms/xforms/FormBuilderException.java
+++ b/source/java/org/alfresco/web/forms/xforms/FormBuilderException.java
@@ -51,4 +51,15 @@ public class FormBuilderException
{
super(x);
}
+
+ /**
+ * Constructs an instance of FormBuilderException
with the specified root exception.
+ *
+ * @param msg the detail message.
+ * @param x The root exception.
+ */
+ public FormBuilderException(String msg, Exception x)
+ {
+ super(msg, x);
+ }
}
diff --git a/source/java/org/alfresco/web/forms/xforms/SchemaFormBuilder.java b/source/java/org/alfresco/web/forms/xforms/SchemaFormBuilder.java
index 5dd3479aab..f3d06a4024 100644
--- a/source/java/org/alfresco/web/forms/xforms/SchemaFormBuilder.java
+++ b/source/java/org/alfresco/web/forms/xforms/SchemaFormBuilder.java
@@ -723,11 +723,14 @@ public class SchemaFormBuilder
final String pathToRoot,
final boolean checkIfExtension,
final ResourceBundle resourceBundle)
+ throws FormBuilderException
{
XSObjectList attrUses = controlType.getAttributeUses();
if (attrUses == null)
+ {
return;
+ }
for (int i = 0; i < attrUses.getLength(); i++)
{
final XSAttributeUse currentAttributeUse = (XSAttributeUse)attrUses.item(i);
@@ -771,41 +774,56 @@ public class SchemaFormBuilder
{
if (LOGGER.isDebugEnabled())
LOGGER.debug("bindId found: " + bindId);
-
+
JXPathContext context = JXPathContext.newContext(formSection.getOwnerDocument());
final Pointer pointer =
context.getPointer("//*[@" + NamespaceConstants.XFORMS_PREFIX + ":bind='" + bindId + "']");
if (pointer != null)
+ {
control = (Element)pointer.getNode();
+ }
}
-
+
//copy it
if (control == null)
+ {
LOGGER.warn("Corresponding control not found");
+ }
else
{
Element newControl = (Element) control.cloneNode(true);
//set new Ids to XForm elements
this.resetXFormIds(newControl);
-
+
formSection.appendChild(newControl);
}
}
else
{
- defaultInstanceElement.setAttributeNS(this.targetNamespace,
- // XXXarielb - i probably need the prefix here i.e. "alf:" + attributeName
- attributeName,
- (currentAttributeUse.getConstraintType() == XSConstants.VC_NONE
- ? null
- : currentAttributeUse.getConstraintValue()));
final String newPathToRoot =
(pathToRoot == null || pathToRoot.length() == 0
? "@" + currentAttribute.getName()
: (pathToRoot.endsWith("/")
? pathToRoot + "@" + currentAttribute.getName()
: pathToRoot + "/@" + currentAttribute.getName()));
-
+
+ LOGGER.debug("adding attribute " + attributeName +
+ " at " + newPathToRoot);
+ try
+ {
+ final String defaultValue = (currentAttributeUse.getConstraintType() == XSConstants.VC_NONE
+ ? null
+ : currentAttributeUse.getConstraintValue());
+ defaultInstanceElement.setAttributeNS(this.targetNamespace,
+ // XXXarielb - i probably need the prefix here i.e. "alf:" + attributeName
+ attributeName,
+ defaultValue);
+ }
+ catch (Exception e)
+ {
+ throw new FormBuilderException("error retrieving default value for attribute " +
+ attributeName + " at " + newPathToRoot, e);
+ }
this.addSimpleType(xForm,
modelSection,
formSection,
@@ -829,6 +847,7 @@ public class SchemaFormBuilder
boolean relative,
final boolean checkIfExtension,
final ResourceBundle resourceBundle)
+ throws FormBuilderException
{
if (controlType == null)
{
@@ -846,37 +865,32 @@ public class SchemaFormBuilder
// add a group node and recurse
//
- Element groupElement = this.createGroup(xForm,
- modelSection,
- formSection,
- owner,
- resourceBundle);
- Element groupWrapper = groupElement;
-
- if (groupElement != modelSection)
- {
- groupWrapper = groupElement;
- }
+ final Element groupElement = this.createGroup(xForm,
+ modelSection,
+ formSection,
+ owner,
+ resourceBundle);
final SchemaUtil.Occurance o = SchemaUtil.getOccurance(owner);
final Element repeatSection = this.addRepeatIfNecessary(xForm,
modelSection,
- groupWrapper,
+ groupElement,
controlType,
o,
pathToRoot);
- Element repeatContentWrapper = repeatSection;
-
- if (repeatSection != groupWrapper)
+ if (repeatSection != groupElement)
{
+ groupElement.setAttributeNS(NamespaceConstants.XFORMS_NS,
+ NamespaceConstants.XFORMS_PREFIX + ":appearance",
+ "repeated");
+
// we have a repeat
- repeatContentWrapper = repeatSection;
relative = true;
}
this.addComplexTypeChildren(xForm,
modelSection,
defaultInstanceElement,
- repeatContentWrapper,
+ repeatSection,
schema,
controlType,
owner,
@@ -897,6 +911,7 @@ public class SchemaFormBuilder
final boolean relative,
final boolean checkIfExtension,
final ResourceBundle resourceBundle)
+ throws FormBuilderException
{
if (controlType == null)
@@ -1015,6 +1030,7 @@ public class SchemaFormBuilder
final XSElementDeclaration elementDecl,
final String pathToRoot,
final ResourceBundle resourceBundle)
+ throws FormBuilderException
{
XSTypeDefinition controlType = elementDecl.getTypeDefinition();
if (controlType == null)
@@ -1483,17 +1499,19 @@ public class SchemaFormBuilder
final SchemaUtil.Occurance o,
final boolean checkIfExtension,
final ResourceBundle resourceBundle)
+ throws FormBuilderException
{
if (group == null)
+ {
return;
+ }
- final Element repeatSection =
- this.addRepeatIfNecessary(xForm,
- modelSection,
- formSection,
- owner.getTypeDefinition(),
- o,
- pathToRoot);
+ final Element repeatSection = this.addRepeatIfNecessary(xForm,
+ modelSection,
+ formSection,
+ owner.getTypeDefinition(),
+ o,
+ pathToRoot);
Element repeatContentWrapper = repeatSection;
if (repeatSection != formSection)
@@ -1629,12 +1647,11 @@ public class SchemaFormBuilder
" default instance element for " + elementName +
" at path " + path);
// update the default instance
- if (elementOccurs.maximum == 1)
- {
- defaultInstanceElement.appendChild(newDefaultInstanceElement.cloneNode(true));
- }
- else
+ if (elementOccurs.isRepeated())
{
+ LOGGER.debug("adding " + (elementOccurs.minimum + 1) +
+ " default instance elements for " + elementName +
+ " at path " + path);
for (int i = 0; i < elementOccurs.minimum + 1; i++)
{
final Element e = (Element)newDefaultInstanceElement.cloneNode(true);
@@ -1647,6 +1664,18 @@ public class SchemaFormBuilder
defaultInstanceElement.appendChild(e);
}
}
+ else
+ {
+ LOGGER.debug("adding one default instance element for " + elementName +
+ " at path " + path);
+ if (elementOccurs.minimum == 0)
+ {
+ newDefaultInstanceElement.setAttributeNS(NamespaceConstants.XMLSCHEMA_INSTANCE_NS,
+ NamespaceConstants.XMLSCHEMA_INSTANCE_PREFIX + ":nil",
+ "true");
+ }
+ defaultInstanceElement.appendChild(newDefaultInstanceElement);
+ }
}
}
else
@@ -1671,13 +1700,16 @@ public class SchemaFormBuilder
{
// add xforms:repeat section if this element re-occurs
- //
if (o.maximum == 1)
+ {
return formSection;
+ }
if (LOGGER.isDebugEnabled())
+ {
LOGGER.debug("AddRepeatIfNecessary for multiple element for type " +
controlType.getName() + ", maxOccurs=" + o.maximum);
+ }
final Element repeatSection =
xForm.createElementNS(NamespaceConstants.XFORMS_NS,
@@ -1724,6 +1756,10 @@ public class SchemaFormBuilder
//add a group inside the repeat?
final Element group = xForm.createElementNS(NamespaceConstants.XFORMS_NS,
NamespaceConstants.XFORMS_PREFIX + ":group");
+
+ group.setAttributeNS(NamespaceConstants.XFORMS_NS,
+ NamespaceConstants.XFORMS_PREFIX + ":appearance",
+ "repeated");
this.setXFormsId(group);
repeatSection.appendChild(group);
return group;
@@ -1770,6 +1806,10 @@ public class SchemaFormBuilder
formSection,
(XSElementDeclaration)owner,
resourceBundle);
+ groupElement.setAttributeNS(NamespaceConstants.XFORMS_NS,
+ NamespaceConstants.XFORMS_PREFIX + ":appearance",
+ "repeated");
+
//set content
formSection = groupElement;
}
diff --git a/source/test-resources/xforms/unit-tests/simple-test/integer-test.xsd b/source/test-resources/xforms/unit-tests/simple-test/integer-test.xsd
new file mode 100644
index 0000000000..4275ea15bc
--- /dev/null
+++ b/source/test-resources/xforms/unit-tests/simple-test/integer-test.xsd
@@ -0,0 +1,169 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Integer Restricted -10 to 10
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/source/test-resources/xforms/unit-tests/simple-test/select1-test.xsd b/source/test-resources/xforms/unit-tests/simple-test/select1-test.xsd
index 00d73edeea..8f9bd95b65 100644
--- a/source/test-resources/xforms/unit-tests/simple-test/select1-test.xsd
+++ b/source/test-resources/xforms/unit-tests/simple-test/select1-test.xsd
@@ -19,24 +19,70 @@
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/source/web/scripts/ajax/xforms.js b/source/web/scripts/ajax/xforms.js
index 3dc9d60924..7007d079c9 100644
--- a/source/web/scripts/ajax/xforms.js
+++ b/source/web/scripts/ajax/xforms.js
@@ -548,14 +548,12 @@ dojo.declare("alfresco.xforms.AbstractSelectWidget",
valid = _evaluateXPath(binding.constraint, value, XPathResult.BOOLEAN_TYPE);
}
dojo.debug("valid " + dojo.dom.textContent(value) + "? " + valid);
- if (valid)
- {
- result.push({
- id: value.getAttribute("id"),
- label: dojo.dom.textContent(label),
- value: dojo.dom.textContent(value)
- });
- }
+ result.push({
+ id: value.getAttribute("id"),
+ label: valid ? dojo.dom.textContent(label) : "",
+ value: valid ? dojo.dom.textContent(value) : "xxx",
+ valid: valid
+ });
}
return result;
}
@@ -566,7 +564,6 @@ dojo.declare("alfresco.xforms.Select",
{
initializer: function(xform, xformsNode)
{
-// this.inherited("initializer", [ xform, xformsNode ]);
},
render: function(attach_point)
{
@@ -662,7 +659,6 @@ dojo.declare("alfresco.xforms.Select1",
{
initializer: function(xform, xformsNode)
{
-// this.inherited("initializer", [ xform, xformsNode ]);
},
render: function(attach_point)
{
@@ -707,6 +703,11 @@ dojo.declare("alfresco.xforms.Select1",
attach_point.appendChild(this.widget);
for (var i = 0; i < values.length; i++)
{
+ if (initial_value && !values[i].valid)
+ {
+ // skip the invalid value if we have a default value
+ continue;
+ }
var option = document.createElement("option");
this.widget.appendChild(option);
option.appendChild(document.createTextNode(values[i].label));
@@ -789,24 +790,9 @@ dojo.declare("alfresco.xforms.Group",
{
this.children = [];
dojo.html.removeClass(this.domNode, "xformsItem");
- this.showHeader = false;
- },
- setShowHeader: function(showHeader)
- {
- if (showHeader == this.showHeader)
- {
- return;
- }
-
- this.showHeader = showHeader;
- if (this.showHeader && this.groupHeaderNode.style.display == "none")
- {
- this.groupHeaderNode.style.display = "block";
- }
- if (!this.showHeader && this.groupHeaderNode.style.display == "block")
- {
- this.groupHeaderNode.style.display = "none";
- }
+ this.showHeader =
+ (this.xformsNode.getAttribute("appearance") != "repeated" &&
+ this.xformsNode.getAttribute(alfresco_xforms_constants.XFORMS_PREFIX + ":appearance") != "repeated");
},
getWidgetsInvalidForSubmit: function()
{
@@ -947,6 +933,8 @@ dojo.declare("alfresco.xforms.Group",
return child;
},
+ _childAdded: function(child) { },
+ _childRemoved: function(child) { },
_destroy: function()
{
this.inherited("_destroy", []);
@@ -977,11 +965,12 @@ dojo.declare("alfresco.xforms.Group",
this.domNode.appendChild(idNode);
}
+ this.showHeader = this.showHeader && this.parent != null;
this.groupHeaderNode = document.createElement("div");
this.groupHeaderNode.id = this.id + "-groupHeaderNode";
this.domNode.appendChild(this.groupHeaderNode);
dojo.html.setClass(this.groupHeaderNode, "xformsGroupHeader");
- this.groupHeaderNode.style.display = "none";
+ this.groupHeaderNode.style.display = this.showHeader ? "block" : "none";
this.toggleExpandedImage = document.createElement("img");
this.groupHeaderNode.appendChild(this.toggleExpandedImage);
@@ -1042,24 +1031,6 @@ dojo.declare("alfresco.xforms.Group",
{
this.children[i].hideAlert();
}
- },
- _childAdded: function(child)
- {
- var hasNonGroupChildren = false;
- for (var i in this.children)
- {
- if (!(this.children[i] instanceof alfresco.xforms.Group))
- {
- hasNonGroupChildren = true;
- break;
- }
- }
- this.setShowHeader(hasNonGroupChildren &&
- this.children.length != 1 &&
- this.parent != null);
- },
- _childRemoved: function(child)
- {
}
});