예제 #1
0
  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;
  }