From 7a13d9d0aa87ca5de9acacc060a1a23130c96232 Mon Sep 17 00:00:00 2001
From: ctissot <ctissot@localhost>
Date: Thu, 20 Dec 2007 09:55:23 +0000
Subject: [PATCH] I use this bug id (138) as an umbrella for a list of  bugfixes/improvements for the DSML gateway.

---
 opendj-sdk/opends/src/dsml/org/opends/dsml/protocol/DSMLSearchOperation.java |  460 +++++++++++++++++++++++++++++++++++++++++++-------------
 1 files changed, 349 insertions(+), 111 deletions(-)

diff --git a/opendj-sdk/opends/src/dsml/org/opends/dsml/protocol/DSMLSearchOperation.java b/opendj-sdk/opends/src/dsml/org/opends/dsml/protocol/DSMLSearchOperation.java
index 950db87..ed9df0c 100644
--- a/opendj-sdk/opends/src/dsml/org/opends/dsml/protocol/DSMLSearchOperation.java
+++ b/opendj-sdk/opends/src/dsml/org/opends/dsml/protocol/DSMLSearchOperation.java
@@ -34,23 +34,22 @@
 import java.util.LinkedHashSet;
 import java.util.LinkedList;
 import java.util.List;
-
-import org.opends.server.protocols.asn1.ASN1Element;
+import javax.xml.bind.JAXBElement;
 import org.opends.server.protocols.asn1.ASN1Exception;
 import org.opends.server.protocols.asn1.ASN1OctetString;
-import org.opends.server.protocols.asn1.ASN1Sequence;
 import org.opends.server.protocols.ldap.LDAPAttribute;
 import org.opends.server.protocols.ldap.LDAPConstants;
 import org.opends.server.protocols.ldap.LDAPFilter;
 import org.opends.server.protocols.ldap.LDAPMessage;
-import org.opends.server.protocols.ldap.ProtocolOp;
 import org.opends.server.protocols.ldap.SearchRequestProtocolOp;
 import org.opends.server.protocols.ldap.SearchResultEntryProtocolOp;
 import org.opends.server.protocols.ldap.SearchResultReferenceProtocolOp;
 import org.opends.server.protocols.ldap.SearchResultDoneProtocolOp;
 import org.opends.server.tools.LDAPConnection;
+import org.opends.server.types.ByteString;
 import org.opends.server.types.DereferencePolicy;
 import org.opends.server.types.LDAPException;
+import org.opends.server.types.RawFilter;
 import org.opends.server.types.SearchScope;
 
 
@@ -74,6 +73,283 @@
     this.connection = connection;
   }
 
+  /**
+   * Returns a new AND search filter with the provided filter components.
+   * 
+   * @param filterSet The filter components for this filter
+   * 
+   * @return a new AND search filter with the provided filter components.
+   * 
+   * @throws LDAPException an LDAPException is thrown if the creation of a
+   *                       filter component fails.
+   */
+  private static LDAPFilter createANDFilter(FilterSet filterSet)
+          throws LDAPException {
+    List<JAXBElement<?>> list = filterSet.getFilterGroup();
+    ArrayList<RawFilter> filters = new ArrayList<RawFilter>(list.size());
+
+    for(JAXBElement<?> filter : list) {
+      filters.add(createFilter(filter));
+    }
+    return LDAPFilter.createANDFilter(filters);
+  }
+
+  /**
+   * Returns a new Approximate search filter with the provided information.
+   * 
+   * @param ava the attribute value assertion for this approximate filter.
+   * 
+   * @return a new Approximate search filter with the provided information.
+   */
+  private static LDAPFilter createApproximateFilter(AttributeValueAssertion ava)
+  {
+    return LDAPFilter.createApproximateFilter(ava.getName(),
+                                           new ASN1OctetString(ava.getValue()));
+  }
+
+  /**
+   * Returns a new Equality search filter with the provided information.
+   * 
+   * @param ava the attribute value assertion for this Equality filter.
+   * 
+   * @return a new Equality search filter with the provided information.
+   */
+  private static LDAPFilter createEqualityFilter(AttributeValueAssertion ava) {
+    return LDAPFilter.createEqualityFilter(ava.getName(),
+                                          new ASN1OctetString(ava.getValue()));
+  }
+
+  /**
+   * Returns a new Extensible search filter with the provided information.
+   * 
+   * @param mra the matching rule assertion for this Extensible filter.
+   * 
+   * @return a new Extensible search filter with the provided information.
+   */
+  private static LDAPFilter createExtensibleFilter(MatchingRuleAssertion mra) {
+    return LDAPFilter.createExtensibleFilter(mra.getMatchingRule(),
+                                        mra.getName(),
+                                        new ASN1OctetString(mra.getValue()),
+                                        mra.isDnAttributes());
+  }
+
+  /**
+   * Returns a new GreaterOrEqual search filter with the provided information.
+   * 
+   * @param ava the attribute value assertion for this GreaterOrEqual filter.
+   * 
+   * @return a new GreaterOrEqual search filter with the provided information.
+   */
+  private static LDAPFilter createGreaterOrEqualFilter(
+                              AttributeValueAssertion ava) {
+    return LDAPFilter.createGreaterOrEqualFilter(ava.getName(),
+                                          new ASN1OctetString(ava.getValue()));
+  }
+
+  /**
+   * Returns a new LessOrEqual search filter with the provided information.
+   * 
+   * @param ava the attribute value assertion for this LessOrEqual filter.
+   * 
+   * @return a new LessOrEqual search filter with the provided information.
+   */
+  private static LDAPFilter createLessOrEqualFilter(
+                              AttributeValueAssertion ava) {
+    return LDAPFilter.createLessOrEqualFilter(ava.getName(),
+                                          new ASN1OctetString(ava.getValue()));
+  }
+
+  /**
+   * Returns a new NOT search filter with the provided information.
+   * 
+   * @param filter the filter for this NOT filter.
+   * 
+   * @return a new NOT search filter with the provided information.
+   * 
+   * @throws LDAPException an LDAPException is thrown if the creation of the
+   *                       provided filter fails.
+   */
+  private static LDAPFilter createNOTFilter(Filter filter)
+          throws LDAPException {
+    return LDAPFilter.createNOTFilter(createFilter(filter));
+  }
+
+  /**
+   * Returns a new OR search filter with the provided filter components.
+   * 
+   * @param filterSet The filter components for this filter
+   * 
+   * @return a new OR search filter with the provided filter components.
+   * 
+   * @throws LDAPException an LDAPException is thrown if the creation of a
+   *                       filter component fails.
+   */
+  private static LDAPFilter createORFilter(FilterSet filterSet)
+          throws LDAPException {
+    List<JAXBElement<?>> list = filterSet.getFilterGroup();
+    ArrayList<RawFilter> filters = new ArrayList<RawFilter>(list.size());
+
+    for(JAXBElement<?> filter : list) {
+      filters.add(createFilter(filter));
+    }
+    return LDAPFilter.createORFilter(filters);
+  }
+
+  /**
+   * Returns a new Present search filter with the provided information.
+   * 
+   * @param ad the attribute description for this Present filter.
+   * 
+   * @returna new Present search filter with the provided information.
+   * 
+   * @throws LDAPException an LDAPException is thrown if the ASN.1 element 
+   *                       provided by the attribute description cannot be
+   *                       decoded as a raw search filter.
+   */
+  private static LDAPFilter createPresentFilter(AttributeDescription ad)
+          throws LDAPException {
+    return LDAPFilter.decode(
+             new StringBuilder(ad.getName()).append("=*").toString());
+  }
+
+  /**
+   * Returns a new Substring search filter with the provided information.
+   * 
+   * @param sf the substring filter for this Substring filter.
+   * 
+   * @return a new Substring search filter with the provided information.
+   */
+  private static LDAPFilter createSubstringFilter(SubstringFilter sf) {
+    List<String> anys = sf.getAny();
+    ArrayList<ByteString> subAnyElements = 
+                                         new ArrayList<ByteString>(anys.size());
+
+    for(String s : anys) {
+      subAnyElements.add(new ASN1OctetString(s));
+    }
+    return LDAPFilter.createSubstringFilter(sf.getName(),
+                                        new ASN1OctetString(sf.getInitial()),
+                                        subAnyElements,
+                                        new ASN1OctetString(sf.getFinal()));
+  }
+
+  /**
+   * Returns a new LDAPFilter according to the tag name of the provided element 
+   * that can be "and", "or", "not", "equalityMatch", "substrings",
+   * "greaterOrEqual", "lessOrEqual", "present", "approxMatch",
+   * "extensibleMatch".
+   * 
+   * @param xmlElement a JAXBElement that contains the name of the filter to
+   *                   create and the associated argument.
+   * 
+   * @return a new LDAPFilter according to the tag name of the provided element.
+   * 
+   * @throws LDAPException an LDAPException is thrown if the creation of the
+   *                       targeted filter fails.
+   */
+  private static LDAPFilter createFilter(JAXBElement<?> xmlElement)
+          throws LDAPException {
+    LDAPFilter result = null;
+
+    String filterName = xmlElement.getName().getLocalPart();
+
+    if ( "and".equals(filterName) ) {
+      // <xsd:element name="and" type="FilterSet"/>
+      result = createANDFilter((FilterSet)xmlElement.getValue());
+    }
+    else if ( "or".equals(filterName) ) {
+      // <xsd:element name="or" type="FilterSet"/>
+      result = createORFilter((FilterSet)xmlElement.getValue());
+    }
+    else if ( "not".equals(filterName) ) {
+      // <xsd:element name="not" type="Filter"/>
+      result = createNOTFilter((Filter)xmlElement.getValue());
+    }
+    else if ( "equalityMatch".equals(filterName) ) {
+      // <xsd:element name="equalityMatch" type="AttributeValueAssertion"/>
+      result = createEqualityFilter((AttributeValueAssertion)
+                                                         xmlElement.getValue());
+    }
+    else if ( "substrings".equals(filterName) ) {
+      // <xsd:element name="substrings" type="SubstringFilter"/>
+      result = createSubstringFilter((SubstringFilter)xmlElement.getValue());
+    }
+    else if ( "greaterOrEqual".equals(filterName) ) {
+      // <xsd:element name="greaterOrEqual" type="AttributeValueAssertion"/>
+      result = createGreaterOrEqualFilter((AttributeValueAssertion)
+                                                         xmlElement.getValue());
+    }
+    else if ( "lessOrEqual".equals(filterName) ) {
+      // <xsd:element name="lessOrEqual" type="AttributeValueAssertion"/>
+      result = createLessOrEqualFilter((AttributeValueAssertion)
+                                                         xmlElement.getValue());
+    }
+    else if ( "present".equals(filterName) ) {
+      // <xsd:element name="present" type="AttributeDescription"/>
+      result = createPresentFilter((AttributeDescription)xmlElement.getValue());
+    }
+    else if ( "approxMatch".equals(filterName) ) {
+      // <xsd:element name="approxMatch" type="AttributeValueAssertion"/>
+      result = createApproximateFilter((AttributeValueAssertion)
+                                                         xmlElement.getValue());
+    }
+    else if ( "extensibleMatch".equals(filterName) ) {
+      // <xsd:element name="extensibleMatch" type="MatchingRuleAssertion"/>
+      result = createExtensibleFilter((MatchingRuleAssertion)
+                                                         xmlElement.getValue());
+    }
+    return result;
+  }
+
+  /**
+   * Returns a new LDAPFilter according to the filter assigned to the provided
+   * filter.
+   * 
+   * @param filter a filter that contains the object filter to create.
+   * 
+   * @return a new LDAPFilter according to the filter assigned to the provided
+   *         filter.
+   * 
+   * @throws LDAPException an LDAPException is thrown if the creation of the
+   *                       targeted filter fails.
+   */
+  private static LDAPFilter createFilter(Filter filter)
+          throws LDAPException {
+
+    LDAPFilter result = null;
+    
+    if ( filter.getAnd() != null ) {
+      result = createANDFilter(filter.getAnd());
+    }
+    else if ( filter.getApproxMatch() != null ) {
+      result = createApproximateFilter(filter.getApproxMatch());
+    }
+    else if ( filter.getEqualityMatch() != null ) {
+      result = createEqualityFilter(filter.getEqualityMatch());
+    }
+    else if ( filter.getExtensibleMatch() != null ) {
+      result = createExtensibleFilter(filter.getExtensibleMatch());
+    }
+    else if ( filter.getGreaterOrEqual() != null ) {
+      result = createGreaterOrEqualFilter(filter.getGreaterOrEqual());
+    }
+    else if ( filter.getLessOrEqual() != null ) {
+      result = createLessOrEqualFilter(filter.getLessOrEqual());
+    }
+    else if ( filter.getNot() != null ) {
+      result = createNOTFilter(filter.getNot());
+    }
+    else if ( filter.getOr() != null ) {
+      result = createORFilter(filter.getOr());
+    }
+    else if ( filter.getPresent() != null ) {
+      result = createPresentFilter(filter.getPresent());
+    }
+    else if ( filter.getSubstrings() != null ) {
+      result = createSubstringFilter(filter.getSubstrings());
+    }
+    return result;
+  }
 
   /**
    * Perform the LDAP SEARCH operation and send the result back to the
@@ -96,24 +372,8 @@
     SearchResponse searchResponse = objFactory.createSearchResponse();
     searchResponse.setRequestID(searchRequest.getRequestID());
 
-    ArrayList<LDAPFilter> filters = new ArrayList<LDAPFilter> ();
-    LDAPFilter f = null;
-    if(searchRequest.getFilter().getPresent() != null)
-    {
-      f = LDAPFilter.decode(searchRequest.getFilter().getPresent().getName() +
-          "=*");
-    } else if(searchRequest.getFilter().getEqualityMatch() != null)
-    {
-      AttributeValueAssertion fgem =
-           searchRequest.getFilter().getEqualityMatch();
+    LDAPFilter filter = createFilter(searchRequest.getFilter());
 
-      f = LDAPFilter.createEqualityFilter(fgem.getName(),
-      new ASN1OctetString(fgem.getValue()));
-    }
-    if(f != null)
-    {
-      filters.add(f);
-    }
     DereferencePolicy derefPolicy = DereferencePolicy.NEVER_DEREF_ALIASES;
     String derefStr = searchRequest.getDerefAliases().toLowerCase();
     if (derefStr.equals("derefinsearching"))
@@ -151,113 +411,91 @@
       }
     }
 
-    for (LDAPFilter filter: filters)
+    SearchRequestProtocolOp protocolOp = new SearchRequestProtocolOp(
+        new ASN1OctetString(searchRequest.getDn()),
+        scope, derefPolicy,
+                (int) searchRequest.getSizeLimit(),
+        (int) searchRequest.getTimeLimit(),
+        searchRequest.isTypesOnly(), filter, attributes);
+    try
     {
+      LDAPMessage msg = new LDAPMessage(DSMLServlet.nextMessageID(),
+                                        protocolOp);
+      connection.getLDAPWriter().writeMessage(msg);
 
-      SearchRequestProtocolOp protocolOp = new SearchRequestProtocolOp(
-          new ASN1OctetString(searchRequest.getDn()),
-          scope, derefPolicy,
-                  (int) searchRequest.getSizeLimit(),
-          (int) searchRequest.getTimeLimit(),
-          false, filter, attributes);
-      try
+      byte opType;
+      do
       {
-        LDAPMessage msg = new LDAPMessage(DSMLServlet.nextMessageID(),
-                                          protocolOp);
-        connection.getLDAPWriter().writeMessage(msg);
+        int resultCode = 0;
+        Message errorMessage = null;
+        LDAPMessage responseMessage =
+             connection.getLDAPReader().readMessage();
 
-        byte opType;
-        do
+        opType = responseMessage.getProtocolOpType();
+        switch(opType)
         {
-          int resultCode = 0;
-          Message errorMessage = null;
-          LDAPMessage responseMessage =
-               connection.getLDAPReader().readMessage();
+          case LDAPConstants.OP_TYPE_SEARCH_RESULT_ENTRY:
+            SearchResultEntryProtocolOp searchEntryOp =
+              responseMessage.getSearchResultEntryProtocolOp();
 
-          opType = responseMessage.getProtocolOpType();
-          switch(opType)
-          {
-            case LDAPConstants.OP_TYPE_SEARCH_RESULT_ENTRY:
-              SearchResultEntryProtocolOp searchEntryOp =
-                responseMessage.getSearchResultEntryProtocolOp();
+            SearchResultEntry entry = objFactory.createSearchResultEntry();
+            java.util.List<DsmlAttr> attrList = entry.getAttr();
 
-        SearchResultEntry entry = objFactory.createSearchResultEntry();
-        java.util.List<DsmlAttr> attrList = entry.getAttr();
+            LinkedList<LDAPAttribute> attrs = searchEntryOp.getAttributes();
 
-        LinkedList<LDAPAttribute> attrs = searchEntryOp.getAttributes();
+            for(LDAPAttribute attr : attrs)
+            {
+              String nm = attr.getAttributeType();
+              DsmlAttr dsmlAttr = objFactory.createDsmlAttr();
 
-        for(LDAPAttribute attr : attrs)
-        {
-          String nm = attr.getAttributeType();
-          DsmlAttr dsmlAttr = objFactory.createDsmlAttr();
-
-          dsmlAttr.setName(nm);
-          List<String> dsmlAttrVal = dsmlAttr.getValue();
-          ArrayList<ASN1OctetString> vals = attr.getValues();
-          for(ASN1OctetString val : vals)
-          {
-            dsmlAttrVal.add(val.toString());
-          }
-          attrList.add(dsmlAttr);
-        }
-
-        entry.setDn(searchEntryOp.getDN().toString());
-        searchResponse.getSearchResultEntry().add(entry);
-        /*
-              StringBuilder sb = new StringBuilder();
-              searchEntryOp.toLDIF(sb, 80);
-              System.out.println(sb.toString());
-        */
-              break;
-
-            case LDAPConstants.OP_TYPE_SEARCH_RESULT_REFERENCE:
-              SearchResultReferenceProtocolOp searchRefOp =
-                responseMessage.getSearchResultReferenceProtocolOp();
-              System.out.println(searchRefOp.toString());
-              break;
-
-            case LDAPConstants.OP_TYPE_SEARCH_RESULT_DONE:
-              SearchResultDoneProtocolOp searchOp =
-                responseMessage.getSearchResultDoneProtocolOp();
-              resultCode = searchOp.getResultCode();
-              errorMessage = searchOp.getErrorMessage();
-              LDAPResult result = objFactory.createLDAPResult();
-              ResultCode code = objFactory.createResultCode();
-              code.setCode(resultCode);
-              result.setResultCode(code);
-              result.setErrorMessage(
-                      errorMessage != null ? errorMessage.toString() : null);
-              if(searchOp.getMatchedDN() != null)
+              dsmlAttr.setName(nm);
+              List<String> dsmlAttrVal = dsmlAttr.getValue();
+              ArrayList<ASN1OctetString> vals = attr.getValues();
+              for(ASN1OctetString val : vals)
               {
-                 result.setMatchedDN(searchOp.getMatchedDN().toString());
+                dsmlAttrVal.add(val.toString());
               }
-              searchResponse.setSearchResultDone(result);
-              break;
-            default:
-               // FIXME - throw exception
-               System.err.println("Invalid protocol operation:" + opType);
-               break;
-           }
+              attrList.add(dsmlAttr);
+            }
 
-           if(resultCode != 0 && resultCode != 10)
-           {
-             org.opends.server.types.ResultCode rc =
-                  org.opends.server.types.ResultCode.valueOf(resultCode);
+            entry.setDn(searchEntryOp.getDN().toString());
+            searchResponse.getSearchResultEntry().add(entry);
+            break;
 
-             // TODO:  FIXME - null message
-             throw new LDAPException(resultCode, null, rc.getResultCodeName());
-           }
+          case LDAPConstants.OP_TYPE_SEARCH_RESULT_REFERENCE:
+            SearchResultReferenceProtocolOp searchRefOp =
+              responseMessage.getSearchResultReferenceProtocolOp();
+            break;
 
-        } while(opType != LDAPConstants.OP_TYPE_SEARCH_RESULT_DONE);
+          case LDAPConstants.OP_TYPE_SEARCH_RESULT_DONE:
+            SearchResultDoneProtocolOp searchOp =
+              responseMessage.getSearchResultDoneProtocolOp();
+            resultCode = searchOp.getResultCode();
+            errorMessage = searchOp.getErrorMessage();
+            LDAPResult result = objFactory.createLDAPResult();
+            ResultCode code = objFactory.createResultCode();
+            code.setCode(resultCode);
+            result.setResultCode(code);
+            result.setErrorMessage(
+                    errorMessage != null ? errorMessage.toString() : null);
+            if(searchOp.getMatchedDN() != null)
+            {
+               result.setMatchedDN(searchOp.getMatchedDN().toString());
+            }
+            searchResponse.setSearchResultDone(result);
+            break;
+          default:
+             throw new RuntimeException("Invalid protocol operation:" + opType);
+         }
+      } while(opType != LDAPConstants.OP_TYPE_SEARCH_RESULT_DONE);
 
-      } catch(ASN1Exception ae)
-      {
-        ae.printStackTrace();
-        throw new IOException(ae.getMessage());
-      }
+    } catch(ASN1Exception ae)
+    {
+      ae.printStackTrace();
+      throw new IOException(ae.getMessage());
     }
+
     return searchResponse;
   }
-
 }
 

--
Gitblit v1.10.0