/** * Generate Javascript code to test whether an item conforms to this item type * * @param knownToBe a type that this item is known to conform to * @param targetVersion * @return a Javascript instruction or sequence of instructions, which can be used as the body * of a Javascript function, and which returns a boolean indication whether the value of the * variable "item" is an instance of this item type. * @throws XPathException if JS code cannot be generated for this item type, for example because * the test is schema-aware. */ @Override public String generateJavaScriptItemTypeTest(ItemType knownToBe, int targetVersion) throws XPathException { if (this == ANY_MAP_TYPE) { return "return SaxonJS.U.isMap(item)"; } FastStringBuffer fsb = new FastStringBuffer(256); fsb.append("function k(item) {" + keyType.generateJavaScriptItemTypeTest(BuiltInAtomicType.ANY_ATOMIC, targetVersion) + "};"); fsb.append("function v(item) {" + valueType.getPrimaryType().generateJavaScriptItemTypeTest(AnyItemType.getInstance(), targetVersion) + "};"); int card = valueType.getCardinality(); fsb.append(Cardinality.generateJavaScriptChecker(card)); if (targetVersion == 1) { fsb.append("return SaxonJS.U.isMap(item) && item.conforms(k, v, c);"); } else { fsb.append("return SaxonJS.U.isConstrainedMap(item, k, v, c);"); } return fsb.toString(); } }
/** * Generate Javascript code to test whether an item conforms to this item type * * @param knownToBe a type that this item is known to conform to * @param targetVersion * @return a Javascript instruction or sequence of instructions, which can be used as the body * of a Javascript function, and which returns a boolean indication whether the value of the * variable "item" is an instance of this item type. * @throws XPathException if JS code cannot be generated for this item type, for example because * the test is schema-aware. */ @Override public String generateJavaScriptItemTypeTest(ItemType knownToBe, int targetVersion) throws XPathException { if (this == ANY_MAP_TYPE) { return "return SaxonJS.U.isMap(item)"; } FastStringBuffer fsb = new FastStringBuffer(256); fsb.append("function k(item) {" + keyType.generateJavaScriptItemTypeTest(BuiltInAtomicType.ANY_ATOMIC, targetVersion) + "};"); fsb.append("function v(item) {" + valueType.getPrimaryType().generateJavaScriptItemTypeTest(AnyItemType.getInstance(), targetVersion) + "};"); int card = valueType.getCardinality(); fsb.append(Cardinality.generateJavaScriptChecker(card)); if (targetVersion == 1) { fsb.append("return SaxonJS.U.isMap(item) && item.conforms(k, v, c);"); } else { fsb.append("return SaxonJS.U.isConstrainedMap(item, k, v, c);"); } return fsb.toString(); } }
} else if (targetVersion == 1) { FastStringBuffer fsb = new FastStringBuffer(256); fsb.append("function v(item) {" + memberType.getPrimaryType().generateJavaScriptItemTypeTest(AnyItemType.getInstance(), targetVersion) + "};"); fsb.append(Cardinality.generateJavaScriptChecker(memberType.getCardinality())); fsb.append("return SaxonJS.U.isArray(item) && " + fsb.append("function v(item) {" + memberType.getPrimaryType().generateJavaScriptItemTypeTest(AnyItemType.getInstance(), targetVersion) + "};"); fsb.append(Cardinality.generateJavaScriptChecker(memberType.getCardinality())); fsb.append("return SaxonJS.U.isConstrainedArray(item, v, c);");
} else if (targetVersion == 1) { FastStringBuffer fsb = new FastStringBuffer(256); fsb.append("function v(item) {" + memberType.getPrimaryType().generateJavaScriptItemTypeTest(AnyItemType.getInstance(), targetVersion) + "};"); fsb.append(Cardinality.generateJavaScriptChecker(memberType.getCardinality())); fsb.append("return SaxonJS.U.isArray(item) && " + fsb.append("function v(item) {" + memberType.getPrimaryType().generateJavaScriptItemTypeTest(AnyItemType.getInstance(), targetVersion) + "};"); fsb.append(Cardinality.generateJavaScriptChecker(memberType.getCardinality())); fsb.append("return SaxonJS.U.isConstrainedArray(item, v, c);");
/** * Diagnostic print of expression structure. The abstract expression tree * is written to the supplied output destination. */ public void export(ExpressionPresenter out) throws XPathException { out.startElement("treat", this); out.emitAttribute("as", requiredItemType.toExportString()); if ("JS".equals(((ExpressionPresenter.ExportOptions) out.getOptions()).target)) { int targetVersion = ((ExpressionPresenter.ExportOptions) out.getOptions()).targetVersion; out.emitAttribute("jsTest", requiredItemType.generateJavaScriptItemTypeTest(getBaseExpression().getItemType(), targetVersion)); } out.emitAttribute("diag", role.save()); getBaseExpression().export(out); out.endElement(); }
/** * Diagnostic print of expression structure. The abstract expression tree * is written to the supplied output destination. */ public void export(ExpressionPresenter out) throws XPathException { out.startElement("instance", this); if (targetCardinality == StaticProperty.ALLOWS_ZERO) { out.emitAttribute("of", "empty-sequence()"); } else { out.emitAttribute("of", targetType.toExportString() + Cardinality.getOccurrenceIndicator(targetCardinality)); } if ("JS".equals(((ExpressionPresenter.ExportOptions) out.getOptions()).target)) { int targetVersion = ((ExpressionPresenter.ExportOptions) out.getOptions()).targetVersion; out.emitAttribute("jsTest", targetType.generateJavaScriptItemTypeTest(getBaseExpression().getItemType(), targetVersion)); } getBaseExpression().export(out); out.endElement(); }
/** * Diagnostic print of expression structure. The abstract expression tree * is written to the supplied output destination. */ public void export(ExpressionPresenter out) throws XPathException { out.startElement("instance", this); if (targetCardinality == StaticProperty.ALLOWS_ZERO) { out.emitAttribute("of", "empty-sequence()"); } else { out.emitAttribute("of", targetType.toExportString() + Cardinality.getOccurrenceIndicator(targetCardinality)); } if ("JS".equals(((ExpressionPresenter.ExportOptions) out.getOptions()).target)) { int targetVersion = ((ExpressionPresenter.ExportOptions) out.getOptions()).targetVersion; out.emitAttribute("jsTest", targetType.generateJavaScriptItemTypeTest(getBaseExpression().getItemType(), targetVersion)); } getBaseExpression().export(out); out.endElement(); }
/** * Export the global context item declaration to an SEF export file * @param out the export destination * @throws XPathException if things go wrong */ public void export(ExpressionPresenter out) throws XPathException { out.startElement("glob"); String use; if (isMayBeOmitted()) { if (isAbsentFocus()) { use = "pro"; } else { use = "opt"; } } else { use = "req"; } out.emitAttribute("use", use); if (!getRequiredItemType().equals(AnyItemType.getInstance())) { out.emitAttribute("type", getRequiredItemType().toExportString()); } if ("JS".equals(((ExpressionPresenter.ExportOptions) out.getOptions()).target)) { int targetVersion = ((ExpressionPresenter.ExportOptions) out.getOptions()).targetVersion; out.emitAttribute("jsTest", getRequiredItemType().generateJavaScriptItemTypeTest( AnyItemType.getInstance(), targetVersion)); } out.endElement(); }
/** * Export the global context item declaration to an SEF export file * @param out the export destination * @throws XPathException if things go wrong */ public void export(ExpressionPresenter out) throws XPathException { out.startElement("glob"); String use; if (isMayBeOmitted()) { if (isAbsentFocus()) { use = "pro"; } else { use = "opt"; } } else { use = "req"; } out.emitAttribute("use", use); if (!getRequiredItemType().equals(AnyItemType.getInstance())) { out.emitAttribute("type", getRequiredItemType().toExportString()); } if ("JS".equals(((ExpressionPresenter.ExportOptions) out.getOptions()).target)) { int targetVersion = ((ExpressionPresenter.ExportOptions) out.getOptions()).targetVersion; out.emitAttribute("jsTest", getRequiredItemType().generateJavaScriptItemTypeTest( AnyItemType.getInstance(), targetVersion)); } out.endElement(); }
/** * Diagnostic print of expression structure. The abstract expression tree * is written to the supplied output destination. */ public void export(ExpressionPresenter out) throws XPathException { out.startElement("treat", this); out.emitAttribute("as", requiredItemType.toExportString()); ExpressionPresenter.ExportOptions options = (ExpressionPresenter.ExportOptions) out.getOptions(); if ("JS".equals(options.target)) { int targetVersion = options.targetVersion; out.emitAttribute("jsTest", requiredItemType.generateJavaScriptItemTypeTest(getBaseExpression().getItemType(), targetVersion)); if (targetVersion == 2) { SequenceType st = SequenceType.makeSequenceType(requiredItemType, StaticProperty.EXACTLY_ONE); out.emitAttribute("asJ", st.toExportString2()); } } out.emitAttribute("diag", role.save()); getBaseExpression().export(out); out.endElement(); }
public void explainProperties(ExpressionPresenter presenter) throws XPathException { if (getRequiredContextItemType() != AnyItemType.getInstance()) { presenter.emitAttribute("cxt", getRequiredContextItemType().toString()); if ("JS".equals(((ExpressionPresenter.ExportOptions) presenter.getOptions()).target)) { int targetVersion = ((ExpressionPresenter.ExportOptions) presenter.getOptions()).targetVersion; presenter.emitAttribute("jsTest", getRequiredContextItemType().generateJavaScriptItemTypeTest(AnyItemType.getInstance(), targetVersion)); } } String flags = ""; if (!absentFocus) { flags += "s"; } presenter.emitAttribute("flags", flags); if (getRequiredType() != SequenceType.ANY_SEQUENCE) { presenter.emitAttribute("as", getRequiredType().toExportString()); } presenter.emitAttribute("line", getLineNumber() + ""); presenter.emitAttribute("module", getSystemId()); if (isDeclaredStreamable()) { presenter.emitAttribute("streamable", "1"); } }
public void explainProperties(ExpressionPresenter presenter) throws XPathException { if (getRequiredContextItemType() != AnyItemType.getInstance()) { presenter.emitAttribute("cxt", getRequiredContextItemType().toString()); if ("JS".equals(((ExpressionPresenter.ExportOptions) presenter.getOptions()).target)) { int targetVersion = ((ExpressionPresenter.ExportOptions) presenter.getOptions()).targetVersion; presenter.emitAttribute("jsTest", getRequiredContextItemType().generateJavaScriptItemTypeTest(AnyItemType.getInstance(), targetVersion)); } } String flags = ""; if (!absentFocus) { flags += "s"; } presenter.emitAttribute("flags", flags); if (getRequiredType() != SequenceType.ANY_SEQUENCE) { presenter.emitAttribute("as", getRequiredType().toExportString()); } presenter.emitAttribute("line", getLineNumber() + ""); presenter.emitAttribute("module", getSystemId()); if (isDeclaredStreamable()) { presenter.emitAttribute("streamable", "1"); } }
public void explainProperties(ExpressionPresenter presenter) throws XPathException { if (getRequiredContextItemType() != AnyItemType.getInstance()) { presenter.emitAttribute("cxt", getRequiredContextItemType().toExportString()); if ("JS".equals(((ExpressionPresenter.ExportOptions) presenter.getOptions()).target)) { try { int targetVersion = ((ExpressionPresenter.ExportOptions) presenter.getOptions()).targetVersion; presenter.emitAttribute("jsTest", getRequiredContextItemType().generateJavaScriptItemTypeTest(AnyItemType.getInstance(), targetVersion)); } catch (XPathException e) { e.maybeSetLocation(getLocation()); throw e; } } } String flags = ""; if (mayOmitContextItem) { flags = "o"; } if (!absentFocus) { flags += "s"; } presenter.emitAttribute("flags", flags); if (getRequiredType() != SequenceType.ANY_SEQUENCE) { presenter.emitAttribute("as", getRequiredType().toExportString()); } presenter.emitAttribute("line", getLineNumber() + ""); presenter.emitAttribute("module", getSystemId()); }
public void explainProperties(ExpressionPresenter presenter) throws XPathException { if (getRequiredContextItemType() != AnyItemType.getInstance()) { presenter.emitAttribute("cxt", getRequiredContextItemType().toExportString()); if ("JS".equals(((ExpressionPresenter.ExportOptions) presenter.getOptions()).target)) { try { int targetVersion = ((ExpressionPresenter.ExportOptions) presenter.getOptions()).targetVersion; presenter.emitAttribute("jsTest", getRequiredContextItemType().generateJavaScriptItemTypeTest(AnyItemType.getInstance(), targetVersion)); } catch (XPathException e) { e.maybeSetLocation(getLocation()); throw e; } } } String flags = ""; if (mayOmitContextItem) { flags = "o"; } if (!absentFocus) { flags += "s"; } presenter.emitAttribute("flags", flags); if (getRequiredType() != SequenceType.ANY_SEQUENCE) { presenter.emitAttribute("as", getRequiredType().toExportString()); } presenter.emitAttribute("line", getLineNumber() + ""); presenter.emitAttribute("module", getSystemId()); }