| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * https://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| * |
| */ |
| package org.apache.directory.api.ldap.codec.actions.request.search; |
| |
| |
| import java.util.ArrayList; |
| import java.util.List; |
| |
| import org.apache.directory.api.asn1.DecoderException; |
| import org.apache.directory.api.asn1.ber.grammar.GrammarAction; |
| import org.apache.directory.api.i18n.I18n; |
| import org.apache.directory.api.ldap.codec.AttributeValueAssertion; |
| import org.apache.directory.api.ldap.codec.api.LdapCodecConstants; |
| import org.apache.directory.api.ldap.codec.api.LdapMessageContainer; |
| import org.apache.directory.api.ldap.codec.search.AndFilter; |
| import org.apache.directory.api.ldap.codec.search.AttributeValueAssertionFilter; |
| import org.apache.directory.api.ldap.codec.search.ConnectorFilter; |
| import org.apache.directory.api.ldap.codec.search.ExtensibleMatchFilter; |
| import org.apache.directory.api.ldap.codec.search.Filter; |
| import org.apache.directory.api.ldap.codec.search.OrFilter; |
| import org.apache.directory.api.ldap.codec.search.PresentFilter; |
| import org.apache.directory.api.ldap.codec.search.SubstringFilter; |
| import org.apache.directory.api.ldap.model.entry.Value; |
| import org.apache.directory.api.ldap.model.exception.LdapSchemaException; |
| import org.apache.directory.api.ldap.model.filter.AndNode; |
| import org.apache.directory.api.ldap.model.filter.ApproximateNode; |
| import org.apache.directory.api.ldap.model.filter.BranchNode; |
| import org.apache.directory.api.ldap.model.filter.EqualityNode; |
| import org.apache.directory.api.ldap.model.filter.ExprNode; |
| import org.apache.directory.api.ldap.model.filter.ExtensibleNode; |
| import org.apache.directory.api.ldap.model.filter.GreaterEqNode; |
| import org.apache.directory.api.ldap.model.filter.LeafNode; |
| import org.apache.directory.api.ldap.model.filter.LessEqNode; |
| import org.apache.directory.api.ldap.model.filter.NotNode; |
| import org.apache.directory.api.ldap.model.filter.OrNode; |
| import org.apache.directory.api.ldap.model.filter.PresenceNode; |
| import org.apache.directory.api.ldap.model.filter.SubstringNode; |
| import org.apache.directory.api.ldap.model.message.SearchRequest; |
| import org.slf4j.Logger; |
| import org.slf4j.LoggerFactory; |
| |
| |
| /** |
| * The action used to initialize the AttributeDesc list |
| * <pre> |
| * SearchRequest ::= [APPLICATION 3] SEQUENCE { |
| * ... |
| * filter Filter, |
| * attributes AttributeDescriptionList } |
| * |
| * AttributeDescriptionList ::= SEQUENCE OF |
| * AttributeDescription |
| * </pre> |
| * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a> |
| */ |
| public class InitSearchRequestAttributeDescList extends GrammarAction<LdapMessageContainer<SearchRequest>> |
| { |
| /** The logger */ |
| private static final Logger LOG = LoggerFactory.getLogger( InitSearchRequestAttributeDescList.class ); |
| |
| /** |
| * Instantiates a new init attribute desc list action. |
| */ |
| public InitSearchRequestAttributeDescList() |
| { |
| super( "Initialize AttributeDesc list" ); |
| } |
| |
| |
| /** |
| * Transform the Filter part of a SearchRequest to an ExprNode |
| * |
| * @param filter The filter to be transformed |
| * @return An ExprNode |
| * @throws LdapSchemaException If teh filter is invalid |
| */ |
| private ExprNode transform( Filter filter ) throws LdapSchemaException |
| { |
| if ( filter != null ) |
| { |
| // Transform OR, AND or NOT leaves |
| if ( filter instanceof ConnectorFilter ) |
| { |
| BranchNode branch; |
| |
| if ( filter instanceof AndFilter ) |
| { |
| branch = new AndNode(); |
| } |
| else if ( filter instanceof OrFilter ) |
| { |
| branch = new OrNode(); |
| } |
| else |
| { |
| branch = new NotNode(); |
| } |
| |
| List<Filter> filtersSet = ( ( ConnectorFilter ) filter ).getFilterSet(); |
| |
| // Loop on all AND/OR children |
| if ( filtersSet != null ) |
| { |
| for ( Filter node : filtersSet ) |
| { |
| branch.addNode( transform( node ) ); |
| } |
| } |
| |
| return branch; |
| } |
| else |
| { |
| // Transform PRESENT or ATTRIBUTE_VALUE_ASSERTION |
| LeafNode branch = null; |
| |
| if ( filter instanceof PresentFilter ) |
| { |
| branch = new PresenceNode( ( ( PresentFilter ) filter ).getAttributeDescription() ); |
| } |
| else if ( filter instanceof AttributeValueAssertionFilter ) |
| { |
| AttributeValueAssertion ava = ( ( AttributeValueAssertionFilter ) filter ).getAssertion(); |
| |
| // Transform =, >=, <=, ~= filters |
| int filterType = ( ( AttributeValueAssertionFilter ) filter ).getFilterType(); |
| |
| switch ( filterType ) |
| { |
| case LdapCodecConstants.EQUALITY_MATCH_FILTER: |
| branch = new EqualityNode( ava.getAttributeDesc(), ava.getAssertion() ); |
| break; |
| |
| case LdapCodecConstants.GREATER_OR_EQUAL_FILTER: |
| branch = new GreaterEqNode( ava.getAttributeDesc(), ava.getAssertion() ); |
| break; |
| |
| case LdapCodecConstants.LESS_OR_EQUAL_FILTER: |
| branch = new LessEqNode( ava.getAttributeDesc(), ava.getAssertion() ); |
| break; |
| |
| case LdapCodecConstants.APPROX_MATCH_FILTER: |
| branch = new ApproximateNode( ava.getAttributeDesc(), ava.getAssertion() ); |
| break; |
| |
| default: |
| throw new IllegalArgumentException( I18n.err( I18n.ERR_05503_UNEXPECTED_FILTER_TYPE, filterType ) ); |
| } |
| |
| } |
| else if ( filter instanceof SubstringFilter ) |
| { |
| // Transform Substring filters |
| SubstringFilter substrFilter = ( SubstringFilter ) filter; |
| String initialString = null; |
| String finalString = null; |
| List<String> anyString = null; |
| |
| if ( substrFilter.getInitialSubstrings() != null ) |
| { |
| initialString = substrFilter.getInitialSubstrings(); |
| } |
| |
| if ( substrFilter.getFinalSubstrings() != null ) |
| { |
| finalString = substrFilter.getFinalSubstrings(); |
| } |
| |
| if ( substrFilter.getAnySubstrings() != null ) |
| { |
| anyString = new ArrayList<>(); |
| |
| for ( String any : substrFilter.getAnySubstrings() ) |
| { |
| anyString.add( any ); |
| } |
| } |
| |
| branch = new SubstringNode( anyString, substrFilter.getType(), initialString, finalString ); |
| } |
| else if ( filter instanceof ExtensibleMatchFilter ) |
| { |
| // Transform Extensible Match Filter |
| ExtensibleMatchFilter extFilter = ( ExtensibleMatchFilter ) filter; |
| String matchingRule = null; |
| |
| Value value = extFilter.getMatchValue(); |
| |
| if ( extFilter.getMatchingRule() != null ) |
| { |
| matchingRule = extFilter.getMatchingRule(); |
| } |
| |
| branch = new ExtensibleNode( extFilter.getType(), value, matchingRule, extFilter.isDnAttributes() ); |
| } |
| |
| return branch; |
| } |
| } |
| else |
| { |
| // We have found nothing to transform. Return null then. |
| return null; |
| } |
| } |
| |
| |
| /** |
| * {@inheritDoc} |
| */ |
| public void action( LdapMessageContainer<SearchRequest> container ) throws DecoderException |
| { |
| // Here, we have to inject the decoded filter into the SearchRequest |
| SearchRequest searchRequest = container.getMessage(); |
| |
| try |
| { |
| searchRequest.setFilter( transform( container.getTopFilter() ) ); |
| } |
| catch ( LdapSchemaException lse ) |
| { |
| throw new DecoderException( lse.getMessage(), lse ); |
| } |
| |
| // We can have an END transition |
| container.setGrammarEndAllowed( true ); |
| |
| if ( LOG.isDebugEnabled() ) |
| { |
| LOG.debug( I18n.msg( I18n.MSG_05158_INITIALIZE_ATT_DESC_LIST ) ); |
| } |
| } |
| } |