public static Query getQuery(OMElement omElement) { if (new QName(CSWConstants.CSW_202_NS, "Query").equals(omElement.getQName())) { XMLAdapter adapter = new XMLAdapter(omElement); SortProperty[] sortProps = null; Filter constraint = null; ReturnableElement elementSetName = null; String[] elementName = null; ConstraintLanguage constraintLanguage = null; List<OMElement> queryChildElements = adapter.getRequiredElements(omElement, new XPath("*", nsContext)); String typeQuery = adapter.getNodeAsString(omElement, new XPath("./@typeNames", nsContext), ""); if ("".equals(typeQuery)) { String msg = "ERROR in XML document: Required attribute \"typeNames\" in element \"Query\" is missing!"; throw new MissingParameterException(msg); } String[] queryTypeNamesString = StringUtils.split(typeQuery, " "); QName[] queryTypeNames = new QName[queryTypeNamesString.length]; int counterQName = 0; for (String s : queryTypeNamesString) { LOG.debug("Parsing typeName '" + s + "' of Query as QName. "); QName qname = adapter.parseQName(s, adapter.getRootElement()); queryTypeNames[counterQName++] = qname; } elementName = adapter.getNodesAsStrings(omElement, new XPath("./csw:ElementName", nsContext)); QName[] returnTypeNames = null; for (OMElement omQueryElement : queryChildElements) { // TODO mandatory exclusiveness between ElementSetName vs. ElementName not implemented yet if (new QName(CSWConstants.CSW_202_NS, "ElementSetName") .equals(omQueryElement.getQName())) { String elementSetNameString = omQueryElement.getText(); elementSetName = ReturnableElement.determineReturnableElement(elementSetNameString); // elementSetNameTypeNames = getNodesAsQNames( omQueryElement, new XPath( "@typeNames", // nsContext ) ); String typeElementSetName = adapter .getNodeAsString(omQueryElement, new XPath("./@typeNames", nsContext), "") .trim(); String[] elementSetNameTypeNamesString = StringUtils.split(typeElementSetName, " "); returnTypeNames = new QName[elementSetNameTypeNamesString.length]; for (int i = 0; i < elementSetNameTypeNamesString.length; i++) { returnTypeNames[i] = adapter.parseQName(elementSetNameTypeNamesString[i], omElement); } } Pair<Filter, ConstraintLanguage> parsedConstraint = parseConstraint(adapter, omQueryElement); if (parsedConstraint != null) { constraintLanguage = parsedConstraint.second; constraint = parsedConstraint.first; } if (new QName(OGCNS, "SortBy").equals(omQueryElement.getQName())) { List<OMElement> sortPropertyElements = adapter.getRequiredElements(omQueryElement, new XPath("ogc:SortProperty", nsContext)); sortProps = new SortProperty[sortPropertyElements.size()]; int counter = 0; for (OMElement sortPropertyEl : sortPropertyElements) { OMElement propNameEl = adapter.getRequiredElement( sortPropertyEl, new XPath("ogc:PropertyName", nsContext)); String sortOrder = adapter.getNodeAsString( sortPropertyEl, new XPath("ogc:SortOrder", nsContext), "ASC"); SortProperty sortProp = new SortProperty( new ValueReference( propNameEl.getText(), adapter.getNamespaceContext(propNameEl)), sortOrder.equals("ASC")); sortProps[counter++] = sortProp; } } } return new Query( elementSetName, elementName, constraint, constraintLanguage, sortProps, queryTypeNames, returnTypeNames); } return null; }