List of usage examples for org.apache.commons.jxpath JXPathContext getRelativeContext
public abstract JXPathContext getRelativeContext(Pointer pointer);
From source file:org.apache.cocoon.forms.binding.SimpleRepeaterJXPathBinding.java
public void doLoad(Widget frmModel, JXPathContext jctx) throws BindingException { // Find the repeater and clear it Repeater repeater = (Repeater) selectWidget(frmModel, this.repeaterId); if (this.clearOnLoad) { repeater.clear();//from w w w. j a v a2 s .c o m } // Move to repeater context Pointer ptr = jctx.getPointer(this.repeaterPath); if (ptr.getNode() != null) { // There are some nodes to load from JXPathContext repeaterContext = jctx.getRelativeContext(ptr); // build a jxpath iterator for pointers Iterator rowPointers = repeaterContext.iteratePointers(this.rowPath); //iterate through it int rowNum = 0; while (rowPointers.hasNext()) { // Get a row. It is created if needed (depends on clearOnLoad) Repeater.RepeaterRow thisRow; if (repeater.getSize() > rowNum) { thisRow = repeater.getRow(rowNum); } else { thisRow = repeater.addRow(); } rowNum++; // make a jxpath sub context on the iterated element Pointer jxp = (Pointer) rowPointers.next(); JXPathContext rowContext = repeaterContext.getRelativeContext(jxp); this.rowBinding.loadFormFromModel(thisRow, rowContext); } } if (getLogger().isDebugEnabled()) { getLogger().debug("done loading rows " + toString()); } }
From source file:org.apache.cocoon.forms.binding.SimpleRepeaterJXPathBinding.java
public void doSave(Widget frmModel, JXPathContext jctx) throws BindingException { // Find the repeater Repeater repeater = (Repeater) selectWidget(frmModel, this.repeaterId); if (repeater.getSize() == 0 && this.deleteIfEmpty) { // Repeater is empty : erase all jctx.removeAll(this.repeaterPath); } else {//from w w w .ja va 2 s . com // Repeater is not empty // Move to repeater context and create the path if needed JXPathContext repeaterContext = jctx.getRelativeContext(jctx.createPath(this.repeaterPath)); // Delete all that is already present repeaterContext.removeAll(this.rowPath); for (int i = 0; i < repeater.getSize(); i++) { Pointer rowPtr = repeaterContext.createPath(this.rowPath + '[' + (i + 1) + ']'); JXPathContext rowContext = repeaterContext.getRelativeContext(rowPtr); this.rowBinding.saveFormToModel(repeater.getRow(i), rowContext); } } }
From source file:org.apache.cocoon.forms.binding.TempRepeaterJXPathBinding.java
public void doLoad(Widget frmModel, JXPathContext jctx) throws BindingException { // (There should be a general widget type checker for all the bindings to use, // coupled with a general informative exception class to throw if the widget is // of the wrong type or null.) Repeater repeater = (Repeater) selectWidget(frmModel, this.repeaterId); if (repeater == null) { String fullId = frmModel.getRequestParameterName(); if (fullId == null || fullId.length() == 0) { fullId = ""; } else {//from ww w .j a va 2 s . c o m fullId = fullId + "."; } throw new RuntimeException("TempRepeaterJXPathBinding: Repeater \"" + fullId + this.repeaterId + "\" does not exist (" + frmModel.getLocation() + ")"); } // Start by clearing the repeater, if necessary. if (this.clearOnLoad) { repeater.clear(); } // Find the location of the repeater data. Pointer repeaterPointer = jctx.getPointer(this.repeaterPath); // Check if there is data present. // // (Otherwise, should we check the leniency config option // to decide whether to be silent or throw an exception?) if (repeaterPointer != null) { // Narrow to repeater context. JXPathContext repeaterContext = jctx.getRelativeContext(repeaterPointer); // Build a jxpath iterator for the repeater row pointers. Iterator rowPointers = repeaterContext.iteratePointers(this.rowPath); // Iterate through the rows of data. int rowNum = 0; while (rowPointers.hasNext()) { // Get or create a row widget. Repeater.RepeaterRow thisRow; if (repeater.getSize() > rowNum) { thisRow = repeater.getRow(rowNum); } else { thisRow = repeater.addRow(); } rowNum++; // Narrow to the row context. Pointer rowPointer = (Pointer) rowPointers.next(); JXPathContext rowContext = repeaterContext.getRelativeContext(rowPointer); // If virtual rows are requested, place a deep clone of the row data // into a temporary node, and narrow the context to this virtual row. // // (A clone of the data is used to prevent modifying the source document. // Otherwise, the appendChild method would remove the data from the source // document. Is this protection worth the penalty of a deep clone?) // // (This implementation of virtual rows currently only supports DOM // bindings, but could easily be extended to support other bindings.) if (virtualRows == true) { Node repeaterNode = (Node) repeaterPointer.getNode(); Node virtualNode = repeaterNode.getOwnerDocument().createElementNS(null, "virtual"); Node node = (Node) rowPointer.getNode(); Node clone = node.cloneNode(true); Node fakeDocElement = node.getOwnerDocument().getDocumentElement().cloneNode(false); virtualNode.appendChild(clone); fakeDocElement.appendChild(virtualNode); rowContext = JXPathContext.newContext(repeaterContext, fakeDocElement); rowContext = rowContext.getRelativeContext(rowContext.getPointer("virtual")); } // Finally, perform the load row binding. this.rowBinding.loadFormFromModel(thisRow, rowContext); } } if (getLogger().isDebugEnabled()) getLogger().debug("done loading rows " + toString()); }
From source file:org.apache.cocoon.forms.binding.TempRepeaterJXPathBinding.java
public void doSave(Widget frmModel, JXPathContext jctx) throws BindingException { // (See comment in doLoad about type checking and throwing a meaningful exception.) Repeater repeater = (Repeater) selectWidget(frmModel, this.repeaterId); // Perform shortcut binding if the repeater is empty // and the deleteIfEmpty config option is selected. if (repeater.getSize() == 0 && this.deleteIfEmpty) { // Delete all of the old data for this repeater. jctx.removeAll(this.repeaterPath); // Otherwise perform the normal save binding. } else {/*from w ww .j ava2s . com*/ // Narrow to the repeater context, creating the path if it did not exist. JXPathContext repeaterContext = jctx.getRelativeContext(jctx.createPath(this.repeaterPath)); // Start by deleting all of the old row data. repeaterContext.removeAll(this.rowPath); // Verify that repeater is not empty and has an insert row binding. if (repeater.getSize() > 0) { if (this.insertRowBinding != null) { //register the factory! //this.insertRowBinding.saveFormToModel(repeater, repeaterContext); // Iterate through the repeater rows. for (int i = 0; i < repeater.getSize(); i++) { // Narrow to the repeater row context. Pointer rowPointer = repeaterContext.getPointer(this.rowPathInsert); JXPathContext rowContext = repeaterContext.getRelativeContext(rowPointer); // Variables used for virtual rows. // They are initialized here just to keep the compiler happy. Node rowNode = null; Node virtualNode = null; // If virtual rows are requested, create a temporary node and // narrow the context to this initially empty new virtual row. if (virtualRows == true) { rowNode = (Node) rowContext.getContextBean(); Document document = rowNode.getOwnerDocument(); virtualNode = document.createElementNS(null, "virtual"); Node fakeDocElement = document.getDocumentElement().cloneNode(false); fakeDocElement.appendChild(virtualNode); rowContext = JXPathContext.newContext(repeaterContext, fakeDocElement); rowContext = rowContext.getRelativeContext(rowContext.getPointer("virtual")); } // Perform the insert row binding this.insertRowBinding.saveFormToModel(repeater, rowContext); // Perform the save row binding. this.rowBinding.saveFormToModel(repeater.getRow(i), rowContext); // If virtual rows are requested, finish by appending the // children of the virtual row to the real context node. if (virtualRows == true) { NodeList list = virtualNode.getChildNodes(); int count = list.getLength(); for (int j = 0; j < count; j++) { // The list shrinks when a child is appended to the context // node, so we always reference the first child in the list. rowNode.appendChild(list.item(0)); } } getLogger().debug("bound new row"); } } else { getLogger().warn("TempRepeaterBinding has detected rows to insert, " + "but misses the <on-insert-row> binding to do it."); } } } }
From source file:org.apache.cocoon.forms.binding.UnionJXPathBinding.java
/** * Narrows the scope on the form-model to the member widget-field, and * narrows the scope on the object-model to the member xpath-context * before continuing the binding over the child-bindings. *///from www. j ava 2s .co m public void doLoad(Widget frmModel, JXPathContext jxpc) throws BindingException { Widget widget = selectWidget(frmModel, this.widgetId); JXPathContext subContext = jxpc.getRelativeContext(jxpc.getPointer(this.xpath)); if (!(widget instanceof Union)) throw new RuntimeException( "Binding: Expected Union widget, but received class: \"" + widget.getClass().getName() + "\"."); Union unionWidget = (Union) widget; Binding[] subBindings = getChildBindings(); if (subBindings != null) { int size = subBindings.length; for (int i = 0; i < size; i++) { subBindings[i].loadFormFromModel(unionWidget, subContext); } } if (getLogger().isDebugEnabled()) { getLogger().debug("done loading " + toString()); } }
From source file:org.apache.cocoon.forms.binding.UnionJXPathBinding.java
/** * Narrows the scope on the form-model to the member widget-field, and * narrows the scope on the object-model to the member xpath-context * before continuing the binding over the child-bindings. *//* ww w . j av a 2s.com*/ public void doSave(Widget frmModel, JXPathContext jxpc) throws BindingException { Union unionWidget = (Union) selectWidget(frmModel, this.widgetId); JXPathContext subContext = jxpc.getRelativeContext(jxpc.getPointer(this.xpath)); Binding[] subBindings = getChildBindings(); if (subBindings != null) { int size = subBindings.length; for (int i = 0; i < size; i++) { subBindings[i].saveFormToModel(unionWidget, subContext); } } if (getLogger().isDebugEnabled()) { getLogger().debug("done saving " + toString()); } }
From source file:org.apache.cocoon.forms.binding.ValueJXPathBinding.java
/** * Actively performs the binding from the CForms-form to the ObjectModel * wrapped in a jxpath context//from w w w .j a va 2 s . c o m */ public void doSave(Widget frmModel, JXPathContext jxpc) throws BindingException { Widget widget = selectWidget(frmModel, this.fieldId); Object value = widget.getValue(); if (value != null && convertor != null) { value = convertor.convertToString(value, convertorLocale, null); } Object oldValue = jxpc.getValue(this.xpath); if (getLogger().isDebugEnabled()) { getLogger().debug("value= " + value + "-- oldvalue=" + oldValue); } boolean update = false; if ((value == null && oldValue != null) || value != null && !value.equals(oldValue)) { // first update the value itself if (value != null) { jxpc.createPathAndSetValue(this.xpath, value); } else { jxpc.removePath(this.xpath); } // now perform any other bindings that need to be performed when the value is updated JXPathContext subContext = null; try { subContext = jxpc.getRelativeContext(jxpc.getPointer(this.xpath)); } catch (JXPathException e) { // if the value has been set to null and the underlying model is a bean, then // JXPath will not be able to create a relative context if (getLogger().isDebugEnabled()) { getLogger().debug("(Ignorable) problem binding field " + widget.getRequestParameterName(), e); } } if (subContext != null) { this.updateBinding.saveFormToModel(frmModel, subContext); } update = true; } if (getLogger().isDebugEnabled()) { getLogger().debug("done saving " + toString() + " -- value= " + value + " -- on-update == " + update); } }
From source file:org.apache.cocoon.forms.datatype.FlowJXPathSelectionList.java
public void generateSaxFragment(ContentHandler contentHandler, Locale locale) throws SAXException { JXPathContext ctx = null; Iterator iter = null;/* w w w.j a v a2 s . c o m*/ if (model == null) { Object flowData = FlowHelper.getContextObject(ContextHelper.getObjectModel(this.context)); if (flowData == null) { throw new SAXException("No flow data to produce selection list"); } // Move to the list location ctx = JXPathContext.newContext(flowData); // Iterate on all elements of the list iter = ctx.iteratePointers(this.listPath); } else { // Move to the list location ctx = JXPathContext.newContext(model); // Iterate on all elements of the list iter = ctx.iteratePointers("."); } // Start the selection-list contentHandler.startElement(FormsConstants.INSTANCE_NS, SELECTION_LIST_EL, FormsConstants.INSTANCE_PREFIX_COLON + SELECTION_LIST_EL, XMLUtils.EMPTY_ATTRIBUTES); if (this.nullable) { final AttributesImpl voidAttrs = new AttributesImpl(); voidAttrs.addCDATAAttribute("value", ""); contentHandler.startElement(FormsConstants.INSTANCE_NS, ITEM_EL, FormsConstants.INSTANCE_PREFIX_COLON + ITEM_EL, voidAttrs); if (this.nullText != null) { contentHandler.startElement(FormsConstants.INSTANCE_NS, LABEL_EL, FormsConstants.INSTANCE_PREFIX_COLON + LABEL_EL, XMLUtils.EMPTY_ATTRIBUTES); if (this.nullTextIsI18nKey) { if ((this.i18nCatalog != null) && (this.i18nCatalog.trim().length() > 0)) { new I18nMessage(this.nullText, this.i18nCatalog).toSAX(contentHandler); } else { new I18nMessage(this.nullText).toSAX(contentHandler); } } else { contentHandler.characters(this.nullText.toCharArray(), 0, this.nullText.length()); } contentHandler.endElement(FormsConstants.INSTANCE_NS, LABEL_EL, FormsConstants.INSTANCE_PREFIX_COLON + LABEL_EL); } contentHandler.endElement(FormsConstants.INSTANCE_NS, ITEM_EL, FormsConstants.INSTANCE_PREFIX_COLON + ITEM_EL); } while (iter.hasNext()) { String stringValue = ""; Object label = null; // Get a context on the current item Pointer ptr = (Pointer) iter.next(); if (ptr.getValue() != null) { JXPathContext itemCtx = ctx.getRelativeContext(ptr); // Get the value as a string Object value = itemCtx.getValue(this.valuePath); // List may contain null value, and (per contract with convertors), // convertors are not invoked on nulls. if (value != null) { stringValue = this.datatype.convertToString(value, locale); } // Get the label (can be ommitted) itemCtx.setLenient(true); label = itemCtx.getValue(this.labelPath); if (label == null) { label = stringValue; } } // Output this item AttributesImpl itemAttrs = new AttributesImpl(); itemAttrs.addCDATAAttribute("value", stringValue); contentHandler.startElement(FormsConstants.INSTANCE_NS, ITEM_EL, FormsConstants.INSTANCE_PREFIX_COLON + ITEM_EL, itemAttrs); if (label != null) { contentHandler.startElement(FormsConstants.INSTANCE_NS, LABEL_EL, FormsConstants.INSTANCE_PREFIX_COLON + LABEL_EL, XMLUtils.EMPTY_ATTRIBUTES); if (label instanceof XMLizable) { ((XMLizable) label).toSAX(contentHandler); } else if (this.labelIsI18nKey) { String stringLabel = label.toString(); if ((this.i18nCatalog != null) && (this.i18nCatalog.trim().length() > 0)) { new I18nMessage(stringLabel, this.i18nCatalog).toSAX(contentHandler); } else { new I18nMessage(stringLabel).toSAX(contentHandler); } } else { String stringLabel = label.toString(); contentHandler.characters(stringLabel.toCharArray(), 0, stringLabel.length()); } contentHandler.endElement(FormsConstants.INSTANCE_NS, LABEL_EL, FormsConstants.INSTANCE_PREFIX_COLON + LABEL_EL); } contentHandler.endElement(FormsConstants.INSTANCE_NS, ITEM_EL, FormsConstants.INSTANCE_PREFIX_COLON + ITEM_EL); } // End the selection-list contentHandler.endElement(FormsConstants.INSTANCE_NS, SELECTION_LIST_EL, FormsConstants.INSTANCE_PREFIX_COLON + SELECTION_LIST_EL); }
From source file:org.apache.cocoon.generation.JXTemplateGenerator.java
private void execute(final XMLConsumer consumer, MyJexlContext jexlContext, JXPathContext jxpathContext, StartElement macroCall, Event startEvent, Event endEvent) throws SAXException { Event ev = startEvent;/* w w w .j ava 2 s .c o m*/ LocationFacade loc = new LocationFacade(ev.location); consumer.setDocumentLocator(loc); while (ev != endEvent) { loc.setDocumentLocation(ev.location); if (ev instanceof Characters) { TextEvent text = (TextEvent) ev; Iterator iter = text.substitutions.iterator(); while (iter.hasNext()) { Object subst = iter.next(); char[] chars; if (subst instanceof char[]) { chars = (char[]) subst; } else { JXTExpression expr = (JXTExpression) subst; try { Object val = getNode(expr, jexlContext, jxpathContext); if (val instanceof Node) { executeDOM(consumer, jexlContext, jxpathContext, (Node) val); continue; } else if (val instanceof NodeList) { NodeList nodeList = (NodeList) val; int len = nodeList.getLength(); for (int i = 0; i < len; i++) { Node n = nodeList.item(i); executeDOM(consumer, jexlContext, jxpathContext, n); } continue; } else if (val instanceof Node[]) { Node[] nodeList = (Node[]) val; int len = nodeList.length; for (int i = 0; i < len; i++) { Node n = nodeList[i]; executeDOM(consumer, jexlContext, jxpathContext, n); } continue; } else if (val instanceof XMLizable) { ((XMLizable) val).toSAX(new IncludeXMLConsumer(consumer)); continue; } chars = val != null ? val.toString().toCharArray() : ArrayUtils.EMPTY_CHAR_ARRAY; } catch (Exception e) { throw new JXTException(e.getMessage(), ev.location, e); } } consumer.characters(chars, 0, chars.length); } } else if (ev instanceof EndElement) { EndElement endElement = (EndElement) ev; StartElement startElement = endElement.startElement; StartDefine def = (StartDefine) definitions.get(startElement.qname); if (def == null) { consumer.endElement(startElement.namespaceURI, startElement.localName, startElement.raw); namespaces.leaveScope(consumer); } } else if (ev instanceof EndPrefixMapping) { EndPrefixMapping endPrefixMapping = (EndPrefixMapping) ev; namespaces.removeDeclaration(endPrefixMapping.prefix); } else if (ev instanceof IgnorableWhitespace) { TextEvent text = (TextEvent) ev; characters(jexlContext, jxpathContext, text, new CharHandler() { public void characters(char[] ch, int offset, int len) throws SAXException { consumer.ignorableWhitespace(ch, offset, len); } }); } else if (ev instanceof SkippedEntity) { SkippedEntity skippedEntity = (SkippedEntity) ev; consumer.skippedEntity(skippedEntity.name); } else if (ev instanceof StartIf) { StartIf startIf = (StartIf) ev; Object val; try { val = getValue(startIf.test, jexlContext, jxpathContext, Boolean.TRUE); } catch (Exception e) { throw new JXTException(e.getMessage(), ev.location, e); } boolean result = false; if (val instanceof Boolean) { result = ((Boolean) val).booleanValue(); } else { result = (val != null); } if (!result) { ev = startIf.endInstruction.next; continue; } } else if (ev instanceof StartForEach) { StartForEach startForEach = (StartForEach) ev; final Object items = startForEach.items; Iterator iter = null; int begin, end, step; String var, varStatus; try { if (items != null) { JXTExpression expr = (JXTExpression) items; if (expr.compiledExpression instanceof CompiledExpression) { CompiledExpression compiledExpression = (CompiledExpression) expr.compiledExpression; Object val = compiledExpression.getPointer(jxpathContext, expr.raw).getNode(); // FIXME: workaround for JXPath bug iter = val instanceof NativeArray ? new JSIntrospector.NativeArrayIterator((NativeArray) val) : compiledExpression.iteratePointers(jxpathContext); } else if (expr.compiledExpression instanceof Expression) { Expression e = (Expression) expr.compiledExpression; Object result = e.evaluate(jexlContext); if (result != null) { iter = Introspector.getUberspect().getIterator(result, new Info(ev.location.getURI(), ev.location.getLineNumber(), ev.location.getColumnNumber())); } if (iter == null) { iter = EMPTY_ITER; } } else { // literal value iter = new Iterator() { Object val = items; public boolean hasNext() { return val != null; } public Object next() { Object res = val; val = null; return res; } public void remove() { // EMPTY } }; } } else { iter = NULL_ITER; } begin = startForEach.begin == null ? 0 : getIntValue(startForEach.begin, jexlContext, jxpathContext); end = startForEach.end == null ? Integer.MAX_VALUE : getIntValue(startForEach.end, jexlContext, jxpathContext); step = startForEach.step == null ? 1 : getIntValue(startForEach.step, jexlContext, jxpathContext); var = getStringValue(startForEach.var, jexlContext, jxpathContext); varStatus = getStringValue(startForEach.varStatus, jexlContext, jxpathContext); } catch (Exception exc) { throw new JXTException(exc.getMessage(), ev.location, exc); } MyJexlContext localJexlContext = new MyJexlContext(jexlContext); MyVariables localJXPathVariables = new MyVariables((MyVariables) jxpathContext.getVariables()); int i = 0; // Move to the begin row while (i < begin && iter.hasNext()) { iter.next(); i++; } LoopTagStatus status = null; if (varStatus != null) { status = new LoopTagStatus(); status.begin = begin; status.end = end; status.step = step; status.first = true; localJexlContext.put(varStatus, status); localJXPathVariables.declareVariable(varStatus, status); } int skipCounter, count = 1; JXPathContext localJXPathContext = null; while (i <= end && iter.hasNext()) { Object value = iter.next(); if (value instanceof Pointer) { Pointer ptr = (Pointer) value; localJXPathContext = jxpathContext.getRelativeContext(ptr); localJXPathContext.setNamespaceContextPointer(new NamespacesTablePointer(namespaces)); try { value = ptr.getNode(); } catch (Exception exc) { throw new JXTException(exc.getMessage(), ev.location, null); } } else { localJXPathContext = jxpathContextFactory.newContext(jxpathContext, value); localJXPathContext.setNamespaceContextPointer(new NamespacesTablePointer(namespaces)); } localJXPathContext.setVariables(localJXPathVariables); if (var != null) { localJexlContext.put(var, value); } if (status != null) { status.index = i; status.count = count; status.first = i == begin; status.current = value; status.last = (i == end || !iter.hasNext()); } execute(consumer, localJexlContext, localJXPathContext, macroCall, startForEach.next, startForEach.endInstruction); // Skip rows skipCounter = step; while (--skipCounter > 0 && iter.hasNext()) { iter.next(); } // Increase index i += step; count++; } ev = startForEach.endInstruction.next; continue; } else if (ev instanceof StartChoose) { StartChoose startChoose = (StartChoose) ev; StartWhen startWhen = startChoose.firstChoice; while (startWhen != null) { Object val; try { val = getValue(startWhen.test, jexlContext, jxpathContext, Boolean.TRUE); } catch (Exception e) { throw new JXTException(e.getMessage(), ev.location, e); } boolean result; if (val instanceof Boolean) { result = ((Boolean) val).booleanValue(); } else { result = (val != null); } if (result) { execute(consumer, jexlContext, jxpathContext, macroCall, startWhen.next, startWhen.endInstruction); break; } startWhen = startWhen.nextChoice; } if (startWhen == null && startChoose.otherwise != null) { execute(consumer, jexlContext, jxpathContext, macroCall, startChoose.otherwise.next, startChoose.otherwise.endInstruction); } ev = startChoose.endInstruction.next; continue; } else if (ev instanceof StartSet) { StartSet startSet = (StartSet) ev; Object value = null; String var = null; try { if (startSet.var != null) { var = getStringValue(startSet.var, jexlContext, jxpathContext); } if (startSet.value != null) { value = getNode(startSet.value, jexlContext, jxpathContext); } } catch (Exception exc) { throw new JXTException(exc.getMessage(), ev.location, exc); } if (value == null) { NodeList nodeList = toDOMNodeList("set", startSet, jexlContext, macroCall); // JXPath doesn't handle NodeList, so convert it to an array int len = nodeList.getLength(); Node[] nodeArr = new Node[len]; for (int i = 0; i < len; i++) { nodeArr[i] = nodeList.item(i); } value = nodeArr; } if (var != null) { jxpathContext.getVariables().declareVariable(var, value); jexlContext.put(var, value); } ev = startSet.endInstruction.next; continue; } else if (ev instanceof StartElement) { StartElement startElement = (StartElement) ev; StartDefine def = (StartDefine) definitions.get(startElement.qname); if (def != null) { Map attributeMap = new HashMap(); Iterator i = startElement.attributeEvents.iterator(); while (i.hasNext()) { String attributeName; Object attributeValue; AttributeEvent attrEvent = (AttributeEvent) i.next(); attributeName = attrEvent.localName; if (attrEvent instanceof CopyAttribute) { CopyAttribute copy = (CopyAttribute) attrEvent; attributeValue = copy.value; } else if (attrEvent instanceof SubstituteAttribute) { SubstituteAttribute substEvent = (SubstituteAttribute) attrEvent; if (substEvent.substitutions.size() == 1 && substEvent.substitutions.get(0) instanceof JXTExpression) { JXTExpression expr = (JXTExpression) substEvent.substitutions.get(0); Object val; try { val = getNode(expr, jexlContext, jxpathContext); } catch (Exception e) { throw new JXTException(e.getMessage(), ev.location, e); } attributeValue = val != null ? val : ""; } else { StringBuffer buf = new StringBuffer(); Iterator iterSubst = substEvent.substitutions.iterator(); while (iterSubst.hasNext()) { Subst subst = (Subst) iterSubst.next(); if (subst instanceof Literal) { Literal lit = (Literal) subst; buf.append(lit.value); } else if (subst instanceof JXTExpression) { JXTExpression expr = (JXTExpression) subst; Object val; try { val = getValue(expr, jexlContext, jxpathContext); } catch (Exception e) { throw new JXTException(e.getMessage(), ev.location, e); } buf.append(val != null ? val.toString() : ""); } } attributeValue = buf.toString(); } } else { throw new Error("this shouldn't have happened"); } attributeMap.put(attributeName, attributeValue); } MyVariables parent = (MyVariables) jxpathContext.getVariables(); MyVariables vars = new MyVariables(parent); MyJexlContext localJexlContext = new MyJexlContext(jexlContext); HashMap macro = new HashMap(); macro.put("body", startElement); macro.put("arguments", attributeMap); localJexlContext.put("macro", macro); vars.declareVariable("macro", macro); Iterator iter = def.parameters.entrySet().iterator(); while (iter.hasNext()) { Map.Entry e = (Map.Entry) iter.next(); String key = (String) e.getKey(); StartParameter startParam = (StartParameter) e.getValue(); Object default_ = startParam.default_; Object val = attributeMap.get(key); if (val == null) { val = default_; } localJexlContext.put(key, val); vars.declareVariable(key, val); } JXPathContext localJXPathContext = jxpathContextFactory.newContext(null, jxpathContext.getContextBean()); localJXPathContext.setNamespaceContextPointer(new NamespacesTablePointer(namespaces)); localJXPathContext.setVariables(vars); call(ev.location, startElement, consumer, localJexlContext, localJXPathContext, def.body, def.endInstruction); ev = startElement.endElement.next; continue; } Iterator i = startElement.attributeEvents.iterator(); AttributesImpl attrs = new AttributesImpl(); while (i.hasNext()) { AttributeEvent attrEvent = (AttributeEvent) i.next(); if (attrEvent instanceof CopyAttribute) { CopyAttribute copy = (CopyAttribute) attrEvent; attrs.addAttribute(copy.namespaceURI, copy.localName, copy.raw, copy.type, copy.value); } else if (attrEvent instanceof SubstituteAttribute) { StringBuffer buf = new StringBuffer(); SubstituteAttribute substEvent = (SubstituteAttribute) attrEvent; Iterator iterSubst = substEvent.substitutions.iterator(); while (iterSubst.hasNext()) { Subst subst = (Subst) iterSubst.next(); if (subst instanceof Literal) { Literal lit = (Literal) subst; buf.append(lit.value); } else if (subst instanceof JXTExpression) { JXTExpression expr = (JXTExpression) subst; Object val; try { val = getValue(expr, jexlContext, jxpathContext); } catch (Exception e) { throw new JXTException(e.getMessage(), ev.location, e); } buf.append(val != null ? val.toString() : ""); } } attrs.addAttribute(attrEvent.namespaceURI, attrEvent.localName, attrEvent.raw, attrEvent.type, buf.toString()); } } namespaces.enterScope(consumer); consumer.startElement(startElement.namespaceURI, startElement.localName, startElement.raw, attrs); } else if (ev instanceof StartFormatNumber) { StartFormatNumber startFormatNumber = (StartFormatNumber) ev; try { String result = startFormatNumber.format(jexlContext, jxpathContext); if (result != null) { char[] chars = result.toCharArray(); consumer.characters(chars, 0, chars.length); } } catch (Exception e) { throw new JXTException(e.getMessage(), ev.location, e); } } else if (ev instanceof StartFormatDate) { StartFormatDate startFormatDate = (StartFormatDate) ev; try { String result = startFormatDate.format(jexlContext, jxpathContext); if (result != null) { char[] chars = result.toCharArray(); consumer.characters(chars, 0, chars.length); } } catch (Exception e) { throw new JXTException(e.getMessage(), ev.location, e); } } else if (ev instanceof StartPrefixMapping) { StartPrefixMapping startPrefixMapping = (StartPrefixMapping) ev; namespaces.addDeclaration(startPrefixMapping.prefix, startPrefixMapping.uri); } else if (ev instanceof StartComment) { StartComment startJXComment = (StartComment) ev; // Parse the body of the comment NodeList nodeList = toDOMNodeList("comment", startJXComment, jexlContext, macroCall); // JXPath doesn't handle NodeList, so convert it to an array int len = nodeList.getLength(); final StringBuffer buf = new StringBuffer(); Properties omit = XMLUtils.createPropertiesForXML(true); for (int i = 0; i < len; i++) { try { String str = XMLUtils.serializeNode(nodeList.item(i), omit); buf.append(StringUtils.substringAfter(str, ">")); // cut the XML header } catch (Exception e) { throw new JXTException(e.getMessage(), startJXComment.location, e); } } char[] chars = new char[buf.length()]; buf.getChars(0, chars.length, chars, 0); consumer.comment(chars, 0, chars.length); ev = startJXComment.endInstruction.next; continue; } else if (ev instanceof EndCDATA) { consumer.endCDATA(); } else if (ev instanceof EndDTD) { consumer.endDTD(); } else if (ev instanceof EndEntity) { consumer.endEntity(((EndEntity) ev).name); } else if (ev instanceof StartCDATA) { consumer.startCDATA(); } else if (ev instanceof StartDTD) { StartDTD startDTD = (StartDTD) ev; consumer.startDTD(startDTD.name, startDTD.publicId, startDTD.systemId); } else if (ev instanceof StartEntity) { consumer.startEntity(((StartEntity) ev).name); } else if (ev instanceof StartOut) { StartOut startOut = (StartOut) ev; Object val; try { val = getNode(startOut.compiledExpression, jexlContext, jxpathContext, startOut.lenient); if (val instanceof Node) { executeDOM(consumer, jexlContext, jxpathContext, (Node) val); } else if (val instanceof NodeList) { NodeList nodeList = (NodeList) val; int len = nodeList.getLength(); for (int i = 0; i < len; i++) { Node n = nodeList.item(i); executeDOM(consumer, jexlContext, jxpathContext, n); } } else if (val instanceof Node[]) { Node[] nodeList = (Node[]) val; int len = nodeList.length; for (int i = 0; i < len; i++) { Node n = nodeList[i]; executeDOM(consumer, jexlContext, jxpathContext, n); } } else if (val instanceof XMLizable) { ((XMLizable) val).toSAX(new IncludeXMLConsumer(consumer)); } else { char[] ch = val == null ? ArrayUtils.EMPTY_CHAR_ARRAY : val.toString().toCharArray(); consumer.characters(ch, 0, ch.length); } } catch (Exception e) { throw new JXTException(e.getMessage(), ev.location, e); } } else if (ev instanceof StartTemplate) { // EMPTY } else if (ev instanceof StartEval) { StartEval startEval = (StartEval) ev; JXTExpression expr = startEval.value; try { Object val = getNode(expr, jexlContext, jxpathContext); if (!(val instanceof StartElement)) { throw new Exception("macro invocation required instead of: " + val); } StartElement call = (StartElement) val; execute(consumer, jexlContext, jxpathContext, call, call.next, call.endElement); } catch (Exception exc) { throw new JXTException(exc.getMessage(), ev.location, exc); } ev = startEval.endInstruction.next; continue; } else if (ev instanceof StartEvalBody) { StartEvalBody startEval = (StartEvalBody) ev; try { execute(consumer, jexlContext, jxpathContext, null, macroCall.next, macroCall.endElement); } catch (Exception exc) { throw new JXTException(exc.getMessage(), ev.location, exc); } ev = startEval.endInstruction.next; continue; } else if (ev instanceof StartDefine) { StartDefine startDefine = (StartDefine) ev; definitions.put(startDefine.qname, startDefine); ev = startDefine.endInstruction.next; continue; } else if (ev instanceof StartImport) { StartImport startImport = (StartImport) ev; String uri; AttributeEvent e = startImport.uri; if (e instanceof CopyAttribute) { CopyAttribute copy = (CopyAttribute) e; uri = copy.value; } else { StringBuffer buf = new StringBuffer(); SubstituteAttribute substAttr = (SubstituteAttribute) e; Iterator i = substAttr.substitutions.iterator(); while (i.hasNext()) { Subst subst = (Subst) i.next(); if (subst instanceof Literal) { Literal lit = (Literal) subst; buf.append(lit.value); } else if (subst instanceof JXTExpression) { JXTExpression expr = (JXTExpression) subst; Object val; try { val = getValue(expr, jexlContext, jxpathContext); } catch (Exception exc) { throw new JXTException(exc.getMessage(), ev.location, exc); } buf.append(val != null ? val.toString() : ""); } } uri = buf.toString(); } Source input = null; StartDocument doc; try { input = resolver.resolveURI(uri); SourceValidity validity = null; synchronized (cache) { doc = (StartDocument) cache.get(input.getURI()); if (doc != null) { boolean recompile = false; if (doc.compileTime == null) { recompile = true; } else { int valid = doc.compileTime.isValid(); if (valid == SourceValidity.UNKNOWN) { validity = input.getValidity(); valid = doc.compileTime.isValid(validity); } if (valid != SourceValidity.VALID) { recompile = true; } } if (recompile) { doc = null; // recompile } } } if (doc == null) { Parser parser = new Parser(); // call getValidity before using the stream is faster if the source is a SitemapSource if (validity == null) { validity = input.getValidity(); } SourceUtil.parse(this.manager, input, parser); doc = parser.getStartEvent(); doc.compileTime = validity; synchronized (cache) { cache.put(input.getURI(), doc); } } } catch (Exception exc) { throw new JXTException(exc.getMessage(), ev.location, exc); } finally { resolver.release(input); } JXPathContext selectJXPath = jxpathContext; MyJexlContext selectJexl = jexlContext; if (startImport.select != null) { try { Object obj = getValue(startImport.select, jexlContext, jxpathContext); selectJXPath = jxpathContextFactory.newContext(null, obj); selectJXPath.setNamespaceContextPointer(new NamespacesTablePointer(namespaces)); selectJXPath.setVariables(variables); selectJexl = new MyJexlContext(jexlContext); fillContext(obj, selectJexl); } catch (Exception exc) { throw new JXTException(exc.getMessage(), ev.location, exc); } } try { execute(consumer, selectJexl, selectJXPath, macroCall, doc.next, doc.endDocument); } catch (Exception exc) { throw new JXTException( "Exception occurred in imported template " + uri + ": " + exc.getMessage(), ev.location, exc); } ev = startImport.endInstruction.next; continue; } else if (ev instanceof StartDocument) { if (((StartDocument) ev).endDocument != null) { // if this isn't a document fragment consumer.startDocument(); } } else if (ev instanceof EndDocument) { consumer.endDocument(); } else if (ev instanceof ProcessingInstruction) { ProcessingInstruction pi = (ProcessingInstruction) ev; consumer.processingInstruction(pi.target, pi.data); } ev = ev.next; } }
From source file:org.apache.cocoon.woody.binding.AggregateJXPathBinding.java
/** * Narrows the scope on the form-model to the member widget-field, and * narrows the scope on the object-model to the member xpath-context * before continuing the binding over the child-bindings. *//*from w w w . j av a 2 s .c o m*/ public void doLoad(Widget frmModel, JXPathContext jxpc) throws BindingException { AggregateField aggregate = (AggregateField) frmModel.getWidget(this.widgetId); JXPathContext subContext = jxpc.getRelativeContext(jxpc.getPointer(this.xpath)); super.doLoad(aggregate, subContext); aggregate.combineFields(); if (getLogger().isDebugEnabled()) { getLogger().debug("Done loading " + toString()); } }