diff --git a/source/java/org/alfresco/web/bean/wcm/AVMConstants.java b/source/java/org/alfresco/web/bean/wcm/AVMConstants.java index 7797458cdd..e891fbfb32 100644 --- a/source/java/org/alfresco/web/bean/wcm/AVMConstants.java +++ b/source/java/org/alfresco/web/bean/wcm/AVMConstants.java @@ -231,6 +231,18 @@ public final class AVMConstants return parent + path; } + + /** + * Returns a path relative to the webapp portion of the avm path. + * + * @param absoluteAVMPath an absolute path within the avm + * @return a relative path within the webapp. + */ + public static String getWebappRelativePath(final String absoluteAVMPath) + { + final Matcher m = webappRelativePath.matcher(absoluteAVMPath); + return m.matches() && m.group(1).length() != 0 ? m.group(1) : "/"; + } // names of the stores representing the layers for an AVM website public final static String STORE_STAGING = "-staging"; @@ -262,4 +274,7 @@ public final class AVMConstants // patter for absolute AVM Path private final static Pattern absoluteAVMPath = Pattern.compile( "([^:]+:/" + AVMConstants.DIR_APPBASE + "/[^/]+/[^/]+).*"); + private final static Pattern webappRelativePath = Pattern.compile( + "[^:]+:/" + AVMConstants.DIR_APPBASE + + "/" + AVMConstants.DIR_WEBAPPS + "/[^/]+(.*)"); } diff --git a/source/java/org/alfresco/web/forms/xforms/SchemaFormBuilder.java b/source/java/org/alfresco/web/forms/xforms/SchemaFormBuilder.java index 99e9f66c01..538e83ced5 100644 --- a/source/java/org/alfresco/web/forms/xforms/SchemaFormBuilder.java +++ b/source/java/org/alfresco/web/forms/xforms/SchemaFormBuilder.java @@ -347,6 +347,53 @@ public class SchemaFormBuilder private final TreeMap> typeTree = new TreeMap>(); + private final static HashMap DATA_TYPE_TO_NAME = + new HashMap(); + static + { + SchemaFormBuilder.DATA_TYPE_TO_NAME.put(XSConstants.ANYSIMPLETYPE_DT, "anyType"); + SchemaFormBuilder.DATA_TYPE_TO_NAME.put(XSConstants.ANYURI_DT, "anyURI"); + SchemaFormBuilder.DATA_TYPE_TO_NAME.put(XSConstants.BASE64BINARY_DT, "base64Binary"); + SchemaFormBuilder.DATA_TYPE_TO_NAME.put(XSConstants.BOOLEAN_DT, "boolean"); + SchemaFormBuilder.DATA_TYPE_TO_NAME.put(XSConstants.BYTE_DT, "byte"); + SchemaFormBuilder.DATA_TYPE_TO_NAME.put(XSConstants.DATETIME_DT, "dateTime"); + SchemaFormBuilder.DATA_TYPE_TO_NAME.put(XSConstants.DATE_DT, "date"); + SchemaFormBuilder.DATA_TYPE_TO_NAME.put(XSConstants.DECIMAL_DT, "decimal"); + SchemaFormBuilder.DATA_TYPE_TO_NAME.put(XSConstants.DOUBLE_DT, "double"); + SchemaFormBuilder.DATA_TYPE_TO_NAME.put(XSConstants.DURATION_DT, "duration"); + SchemaFormBuilder.DATA_TYPE_TO_NAME.put(XSConstants.ENTITY_DT, "ENTITY"); + SchemaFormBuilder.DATA_TYPE_TO_NAME.put(XSConstants.FLOAT_DT, "float"); + SchemaFormBuilder.DATA_TYPE_TO_NAME.put(XSConstants.GDAY_DT, "gDay"); + SchemaFormBuilder.DATA_TYPE_TO_NAME.put(XSConstants.GMONTHDAY_DT, "gMonthDay"); + SchemaFormBuilder.DATA_TYPE_TO_NAME.put(XSConstants.GMONTH_DT, "gMonth"); + SchemaFormBuilder.DATA_TYPE_TO_NAME.put(XSConstants.GYEARMONTH_DT, "gYearMonth"); + SchemaFormBuilder.DATA_TYPE_TO_NAME.put(XSConstants.GYEAR_DT, "gYear"); + SchemaFormBuilder.DATA_TYPE_TO_NAME.put(XSConstants.IDREF_DT, "IDREF"); + SchemaFormBuilder.DATA_TYPE_TO_NAME.put(XSConstants.ID_DT, "ID"); + SchemaFormBuilder.DATA_TYPE_TO_NAME.put(XSConstants.INTEGER_DT, "integer"); + SchemaFormBuilder.DATA_TYPE_TO_NAME.put(XSConstants.INT_DT, "int"); + SchemaFormBuilder.DATA_TYPE_TO_NAME.put(XSConstants.LANGUAGE_DT, "language"); + SchemaFormBuilder.DATA_TYPE_TO_NAME.put(XSConstants.LONG_DT, "long"); + SchemaFormBuilder.DATA_TYPE_TO_NAME.put(XSConstants.NAME_DT, "Name"); + SchemaFormBuilder.DATA_TYPE_TO_NAME.put(XSConstants.NCNAME_DT, "NCName"); + SchemaFormBuilder.DATA_TYPE_TO_NAME.put(XSConstants.NEGATIVEINTEGER_DT, "negativeInteger"); + SchemaFormBuilder.DATA_TYPE_TO_NAME.put(XSConstants.NMTOKEN_DT, "NMTOKEN"); + SchemaFormBuilder.DATA_TYPE_TO_NAME.put(XSConstants.NONNEGATIVEINTEGER_DT, "nonNegativeInteger"); + SchemaFormBuilder.DATA_TYPE_TO_NAME.put(XSConstants.NONPOSITIVEINTEGER_DT, "nonPositiveInteger"); + SchemaFormBuilder.DATA_TYPE_TO_NAME.put(XSConstants.NORMALIZEDSTRING_DT, "normalizedString"); + SchemaFormBuilder.DATA_TYPE_TO_NAME.put(XSConstants.NOTATION_DT, "NOTATION"); + SchemaFormBuilder.DATA_TYPE_TO_NAME.put(XSConstants.POSITIVEINTEGER_DT, "positiveInteger"); + SchemaFormBuilder.DATA_TYPE_TO_NAME.put(XSConstants.QNAME_DT, "QName"); + SchemaFormBuilder.DATA_TYPE_TO_NAME.put(XSConstants.SHORT_DT, "short"); + SchemaFormBuilder.DATA_TYPE_TO_NAME.put(XSConstants.STRING_DT, "string"); + SchemaFormBuilder.DATA_TYPE_TO_NAME.put(XSConstants.TIME_DT, "time"); + SchemaFormBuilder.DATA_TYPE_TO_NAME.put(XSConstants.TOKEN_DT, "TOKEN"); + SchemaFormBuilder.DATA_TYPE_TO_NAME.put(XSConstants.UNSIGNEDBYTE_DT, "unsignedByte"); + SchemaFormBuilder.DATA_TYPE_TO_NAME.put(XSConstants.UNSIGNEDINT_DT, "unsignedInt"); + SchemaFormBuilder.DATA_TYPE_TO_NAME.put(XSConstants.UNSIGNEDLONG_DT, "unsignedLong"); + SchemaFormBuilder.DATA_TYPE_TO_NAME.put(XSConstants.UNSIGNEDSHORT_DT, "unsignedShort"); + }; + /** * Creates a new SchemaFormBuilder object. * @@ -438,10 +485,10 @@ public class SchemaFormBuilder final Element formSection = (Element) xForm.getDocumentElement().getLastChild(); final Element modelSection = (Element) - xForm.getDocumentElement().getElementsByTagNameNS(XFORMS_NS, "model").item(0); + xForm.getDocumentElement().getElementsByTagNameNS(SchemaFormBuilder.XFORMS_NS, "model").item(0); //add XMLSchema if we use schema types - modelSection.setAttributeNS(XFORMS_NS, "schema", "#schema-1"); + modelSection.setAttributeNS(SchemaFormBuilder.XFORMS_NS, "schema", "#schema-1"); final Element importedSchemaRootElement = (Element) xForm.importNode(schemaDocument.getDocumentElement(), true); importedSchemaRootElement.setAttributeNS(SchemaFormBuilder.XFORMS_NS, @@ -487,7 +534,7 @@ public class SchemaFormBuilder } rootElementName = this.getElementName(rootElementDecl, xForm); final Element instanceElement = - xForm.createElementNS(XFORMS_NS, + xForm.createElementNS(SchemaFormBuilder.XFORMS_NS, SchemaFormBuilder.XFORMS_NS_PREFIX + "instance"); modelSection.appendChild(instanceElement); this.setXFormsId(instanceElement); @@ -527,36 +574,36 @@ public class SchemaFormBuilder "/" + getElementName(rootElementDecl, xForm)); Element submitInfoElement = - xForm.createElementNS(XFORMS_NS, + xForm.createElementNS(SchemaFormBuilder.XFORMS_NS, SchemaFormBuilder.XFORMS_NS_PREFIX + "submission"); modelSection.appendChild(submitInfoElement); - //submitInfoElement.setAttributeNS(XFORMS_NS,SchemaFormBuilder.XFORMS_NS_PREFIX+"id","save"); + //submitInfoElement.setAttributeNS(SchemaFormBuilder.XFORMS_NS,SchemaFormBuilder.XFORMS_NS_PREFIX+"id","save"); String submissionId = this.setXFormsId(submitInfoElement); //action - submitInfoElement.setAttributeNS(XFORMS_NS, + submitInfoElement.setAttributeNS(SchemaFormBuilder.XFORMS_NS, SchemaFormBuilder.XFORMS_NS_PREFIX + "action", this.action == null ? "" : this.base + this.action); //method - submitInfoElement.setAttributeNS(XFORMS_NS, + submitInfoElement.setAttributeNS(SchemaFormBuilder.XFORMS_NS, SchemaFormBuilder.XFORMS_NS_PREFIX + "method", (this.submitMethod != null && this.submitMethod.length() != 0 ? this.submitMethod : SchemaFormBuilder.SUBMIT_METHOD_POST)); final Element submitButton = - xForm.createElementNS(XFORMS_NS, SchemaFormBuilder.XFORMS_NS_PREFIX + "submit"); + xForm.createElementNS(SchemaFormBuilder.XFORMS_NS, SchemaFormBuilder.XFORMS_NS_PREFIX + "submit"); final Element submitControlWrapper = this.wrapper.createControlsWrapper(submitButton); formContentWrapper.appendChild(submitControlWrapper); - submitButton.setAttributeNS(XFORMS_NS, + submitButton.setAttributeNS(SchemaFormBuilder.XFORMS_NS, SchemaFormBuilder.XFORMS_NS_PREFIX + "submission", submissionId); this.setXFormsId(submitButton); final Element submitButtonCaption = - xForm.createElementNS(XFORMS_NS, + xForm.createElementNS(SchemaFormBuilder.XFORMS_NS, SchemaFormBuilder.XFORMS_NS_PREFIX + "label"); submitButton.appendChild(submitButtonCaption); submitButtonCaption.appendChild(xForm.createTextNode("Submit")); @@ -595,13 +642,15 @@ public class SchemaFormBuilder /** * Returns the most-specific built-in base type for the provided type. */ - protected short getBuiltInType(XSTypeDefinition type) { + protected short getBuiltInType(final XSTypeDefinition type) + { // type.getName() may be 'null' for anonymous types, so compare against // static string (see bug #1172541 on sf.net) - if (("anyType").equals(type.getName())) { + if (SchemaFormBuilder.DATA_TYPE_TO_NAME.get(XSConstants.ANYSIMPLETYPE_DT).equals(type.getName())) + { return XSConstants.ANYSIMPLETYPE_DT; - } else { - XSSimpleTypeDefinition simpleType = (XSSimpleTypeDefinition) type; + } + final XSSimpleTypeDefinition simpleType = (XSSimpleTypeDefinition) type; //get built-in type //only working method found: getBuiltInKind, but it returns a short ! @@ -618,149 +667,10 @@ public class SchemaFormBuilder LOGGER.debug(" -> builtinType="+builtIn.getName()); return builtIn;*/ - short result = simpleType.getBuiltInKind(); - if (result == XSConstants.LIST_DT) { - result = getBuiltInType(simpleType.getItemType()); - } - return result; - } - } - - /** - * get the name of a datatype defined by its value in XSConstants - * TODO: find an automatic way to do this ! - * - * @param dt the short representating this datatype from XSConstants - * @return the name of the datatype - */ - public String getDataTypeName(short dt) { - String name = ""; - switch (dt) { - case XSConstants.ANYSIMPLETYPE_DT: - name = "anyType"; - break; - case XSConstants.ANYURI_DT: - name = "anyURI"; - break; - case XSConstants.BASE64BINARY_DT: - name = "base64Binary"; - break; - case XSConstants.BOOLEAN_DT: - name = "boolean"; - break; - case XSConstants.BYTE_DT: - name = "byte"; - break; - case XSConstants.DATE_DT: - name = "date"; - break; - case XSConstants.DATETIME_DT: - name = "dateTime"; - break; - case XSConstants.DECIMAL_DT: - name = "decimal"; - break; - case XSConstants.DOUBLE_DT: - name = "double"; - break; - case XSConstants.DURATION_DT: - name = "duration"; - break; - case XSConstants.ENTITY_DT: - name = "ENTITY"; - break; - case XSConstants.FLOAT_DT: - name = "float"; - break; - case XSConstants.GDAY_DT: - name = "gDay"; - break; - case XSConstants.GMONTH_DT: - name = "gMonth"; - break; - case XSConstants.GMONTHDAY_DT: - name = "gMonthDay"; - break; - case XSConstants.GYEAR_DT: - name = "gYear"; - break; - case XSConstants.GYEARMONTH_DT: - name = "gYearMonth"; - break; - case XSConstants.ID_DT: - name = "ID"; - break; - case XSConstants.IDREF_DT: - name = "IDREF"; - break; - case XSConstants.INT_DT: - name = "int"; - break; - case XSConstants.INTEGER_DT: - name = "integer"; - break; - case XSConstants.LANGUAGE_DT: - name = "language"; - break; - case XSConstants.LONG_DT: - name = "long"; - break; - case XSConstants.NAME_DT: - name = "Name"; - break; - case XSConstants.NCNAME_DT: - name = "NCName"; - break; - case XSConstants.NEGATIVEINTEGER_DT: - name = "negativeInteger"; - break; - case XSConstants.NMTOKEN_DT: - name = "NMTOKEN"; - break; - case XSConstants.NONNEGATIVEINTEGER_DT: - name = "nonNegativeInteger"; - break; - case XSConstants.NONPOSITIVEINTEGER_DT: - name = "nonPositiveInteger"; - break; - case XSConstants.NORMALIZEDSTRING_DT: - name = "normalizedString"; - break; - case XSConstants.NOTATION_DT: - name = "NOTATION"; - break; - case XSConstants.POSITIVEINTEGER_DT: - name = "positiveInteger"; - break; - case XSConstants.QNAME_DT: - name = "QName"; - break; - case XSConstants.SHORT_DT: - name = "short"; - break; - case XSConstants.STRING_DT: - name = "string"; - break; - case XSConstants.TIME_DT: - name = "time"; - break; - case XSConstants.TOKEN_DT: - name = "TOKEN"; - break; - case XSConstants.UNSIGNEDBYTE_DT: - name = "unsignedByte"; - break; - case XSConstants.UNSIGNEDINT_DT: - name = "unsignedInt"; - break; - case XSConstants.UNSIGNEDLONG_DT: - name = "unsignedLong"; - break; - case XSConstants.UNSIGNEDSHORT_DT: - name = "unsignedShort"; - break; - } - return name; + final short result = simpleType.getBuiltInKind(); + return (result == XSConstants.LIST_DT + ? this.getBuiltInType(simpleType.getItemType()) + : result); } protected String setXFormsId(final Element el) @@ -797,7 +707,7 @@ public class SchemaFormBuilder private void resetXFormIds(Element newControl) { if (newControl.getNamespaceURI() != null && - newControl.getNamespaceURI().equals(XFORMS_NS)) + newControl.getNamespaceURI().equals(SchemaFormBuilder.XFORMS_NS)) this.setXFormsId(newControl); //recursive call @@ -830,23 +740,10 @@ public class SchemaFormBuilder for (Map.Entry choice : choiceValues.entrySet()) { - Element item = xForm.createElementNS(XFORMS_NS, - SchemaFormBuilder.XFORMS_NS_PREFIX + "item"); - this.setXFormsId(item); + final Element item = this.createXFormsItem(xForm, + this.createCaption(choice.getKey(), choice.getValue()), + this.createCaption(choice.getKey())); choicesElement.appendChild(item); - - Element captionElement = xForm.createElementNS(XFORMS_NS, - SchemaFormBuilder.XFORMS_NS_PREFIX + "label"); - this.setXFormsId(captionElement); - item.appendChild(captionElement); - final String label = createCaption(choice.getKey(), choice.getValue()); - captionElement.appendChild(xForm.createTextNode(label)); - - Element value = xForm.createElementNS(XFORMS_NS, - SchemaFormBuilder.XFORMS_NS_PREFIX + "value"); - this.setXFormsId(value); - item.appendChild(value); - value.appendChild(xForm.createTextNode(choice.getKey())); } } @@ -881,27 +778,14 @@ public class SchemaFormBuilder if (LOGGER.isDebugEnabled()) LOGGER.debug("addChoicesForSelectSwitchControl, processing " + textValue); - - Element item = xForm.createElementNS(XFORMS_NS, - SchemaFormBuilder.XFORMS_NS_PREFIX + "item"); - this.setXFormsId(item); + final Element item = this.createXFormsItem(xForm, + this.createCaption(textValue), + textValue); choicesElement.appendChild(item); - Element captionElement = xForm.createElementNS(XFORMS_NS, - SchemaFormBuilder.XFORMS_NS_PREFIX + "label"); - this.setXFormsId(captionElement); - item.appendChild(captionElement); - captionElement.appendChild(xForm.createTextNode(createCaption(textValue))); - - Element value = xForm.createElementNS(XFORMS_NS, - SchemaFormBuilder.XFORMS_NS_PREFIX + "value"); - this.setXFormsId(value); - item.appendChild(value); - value.appendChild(xForm.createTextNode(textValue)); - /// action in the case - Element action = xForm.createElementNS(XFORMS_NS, + Element action = xForm.createElementNS(SchemaFormBuilder.XFORMS_NS, SchemaFormBuilder.XFORMS_NS_PREFIX + "action"); this.setXFormsId(action); item.appendChild(action); @@ -915,16 +799,16 @@ public class SchemaFormBuilder this.setXFormsId(toggle); //build the case element - Element caseElement = xForm.createElementNS(XFORMS_NS, + Element caseElement = xForm.createElementNS(SchemaFormBuilder.XFORMS_NS, SchemaFormBuilder.XFORMS_NS_PREFIX + "case"); String case_id = this.setXFormsId(caseElement); result.put(textValue, caseElement); - toggle.setAttributeNS(XFORMS_NS, + toggle.setAttributeNS(SchemaFormBuilder.XFORMS_NS, SchemaFormBuilder.XFORMS_NS_PREFIX + "case", case_id); - //toggle.setAttributeNS(XFORMS_NS,SchemaFormBuilder.XFORMS_NS_PREFIX + "case",bindIdPrefix + "_" + textValue +"_case"); + //toggle.setAttributeNS(SchemaFormBuilder.XFORMS_NS,SchemaFormBuilder.XFORMS_NS_PREFIX + "case",bindIdPrefix + "_" + textValue +"_case"); action.appendChild(toggle); } return result; @@ -1052,18 +936,18 @@ public class SchemaFormBuilder //find the existing bind Id //(modelSection is the enclosing bind of the element) - final NodeList binds = modelSection.getElementsByTagNameNS(XFORMS_NS, "bind"); + final NodeList binds = modelSection.getElementsByTagNameNS(SchemaFormBuilder.XFORMS_NS, "bind"); String bindId = null; for (int j = 0; j < binds.getLength() && bindId == null; j++) { Element bind = (Element) binds.item(j); - String nodeset = bind.getAttributeNS(XFORMS_NS, "nodeset"); + String nodeset = bind.getAttributeNS(SchemaFormBuilder.XFORMS_NS, "nodeset"); if (nodeset != null) { //remove "@" in nodeset String name = nodeset.substring(1); if (name.equals(attributeName)) - bindId = bind.getAttributeNS(XFORMS_NS, "id"); + bindId = bind.getAttributeNS(SchemaFormBuilder.XFORMS_NS, "id"); } } @@ -1437,12 +1321,12 @@ public class SchemaFormBuilder } } - Element control = xForm.createElementNS(XFORMS_NS, + Element control = xForm.createElementNS(SchemaFormBuilder.XFORMS_NS, SchemaFormBuilder.XFORMS_NS_PREFIX + "select1"); String select1_id = this.setXFormsId(control); - Element choices = xForm.createElementNS(XFORMS_NS, + Element choices = xForm.createElementNS(SchemaFormBuilder.XFORMS_NS, SchemaFormBuilder.XFORMS_NS_PREFIX + "choices"); this.setXFormsId(choices); @@ -1468,7 +1352,7 @@ public class SchemaFormBuilder { String caption = createCaption(elementDecl.getName() + " Type"); Element controlCaption = - xForm.createElementNS(XFORMS_NS, + xForm.createElementNS(SchemaFormBuilder.XFORMS_NS, SchemaFormBuilder.XFORMS_NS_PREFIX + "label"); control.appendChild(controlCaption); this.setXFormsId(controlCaption); @@ -1477,30 +1361,30 @@ public class SchemaFormBuilder // multiple compatible types for this element exist // in the schema - allow the user to choose from // between compatible non-abstract types - Element bindElement = xForm.createElementNS(XFORMS_NS, + Element bindElement = xForm.createElementNS(SchemaFormBuilder.XFORMS_NS, SchemaFormBuilder.XFORMS_NS_PREFIX + "bind"); String bindId = this.setXFormsId(bindElement); - bindElement.setAttributeNS(XFORMS_NS, + bindElement.setAttributeNS(SchemaFormBuilder.XFORMS_NS, SchemaFormBuilder.XFORMS_NS_PREFIX + "nodeset", pathToRoot + "/@xsi:type"); modelSection.appendChild(bindElement); - control.setAttributeNS(XFORMS_NS, + control.setAttributeNS(SchemaFormBuilder.XFORMS_NS, SchemaFormBuilder.XFORMS_NS_PREFIX + "bind", bindId); //add the "element" bind, in addition - Element bindElement2 = xForm.createElementNS(XFORMS_NS, + Element bindElement2 = xForm.createElementNS(SchemaFormBuilder.XFORMS_NS, SchemaFormBuilder.XFORMS_NS_PREFIX + "bind"); String bindId2 = this.setXFormsId(bindElement2); - bindElement2.setAttributeNS(XFORMS_NS, + bindElement2.setAttributeNS(SchemaFormBuilder.XFORMS_NS, SchemaFormBuilder.XFORMS_NS_PREFIX + "nodeset", pathToRoot); modelSection.appendChild(bindElement2); - control.setAttributeNS(XFORMS_NS, + control.setAttributeNS(SchemaFormBuilder.XFORMS_NS, SchemaFormBuilder.XFORMS_NS_PREFIX + "appearance", (enumValues.size() < Long.parseLong(getProperty(SELECTONE_LONG_LIST_SIZE_PROP)) ? getProperty(SELECTONE_UI_CONTROL_SHORT_PROP) @@ -1513,36 +1397,22 @@ public class SchemaFormBuilder // item to indicate that is not a valid value // String pleaseSelect = "[Select1 " + caption + "]"; - Element item = xForm.createElementNS(XFORMS_NS, - SchemaFormBuilder.XFORMS_NS_PREFIX + "item"); - this.setXFormsId(item); + final Element item = this.createXFormsItem(xForm, pleaseSelect, pleaseSelect); choices.appendChild(item); - Element captionElement = xForm.createElementNS(XFORMS_NS, - SchemaFormBuilder.XFORMS_NS_PREFIX + "label"); - this.setXFormsId(captionElement); - item.appendChild(captionElement); - captionElement.appendChild(xForm.createTextNode(pleaseSelect)); - - Element value = xForm.createElementNS(XFORMS_NS, - SchemaFormBuilder.XFORMS_NS_PREFIX + "value"); - this.setXFormsId(value); - item.appendChild(value); - value.appendChild(xForm.createTextNode(pleaseSelect)); - // not(purchaseOrder/state = '[Choose State]') - //String isValidExpr = "not(" + bindElement.getAttributeNS(XFORMS_NS, "nodeset") + " = '" + pleaseSelect + "')"; + //String isValidExpr = "not(" + bindElement.getAttributeNS(SchemaFormBuilder.XFORMS_NS, "nodeset") + " = '" + pleaseSelect + "')"; // ->no, not(. = '[Choose State]') String isValidExpr = "not( . = '" + pleaseSelect + "')"; //check if there was a constraint - String constraint = bindElement.getAttributeNS(XFORMS_NS, "constraint"); + String constraint = bindElement.getAttributeNS(SchemaFormBuilder.XFORMS_NS, "constraint"); constraint = (constraint != null && constraint.length() != 0 ? constraint + " && " + isValidExpr : isValidExpr); - bindElement.setAttributeNS(XFORMS_NS, + bindElement.setAttributeNS(SchemaFormBuilder.XFORMS_NS, SchemaFormBuilder.XFORMS_NS_PREFIX + "constraint", constraint); @@ -1561,34 +1431,34 @@ public class SchemaFormBuilder ///////////////// //add a trigger for this control (is there a way to not need it ?) - Element trigger = xForm.createElementNS(XFORMS_NS, + Element trigger = xForm.createElementNS(SchemaFormBuilder.XFORMS_NS, SchemaFormBuilder.XFORMS_NS_PREFIX + "trigger"); formSection.appendChild(trigger); this.setXFormsId(trigger); - Element label_trigger = xForm.createElementNS(XFORMS_NS, + Element label_trigger = xForm.createElementNS(SchemaFormBuilder.XFORMS_NS, SchemaFormBuilder.XFORMS_NS_PREFIX + "label"); this.setXFormsId(label_trigger); trigger.appendChild(label_trigger); String trigger_caption = createCaption("validate choice"); label_trigger.appendChild(xForm.createTextNode(trigger_caption)); - Element action_trigger = xForm.createElementNS(XFORMS_NS, + Element action_trigger = xForm.createElementNS(SchemaFormBuilder.XFORMS_NS, SchemaFormBuilder.XFORMS_NS_PREFIX + "action"); this.setXFormsId(action_trigger); trigger.appendChild(action_trigger); - Element dispatch_trigger = xForm.createElementNS(XFORMS_NS, + Element dispatch_trigger = xForm.createElementNS(SchemaFormBuilder.XFORMS_NS, SchemaFormBuilder.XFORMS_NS_PREFIX + "dispatch"); this.setXFormsId(dispatch_trigger); action_trigger.appendChild(dispatch_trigger); - dispatch_trigger.setAttributeNS(XFORMS_NS, + dispatch_trigger.setAttributeNS(SchemaFormBuilder.XFORMS_NS, SchemaFormBuilder.XFORMS_NS_PREFIX + "name", "DOMActivate"); - dispatch_trigger.setAttributeNS(XFORMS_NS, + dispatch_trigger.setAttributeNS(SchemaFormBuilder.XFORMS_NS, SchemaFormBuilder.XFORMS_NS_PREFIX + "target", select1_id); ///////////////// //add switch - Element switchElement = xForm.createElementNS(XFORMS_NS, + Element switchElement = xForm.createElementNS(SchemaFormBuilder.XFORMS_NS, SchemaFormBuilder.XFORMS_NS_PREFIX + "switch"); this.setXFormsId(switchElement); @@ -1633,8 +1503,8 @@ public class SchemaFormBuilder type.getTypeCategory() == XSTypeDefinition.COMPLEX_TYPE) { - //Element caseElement = (Element) xForm.createElementNS(XFORMS_NS,SchemaFormBuilder.XFORMS_NS_PREFIX + "case"); - //caseElement.setAttributeNS(XFORMS_NS,SchemaFormBuilder.XFORMS_NS_PREFIX + "id",bindId + "_" + type.getName() +"_case"); + //Element caseElement = (Element) xForm.createElementNS(SchemaFormBuilder.XFORMS_NS,SchemaFormBuilder.XFORMS_NS_PREFIX + "case"); + //caseElement.setAttributeNS(SchemaFormBuilder.XFORMS_NS,SchemaFormBuilder.XFORMS_NS_PREFIX + "id",bindId + "_" + type.getName() +"_case"); //String case_id=this.setXFormsId(caseElement); Element caseElement = caseTypes.get(type.getName()); switchElement.appendChild(caseElement); @@ -1655,12 +1525,12 @@ public class SchemaFormBuilder // if (LOGGER.isDebugEnabled()) DOMUtil.prettyPrintDOM(bindElement2); - NodeList binds = bindElement2.getElementsByTagNameNS(XFORMS_NS, "bind"); + NodeList binds = bindElement2.getElementsByTagNameNS(SchemaFormBuilder.XFORMS_NS, "bind"); Element thisBind = null; for (int i = 0; i < binds.getLength() && thisBind == null; i++) { Element subBind = (Element) binds.item(i); - String name = subBind.getAttributeNS(XFORMS_NS, "nodeset"); + String name = subBind.getAttributeNS(SchemaFormBuilder.XFORMS_NS, "nodeset"); if (LOGGER.isDebugEnabled()) LOGGER.debug("Testing sub-bind with nodeset " + name); @@ -1669,7 +1539,9 @@ public class SchemaFormBuilder this.isAttributeDeclaredIn(name, (XSComplexTypeDefinition) type, false)) { if (LOGGER.isDebugEnabled()) - LOGGER.debug("Element/Attribute " + name + " declared in type " + type.getName() + ": adding relevant attribute"); + LOGGER.debug("Element/Attribute " + name + + " declared in type " + type.getName() + + ": adding relevant attribute"); //test sub types of this type final TreeSet subCompatibleTypes = this.typeTree.get(type.getName()); @@ -1693,12 +1565,12 @@ public class SchemaFormBuilder } //change relevant attribute - String relevant = subBind.getAttributeNS(XFORMS_NS, "relevant"); + String relevant = subBind.getAttributeNS(SchemaFormBuilder.XFORMS_NS, "relevant"); if (relevant != null && relevant.length() != 0) newRelevant = ("(" + relevant + ") and " + newRelevant); if (newRelevant != null && newRelevant.length() != 0) - subBind.setAttributeNS(XFORMS_NS, + subBind.setAttributeNS(SchemaFormBuilder.XFORMS_NS, SchemaFormBuilder.XFORMS_NS_PREFIX + "relevant", newRelevant); } @@ -1735,10 +1607,10 @@ public class SchemaFormBuilder // create the element and add it to the model. Element bindElement = - xForm.createElementNS(XFORMS_NS, + xForm.createElementNS(SchemaFormBuilder.XFORMS_NS, SchemaFormBuilder.XFORMS_NS_PREFIX + "bind"); String bindId = this.setXFormsId(bindElement); - bindElement.setAttributeNS(XFORMS_NS, + bindElement.setAttributeNS(SchemaFormBuilder.XFORMS_NS, SchemaFormBuilder.XFORMS_NS_PREFIX + "nodeset", pathToRoot); @@ -1818,7 +1690,7 @@ public class SchemaFormBuilder XSObjectList particles = group.getParticles(); for (int i = 0; i < particles.getLength(); i++) { - XSParticle subPart = (XSParticle) particles.item(i); + XSParticle subPart = (XSParticle)particles.item(i); XSTerm subTerm = subPart.getTerm(); if (subTerm instanceof XSElementDeclaration) { @@ -2009,7 +1881,7 @@ public class SchemaFormBuilder final XSObjectList particles = group.getParticles(); for (int counter = 0; counter < particles.getLength(); counter++) { - final XSParticle currentNode = (XSParticle) particles.item(counter); + final XSParticle currentNode = (XSParticle)particles.item(counter); XSTerm term = currentNode.getTerm(); if (LOGGER.isDebugEnabled()) @@ -2057,14 +1929,14 @@ public class SchemaFormBuilder //find the existing bind Id //(modelSection is the enclosing bind of the element) - NodeList binds = modelSection.getElementsByTagNameNS(XFORMS_NS, "bind"); + NodeList binds = modelSection.getElementsByTagNameNS(SchemaFormBuilder.XFORMS_NS, "bind"); String bindId = null; for (int i = 0; i < binds.getLength() && bindId == null; i++) { - Element bind = (Element) binds.item(i); - String nodeset = bind.getAttributeNS(XFORMS_NS, "nodeset"); + Element bind = (Element)binds.item(i); + String nodeset = bind.getAttributeNS(SchemaFormBuilder.XFORMS_NS, "nodeset"); if (nodeset != null && nodeset.equals(element.getName())) - bindId = bind.getAttributeNS(XFORMS_NS, "id"); + bindId = bind.getAttributeNS(SchemaFormBuilder.XFORMS_NS, "id"); } //find the control @@ -2165,10 +2037,10 @@ public class SchemaFormBuilder controlType.getName() + ", maxOccurs=" + o.maximum); final Element repeatSection = - xForm.createElementNS(XFORMS_NS, SchemaFormBuilder.XFORMS_NS_PREFIX + "repeat"); + xForm.createElementNS(SchemaFormBuilder.XFORMS_NS, SchemaFormBuilder.XFORMS_NS_PREFIX + "repeat"); //bind instead of repeat - //repeatSection.setAttributeNS(XFORMS_NS,SchemaFormBuilder.XFORMS_NS_PREFIX + "nodeset",pathToRoot); + //repeatSection.setAttributeNS(SchemaFormBuilder.XFORMS_NS,SchemaFormBuilder.XFORMS_NS_PREFIX + "nodeset",pathToRoot); // bind -> last element in the modelSection Element bind = DOMUtil.getLastChildElement(modelSection); String bindId = null; @@ -2193,13 +2065,13 @@ public class SchemaFormBuilder LOGGER.warn("addRepeatIfNecessary: bind really not found"); } - repeatSection.setAttributeNS(XFORMS_NS, + repeatSection.setAttributeNS(SchemaFormBuilder.XFORMS_NS, SchemaFormBuilder.XFORMS_NS_PREFIX + "bind", bindId); this.setXFormsId(repeatSection); //appearance=full is more user friendly - repeatSection.setAttributeNS(XFORMS_NS, + repeatSection.setAttributeNS(SchemaFormBuilder.XFORMS_NS, SchemaFormBuilder.XFORMS_NS_PREFIX + "appearance", "full"); @@ -2208,7 +2080,7 @@ public class SchemaFormBuilder formSection.appendChild(controlWrapper); //add a group inside the repeat? - // Element group = xForm.createElementNS(XFORMS_NS, + // Element group = xForm.createElementNS(SchemaFormBuilder.XFORMS_NS, //this.SchemaFormBuilder.XFORMS_NS_PREFIX + "group"); //this.setXFormsId(group); //repeatSection.appendChild(group); @@ -2238,7 +2110,7 @@ public class SchemaFormBuilder LOGGER.debug("owner is " + owner.getClass() + ", name is " + owner.getName()); // create the element and add it to the model. - Element bindElement = xForm.createElementNS(XFORMS_NS, + Element bindElement = xForm.createElementNS(SchemaFormBuilder.XFORMS_NS, SchemaFormBuilder.XFORMS_NS_PREFIX + "bind"); String bindId = this.setXFormsId(bindElement); modelSection.appendChild(bindElement); @@ -2276,10 +2148,10 @@ public class SchemaFormBuilder //if there is a repeat -> create another bind with "." // Element bindElement2 = -// xForm.createElementNS(XFORMS_NS, +// xForm.createElementNS(SchemaFormBuilder.XFORMS_NS, // SchemaFormBuilder.XFORMS_NS_PREFIX + "bind"); // String bindId2 = this.setXFormsId(bindElement2); -// bindElement2.setAttributeNS(XFORMS_NS, +// bindElement2.setAttributeNS(SchemaFormBuilder.XFORMS_NS, // SchemaFormBuilder.XFORMS_NS_PREFIX + "nodeset", // "."); // bindElement.appendChild(bindElement2); @@ -2289,22 +2161,21 @@ public class SchemaFormBuilder } final String caption = owner != null ? createCaption(owner) : createCaption(owningElementName); - Element formControl = this.createFormControl(xForm, - schema, - caption, - controlType, - owner, - bindId, - bindElement, - o); - Element controlWrapper = this.wrapper.createControlsWrapper(formControl); - contentWrapper.appendChild(controlWrapper); + final Element formControl = this.createFormControl(xForm, + schema, + caption, + controlType, + owner, + bindId, + bindElement, + o); + contentWrapper.appendChild(this.wrapper.createControlsWrapper(formControl)); // if this is a repeatable then set ref to point to current element // not sure if this is a workaround or this is just the way XForms works... // if (!repeatSection.equals(formSection)) - formControl.setAttributeNS(XFORMS_NS, + formControl.setAttributeNS(SchemaFormBuilder.XFORMS_NS, SchemaFormBuilder.XFORMS_NS_PREFIX + "ref", "."); @@ -2317,8 +2188,8 @@ public class SchemaFormBuilder //this.addSelector(xForm, (Element) formControl.getParentNode()); // // TODO: Generate help message based on datatype and restrictions - endFormControl(formControl, controlType, o); - endBindElement(bindElement); + this.endFormControl(formControl, controlType, o); + this.endBindElement(bindElement); } private void addSimpleType(final Document xForm, @@ -2417,7 +2288,7 @@ public class SchemaFormBuilder final XSNamedMap types = schema.getComponents(XSConstants.TYPE_DEFINITION); for (int i = 0; i < types.getLength(); i++) { - final XSTypeDefinition t = (XSTypeDefinition) types.item(i); + final XSTypeDefinition t = (XSTypeDefinition)types.item(i); if (t.getTypeCategory() == XSTypeDefinition.COMPLEX_TYPE) { final XSComplexTypeDefinition type = (XSComplexTypeDefinition)t; @@ -2429,7 +2300,7 @@ public class SchemaFormBuilder // build the type tree for simple types for (int i = 0; i < types.getLength(); i++) { - final XSTypeDefinition t = (XSTypeDefinition) types.item(i); + final XSTypeDefinition t = (XSTypeDefinition)types.item(i); if (t.getTypeCategory() == XSTypeDefinition.SIMPLE_TYPE) { this.buildTypeTree((XSSimpleTypeDefinition)t, @@ -2463,56 +2334,37 @@ public class SchemaFormBuilder final Element bindElement, final Occurs o) { - // Select1 xform control to use: - // Will use one of the following: input, textarea, selectOne, selectBoolean, selectMany, range - // secret, output, button, do not apply - // - // select1: enumeration or keyref constrained value - // select: list - // range: union (? not sure about this) - // textarea : ??? - // input: default - // Element formControl = null; - - if (controlType.getTypeCategory() == XSTypeDefinition.SIMPLE_TYPE) + if (controlType.getTypeCategory() == XSTypeDefinition.SIMPLE_TYPE && + ((XSSimpleTypeDefinition)controlType).getItemType() != null) { - XSSimpleTypeDefinition simpleType = (XSSimpleTypeDefinition)controlType; - if (simpleType.getItemType() != null) - { - //list - formControl = createControlForListType(xForm, - simpleType, - caption, - bindElement); - } - else - { - //other simple type - // need to check constraints to determine which form control to use - // - // use the selectOne control - // - if (simpleType.isDefinedFacet(XSSimpleTypeDefinition.FACET_ENUMERATION)) - formControl = this.createControlForEnumerationType(xForm, - simpleType, - caption, - bindElement); - } + formControl = this.createControlForListType(xForm, + (XSSimpleTypeDefinition)controlType, + caption, + bindElement); + } + else if (controlType.getTypeCategory() == XSTypeDefinition.SIMPLE_TYPE && + ((XSSimpleTypeDefinition)controlType).isDefinedFacet(XSSimpleTypeDefinition.FACET_ENUMERATION)) + { + formControl = this.createControlForEnumerationType(xForm, + (XSSimpleTypeDefinition)controlType, + caption, + bindElement); } else if (controlType.getTypeCategory() == XSTypeDefinition.COMPLEX_TYPE && "anyType".equals(controlType.getName())) { - formControl = createControlForAnyType(xForm, caption, controlType); + formControl = this.createControlForAnyType(xForm, caption, controlType); + } + else + { + formControl = this.createControlForAtomicType(xForm, + caption, + (XSSimpleTypeDefinition)controlType); } - if (formControl == null) - formControl = createControlForAtomicType(xForm, - caption, - (XSSimpleTypeDefinition)controlType); - - startFormControl(formControl, controlType); - formControl.setAttributeNS(XFORMS_NS, + this.startFormControl(formControl, controlType); + formControl.setAttributeNS(SchemaFormBuilder.XFORMS_NS, SchemaFormBuilder.XFORMS_NS_PREFIX + "bind", bindId); @@ -2522,7 +2374,7 @@ public class SchemaFormBuilder // // e.g. Please provide a valid value for 'Address'. 'Address' is a mandatory decimal field. // - final Element alertElement = xForm.createElementNS(XFORMS_NS, + final Element alertElement = xForm.createElementNS(SchemaFormBuilder.XFORMS_NS, SchemaFormBuilder.XFORMS_NS_PREFIX + "alert"); formControl.appendChild(alertElement); this.setXFormsId(alertElement); @@ -2563,7 +2415,7 @@ public class SchemaFormBuilder schema.getTypeDefinition(typeName, typeNS) == null) { //use built in type - return this.getDataTypeName(getBuiltInType(controlType)); + return SchemaFormBuilder.DATA_TYPE_TO_NAME.get(this.getBuiltInType(controlType)); } //type is globally defined @@ -2614,7 +2466,7 @@ public class SchemaFormBuilder envelopeElement.setAttributeNS(XML_NAMESPACE_URI, "xml:base", this.base); //model element - Element modelElement = xForm.createElementNS(XFORMS_NS, + Element modelElement = xForm.createElementNS(SchemaFormBuilder.XFORMS_NS, SchemaFormBuilder.XFORMS_NS_PREFIX + "model"); this.setXFormsId(modelElement); Element modelWrapper = this.wrapper.createModelWrapper(modelElement); @@ -2634,7 +2486,7 @@ public class SchemaFormBuilder XSElementDeclaration owner) { // add a group node and recurse Element groupElement = - xForm.createElementNS(XFORMS_NS, + xForm.createElementNS(SchemaFormBuilder.XFORMS_NS, SchemaFormBuilder.XFORMS_NS_PREFIX + "group"); groupElement = startFormGroup(groupElement, owner); @@ -2650,7 +2502,7 @@ public class SchemaFormBuilder formSection.appendChild(controlsWrapper); Element captionElement = - xForm.createElementNS(XFORMS_NS, + xForm.createElementNS(SchemaFormBuilder.XFORMS_NS, SchemaFormBuilder.XFORMS_NS_PREFIX + "label"); groupElement.appendChild(captionElement); this.setXFormsId(captionElement); @@ -2824,43 +2676,40 @@ public class SchemaFormBuilder { Element control; - //remove while select1 do not work correctly in repeats if ("boolean".equals(controlType.getName())) { - control = xForm.createElementNS(XFORMS_NS, + control = xForm.createElementNS(SchemaFormBuilder.XFORMS_NS, SchemaFormBuilder.XFORMS_NS_PREFIX + "select1"); - control.setAttributeNS(XFORMS_NS, - SchemaFormBuilder.XFORMS_NS_PREFIX + "appearance", - "full"); this.setXFormsId(control); final String[] values = { "true", "false" }; for (String v : values) { - Element item = xForm.createElementNS(XFORMS_NS, - SchemaFormBuilder.XFORMS_NS_PREFIX + "item"); - this.setXFormsId(item); - Element e = xForm.createElementNS(XFORMS_NS, - SchemaFormBuilder.XFORMS_NS_PREFIX + "label"); - this.setXFormsId(e); - e.appendChild(xForm.createTextNode(v)); - item.appendChild(e); - - e = xForm.createElementNS(XFORMS_NS, SchemaFormBuilder.XFORMS_NS_PREFIX + "value"); - this.setXFormsId(e); - e.appendChild(xForm.createTextNode(v)); - item.appendChild(e); + final Element item = this.createXFormsItem(xForm, v, v); control.appendChild(item); } } + else if ("anyURI".equals(controlType.getName())) + { + control = xForm.createElementNS(SchemaFormBuilder.XFORMS_NS, + SchemaFormBuilder.XFORMS_NS_PREFIX + "upload"); + final Element e = xForm.createElementNS(SchemaFormBuilder.XFORMS_NS, + SchemaFormBuilder.XFORMS_NS_PREFIX + "filename"); + control.appendChild(e); + e.setAttributeNS(SchemaFormBuilder.XFORMS_NS, + SchemaFormBuilder.XFORMS_NS_PREFIX + "ref", + "."); + this.setXFormsId(control); + } else { - control = xForm.createElementNS(XFORMS_NS, SchemaFormBuilder.XFORMS_NS_PREFIX + "input"); + control = xForm.createElementNS(SchemaFormBuilder.XFORMS_NS, SchemaFormBuilder.XFORMS_NS_PREFIX + "input"); this.setXFormsId(control); } //label - Element captionElement = xForm.createElementNS(XFORMS_NS, - SchemaFormBuilder.XFORMS_NS_PREFIX + "label"); + final Element captionElement = + xForm.createElementNS(SchemaFormBuilder.XFORMS_NS, + SchemaFormBuilder.XFORMS_NS_PREFIX + "label"); control.appendChild(captionElement); this.setXFormsId(captionElement); captionElement.appendChild(xForm.createTextNode(caption)); @@ -2901,18 +2750,18 @@ public class SchemaFormBuilder if (enumFacets.getLength() <= 0) return null; - Element control = xForm.createElementNS(XFORMS_NS, + Element control = xForm.createElementNS(SchemaFormBuilder.XFORMS_NS, SchemaFormBuilder.XFORMS_NS_PREFIX + "select1"); this.setXFormsId(control); //label - Element captionElement1 = xForm.createElementNS(XFORMS_NS, + Element captionElement1 = xForm.createElementNS(SchemaFormBuilder.XFORMS_NS, SchemaFormBuilder.XFORMS_NS_PREFIX + "label"); control.appendChild(captionElement1); this.setXFormsId(captionElement1); captionElement1.appendChild(xForm.createTextNode(caption)); - Element choices = xForm.createElementNS(XFORMS_NS, + Element choices = xForm.createElementNS(SchemaFormBuilder.XFORMS_NS, SchemaFormBuilder.XFORMS_NS_PREFIX + "choices"); this.setXFormsId(choices); @@ -2933,7 +2782,7 @@ public class SchemaFormBuilder : null)); } - control.setAttributeNS(XFORMS_NS, + control.setAttributeNS(SchemaFormBuilder.XFORMS_NS, SchemaFormBuilder.XFORMS_NS_PREFIX + "appearance", (enumFacets.getLength() < Long.parseLong(getProperty(SELECTONE_LONG_LIST_SIZE_PROP)) ? getProperty(SELECTONE_UI_CONTROL_SHORT_PROP) @@ -2945,39 +2794,23 @@ public class SchemaFormBuilder // and set the isValid attribute on the bind element to check for the "Please select..." // item to indicate that is not a valid value // - String pleaseSelect = "[Select1 " + caption + "]"; - Element item = xForm.createElementNS(XFORMS_NS, - SchemaFormBuilder.XFORMS_NS_PREFIX + "item"); - this.setXFormsId(item); + final String pleaseSelect = "[Select1 " + caption + "]"; + final Element item = this.createXFormsItem(xForm, pleaseSelect, pleaseSelect); choices.appendChild(item); - Element captionElement = - xForm.createElementNS(XFORMS_NS, - SchemaFormBuilder.XFORMS_NS_PREFIX + "label"); - this.setXFormsId(captionElement); - item.appendChild(captionElement); - captionElement.appendChild(xForm.createTextNode(pleaseSelect)); - - Element value = - xForm.createElementNS(XFORMS_NS, - SchemaFormBuilder.XFORMS_NS_PREFIX + "value"); - this.setXFormsId(value); - item.appendChild(value); - value.appendChild(xForm.createTextNode(pleaseSelect)); - // not(purchaseOrder/state = '[Choose State]') - //String isValidExpr = "not(" + bindElement.getAttributeNS(XFORMS_NS,"nodeset") + " = '" + pleaseSelect + "')"; + //String isValidExpr = "not(" + bindElement.getAttributeNS(SchemaFormBuilder.XFORMS_NS,"nodeset") + " = '" + pleaseSelect + "')"; // ->no, not(. = '[Choose State]') - String isValidExpr = "not( . = '" + pleaseSelect + "')"; + final String isValidExpr = "not( . = '" + pleaseSelect + "')"; //check if there was a constraint - String constraint = bindElement.getAttributeNS(XFORMS_NS, "constraint"); + String constraint = bindElement.getAttributeNS(SchemaFormBuilder.XFORMS_NS, "constraint"); constraint = (constraint != null && constraint.length() != 0 ? constraint + " and " + isValidExpr : isValidExpr); - bindElement.setAttributeNS(XFORMS_NS, + bindElement.setAttributeNS(SchemaFormBuilder.XFORMS_NS, SchemaFormBuilder.XFORMS_NS_PREFIX + "constraint", constraint); } @@ -3018,12 +2851,12 @@ public class SchemaFormBuilder final StringList enumFacets = controlType.getLexicalEnumeration(); if (enumFacets.getLength() <= 0) return null; - Element control = xForm.createElementNS(XFORMS_NS, + Element control = xForm.createElementNS(SchemaFormBuilder.XFORMS_NS, SchemaFormBuilder.XFORMS_NS_PREFIX + "select"); this.setXFormsId(control); //label - Element captionElement = xForm.createElementNS(XFORMS_NS, + Element captionElement = xForm.createElementNS(SchemaFormBuilder.XFORMS_NS, SchemaFormBuilder.XFORMS_NS_PREFIX + "label"); control.appendChild(captionElement); this.setXFormsId(captionElement); @@ -3052,12 +2885,12 @@ public class SchemaFormBuilder // // For now, use checkbox if there are < DEFAULT_LONG_LIST_MAX_SIZE items, otherwise use long control // - control.setAttributeNS(XFORMS_NS, + control.setAttributeNS(SchemaFormBuilder.XFORMS_NS, SchemaFormBuilder.XFORMS_NS_PREFIX + "appearance", (enumValues.size() < Long.parseLong(getProperty(SELECTMANY_LONG_LIST_SIZE_PROP)) ? getProperty(SELECTMANY_UI_CONTROL_SHORT_PROP) : getProperty(SELECTMANY_UI_CONTROL_LONG_PROP))); - Element choices = xForm.createElementNS(XFORMS_NS, + Element choices = xForm.createElementNS(SchemaFormBuilder.XFORMS_NS, SchemaFormBuilder.XFORMS_NS_PREFIX + "choices"); this.setXFormsId(choices); control.appendChild(choices); @@ -3088,7 +2921,7 @@ public class SchemaFormBuilder if (s == null) return null; final Element hintElement = - xForm.createElementNS(XFORMS_NS, + xForm.createElementNS(SchemaFormBuilder.XFORMS_NS, SchemaFormBuilder.XFORMS_NS_PREFIX + "hint"); this.setXFormsId(hintElement); hintElement.appendChild(xForm.createTextNode(s)); @@ -3165,7 +2998,7 @@ public class SchemaFormBuilder if (o.isRepeated() && o.minimum == 0) nodeset = pathToRoot + "[position() != last()]"; - bindElement.setAttributeNS(XFORMS_NS, + bindElement.setAttributeNS(SchemaFormBuilder.XFORMS_NS, SchemaFormBuilder.XFORMS_NS_PREFIX + "nodeset", nodeset); @@ -3175,7 +3008,7 @@ public class SchemaFormBuilder schema, controlType); if (typeName != null && typeName.length() != 0) - bindElement.setAttributeNS(XFORMS_NS, + bindElement.setAttributeNS(SchemaFormBuilder.XFORMS_NS, SchemaFormBuilder.XFORMS_NS_PREFIX + "type", typeName); } @@ -3189,11 +3022,11 @@ public class SchemaFormBuilder ? ((XSAttributeUse)owner).getConstraintType() : XSConstants.VC_NONE))); - bindElement.setAttributeNS(XFORMS_NS, + bindElement.setAttributeNS(SchemaFormBuilder.XFORMS_NS, SchemaFormBuilder.XFORMS_NS_PREFIX + "readonly", (constraintType == XSConstants.VC_FIXED) + "()"); - bindElement.setAttributeNS(XFORMS_NS, + bindElement.setAttributeNS(SchemaFormBuilder.XFORMS_NS, SchemaFormBuilder.XFORMS_NS_PREFIX + "required", (o.minimum != 0) + "()"); @@ -3227,7 +3060,7 @@ public class SchemaFormBuilder ? minConstraint : maxConstraint)); if (constraint != null) - bindElement.setAttributeNS(XFORMS_NS, + bindElement.setAttributeNS(SchemaFormBuilder.XFORMS_NS, SchemaFormBuilder.XFORMS_NS_PREFIX + "constraint", constraint); return bindElement; @@ -3361,21 +3194,21 @@ public class SchemaFormBuilder { LOGGER.debug("creating triggers for repeats"); final HashMap bindIdToBind = new HashMap(); - final NodeList binds = xformsDocument.getElementsByTagNameNS(XFORMS_NS, "bind"); + final NodeList binds = xformsDocument.getElementsByTagNameNS(SchemaFormBuilder.XFORMS_NS, "bind"); for (int i = 0; i < binds.getLength(); i++) { final Element b = (Element)binds.item(i); - LOGGER.debug("adding bind " + b.getAttributeNS(XFORMS_NS, "id")); - bindIdToBind.put(b.getAttributeNS(XFORMS_NS, "id"), b); + LOGGER.debug("adding bind " + b.getAttributeNS(SchemaFormBuilder.XFORMS_NS, "id")); + bindIdToBind.put(b.getAttributeNS(SchemaFormBuilder.XFORMS_NS, "id"), b); } - final NodeList repeats = xformsDocument.getElementsByTagNameNS(XFORMS_NS, "repeat"); + final NodeList repeats = xformsDocument.getElementsByTagNameNS(SchemaFormBuilder.XFORMS_NS, "repeat"); final HashMap bindToRepeat = new HashMap(); for (int i = 0; i < repeats.getLength(); i++) { Element r = (Element)repeats.item(i); - LOGGER.debug("processing repeat " + r.getAttributeNS(XFORMS_NS, "id")); - Element bind = bindIdToBind.get(r.getAttributeNS(XFORMS_NS, "bind")); + LOGGER.debug("processing repeat " + r.getAttributeNS(SchemaFormBuilder.XFORMS_NS, "id")); + Element bind = bindIdToBind.get(r.getAttributeNS(SchemaFormBuilder.XFORMS_NS, "bind")); bindToRepeat.put(bind, r); String xpath = ""; @@ -3387,23 +3220,23 @@ public class SchemaFormBuilder xpath = '/' + xpath; } - LOGGER.debug("walking bind " + bind.getAttributeNS(XFORMS_NS, "id")); - String s = bind.getAttributeNS(XFORMS_NS, "nodeset"); + LOGGER.debug("walking bind " + bind.getAttributeNS(SchemaFormBuilder.XFORMS_NS, "id")); + String s = bind.getAttributeNS(SchemaFormBuilder.XFORMS_NS, "nodeset"); s = s.replaceAll("^([^\\[]+).*$", "$1"); if (bindToRepeat.containsKey(bind) && !r.equals(bindToRepeat.get(bind))) { - s += "[index(\'" + bindToRepeat.get(bind).getAttributeNS(XFORMS_NS, "id") + "\')]"; + s += "[index(\'" + bindToRepeat.get(bind).getAttributeNS(SchemaFormBuilder.XFORMS_NS, "id") + "\')]"; } xpath = s + xpath; - bind = ((XFORMS_NS_PREFIX + "bind").equals(bind.getParentNode().getNodeName()) + bind = ((SchemaFormBuilder.XFORMS_NS_PREFIX + "bind").equals(bind.getParentNode().getNodeName()) ? (Element)bind.getParentNode() : null); } while (bind != null); this.createTriggersForRepeat(xformsDocument, - r.getAttributeNS(XFORMS_NS, "id"), + r.getAttributeNS(SchemaFormBuilder.XFORMS_NS, "id"), xpath, - r.getAttributeNS(XFORMS_NS, "bind")); + r.getAttributeNS(SchemaFormBuilder.XFORMS_NS, "bind")); } } @@ -3535,4 +3368,25 @@ public class SchemaFormBuilder } } } + + private Element createXFormsItem(final Document xformsDocument, + final String label, + final String value) + { + final Element item = xformsDocument.createElementNS(SchemaFormBuilder.XFORMS_NS, + SchemaFormBuilder.XFORMS_NS_PREFIX + "item"); + this.setXFormsId(item); + Element e = xformsDocument.createElementNS(SchemaFormBuilder.XFORMS_NS, + SchemaFormBuilder.XFORMS_NS_PREFIX + "label"); + this.setXFormsId(e); + e.appendChild(xformsDocument.createTextNode(label)); + item.appendChild(e); + + e = xformsDocument.createElementNS(SchemaFormBuilder.XFORMS_NS, + SchemaFormBuilder.XFORMS_NS_PREFIX + "value"); + this.setXFormsId(e); + e.appendChild(xformsDocument.createTextNode(value)); + item.appendChild(e); + return item; + } } diff --git a/source/java/org/alfresco/web/forms/xforms/XFormsBean.java b/source/java/org/alfresco/web/forms/xforms/XFormsBean.java index 610a146f75..d84dfcc09c 100644 --- a/source/java/org/alfresco/web/forms/xforms/XFormsBean.java +++ b/source/java/org/alfresco/web/forms/xforms/XFormsBean.java @@ -31,12 +31,18 @@ import javax.servlet.http.HttpSession; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.alfresco.repo.avm.AVMNodeConverter; +import org.alfresco.service.ServiceRegistry; +import org.alfresco.service.cmr.avm.AVMNodeDescriptor; +import org.alfresco.service.cmr.avm.AVMService; import org.alfresco.web.bean.wcm.AVMConstants; import org.alfresco.web.forms.*; import org.w3c.dom.Document; import org.w3c.dom.Node; -import org.alfresco.web.bean.wcm.AVMBrowseBean; import org.alfresco.web.app.servlet.FacesHelper; +import org.alfresco.web.bean.repository.Repository; +import org.alfresco.web.bean.wcm.AVMBrowseBean; +import org.alfresco.web.ui.common.Utils; import org.chiba.xml.xforms.ChibaBean; import org.chiba.xml.xforms.Instance; import org.chiba.xml.xforms.XFormsElement; @@ -46,6 +52,7 @@ import org.chiba.xml.xforms.exception.XFormsException; import org.chiba.xml.xforms.events.XFormsEvent; import org.chiba.xml.xforms.events.XFormsEventFactory; import org.chiba.xml.xforms.ui.BoundElement; +import org.chiba.xml.xforms.ui.Upload; import org.w3c.dom.*; import org.w3c.dom.bootstrap.DOMImplementationRegistry; @@ -99,8 +106,7 @@ public class XFormsBean final ExternalContext externalContext = facesContext.getExternalContext(); final HttpServletRequest request = (HttpServletRequest) externalContext.getRequest(); - final HttpSession session = (HttpSession) - externalContext.getSession(true); + final HttpSession session = (HttpSession)externalContext.getSession(true); final AVMBrowseBean browseBean = (AVMBrowseBean) session.getAttribute("AVMBrowseBean"); LOGGER.debug("avm cwd is " + browseBean.getCurrentPath()); @@ -170,14 +176,12 @@ public class XFormsBean throws IOException, XFormsException { - LOGGER.debug(this + " building xform"); + LOGGER.debug(this + ".getXForm()"); final FacesContext context = FacesContext.getCurrentInstance(); final ResponseWriter out = context.getResponseWriter(); - final Map requestParameters = context.getExternalContext().getRequestParameterMap(); LOGGER.debug("building xform for " + this.tt.getName()); final Node form = this.chibaBean.getXMLContainer(); - final FormsService ts = FormsService.getInstance(); - ts.writeXML(form, out); + FormsService.getInstance().writeXML(form, out); } /** @@ -195,12 +199,18 @@ public class XFormsBean final String id = (String)requestParameters.get("id"); final String value = (String)requestParameters.get("value"); - LOGGER.debug(this + " setXFormsValue(" + id + ", " + value + ")"); - this.chibaBean.updateControlValue(id, value); + LOGGER.debug(this + ".setXFormsValue(" + id + ", " + value + ")"); + if (this.chibaBean.lookup(id) instanceof Upload) + { + this.chibaBean.updateControlValue(id, null, value, value.getBytes()); + } + else + { + this.chibaBean.updateControlValue(id, value); + } - final FormsService ts = FormsService.getInstance(); final ResponseWriter out = context.getResponseWriter(); - ts.writeXML(this.getEventLog(), out); + FormsService.getInstance().writeXML(this.getEventLog(), out); out.close(); } @@ -219,12 +229,11 @@ public class XFormsBean final String id = (String)requestParameters.get("id"); final int index = Integer.parseInt((String)requestParameters.get("index")); - LOGGER.debug(this + " setRepeatIndex(" + id + ", " + index + ")"); + LOGGER.debug(this + ".setRepeatIndex(" + id + ", " + index + ")"); this.chibaBean.updateRepeatIndex(id, index); - final FormsService ts = FormsService.getInstance(); final ResponseWriter out = context.getResponseWriter(); - ts.writeXML(this.getEventLog(), out); + FormsService.getInstance().writeXML(this.getEventLog(), out); out.close(); } @@ -240,12 +249,11 @@ public class XFormsBean final Map requestParameters = context.getExternalContext().getRequestParameterMap(); final String id = (String)requestParameters.get("id"); - LOGGER.debug(this + " fireAction(" + id + ")"); + LOGGER.debug(this + ".fireAction(" + id + ")"); this.chibaBean.dispatch(id, XFormsEventFactory.DOM_ACTIVATE); - final FormsService ts = FormsService.getInstance(); final ResponseWriter out = context.getResponseWriter(); - ts.writeXML(this.getEventLog(), out); + FormsService.getInstance().writeXML(this.getEventLog(), out); out.close(); } @@ -255,16 +263,16 @@ public class XFormsBean public void handleAction() throws Exception { - LOGGER.debug(this + " handleAction"); + LOGGER.debug(this + ".handleAction"); final FacesContext context = FacesContext.getCurrentInstance(); final HttpServletRequest request = (HttpServletRequest) context.getExternalContext().getRequest(); - final FormsService ts = FormsService.getInstance(); - final Document result = ts.parseXML(request.getInputStream()); + final FormsService formsService = FormsService.getInstance(); + final Document result = formsService.parseXML(request.getInputStream()); this.instanceData.setContent(result); final ResponseWriter out = context.getResponseWriter(); - ts.writeXML(result, out); + formsService.writeXML(result, out); out.close(); } @@ -274,21 +282,95 @@ public class XFormsBean public void swapRepeatItems() throws Exception { - LOGGER.debug(this + " handleAction"); final FacesContext context = FacesContext.getCurrentInstance(); - final HttpServletRequest request = (HttpServletRequest) - context.getExternalContext().getRequest(); final Map requestParameters = context.getExternalContext().getRequestParameterMap(); final String fromItemId = (String)requestParameters.get("fromItemId"); final String toItemId = (String)requestParameters.get("toItemId"); - LOGGER.debug("swapping from " + fromItemId + " to " + toItemId); + LOGGER.debug(this + ".swapRepeatItems(" + fromItemId + ", " + toItemId + ")"); this.swapRepeatItems(this.chibaBean.lookup(fromItemId), this.chibaBean.lookup(toItemId)); - final FormsService ts = FormsService.getInstance(); final ResponseWriter out = context.getResponseWriter(); - ts.writeXML(this.getEventLog(), out); + FormsService.getInstance().writeXML(this.getEventLog(), out); + out.close(); + } + + /** + * Provides data for a file picker widget. + */ + public void getFilePickerData() + throws Exception + { + final FacesContext facesContext = FacesContext.getCurrentInstance(); + final ExternalContext externalContext = facesContext.getExternalContext(); + final HttpSession session = (HttpSession) + externalContext.getSession(true); + final AVMBrowseBean browseBean = (AVMBrowseBean) + session.getAttribute("AVMBrowseBean"); + + final Map requestParameters = externalContext.getRequestParameterMap(); + String currentPath = (String)requestParameters.get("currentPath"); + if (currentPath == null) + { + currentPath = browseBean.getCurrentPath(); + } + else + { + currentPath = AVMConstants.buildAbsoluteAVMPath(browseBean.getCurrentPath(), + currentPath); + } + LOGGER.debug(this + ".getFilePickerData(" + currentPath + ")"); + + final ServiceRegistry serviceRegistry = + Repository.getServiceRegistry(facesContext); + final AVMService avmService = serviceRegistry.getAVMService(); + + final FormsService formsService = FormsService.getInstance(); + final Document result = formsService.newDocument(); + final Element filePickerDataElement = result.createElement("file-picker-data"); + result.appendChild(filePickerDataElement); + + + final AVMNodeDescriptor currentNode = avmService.lookup(-1, currentPath); + if (currentNode == null) + { + final Element errorElement = result.createElement("error"); + errorElement.appendChild(result.createTextNode("Path " + currentPath + " not found")); + filePickerDataElement.appendChild(errorElement); + currentPath = browseBean.getCurrentPath(); + } + else if (! currentNode.isDirectory()) + { + currentPath = AVMNodeConverter.SplitBase(currentPath)[0]; + } + + Element e = result.createElement("current-node"); + e.setAttribute("avmPath", currentPath); + e.setAttribute("webappRelativePath", + AVMConstants.getWebappRelativePath(currentPath)); + e.setAttribute("type", "directory"); + e.setAttribute("image", "/images/icons/space_small.gif"); + filePickerDataElement.appendChild(e); + + for (Map.Entry entry : + avmService.getDirectoryListing(-1, currentPath).entrySet()) + { + e = result.createElement("child-node"); + e.setAttribute("avmPath", entry.getValue().getPath()); + e.setAttribute("webappRelativePath", + AVMConstants.getWebappRelativePath(entry.getValue().getPath())); + e.setAttribute("type", entry.getValue().isDirectory() ? "directory" : "file"); + e.setAttribute("image", (entry.getValue().isDirectory() + ? "/images/icons/space_small.gif" + : Utils.getFileTypeImage(facesContext, + entry.getValue().getName(), + true))); + filePickerDataElement.appendChild(e); + } + + final ResponseWriter out = facesContext.getResponseWriter(); + FormsService.getInstance().writeXML(result, out); out.close(); } diff --git a/source/java/org/alfresco/web/forms/xforms/XFormsProcessor.java b/source/java/org/alfresco/web/forms/xforms/XFormsProcessor.java index 01c83c8766..9c8b9a9490 100644 --- a/source/java/org/alfresco/web/forms/xforms/XFormsProcessor.java +++ b/source/java/org/alfresco/web/forms/xforms/XFormsProcessor.java @@ -71,7 +71,7 @@ public class XFormsProcessor // this div is where the ui will write to final Element div = result.createElement("div"); - div.setAttribute("id", "alf-ui"); + div.setAttribute("id", "alfresco-xforms-ui"); result.appendChild(div); // a script with config information and globals. diff --git a/source/test-resources/xforms/unit-tests/upload-tests/upload-simple-test.xsd b/source/test-resources/xforms/unit-tests/upload-tests/upload-simple-test.xsd new file mode 100644 index 0000000000..bb77c220fc --- /dev/null +++ b/source/test-resources/xforms/unit-tests/upload-tests/upload-simple-test.xsd @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + diff --git a/source/web/scripts/ajax/xforms.js b/source/web/scripts/ajax/xforms.js index a7769e21c1..ab241db0bf 100644 --- a/source/web/scripts/ajax/xforms.js +++ b/source/web/scripts/ajax/xforms.js @@ -230,6 +230,54 @@ dojo.declare("alfresco.xforms.Widget", } }); +dojo.declare("alfresco.xforms.FilePicker", + alfresco.xforms.Widget, + { + initializer: function(xform, xformsNode) + { + }, + render: function(attach_point) + { + this.domNode = document.createElement("div"); + this.domNode.setAttribute("id", this.id + "-widget"); + this.domNode.style.width = "100%"; + this.domNode.widget = this; + this.domNode.addEventListener("heightChanged", + function(event) + { + this.widget.domContainer.style.height = + event.target.offsetHeight + "px"; + }, + false); + attach_point.appendChild(this.domNode); + //XXXarielb support readonly and disabled + this.widget = new FilePickerWidget(this.domNode, this.getInitialValue(), false); + this.widget.render(); + this.domNode.addEventListener("valueChanged", + function(event) + { + var w = event.target.widget; + w.xform.setXFormsValue(w.id, w.getValue()); + }, + false); + }, + getValue: function() + { + return this.widget.getValue(); + }, + setValue: function(value) + { + if (!this.widget) + this.setInitialValue(value); + else + this.widget.setValue(value); + }, + _filePicker_changeHandler: function(event) + { + this.xform.setXFormsValue(this.id, this.getValue()); + } + }); + dojo.declare("alfresco.xforms.DatePicker", alfresco.xforms.Widget, { @@ -258,9 +306,9 @@ dojo.declare("alfresco.xforms.DatePicker", : dojo.widget.DatePicker.util.toRfcDate(new Date())); this.widget.picker = dojo.widget.createWidget("DatePicker", { - isHidden: true, - storedDate: dp_initial_value - }, + isHidden: true, + storedDate: dp_initial_value + }, datePickerDiv); this.widget.picker.hide(); dojo.event.connect(this.widget.picker, @@ -1058,14 +1106,14 @@ dojo.declare("alfresco.xforms.Repeat", var req = create_ajax_request(this.xform, "swapRepeatItems", { - fromItemId: fromChild.xformsNode.getAttribute("id"), - toItemId: toChild.xformsNode.getAttribute("id"), - instanceId: this.xform.getInstance().getAttribute("id") - }, + fromItemId: fromChild.xformsNode.getAttribute("id"), + toItemId: toChild.xformsNode.getAttribute("id"), + instanceId: this.xform.getInstance().getAttribute("id") + }, function(type, data, event) { - this.xform._handleEventLog(data.documentElement) - }); + this.target._handleEventLog(data.documentElement) + }); send_ajax_request(req); }, setFocusedChild: function(child) @@ -1372,7 +1420,7 @@ dojo.declare("alfresco.xforms.XForm", {}, function(type, data, evt) { - this.xform._loadHandler(data); + this.target._loadHandler(data); })); }, _loadHandler: function(xformDocument) @@ -1389,7 +1437,7 @@ dojo.declare("alfresco.xforms.XForm", ? bindings[i].parent.id : 'null')); } - var alfUI = document.getElementById("alf-ui"); + var alfUI = document.getElementById("alfresco-xforms-ui"); alfUI.style.width = "100%"; this.rootWidget = new alfresco.xforms.Group(this, alfUI); this.rootWidget.render(alfUI); @@ -1407,6 +1455,8 @@ dojo.declare("alfresco.xforms.XForm", return new alfresco.xforms.Repeat(this, node); case XFORMS_NS_PREFIX + ":textarea": return new alfresco.xforms.TextArea(this, node); + case XFORMS_NS_PREFIX + ":upload": + return new alfresco.xforms.FilePicker(this, node); case XFORMS_NS_PREFIX + ":input": var type = this.getType(node); switch (type) @@ -1541,7 +1591,7 @@ dojo.declare("alfresco.xforms.XForm", { id: id, index: index }, function(type, data, evt) { - this.xform._handleEventLog(data.documentElement); + this.target._handleEventLog(data.documentElement); }); send_ajax_request(req); }, @@ -1553,7 +1603,7 @@ dojo.declare("alfresco.xforms.XForm", function(type, data, evt) { dojo.debug("fireAction." + type); - this.xform._handleEventLog(data.documentElement); + this.target._handleEventLog(data.documentElement); }); send_ajax_request(req); }, @@ -1566,7 +1616,7 @@ dojo.declare("alfresco.xforms.XForm", { id: id, value: value }, function(type, data, evt) { - this.xform._handleEventLog(data.documentElement); + this.target._handleEventLog(data.documentElement); }); send_ajax_request(req); }, @@ -1575,67 +1625,69 @@ dojo.declare("alfresco.xforms.XForm", var prototypeClones = []; for (var i = 0; i < events.childNodes.length; i++) { - if (events.childNodes[i].nodeType == dojo.dom.ELEMENT_NODE) + if (events.childNodes[i].nodeType != dojo.dom.ELEMENT_NODE) { - var xfe = new alfresco.xforms.XFormsEvent(events.childNodes[i]); - dojo.debug("parsing " + xfe.type + - "(" + xfe.targetId + ", " + xfe.targetName + ")"); - switch (xfe.type) + continue; + } + var xfe = new alfresco.xforms.XFormsEvent(events.childNodes[i]); + dojo.debug("parsing " + xfe.type + + "(" + xfe.targetId + ", " + xfe.targetName + ")"); + switch (xfe.type) + { + case "chiba-index-changed": + { + var index = Number(xfe.properties["index"]) - 1; + try { - case "chiba-index-changed": - { - var index = Number(xfe.properties["index"]) - 1; - try - { - xfe.getTarget().handleIndexChanged(index); - } - catch (e) - { - dojo.debug(e); - } - break; + xfe.getTarget().handleIndexChanged(index); } - case "chiba-state-changed": + catch (e) { - xfe.getTarget().setModified(true); - xfe.getTarget().setValid(xfe.properties["valid"] == "true"); - xfe.getTarget().setRequired(xfe.properties["required"] == "true"); - xfe.getTarget().setReadonly(xfe.properties["readonly"] == "true"); - xfe.getTarget().setEnabled(xfe.properties["enabled"] == "true"); - if ("value" in xfe.properties) - { - xfe.getTarget().setValue(xfe.properties["value"]); - } - break; + dojo.debug(e); } - case "chiba-prototype-cloned": + break; + } + case "chiba-state-changed": + { + xfe.getTarget().setModified(true); + xfe.getTarget().setValid(xfe.properties["valid"] == "true"); + xfe.getTarget().setRequired(xfe.properties["required"] == "true"); + xfe.getTarget().setReadonly(xfe.properties["readonly"] == "true"); + xfe.getTarget().setEnabled(xfe.properties["enabled"] == "true"); + if ("value" in xfe.properties) { - var prototypeId = xfe.properties["prototypeId"]; - var originalId = xfe.properties["originalId"]; - dojo.debug("handlePrototypeCloned(" + xfe.targetId + - ", " + originalId + - ", " + prototypeId + ")"); + xfe.getTarget().setValue(xfe.properties["value"]); + } + break; + } + case "chiba-prototype-cloned": + { + var prototypeId = xfe.properties["prototypeId"]; + var originalId = xfe.properties["originalId"]; + dojo.debug("handlePrototypeCloned(" + xfe.targetId + + ", " + originalId + + ", " + prototypeId + ")"); - var prototypeNode = _findElementById(this.xformsNode, originalId); - var binding = this.getBinding(prototypeNode); - var prototypeToClone = null; - for (var w in binding.widgets) + var prototypeNode = _findElementById(this.xformsNode, originalId); + var binding = this.getBinding(prototypeNode); + var prototypeToClone = null; + for (var w in binding.widgets) + { + if (binding.widgets[w] instanceof alfresco.xforms.Repeat) { - if (binding.widgets[w] instanceof alfresco.xforms.Repeat) - { - var chibaData = _getElementsByTagNameNS(binding.widgets[w].xformsNode, - CHIBA_NS, - CHIBA_NS_PREFIX, "data"); - if (chibaData.length == 0) - continue; - prototypeToClone = dojo.dom.firstElement(chibaData[chibaData.length - 1]); - } + var chibaData = _getElementsByTagNameNS(binding.widgets[w].xformsNode, + CHIBA_NS, + CHIBA_NS_PREFIX, "data"); + if (chibaData.length == 0) + continue; + prototypeToClone = dojo.dom.firstElement(chibaData[chibaData.length - 1]); } - if (!prototypeToClone) - throw new Error("unable to find prototype for " + originalId); - dojo.debug("cloning prototype " + prototypeToClone.getAttribute("id")); - var clone = prototypeToClone.cloneNode(true); - clone.setAttribute("id", prototypeId); + } + if (!prototypeToClone) + throw new Error("unable to find prototype for " + originalId); + dojo.debug("cloning prototype " + prototypeToClone.getAttribute("id")); + var clone = prototypeToClone.cloneNode(true); + clone.setAttribute("id", prototypeId); // if (true || originalId == xfe.targetId) // var clone = xfe.getTarget().handlePrototypeCloned(prototypeId); // else @@ -1644,87 +1696,98 @@ dojo.declare("alfresco.xforms.XForm", // var clone = originalWidget.widget.handlePrototypeCloned(prototypeId); // } - prototypeClones.push(clone); - break; - } - case "chiba-id-generated": - { - var originalId = xfe.properties["originalId"]; + prototypeClones.push(clone); + break; + } + case "chiba-id-generated": + { + var originalId = xfe.properties["originalId"]; - dojo.debug("handleIdGenerated(" + xfe.targetId + ", " + originalId + ")"); - var clone = prototypeClones[prototypeClones.length - 1]; - var node = _findElementById(clone, originalId); - if (node) - { - dojo.debug("applying id " + xfe.targetId + - " to " + node.nodeName + "(" + originalId + ")"); - node.setAttribute("id", xfe.targetId); - } - else - throw new Error("unable to find " + originalId + - " in clone " + dojo.dom.innerXML(clone)); - break; - } - case "chiba-item-inserted": + dojo.debug("handleIdGenerated(" + xfe.targetId + ", " + originalId + ")"); + var clone = prototypeClones[prototypeClones.length - 1]; + var node = _findElementById(clone, originalId); + if (node) { - var position = Number(xfe.properties["position"]) - 1; - var originalId = xfe.properties["originalId"]; - var clone = prototypeClones.pop(); - if (prototypeClones.length == 0) - xfe.getTarget().handleItemInserted(clone, position); - else - { - var parentClone = prototypeClones[prototypeClones.length - 1]; - var parentRepeat = _findElementById(parentClone, xfe.targetId); - parentRepeat.appendChild(clone); - } - break; + dojo.debug("applying id " + xfe.targetId + + " to " + node.nodeName + "(" + originalId + ")"); + node.setAttribute("id", xfe.targetId); } - case "chiba-item-deleted": + else + throw new Error("unable to find " + originalId + + " in clone " + dojo.dom.innerXML(clone)); + break; + } + case "chiba-item-inserted": + { + var position = Number(xfe.properties["position"]) - 1; + var originalId = xfe.properties["originalId"]; + var clone = prototypeClones.pop(); + if (prototypeClones.length == 0) + xfe.getTarget().handleItemInserted(clone, position); + else { - var position = Number(xfe.properties["position"]) - 1; - xfe.getTarget().handleItemDeleted(position); - break; + var parentClone = prototypeClones[prototypeClones.length - 1]; + var parentRepeat = _findElementById(parentClone, xfe.targetId); + parentRepeat.appendChild(clone); } - case "chiba-replace-all": - if (this.submitWidget) - { - this.submitWidget.done = true; - this.submitWidget.currentButton.click(); - } - break; - case "xforms-valid": - xfe.getTarget().setValid(true); - xfe.getTarget().setModified(true); - break; - case "xforms-invalid": - xfe.getTarget().setValid(false); - xfe.getTarget().setModified(true); - break; - case "xforms-required": - xfe.getTarget().setRequired(true); - break; - case "xforms-optional": - xfe.getTarget().setRequired(false); - break; - case "xforms-submit-error": - var invalid = this.rootWidget.getWidgetsInvalidForSubmit(); - _show_error(document.createTextNode("Please provide values for all required fields.")); - var error_list = document.createElement("ul"); - for (var j = 0; j < invalid.length; j++) - { - var error_item = document.createElement("li"); - error_item.appendChild(document.createTextNode(invalid[j].getAlert())); - error_list.appendChild(error_item); - invalid[j].showAlert(); - } - _show_error(error_list); - break; - default: + break; + } + case "chiba-item-deleted": + { + var position = Number(xfe.properties["position"]) - 1; + xfe.getTarget().handleItemDeleted(position); + break; + } + case "chiba-replace-all": + { + if (this.submitWidget) { - dojo.debug("unhandled event " + events.childNodes[i].nodeName); + this.submitWidget.done = true; + this.submitWidget.currentButton.click(); } + break; + } + case "xforms-valid": + { + xfe.getTarget().setValid(true); + xfe.getTarget().setModified(true); + break; + } + case "xforms-invalid": + { + xfe.getTarget().setValid(false); + xfe.getTarget().setModified(true); + break; + } + case "xforms-required": + { + xfe.getTarget().setRequired(true); + break; + } + case "xforms-optional": + { + xfe.getTarget().setRequired(false); + break; + } + case "xforms-submit-error": + { + var invalid = this.rootWidget.getWidgetsInvalidForSubmit(); + _show_error(document.createTextNode("Please provide values for all required fields.")); + var error_list = document.createElement("ul"); + for (var j = 0; j < invalid.length; j++) + { + var error_item = document.createElement("li"); + error_item.appendChild(document.createTextNode(invalid[j].getAlert())); + error_list.appendChild(error_item); + invalid[j].showAlert(); } + _show_error(error_list); + break; + } + default: + { + dojo.debug("unhandled event " + events.childNodes[i].nodeName); + } } } } @@ -1749,10 +1812,10 @@ function _findElementById(node, id) return null; } -function create_ajax_request(xform, serverMethod, methodArgs, load, error) +function create_ajax_request(target, serverMethod, methodArgs, load, error) { var result = new dojo.io.Request(WEBAPP_CONTEXT + "/ajax/invoke/XFormsBean." + serverMethod, "text/xml"); - result.xform = xform; + result.target = target; result.content = methodArgs; result.load = load; @@ -1772,7 +1835,7 @@ function create_ajax_request(xform, serverMethod, methodArgs, load, error) function _hide_errors() { - var errorDiv = document.getElementById("alf-xforms-error"); + var errorDiv = document.getElementById("alfresco-xforms-error"); if (errorDiv) { dojo.dom.removeChildren(errorDiv); @@ -1782,17 +1845,17 @@ function _hide_errors() function _show_error(msg) { - var errorDiv = document.getElementById("alf-xforms-error"); + var errorDiv = document.getElementById("alfresco-xforms-error"); if (!errorDiv) { errorDiv = document.createElement("div"); - errorDiv.setAttribute("id", "alf-xforms-error"); - errorDiv.setAttribute(document.all ? "className" : "class", "infoText statusErrorText"); + errorDiv.setAttribute("id", "alfresco-xforms-error"); + dojo.html.setClass(errorDiv, "infoText statusErrorText"); errorDiv.style.padding = "2px"; errorDiv.style.borderColor = "#003366"; errorDiv.style.borderWidth = "1px"; errorDiv.style.borderStyle = "solid"; - var alfUI = document.getElementById("alf-ui"); + var alfUI = document.getElementById("alfresco-xforms-ui"); dojo.dom.prependChild(errorDiv, alfUI); } if (errorDiv.style.display == "block") @@ -1810,11 +1873,11 @@ function send_ajax_request(req) function _get_ajax_loader_element() { - var result = document.getElementById("alf-ajax-loader"); + var result = document.getElementById("alfresco-ajax-loader"); if (result) return result; result = document.createElement("div"); - result.setAttribute("id", "alf-ajax-loader"); + result.setAttribute("id", "alfresco-ajax-loader"); result.style.position = "absolute"; result.style.right = "0px"; result.style.top = "0px"; @@ -1953,3 +2016,216 @@ if (!Array.prototype.indexOf) return -1; } } + +function FilePickerWidget(node, value, readonly) +{ + this.node = node; + this.value = value == null || value.length == 0 ? null : value; + this.readonly = readonly || false; +} + +FilePickerWidget.prototype = { +getValue: function() +{ + return this.value; +}, +setValue: function(v) +{ + this.value = (v == null || v.length == 0 ? null : v); + var event = document.createEvent("UIEvents"); + event.initUIEvent("valueChanged", true, true, window, 0); + this.node.dispatchEvent(event); +}, +setReadonly: function(r) +{ + this.readonly = r; +}, +render: function() +{ + this._showSelectedValue(); +}, +_showSelectedValue: function() +{ + var d = this.node.ownerDocument; + dojo.dom.removeChildren(this.node); + dojo.html.setClass(this.node, "selector"); + + this.node.style.height = "20px"; + this.node.style.lineHeight = this.node.style.height; + var event = d.createEvent("UIEvents"); + event.initUIEvent("heightChanged", true, true, window, 0); + this.node.dispatchEvent(event); + + this.node.appendChild(d.createTextNode(this.value == null + ? "" + : this.value)); + var selectButton = d.createElement("input"); + this.node.appendChild(selectButton); + selectButton.filePickerWidget = this; + selectButton.type = "button"; + selectButton.value = this.value == null ? "Select" : "Change"; + selectButton.enabled = this.readonly; + selectButton.style.marginLeft = "10px"; + selectButton.style.position = "absolute"; + selectButton.style.right = "10px"; + selectButton.style.top = (.5 * this.node.offsetHeight) - (.5 * selectButton.offsetHeight) + "px"; + dojo.event.connect(selectButton, + "onclick", + function(event) + { + var w = event.target.filePickerWidget; + w._navigateToNode(w.getValue() || ""); + }); +}, +_navigateToNode: function(path) +{ + var req = create_ajax_request(this, + "getFilePickerData", + {}, + function(type, data, evt) + { + this.target._showPicker(data.documentElement); + }); + req.content.currentPath = path; + send_ajax_request(req); +}, +_showPicker: function(data) +{ + dojo.dom.removeChildren(this.node); + var d = this.node.ownerDocument; + this.node.style.height = "200px"; + var event = d.createEvent("UIEvents"); + event.initUIEvent("heightChanged", true, true, window, 0); + this.node.dispatchEvent(event); + + var currentPath = data.getElementsByTagName("current-node")[0]; + currentPath = currentPath.getAttribute("webappRelativePath"); + var currentPathName = currentPath.replace(/.*\/([^/]+)/, "$1") + + var headerDiv = d.createElement("div"); + headerDiv.style.position = "relative"; + this.node.appendChild(headerDiv); + headerDiv.style.width = "100%"; + headerDiv.style.backgroundColor = "lightgrey"; + headerDiv.style.paddingLeft = "2px"; + headerDiv.appendChild(d.createTextNode("In: " + currentPathName)); + + var headerRightLink = d.createElement("a"); + headerRightLink.setAttribute("webappRelativePath", currentPath); + headerRightLink.filePickerWidget = this; + headerRightLink.setAttribute("href", "javascript:void(0)"); + if (currentPathName != "/") + { + dojo.event.connect(headerRightLink, + "onclick", + function(event) + { + var w = event.target.filePickerWidget; + var parentPath = event.target.getAttribute("webappRelativePath"); + parentPath = (parentPath.lastIndexOf("/") == 0 + ? "/" + : parentPath.substring(0, parentPath.lastIndexOf("/"))); + w._navigateToNode(parentPath); + }); + } + var navigateToParentNodeImage = d.createElement("img"); + navigateToParentNodeImage.style.borderWidth = "0px"; + navigateToParentNodeImage.style.opacity = (currentPathName == "/" ? .3 : 1); + navigateToParentNodeImage.style.marginRight = "2px"; + navigateToParentNodeImage.setAttribute("src", WEBAPP_CONTEXT + "/images/icons/up.gif"); + headerRightLink.appendChild(navigateToParentNodeImage); + headerRightLink.appendChild(d.createTextNode("Go up")); + + headerRightLink.style.position = "absolute"; + headerRightLink.style.height = headerDiv.style.height; + headerRightLink.style.lineHeight = headerRightLink.style.height; + headerRightLink.style.top = "0px"; + headerRightLink.style.right = "0px"; + headerRightLink.style.paddingRight = "2px"; + headerDiv.appendChild(headerRightLink); + + var contentDiv = d.createElement("div"); + this.node.appendChild(contentDiv); + + var footerDiv = d.createElement("div"); + footerDiv.style.backgroundColor = "lightgrey"; + var cancelButton = d.createElement("input"); + cancelButton.filePickerWidget = this; + cancelButton.type = "button"; + cancelButton.value = "Cancel"; + cancelButton.style.margin = "2px 0px 2px 0px"; + dojo.event.connect(e, "onclick", function(event) + { + var w = event.target.filePickerWidget; + w._showSelectedValue(); + }); + + footerDiv.style.textAlign = "center"; + footerDiv.style.height = headerDiv.style.height; + footerDiv.appendChild(cancelButton); + this.node.appendChild(footerDiv); + + contentDiv.style.height = (this.node.offsetHeight - + footerDiv.offsetHeight - + headerDiv.offsetHeight - 10) + "px"; + contentDiv.style.overflowY = "auto"; + var childNodes = data.getElementsByTagName("child-node"); + for (var i = 0; i < childNodes.length; i++) + { + if (childNodes[i].nodeType != dojo.dom.ELEMENT_NODE) + { + continue; + } + var row = d.createElement("div"); + contentDiv.appendChild(row); + row.style.position = "relative"; + row.style.backgroundColor = i % 2 ? "#f0f0ee" : "#ffffff" + var e = d.createElement("img"); + e.align = "absmiddle"; + e.style.margin = "0px 4px 0px 4px"; + e.setAttribute("src", WEBAPP_CONTEXT + childNodes[i].getAttribute("image")); + row.appendChild(e); + + var path = childNodes[i].getAttribute("webappRelativePath"); + var name = path.replace(/.*\/([^/]+)/, "$1"); + + if (childNodes[i].getAttribute("type") == "directory") + { + e = d.createElement("a"); + e.filePickerWidget = this; + e.setAttribute("href", "javascript:void(0)"); + e.setAttribute("webappRelativePath", path); + dojo.event.connect(e, "onclick", function(event) + { + var w = event.target.filePickerWidget; + w._navigateToNode(event.target.getAttribute("webappRelativePath")); + return true; + }); + e.appendChild(d.createTextNode(name)); + row.appendChild(e); + } + else + { + row.appendChild(d.createTextNode(name)); + } + + e = d.createElement("input"); + e.filePickerWidget = this; + row.appendChild(e); + e.type = "button"; + e.name = path; + e.value = "Select"; + + e.style.position = "absolute"; + e.style.right = "10px"; + e.style.top = (.5 * row.offsetHeight) - (.5 * e.offsetHeight) + "px"; + dojo.event.connect(e, "onclick", function(event) + { + var w = event.target.filePickerWidget; + w.setValue(event.target.name); + w._showSelectedValue(); + }); + + } +} +};