blob: a48323f97678769139c67b182f3bd12d282c4232 [file] [log] [blame]
/*
* 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
*
* http://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.studio.ldapbrowser.core.model.filter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.apache.directory.studio.ldapbrowser.core.BrowserCoreMessages;
import org.apache.directory.studio.ldapbrowser.core.model.filter.parser.LdapFilterToken;
/**
* The LdapFilter class represents an LDAP filter.
*
* @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
*/
public class LdapFilter
{
private LdapFilterToken startToken;
private LdapFilterComponent filterComponent;
private LdapFilterToken stopToken;
private List<LdapFilterToken> otherTokens;
/**
* Creates a new instance of LdapFilter.
*/
public LdapFilter()
{
this.startToken = null;
this.filterComponent = null;
this.stopToken = null;
this.otherTokens = new ArrayList<LdapFilterToken>( 2 );
}
/**
* Sets the start token.
*
* @param startToken the start token
*
* @return true, if setting the start token was successful, false otherwise
*/
public boolean setStartToken( LdapFilterToken startToken )
{
if ( this.startToken == null && startToken != null && startToken.getType() == LdapFilterToken.LPAR )
{
this.startToken = startToken;
return true;
}
else
{
return false;
}
}
/**
* Sets the filter component.
*
* @param filterComponent the filter component
*
* @return true, if setting the filter component was successful, false otherwise
*/
public boolean setFilterComponent( LdapFilterComponent filterComponent )
{
if ( this.startToken != null && this.filterComponent == null && filterComponent != null )
{
this.filterComponent = filterComponent;
return true;
}
else
{
return false;
}
}
/**
* Sets the stop token.
*
* @param stopToken the stop token
*
* @return true, if setting the stop token was successful, false otherwise
*/
public boolean setStopToken( LdapFilterToken stopToken )
{
if ( this.startToken != null && this.stopToken == null && stopToken != null
&& stopToken.getType() == LdapFilterToken.RPAR )
{
this.stopToken = stopToken;
return true;
}
else
{
return false;
}
}
/**
* Adds another token.
*
* @param otherToken the other token
*/
public void addOtherToken( LdapFilterToken otherToken )
{
otherTokens.add( otherToken );
}
/**
* Gets the start token.
*
* @return the start token, or null if not set
*/
public LdapFilterToken getStartToken()
{
return startToken;
}
/**
* Gets the filter component.
*
* @return the filter component, or null if not set
*/
public LdapFilterComponent getFilterComponent()
{
return filterComponent;
}
/**
* Gets the stop token.
*
* @return the stop token or null if not set
*/
public LdapFilterToken getStopToken()
{
return stopToken;
}
/**
* Gets all the tokens.
*
* @return the tokens
*/
public LdapFilterToken[] getTokens()
{
// collect tokens
List<LdapFilterToken> tokenList = new ArrayList<LdapFilterToken>();
if ( startToken != null )
{
tokenList.add( startToken );
}
if ( stopToken != null )
{
tokenList.add( stopToken );
}
if ( filterComponent != null )
{
tokenList.addAll( Arrays.asList( filterComponent.getTokens() ) );
}
tokenList.addAll( otherTokens );
// sort tokens
LdapFilterToken[] tokens = tokenList.toArray( new LdapFilterToken[tokenList.size()] );
Arrays.sort( tokens );
// return
return tokens;
}
/**
* Checks if this filter and all its subfilters are valid.
*
* @return true, if this filter and all its subfilters is valid
*/
public boolean isValid()
{
return startToken != null && filterComponent != null && filterComponent.isValid() && stopToken != null
&& otherTokens.isEmpty();
}
/**
* Gets the invalid filters. This may be this filter itself or any of the subfilters.
*
* @return an array of invalid filters or an empty array if all subfilters
* are valid.
*/
public LdapFilter[] getInvalidFilters()
{
if ( startToken == null || filterComponent == null || stopToken == null )
{
return new LdapFilter[]
{ this };
}
else
{
return filterComponent.getInvalidFilters();
}
}
/**
* Gets the filter at the given offset. This may be this filter
* or one of the subfilters.
*
* @param offset the offset
*
* @return the filter at the given offset or null is offset is out of
* range.
*/
public LdapFilter getFilter( int offset )
{
if ( startToken != null && startToken.getOffset() == offset )
{
return this;
}
else if ( stopToken != null && stopToken.getOffset() == offset )
{
return this;
}
if ( otherTokens != null && otherTokens.size() > 0 )
{
for ( int i = 0; i < otherTokens.size(); i++ )
{
LdapFilterToken otherToken = otherTokens.get( i );
if ( otherToken != null && otherToken.getOffset() <= offset
&& offset < otherToken.getOffset() + otherToken.getLength() )
{
return this;
}
}
}
if ( filterComponent != null )
{
return filterComponent.getFilter( offset );
}
return this;
}
/**
* Gets the invalid cause.
*
* @return the invalid cause, or null if this filter is valid.
*/
public String getInvalidCause()
{
if ( stopToken == null )
{
return BrowserCoreMessages.model_filter_missing_closing_parenthesis;
}
else if ( filterComponent == null )
{
return BrowserCoreMessages.model_filter_missing_filter_expression;
}
else
{
return filterComponent.getInvalidCause();
}
}
/**
* Gets the string representation of this LDAP filter. Invalid tokens and
* white spaces are removed, but incomplete filter parts are kept.
*/
public String toString()
{
StringBuffer sb = new StringBuffer();
LdapFilterToken[] tokens = getTokens();
for ( LdapFilterToken token : tokens )
{
if ( token.getType() != LdapFilterToken.UNKNOWN && token.getType() != LdapFilterToken.WHITESPACE
&& token.getType() != LdapFilterToken.ERROR && token.getType() != LdapFilterToken.EOF )
{
sb.append( token.getValue() );
}
}
return sb.toString();
}
/**
* Gets the string representation of this LDAP filter, as provided by the user.
* It may contain white spaces and invalid tokens.
*/
public String toUserProvidedString()
{
// add _all_ tokens to the string, including invalid tokens and whitespace tokens
StringBuffer sb = new StringBuffer();
LdapFilterToken[] tokens = getTokens();
for ( LdapFilterToken token : tokens )
{
sb.append( token.getValue() );
}
return sb.toString();
}
}