/** * Returns the namespace prefixes that are used in the given XPath 1.0 expression. * * @param xpath * xpath expression, must not be <code>null</code> * @return namespace prefixes used in the expresssion, never <code>null</code> */ public static Set<String> extractPrefixes( Expr xpath ) { Set<String> prefixes = new HashSet<String>(); extractPrefixes( xpath, prefixes ); return prefixes; }
private static void extractPrefixes( Expr expr, Set<String> prefixes ) { if ( expr instanceof BinaryExpr ) { extractPrefixes( ( (BinaryExpr) expr ).getLHS(), prefixes ); extractPrefixes( ( (BinaryExpr) expr ).getRHS(), prefixes ); } else if ( expr instanceof FilterExpr ) { extractPrefixes( ( (FilterExpr) expr ).getExpr(), prefixes ); for ( Object pred : ( (FilterExpr) expr ).getPredicates() ) { extractPrefixes( (Predicate) pred, prefixes ); } } else if ( expr instanceof FunctionCallExpr ) { extractPrefix( ( (FunctionCallExpr) expr ).getPrefix(), prefixes ); for ( Object param : ( (FunctionCallExpr) expr ).getParameters() ) { extractPrefixes( (Expr) param, prefixes ); } } else if ( expr instanceof LocationPath ) { for ( Object step : ( (LocationPath) expr ).getSteps() ) { extractPrefixes( (Step) step, prefixes ); } } else if ( expr instanceof PathExpr ) { extractPrefixes( ( (PathExpr) expr ).getFilterExpr(), prefixes ); extractPrefixes( ( (PathExpr) expr ).getLocationPath(), prefixes ); } else if ( expr instanceof UnaryExpr ) { extractPrefixes( ( (UnaryExpr) expr ).getExpr(), prefixes ); } else if ( expr instanceof VariableReferenceExpr ) { extractPrefix( ( (VariableReferenceExpr) expr ).getPrefix(), prefixes ); } }
/** * The xpaths must contain at least one xpath matching the root element, else an empty document will be written. The * xpaths must be simple location paths that only use steps with qualified names (no predicates, no attribute * steps). * * @param writer * @param xpaths */ public FilteringXMLStreamWriter( XMLStreamWriter writer, List<XPath> xpaths ) { this.writer = writer; for ( XPath x : xpaths ) { List<QName> names = XPathUtils.extractQNames( x ); stack.addPath( names ); } }
private static void extractPrefixes( Step step, Set<String> prefixes ) { if ( step instanceof NameStep ) { extractPrefix( ( (NameStep) step ).getPrefix(), prefixes ); } }
public static List<QName> extractQNames( XPath xpath ) { List<QName> list = new ArrayList<QName>(); try { Expr expr = new BaseXPath( xpath.getXPath(), null ).getRootExpr(); if ( expr instanceof LocationPath ) { LocationPath lp = (LocationPath) expr; for ( Object o : lp.getSteps() ) { findQName( list, (Step) o, xpath.getNamespaceContext() ); } } } catch ( JaxenException e ) { // not a proper xpath } return list; }
private static void extractPrefixes( Predicate pred, Set<String> prefixes ) { extractPrefixes( pred.getExpr(), prefixes ); }
/** * Returns the namespace prefixes that are used in the given XPath 1.0 expression. * <p> * If the expression is not a valid XPath expression, the empty set is returned. * </p> * * @param text * xpath expression, must not be <code>null</code> * @return namespace prefixes used in the expression, never <code>null</code>, but can be empty */ public static Set<String> extractPrefixes( String text ) { try { return extractPrefixes( new BaseXPath( text, null ).getRootExpr() ); } catch ( JaxenException e ) { // not an XPath expression return Collections.emptySet(); } }
private static ValueReference parsePropertyName( XMLStreamReader xmlStream ) throws XMLStreamException { String propName = xmlStream.getElementText().trim(); if ( propName.isEmpty() ) { // TODO filter encoding guy: use whatever exception shall be used here. But make sure that the // GetObservation100XMLAdapter gets an exception from here as the compliance of the SOS hangs on it's thread throw new XMLParsingException( xmlStream, Messages.getMessage( "FILTER_PARSER_PROPERTY_NAME_EMPTY", new QName( OGC_NS, "PropertyName" ) ) ); } Set<String> prefixes = XPathUtils.extractPrefixes( propName ); return new ValueReference( propName, new NamespaceBindings( xmlStream.getNamespaceContext(), prefixes ) ); }
private static ValueReference parseValueReference( XMLStreamReader xmlStream, boolean permitEmpty ) throws XMLStreamException { requireStartElement( xmlStream, singleton( new QName( FES_NS, "ValueReference" ) ) ); String xpath = xmlStream.getElementText().trim(); if ( !permitEmpty && xpath.isEmpty() ) { throw new XMLParsingException( xmlStream, Messages.getMessage( "FILTER_PARSER_PROPERTY_NAME_EMPTY", new QName( FES_NS, "ValueReference" ) ) ); } if ( xpath.isEmpty() ) { return null; } Set<String> prefixes = XPathUtils.extractPrefixes( xpath ); return new ValueReference( xpath, new NamespaceBindings( xmlStream.getNamespaceContext(), prefixes ) ); }
private static ValueReference parsePropertyName( XMLStreamReader xmlStream, boolean permitEmpty ) throws XMLStreamException { requireStartElement( xmlStream, Collections.singleton( new QName( OGC_NS, "PropertyName" ) ) ); String xpath = xmlStream.getElementText().trim(); if ( !permitEmpty && xpath.isEmpty() ) { // TODO filter encoding guy: use whatever exception shall be used here. But make sure that the // GetObservation100XMLAdapter gets an exception from here as the compliance of the SOS hangs on it's thread throw new XMLParsingException( xmlStream, Messages.getMessage( "FILTER_PARSER_PROPERTY_NAME_EMPTY", new QName( OGC_NS, "PropertyName" ) ) ); } if ( xpath.isEmpty() ) { return null; } Set<String> prefixes = XPathUtils.extractPrefixes( xpath ); return new ValueReference( xpath, new NamespaceBindings( xmlStream.getNamespaceContext(), prefixes ) ); }
private static SortProperty parseSortProperty( XMLStreamReader reader ) throws XMLStreamException { requireStartElement( reader, singleton( new QName( OGCNS, "SortProperty" ) ) ); nextElement( reader ); requireStartElement( reader, singleton( new QName( OGCNS, "PropertyName" ) ) ); String xpath = reader.getElementText().trim(); Set<String> prefixes = XPathUtils.extractPrefixes( xpath ); NamespaceBindings nsContext = new NamespaceBindings( reader.getNamespaceContext(), prefixes ); ValueReference propName = new ValueReference( xpath, nsContext ); nextElement( reader ); boolean sortAscending = true; if ( reader.isStartElement() ) { requireStartElement( reader, singleton( new QName( OGCNS, "SortOrder" ) ) ); String s = reader.getElementText().trim(); sortAscending = "ASC".equals( s ); nextElement( reader ); } reader.require( END_ELEMENT, OGCNS, "SortProperty" ); return new SortProperty( propName, sortAscending ); }
Set<String> usedPrefixes = XPathUtils.extractPrefixes( propertyName.getAsXPath() ); NamespaceBindings usedNamespaceBindings = new NamespaceBindings();
for ( String prefix : XPathUtils.extractPrefixes( xpath ) ) { String ns = nsContext == null ? null : nsContext.translateNamespacePrefixToUri( prefix ); LOG.debug( prefix + " -> " + ns );
@Override public PropertyReplacement readProperty( XMLStreamReader xmlStream ) throws XMLStreamException { xmlStream.require( START_ELEMENT, WFS_200_NS, "Property" ); nextElement( xmlStream ); xmlStream.require( START_ELEMENT, WFS_200_NS, "ValueReference" ); UpdateAction updateAction = parseUpdateAction( xmlStream.getAttributeValue( null, "action" ) ); String propName = xmlStream.getElementText(); Set<String> prefixes = XPathUtils.extractPrefixes( propName ); ValueReference propertyName = new ValueReference( propName, new NamespaceBindings( xmlStream.getNamespaceContext(), prefixes ) ); nextElement( xmlStream ); PropertyReplacement replacement = null; if ( new QName( WFS_200_NS, "Value" ).equals( xmlStream.getName() ) ) { replacement = new PropertyReplacement( propertyName, xmlStream, updateAction ); } else { xmlStream.require( END_ELEMENT, WFS_200_NS, "Property" ); replacement = new PropertyReplacement( propertyName, null, updateAction ); nextElement( xmlStream ); } return replacement; }