| | |
| | | * Copyright 2006-2008 Sun Microsystems, Inc. |
| | | */ |
| | | package org.opends.dsml.protocol; |
| | | |
| | | |
| | | |
| | | import org.opends.messages.Message; |
| | | |
| | | |
| | | |
| | | import java.io.IOException; |
| | | import java.util.ArrayList; |
| | | import java.util.LinkedHashSet; |
| | | import java.util.LinkedList; |
| | | import java.util.List; |
| | | |
| | | import javax.xml.bind.JAXBElement; |
| | | |
| | | import org.opends.server.protocols.asn1.ASN1Exception; |
| | | import org.opends.server.protocols.asn1.ASN1OctetString; |
| | | 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.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; |
| | |
| | | |
| | | |
| | | /** |
| | | * This class provides the functionality for the performing an |
| | | * LDAP SEARCH operation based on the specified DSML request. |
| | | * This class provides the functionality for the performing an LDAP |
| | | * SEARCH operation based on the specified DSML request. |
| | | */ |
| | | public class DSMLSearchOperation |
| | | { |
| | | |
| | | private LDAPConnection connection; |
| | | |
| | | |
| | | |
| | | /** |
| | | * Create the instance with the specified connection. |
| | | * |
| | | * @param connection The LDAP connection to send the request on. |
| | | * @param connection |
| | | * The LDAP connection to send the request on. |
| | | */ |
| | | |
| | | public DSMLSearchOperation(LDAPConnection connection) |
| | |
| | | this.connection = connection; |
| | | } |
| | | |
| | | |
| | | |
| | | /** |
| | | * Returns a new AND search filter with the provided filter components. |
| | | * 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. |
| | | * @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 { |
| | | throws LDAPException |
| | | { |
| | | List<JAXBElement<?>> list = filterSet.getFilterGroup(); |
| | | ArrayList<RawFilter> filters = new ArrayList<RawFilter>(list.size()); |
| | | |
| | | for(JAXBElement<?> filter : list) { |
| | | for (JAXBElement<?> filter : list) |
| | | { |
| | | filters.add(createFilter(filter)); |
| | | } |
| | | return LDAPFilter.createANDFilter(filters); |
| | | } |
| | | |
| | | |
| | | |
| | | /** |
| | | * Returns a new Approximate search filter with the provided information. |
| | | * 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. |
| | | * @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())); |
| | | return LDAPFilter.createApproximateFilter(ava.getName(), ByteString |
| | | .valueOf(ava.getValue())); |
| | | } |
| | | |
| | | |
| | | |
| | | /** |
| | | * Returns a new Equality search filter with the provided information. |
| | | * 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. |
| | | * @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())); |
| | | private static LDAPFilter createEqualityFilter(AttributeValueAssertion ava) |
| | | { |
| | | return LDAPFilter.createEqualityFilter(ava.getName(), ByteString |
| | | .valueOf(ava.getValue())); |
| | | } |
| | | |
| | | |
| | | |
| | | /** |
| | | * Returns a new Extensible search filter with the provided information. |
| | | * 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. |
| | | * @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()); |
| | | private static LDAPFilter createExtensibleFilter(MatchingRuleAssertion mra) |
| | | { |
| | | return LDAPFilter.createExtensibleFilter(mra.getMatchingRule(), mra |
| | | .getName(), ByteString.valueOf(mra.getValue()), mra.isDnAttributes()); |
| | | } |
| | | |
| | | |
| | | |
| | | /** |
| | | * Returns a new GreaterOrEqual search filter with the provided information. |
| | | * 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. |
| | | * @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())); |
| | | AttributeValueAssertion ava) |
| | | { |
| | | return LDAPFilter.createGreaterOrEqualFilter(ava.getName(), ByteString |
| | | .valueOf(ava.getValue())); |
| | | } |
| | | |
| | | |
| | | |
| | | /** |
| | | * Returns a new LessOrEqual search filter with the provided information. |
| | | * 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. |
| | | * @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())); |
| | | private static LDAPFilter createLessOrEqualFilter(AttributeValueAssertion ava) |
| | | { |
| | | return LDAPFilter.createLessOrEqualFilter(ava.getName(), ByteString |
| | | .valueOf(ava.getValue())); |
| | | } |
| | | |
| | | |
| | | |
| | | /** |
| | | * Returns a new NOT search filter with the provided information. |
| | | * |
| | | * @param filter the filter for this NOT filter. |
| | | * |
| | | * @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. |
| | | * @throws LDAPException |
| | | * an LDAPException is thrown if the creation of the |
| | | * provided filter fails. |
| | | */ |
| | | private static LDAPFilter createNOTFilter(Filter filter) |
| | | throws LDAPException { |
| | | private static LDAPFilter createNOTFilter(Filter filter) throws LDAPException |
| | | { |
| | | return LDAPFilter.createNOTFilter(createFilter(filter)); |
| | | } |
| | | |
| | | |
| | | |
| | | /** |
| | | * Returns a new OR search filter with the provided filter components. |
| | | * 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. |
| | | * @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 { |
| | | throws LDAPException |
| | | { |
| | | List<JAXBElement<?>> list = filterSet.getFilterGroup(); |
| | | ArrayList<RawFilter> filters = new ArrayList<RawFilter>(list.size()); |
| | | |
| | | for(JAXBElement<?> filter : list) { |
| | | for (JAXBElement<?> filter : list) |
| | | { |
| | | filters.add(createFilter(filter)); |
| | | } |
| | | return LDAPFilter.createORFilter(filters); |
| | | } |
| | | |
| | | |
| | | |
| | | /** |
| | | * Returns a new Present search filter with the provided information. |
| | | * Returns a new Present search filter with the provided |
| | | * information. |
| | | * |
| | | * @param ad the attribute description for this Present filter. |
| | | * |
| | | * @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. |
| | | * @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()); |
| | | throws LDAPException |
| | | { |
| | | return LDAPFilter.decode(new StringBuilder(ad.getName()).append("=*") |
| | | .toString()); |
| | | } |
| | | |
| | | |
| | | |
| | | /** |
| | | * Returns a new Substring search filter with the provided information. |
| | | * 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. |
| | | * @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) { |
| | | private static LDAPFilter createSubstringFilter(SubstringFilter sf) |
| | | { |
| | | List<String> anys = sf.getAny(); |
| | | ArrayList<ByteString> subAnyElements = |
| | | new ArrayList<ByteString>(anys.size()); |
| | | ArrayList<ByteString> subAnyElements = new ArrayList<ByteString>(anys |
| | | .size()); |
| | | |
| | | for(String s : anys) { |
| | | subAnyElements.add(new ASN1OctetString(s)); |
| | | for (String s : anys) |
| | | { |
| | | subAnyElements.add(ByteString.valueOf(s)); |
| | | } |
| | | return LDAPFilter.createSubstringFilter(sf.getName(), |
| | | new ASN1OctetString(sf.getInitial()), |
| | | subAnyElements, |
| | | new ASN1OctetString(sf.getFinal())); |
| | | return LDAPFilter.createSubstringFilter(sf.getName(), ByteString.valueOf(sf |
| | | .getInitial()), subAnyElements, ByteString.valueOf(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". |
| | | * 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. |
| | | * @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 { |
| | | throws LDAPException |
| | | { |
| | | LDAPFilter result = null; |
| | | |
| | | String filterName = xmlElement.getName().getLocalPart(); |
| | | |
| | | if ( "and".equals(filterName) ) { |
| | | if ("and".equals(filterName)) |
| | | { |
| | | // <xsd:element name="and" type="FilterSet"/> |
| | | result = createANDFilter((FilterSet)xmlElement.getValue()); |
| | | result = createANDFilter((FilterSet) xmlElement.getValue()); |
| | | } |
| | | else if ( "or".equals(filterName) ) { |
| | | else if ("or".equals(filterName)) |
| | | { |
| | | // <xsd:element name="or" type="FilterSet"/> |
| | | result = createORFilter((FilterSet)xmlElement.getValue()); |
| | | result = createORFilter((FilterSet) xmlElement.getValue()); |
| | | } |
| | | else if ( "not".equals(filterName) ) { |
| | | else if ("not".equals(filterName)) |
| | | { |
| | | // <xsd:element name="not" type="Filter"/> |
| | | result = createNOTFilter((Filter)xmlElement.getValue()); |
| | | result = createNOTFilter((Filter) xmlElement.getValue()); |
| | | } |
| | | else if ( "equalityMatch".equals(filterName) ) { |
| | | // <xsd:element name="equalityMatch" type="AttributeValueAssertion"/> |
| | | result = createEqualityFilter((AttributeValueAssertion) |
| | | xmlElement.getValue()); |
| | | else if ("equalityMatch".equals(filterName)) |
| | | { |
| | | // <xsd:element name="equalityMatch" |
| | | // type="AttributeValueAssertion"/> |
| | | result = createEqualityFilter((AttributeValueAssertion) xmlElement |
| | | .getValue()); |
| | | } |
| | | else if ( "substrings".equals(filterName) ) { |
| | | else if ("substrings".equals(filterName)) |
| | | { |
| | | // <xsd:element name="substrings" type="SubstringFilter"/> |
| | | result = createSubstringFilter((SubstringFilter)xmlElement.getValue()); |
| | | result = createSubstringFilter((SubstringFilter) xmlElement.getValue()); |
| | | } |
| | | else if ( "greaterOrEqual".equals(filterName) ) { |
| | | // <xsd:element name="greaterOrEqual" type="AttributeValueAssertion"/> |
| | | result = createGreaterOrEqualFilter((AttributeValueAssertion) |
| | | 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 ("lessOrEqual".equals(filterName)) |
| | | { |
| | | // <xsd:element name="lessOrEqual" |
| | | // type="AttributeValueAssertion"/> |
| | | result = createLessOrEqualFilter((AttributeValueAssertion) xmlElement |
| | | .getValue()); |
| | | } |
| | | else if ( "present".equals(filterName) ) { |
| | | else if ("present".equals(filterName)) |
| | | { |
| | | // <xsd:element name="present" type="AttributeDescription"/> |
| | | result = createPresentFilter((AttributeDescription)xmlElement.getValue()); |
| | | result = |
| | | createPresentFilter((AttributeDescription) xmlElement.getValue()); |
| | | } |
| | | else if ( "approxMatch".equals(filterName) ) { |
| | | // <xsd:element name="approxMatch" type="AttributeValueAssertion"/> |
| | | result = createApproximateFilter((AttributeValueAssertion) |
| | | 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()); |
| | | 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. |
| | | * 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. |
| | | * @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 { |
| | | private static LDAPFilter createFilter(Filter filter) throws LDAPException |
| | | { |
| | | |
| | | LDAPFilter result = null; |
| | | |
| | | if ( filter.getAnd() != null ) { |
| | | if (filter.getAnd() != null) |
| | | { |
| | | result = createANDFilter(filter.getAnd()); |
| | | } |
| | | else if ( filter.getApproxMatch() != null ) { |
| | | else if (filter.getApproxMatch() != null) |
| | | { |
| | | result = createApproximateFilter(filter.getApproxMatch()); |
| | | } |
| | | else if ( filter.getEqualityMatch() != null ) { |
| | | else if (filter.getEqualityMatch() != null) |
| | | { |
| | | result = createEqualityFilter(filter.getEqualityMatch()); |
| | | } |
| | | else if ( filter.getExtensibleMatch() != null ) { |
| | | else if (filter.getExtensibleMatch() != null) |
| | | { |
| | | result = createExtensibleFilter(filter.getExtensibleMatch()); |
| | | } |
| | | else if ( filter.getGreaterOrEqual() != null ) { |
| | | else if (filter.getGreaterOrEqual() != null) |
| | | { |
| | | result = createGreaterOrEqualFilter(filter.getGreaterOrEqual()); |
| | | } |
| | | else if ( filter.getLessOrEqual() != null ) { |
| | | else if (filter.getLessOrEqual() != null) |
| | | { |
| | | result = createLessOrEqualFilter(filter.getLessOrEqual()); |
| | | } |
| | | else if ( filter.getNot() != null ) { |
| | | else if (filter.getNot() != null) |
| | | { |
| | | result = createNOTFilter(filter.getNot()); |
| | | } |
| | | else if ( filter.getOr() != null ) { |
| | | else if (filter.getOr() != null) |
| | | { |
| | | result = createORFilter(filter.getOr()); |
| | | } |
| | | else if ( filter.getPresent() != null ) { |
| | | else if (filter.getPresent() != null) |
| | | { |
| | | result = createPresentFilter(filter.getPresent()); |
| | | } |
| | | else if ( filter.getSubstrings() != null ) { |
| | | else if (filter.getSubstrings() != null) |
| | | { |
| | | result = createSubstringFilter(filter.getSubstrings()); |
| | | } |
| | | return result; |
| | | } |
| | | |
| | | |
| | | |
| | | /** |
| | | * Perform the LDAP SEARCH operation and send the result back to the |
| | | * client. |
| | | * |
| | | * @param objFactory The object factory for this operation. |
| | | * @param searchRequest The search request for this operation. |
| | | * |
| | | * @return The result of the add operation. |
| | | * |
| | | * @throws IOException If an I/O problem occurs. |
| | | * |
| | | * @throws LDAPException If an error occurs while interacting with an LDAP |
| | | * element. |
| | | * @param objFactory |
| | | * The object factory for this operation. |
| | | * @param searchRequest |
| | | * The search request for this operation. |
| | | * @return The result of the add operation. |
| | | * @throws IOException |
| | | * If an I/O problem occurs. |
| | | * @throws LDAPException |
| | | * If an error occurs while interacting with an LDAP |
| | | * element. |
| | | */ |
| | | public SearchResponse doSearch(ObjectFactory objFactory, |
| | | SearchRequest searchRequest) |
| | | throws IOException, LDAPException |
| | | SearchRequest searchRequest) throws IOException, LDAPException |
| | | { |
| | | SearchResponse searchResponse = objFactory.createSearchResponse(); |
| | | searchResponse.setRequestID(searchRequest.getRequestID()); |
| | |
| | | |
| | | SearchScope scope = SearchScope.WHOLE_SUBTREE; |
| | | String scopeStr = searchRequest.getScope().toLowerCase(); |
| | | if(scopeStr.equals("singlelevel") || scopeStr.equals("one")) |
| | | if (scopeStr.equals("singlelevel") || scopeStr.equals("one")) |
| | | { |
| | | scope = SearchScope.SINGLE_LEVEL; |
| | | } else if(scopeStr.equals("baseobject") || scopeStr.equals("base")) |
| | | } |
| | | else if (scopeStr.equals("baseobject") || scopeStr.equals("base")) |
| | | { |
| | | scope = SearchScope.BASE_OBJECT; |
| | | } |
| | |
| | | LinkedHashSet<String> attributes = new LinkedHashSet<String>(); |
| | | // Get the list of attributes. |
| | | AttributeDescriptions attrDescriptions = searchRequest.getAttributes(); |
| | | if(attrDescriptions != null) |
| | | if (attrDescriptions != null) |
| | | { |
| | | List<AttributeDescription> attrDesc = attrDescriptions.getAttribute(); |
| | | for(AttributeDescription desc : attrDesc) |
| | | for (AttributeDescription desc : attrDesc) |
| | | { |
| | | attributes.add(desc.getName()); |
| | | } |
| | | } |
| | | |
| | | SearchRequestProtocolOp protocolOp = new SearchRequestProtocolOp( |
| | | new ASN1OctetString(searchRequest.getDn()), |
| | | scope, derefPolicy, |
| | | (int) searchRequest.getSizeLimit(), |
| | | (int) searchRequest.getTimeLimit(), |
| | | SearchRequestProtocolOp protocolOp = new SearchRequestProtocolOp(ByteString |
| | | .valueOf(searchRequest.getDn()), scope, derefPolicy, |
| | | (int) searchRequest.getSizeLimit(), (int) searchRequest.getTimeLimit(), |
| | | searchRequest.isTypesOnly(), filter, attributes); |
| | | try |
| | | { |
| | | LDAPMessage msg = new LDAPMessage(DSMLServlet.nextMessageID(), |
| | | protocolOp); |
| | | LDAPMessage msg = |
| | | new LDAPMessage(DSMLServlet.nextMessageID(), protocolOp); |
| | | connection.getLDAPWriter().writeMessage(msg); |
| | | |
| | | byte opType; |
| | |
| | | { |
| | | int resultCode = 0; |
| | | Message errorMessage = null; |
| | | LDAPMessage responseMessage = |
| | | connection.getLDAPReader().readMessage(); |
| | | LDAPMessage responseMessage = connection.getLDAPReader().readMessage(); |
| | | |
| | | opType = responseMessage.getProtocolOpType(); |
| | | switch(opType) |
| | | switch (opType) |
| | | { |
| | | case LDAPConstants.OP_TYPE_SEARCH_RESULT_ENTRY: |
| | | SearchResultEntryProtocolOp searchEntryOp = |
| | | responseMessage.getSearchResultEntryProtocolOp(); |
| | | 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) |
| | | for (LDAPAttribute attr : attrs) |
| | | { |
| | | String nm = attr.getAttributeType(); |
| | | DsmlAttr dsmlAttr = objFactory.createDsmlAttr(); |
| | | |
| | | dsmlAttr.setName(nm); |
| | | List<String> dsmlAttrVal = dsmlAttr.getValue(); |
| | | ArrayList<ByteString> vals = attr.getValues(); |
| | | for (ByteString val : vals) |
| | | { |
| | | 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); |
| | | dsmlAttrVal.add(val.toString()); |
| | | } |
| | | attrList.add(dsmlAttr); |
| | | } |
| | | |
| | | entry.setDn(searchEntryOp.getDN().toString()); |
| | | searchResponse.getSearchResultEntry().add(entry); |
| | | break; |
| | | entry.setDn(searchEntryOp.getDN().toString()); |
| | | searchResponse.getSearchResultEntry().add(entry); |
| | | break; |
| | | |
| | | case LDAPConstants.OP_TYPE_SEARCH_RESULT_REFERENCE: |
| | | SearchResultReferenceProtocolOp searchRefOp = |
| | | responseMessage.getSearchResultReferenceProtocolOp(); |
| | | break; |
| | | case LDAPConstants.OP_TYPE_SEARCH_RESULT_REFERENCE: |
| | | responseMessage.getSearchResultReferenceProtocolOp(); |
| | | 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) |
| | | { |
| | | 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); |
| | | 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) |
| | | } |
| | | catch (ASN1Exception ae) |
| | | { |
| | | ae.printStackTrace(); |
| | | throw new IOException(ae.getMessage()); |
| | |
| | | return searchResponse; |
| | | } |
| | | } |
| | | |