You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@directory.apache.org by fe...@apache.org on 2007/11/05 17:52:07 UTC
svn commit: r592082 [10/20] - in
/directory/sandbox/felixk/studio-ldapbrowser-core: ./ META-INF/ src/
src/main/ src/main/java/ src/main/java/org/ src/main/java/org/apache/
src/main/java/org/apache/directory/
src/main/java/org/apache/directory/studio/ s...
Added: directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/model/filter/LdapFilterComponent.java
URL: http://svn.apache.org/viewvc/directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/model/filter/LdapFilterComponent.java?rev=592082&view=auto
==============================================================================
--- directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/model/filter/LdapFilterComponent.java (added)
+++ directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/model/filter/LdapFilterComponent.java Mon Nov 5 08:51:43 2007
@@ -0,0 +1,281 @@
+/*
+ * 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.Iterator;
+import java.util.List;
+
+import org.apache.directory.studio.ldapbrowser.core.model.filter.parser.LdapFilterToken;
+
+
+/**
+ * The LdapFilterComponent is the base class for all filter components.
+ *
+ * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+ * @version $Rev$, $Date$
+ */
+public abstract class LdapFilterComponent
+{
+
+ /** The parent filter. */
+ protected final LdapFilter parent;
+
+ /** The start token. */
+ protected LdapFilterToken startToken;
+
+ /** The filter list. */
+ protected List<LdapFilter> filterList;
+
+
+ /**
+ * The Constructor.
+ *
+ * @param parent the parent filter, not null
+ */
+ protected LdapFilterComponent( LdapFilter parent )
+ {
+ if ( parent == null )
+ {
+ throw new IllegalArgumentException( "parent is null" );
+ }
+
+ this.parent = parent;
+ this.startToken = null;
+ this.filterList = new ArrayList<LdapFilter>( 2 );
+ }
+
+
+ /**
+ * Returns the parent filter of this filter component.
+ *
+ * @return the parent filter, never null.
+ */
+ public final LdapFilter getParent()
+ {
+ return parent;
+ }
+
+
+ /**
+ * Sets the start token of the filter component. Checks if start token
+ * isn't set yet and if the given start token isn't null.
+ *
+ * @param startToken
+ *
+ * @return true if setting the start token was successful, false
+ * otherwise.
+ */
+ public boolean setStartToken( LdapFilterToken startToken )
+ {
+ if ( this.startToken == null && startToken != null )
+ {
+ this.startToken = startToken;
+ return true;
+ }
+ else
+ {
+ return false;
+ }
+ }
+
+
+ /**
+ * Returns the start token of this filter component.
+ *
+ * @return the start token or null if not set.
+ */
+ public final LdapFilterToken getStartToken()
+ {
+ return startToken;
+ }
+
+
+ /**
+ * Adds a filter to the list of subfilters. Checks if the start token
+ * was set before and if the filter isn't null.
+ *
+ * @param filter
+ *
+ * @return true if adding the filter was successful, false otherwise.
+ */
+ public boolean addFilter( LdapFilter filter )
+ {
+ if ( startToken != null && filter != null )
+ {
+ filterList.add( filter );
+ return true;
+ }
+ else
+ {
+ return false;
+ }
+ }
+
+
+ /**
+ * Returns the subfilters of this filter component.
+ *
+ * @return an array of subfilters or an empty array.
+ */
+ public LdapFilter[] getFilters()
+ {
+ LdapFilter[] filters = new LdapFilter[filterList.size()];
+ filterList.toArray( filters );
+ return filters;
+ }
+
+
+ /**
+ * Checks if this filter component including all subfilters is valid.
+ *
+ * @return true if this filter component is valid.
+ */
+ public boolean isValid()
+ {
+ if ( startToken == null )
+ {
+ return false;
+ }
+
+ if ( filterList.isEmpty() )
+ {
+ return false;
+ }
+
+ for ( Iterator<LdapFilter> it = filterList.iterator(); it.hasNext(); )
+ {
+ LdapFilter filter = it.next();
+ if ( filter == null || !filter.isValid() )
+ {
+ return false;
+ }
+ }
+
+ return true;
+ }
+
+
+ /**
+ * Returns the invalid cause.
+ *
+ * @return the invalid cause, or null if this filter is valid.
+ */
+ public abstract String getInvalidCause();
+
+
+ /**
+ * Returns the invalid filters. This may be the whole parent filter or
+ * any of the subfilters.
+ *
+ * @return an array of invalid filters or an empty array if all filters
+ * are valid.
+ */
+ public LdapFilter[] getInvalidFilters()
+ {
+ if ( startToken == null || filterList.isEmpty() )
+ {
+ return new LdapFilter[]
+ { parent };
+ }
+ else
+ {
+ List<LdapFilter> invalidFilterList = new ArrayList<LdapFilter>();
+ for ( Iterator<LdapFilter> it = filterList.iterator(); it.hasNext(); )
+ {
+ LdapFilter filter = it.next();
+ if ( filter != null )
+ {
+ invalidFilterList.addAll( Arrays.asList( filter.getInvalidFilters() ) );
+ }
+ }
+ return invalidFilterList.toArray( new LdapFilter[invalidFilterList.size()] );
+ }
+ }
+
+
+ /**
+ * Returns all tokens of the filter component including all subfilters.
+ *
+ * @return an array of tokens of an empty array.
+ */
+ public LdapFilterToken[] getTokens()
+ {
+ // collect tokens
+ List<LdapFilterToken> tokenList = new ArrayList<LdapFilterToken>();
+ if ( startToken != null )
+ {
+ tokenList.add( startToken );
+ }
+ for ( Iterator<LdapFilter> it = filterList.iterator(); it.hasNext(); )
+ {
+ LdapFilter filter = it.next();
+ if ( filter != null )
+ {
+ tokenList.addAll( Arrays.asList( filter.getTokens() ) );
+ }
+ }
+
+ // sort tokens
+ LdapFilterToken[] tokens = tokenList.toArray( new LdapFilterToken[tokenList.size()] );
+ Arrays.sort( tokens );
+
+ // return
+ return tokens;
+ }
+
+
+ /**
+ * Returns the filter at the given offset. This may be the whole parent
+ * 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 parent;
+ }
+ else if ( filterList != null || !filterList.isEmpty() )
+ {
+ for ( Iterator<LdapFilter> it = filterList.iterator(); it.hasNext(); )
+ {
+ LdapFilter filter = it.next();
+ if ( filter != null && filter.getFilter( offset ) != null )
+ {
+ return filter.getFilter( offset );
+ }
+ }
+ return null;
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+}
Propchange: directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/model/filter/LdapFilterComponent.java
------------------------------------------------------------------------------
svn:eol-style = native
Added: directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/model/filter/LdapFilterExtensibleComponent.java
URL: http://svn.apache.org/viewvc/directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/model/filter/LdapFilterExtensibleComponent.java?rev=592082&view=auto
==============================================================================
--- directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/model/filter/LdapFilterExtensibleComponent.java (added)
+++ directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/model/filter/LdapFilterExtensibleComponent.java Mon Nov 5 08:51:43 2007
@@ -0,0 +1,499 @@
+/*
+ * 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.model.filter.parser.LdapFilterToken;
+
+
+/**
+ * The LdapFilterExtensibleComponent represents an extensible filter.
+ *
+ * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+ * @version $Rev$, $Date$
+ */
+public class LdapFilterExtensibleComponent extends LdapFilterComponent
+{
+ private LdapFilterToken attributeToken;
+
+ private LdapFilterToken dnAttrColonToken;
+ private LdapFilterToken dnAttrToken;
+
+ private LdapFilterToken matchingRuleColonToken;
+ private LdapFilterToken matchingRuleToken;
+
+ private LdapFilterToken equalsColonToken;
+ private LdapFilterToken equalsToken;
+
+ private LdapFilterToken valueToken;
+
+
+ /**
+ * Creates a new instance of LdapFilterExtensibleComponent.
+ *
+ * @param parent the parent filter
+ */
+ public LdapFilterExtensibleComponent( LdapFilter parent )
+ {
+ super( parent );
+ }
+
+
+ /**
+ * Sets the attribute token.
+ *
+ * @param attributeToken the attribute token
+ *
+ * @return true, if setting the attribute token was successful,false otherwise.
+ */
+ public boolean setAttributeToken( LdapFilterToken attributeToken )
+ {
+ if ( this.attributeToken == null && attributeToken != null
+ && attributeToken.getType() == LdapFilterToken.EXTENSIBLE_ATTRIBUTE )
+ {
+ if ( super.getStartToken() == null )
+ {
+ super.setStartToken( attributeToken );
+ }
+ this.attributeToken = attributeToken;
+ return true;
+ }
+ else
+ {
+ return false;
+ }
+ }
+
+
+ /**
+ * Gets the attribute token.
+ *
+ * @return the attribute token, or null if not set
+ */
+ public LdapFilterToken getAttributeToken()
+ {
+ return attributeToken;
+ }
+
+
+ /**
+ * Sets the dn attr colon token.
+ *
+ * @param dnAttrColonToken the dn attr colon token
+ *
+ * @return true, if setting the dn attr colon token was sucessful, false otherwise
+ */
+ public boolean setDnAttrColonToken( LdapFilterToken dnAttrColonToken )
+ {
+ if ( this.dnAttrColonToken == null && dnAttrColonToken != null
+ && dnAttrColonToken.getType() == LdapFilterToken.EXTENSIBLE_DNATTR_COLON )
+ {
+ if ( super.getStartToken() == null )
+ {
+ super.setStartToken( dnAttrColonToken );
+ }
+ this.dnAttrColonToken = dnAttrColonToken;
+ return true;
+ }
+ else
+ {
+ return false;
+ }
+ }
+
+
+ /**
+ * Gets the dn attr colon token.
+ *
+ * @return the dn attr colon token, or null if not set
+ */
+ public LdapFilterToken getDnAttrColonToken()
+ {
+ return dnAttrColonToken;
+ }
+
+
+ /**
+ * Sets the dn attr token.
+ *
+ * @param dnAttrToken the dn attr token
+ *
+ * @return true, if setting the dn attr token was successful, false otherwise
+ */
+ public boolean setDnAttrToken( LdapFilterToken dnAttrToken )
+ {
+ if ( this.dnAttrToken == null && dnAttrToken != null
+ && dnAttrToken.getType() == LdapFilterToken.EXTENSIBLE_DNATTR )
+ {
+ this.dnAttrToken = dnAttrToken;
+ return true;
+ }
+ else
+ {
+ return false;
+ }
+ }
+
+
+ /**
+ * Gets the dn attr token.
+ *
+ * @return the dn attr token, or null if not set
+ */
+ public LdapFilterToken getDnAttrToken()
+ {
+ return dnAttrToken;
+ }
+
+
+ /**
+ * Sets the matching rule colon token.
+ *
+ * @param matchingRuleColonToken the matching rule colon token
+ *
+ * @return true, if setting the matching rule colon token was successful, false otherwise
+ */
+ public boolean setMatchingRuleColonToken( LdapFilterToken matchingRuleColonToken )
+ {
+ if ( this.matchingRuleColonToken == null && matchingRuleColonToken != null
+ && matchingRuleColonToken.getType() == LdapFilterToken.EXTENSIBLE_MATCHINGRULEOID_COLON )
+ {
+ if ( super.getStartToken() == null )
+ {
+ super.setStartToken( matchingRuleColonToken );
+ }
+ this.matchingRuleColonToken = matchingRuleColonToken;
+ return true;
+ }
+ else
+ {
+ return false;
+ }
+ }
+
+
+ /**
+ * Gets the matching rule colon token.
+ *
+ * @return the matching rule colon token, or null if not set
+ */
+ public LdapFilterToken getMatchingRuleColonToken()
+ {
+ return matchingRuleColonToken;
+ }
+
+
+ /**
+ * Sets the matching rule token.
+ *
+ * @param matchingRuleToken the matching rule token
+ *
+ * @return true, if setting the matching rule token was successful, false otherwise
+ */
+ public boolean setMatchingRuleToken( LdapFilterToken matchingRuleToken )
+ {
+ if ( this.matchingRuleToken == null && matchingRuleToken != null
+ && matchingRuleToken.getType() == LdapFilterToken.EXTENSIBLE_MATCHINGRULEOID )
+ {
+ this.matchingRuleToken = matchingRuleToken;
+ return true;
+ }
+ else
+ {
+ return false;
+ }
+ }
+
+
+ /**
+ * Gets the matching rule token.
+ *
+ * @return the matching rule token, or null if not set
+ */
+ public LdapFilterToken getMatchingRuleToken()
+ {
+ return matchingRuleToken;
+ }
+
+
+ /**
+ * Sets the equals colon token.
+ *
+ * @param equalsColonToken the equals colon token
+ *
+ * @return true, if setting the equals colon token was sucessful, false otherwise
+ */
+ public boolean setEqualsColonToken( LdapFilterToken equalsColonToken )
+ {
+ if ( this.equalsColonToken == null && equalsColonToken != null
+ && equalsColonToken.getType() == LdapFilterToken.EXTENSIBLE_EQUALS_COLON )
+ {
+ this.equalsColonToken = equalsColonToken;
+ return true;
+ }
+ else
+ {
+ return false;
+ }
+ }
+
+
+ /**
+ * Gets the equals colon token.
+ *
+ * @return the equals colon token, or null if not set
+ */
+ public LdapFilterToken getEqualsColonToken()
+ {
+ return equalsColonToken;
+ }
+
+
+ /**
+ * Sets the equals token.
+ *
+ * @param equalsToken the equals token
+ *
+ * @return true, if setting the equals token was successful, false otherwise
+ */
+ public boolean setEqualsToken( LdapFilterToken equalsToken )
+ {
+ if ( this.equalsToken == null && equalsToken != null && equalsToken.getType() == LdapFilterToken.EQUAL )
+ {
+ this.equalsToken = equalsToken;
+ return true;
+ }
+ else
+ {
+ return false;
+ }
+ }
+
+
+ /**
+ * Gets the equals token.
+ *
+ * @return the equals token, or null if not set
+ */
+ public LdapFilterToken getEqualsToken()
+ {
+ return equalsToken;
+ }
+
+
+ /**
+ * Sets the value token.
+ *
+ * @param valueToken the value token
+ *
+ * @return true, if setting the value token was successful, false otherwise
+ */
+ public boolean setValueToken( LdapFilterToken valueToken )
+ {
+ if ( this.valueToken == null && valueToken != null && valueToken.getType() == LdapFilterToken.VALUE )
+ {
+ this.valueToken = valueToken;
+ return true;
+ }
+ else
+ {
+ return false;
+ }
+ }
+
+
+ /**
+ * Gets the value token.
+ *
+ * @return the value token, or null if not set
+ */
+ public LdapFilterToken getValueToken()
+ {
+ return this.valueToken;
+ }
+
+
+ /**
+ * @see org.apache.directory.studio.ldapbrowser.core.model.filter.LdapFilterComponent#isValid()
+ */
+ public boolean isValid()
+ {
+ return startToken != null
+ && equalsColonToken != null
+ & equalsToken != null
+ && valueToken != null
+ &&
+
+ ( ( attributeToken != null
+ && ( ( dnAttrColonToken == null && dnAttrToken == null ) || ( dnAttrColonToken != null && dnAttrToken != null ) ) && ( ( matchingRuleColonToken == null && matchingRuleToken == null ) || ( matchingRuleColonToken != null && matchingRuleToken != null ) ) ) || ( attributeToken == null
+ && ( ( dnAttrColonToken == null && dnAttrToken == null ) || ( dnAttrColonToken != null && dnAttrToken != null ) )
+ && matchingRuleColonToken != null && matchingRuleToken != null ) );
+ }
+
+
+ /**
+ * @see org.apache.directory.studio.ldapbrowser.core.model.filter.LdapFilterComponent#getTokens()
+ */
+ public LdapFilterToken[] getTokens()
+ {
+ // collect tokens
+ List<LdapFilterToken> tokenList = new ArrayList<LdapFilterToken>();
+ if ( attributeToken != null )
+ {
+ tokenList.add( attributeToken );
+ }
+ if ( dnAttrColonToken != null )
+ {
+ tokenList.add( dnAttrColonToken );
+ }
+ if ( dnAttrToken != null )
+ {
+ tokenList.add( dnAttrToken );
+ }
+ if ( matchingRuleColonToken != null )
+ {
+ tokenList.add( matchingRuleColonToken );
+ }
+ if ( matchingRuleToken != null )
+ {
+ tokenList.add( matchingRuleToken );
+ }
+ if ( equalsColonToken != null )
+ {
+ tokenList.add( equalsColonToken );
+ }
+ if ( equalsToken != null )
+ {
+ tokenList.add( equalsToken );
+ }
+ if ( valueToken != null )
+ {
+ tokenList.add( valueToken );
+ }
+
+ // sort tokens
+ LdapFilterToken[] tokens = tokenList.toArray( new LdapFilterToken[tokenList.size()] );
+ Arrays.sort( tokens );
+
+ // return
+ return tokens;
+ }
+
+
+ /**
+ * @see java.lang.Object#toString()
+ */
+ public String toString()
+ {
+ return ( attributeToken != null ? startToken.getValue() : "" )
+ + ( dnAttrColonToken != null ? dnAttrColonToken.getValue() : "" )
+ + ( dnAttrToken != null ? dnAttrToken.getValue() : "" )
+ + ( matchingRuleColonToken != null ? matchingRuleColonToken.getValue() : "" )
+ + ( matchingRuleToken != null ? matchingRuleToken.getValue() : "" )
+ + ( equalsColonToken != null ? equalsColonToken.getValue() : "" )
+ + ( equalsToken != null ? equalsToken.getValue() : "" )
+ + ( valueToken != null ? valueToken.getValue() : "" );
+ }
+
+
+ /**
+ * @see org.apache.directory.studio.ldapbrowser.core.model.filter.LdapFilterComponent#addFilter(org.apache.directory.studio.ldapbrowser.core.model.filter.LdapFilter)
+ */
+ public boolean addFilter( LdapFilter filter )
+ {
+ return false;
+ }
+
+
+ /**
+ * @see org.apache.directory.studio.ldapbrowser.core.model.filter.LdapFilterComponent#getInvalidFilters()
+ */
+ public LdapFilter[] getInvalidFilters()
+ {
+ if ( isValid() )
+ {
+ return new LdapFilter[0];
+ }
+ else
+ {
+ return new LdapFilter[]
+ { parent };
+ }
+ }
+
+
+ /**
+ * @see org.apache.directory.studio.ldapbrowser.core.model.filter.LdapFilterComponent#getFilter(int)
+ */
+ public LdapFilter getFilter( int offset )
+ {
+ if ( startToken != null && startToken.getOffset() <= offset
+ && offset < startToken.getOffset() + toString().length() )
+ {
+ return parent;
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+
+ /**
+ * @see org.apache.directory.studio.ldapbrowser.core.model.filter.LdapFilterComponent#getInvalidCause()
+ */
+ public String getInvalidCause()
+ {
+ if ( dnAttrColonToken != null && dnAttrToken == null )
+ {
+ return "Missing dn";
+ }
+ else if ( matchingRuleColonToken != null && matchingRuleToken == null )
+ {
+ return "Missing matching rule";
+ }
+ else if ( equalsColonToken == null )
+ {
+ return "Missing colon";
+ }
+ else if ( equalsToken == null )
+ {
+ return "Missing equals";
+ }
+ else if ( attributeToken == null )
+ {
+ return "Missing attribute type";
+ }
+ else if ( valueToken != null )
+ {
+ return "Missing value";
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+}
Propchange: directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/model/filter/LdapFilterExtensibleComponent.java
------------------------------------------------------------------------------
svn:eol-style = native
Added: directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/model/filter/LdapFilterItemComponent.java
URL: http://svn.apache.org/viewvc/directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/model/filter/LdapFilterItemComponent.java?rev=592082&view=auto
==============================================================================
--- directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/model/filter/LdapFilterItemComponent.java (added)
+++ directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/model/filter/LdapFilterItemComponent.java Mon Nov 5 08:51:43 2007
@@ -0,0 +1,299 @@
+/*
+ * 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.model.filter.parser.LdapFilterToken;
+
+
+/**
+ * The LdapFilterExtensibleComponent represents an simple filter.
+ *
+ * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+ * @version $Rev$, $Date$
+ */
+
+public class LdapFilterItemComponent extends LdapFilterComponent
+{
+
+ /** The filtertype token. */
+ private LdapFilterToken filtertypeToken;
+
+ /** The value token. */
+ private LdapFilterToken valueToken;
+
+
+ /**
+ * Creates a new instance of LdapFilterItemComponent.
+ *
+ * @param parent the parent filter
+ */
+ public LdapFilterItemComponent( LdapFilter parent )
+ {
+ super( parent );
+ this.filtertypeToken = null;
+ this.valueToken = null;
+ }
+
+
+ /**
+ * @see org.apache.directory.studio.ldapbrowser.core.model.filter.LdapFilterComponent#setStartToken(org.apache.directory.studio.ldapbrowser.core.model.filter.parser.LdapFilterToken)
+ */
+ public boolean setStartToken( LdapFilterToken attributeToken )
+ {
+ if ( attributeToken != null && attributeToken.getType() == LdapFilterToken.ATTRIBUTE )
+ {
+ super.setStartToken( attributeToken );
+ return true;
+ }
+ else
+ {
+ return false;
+ }
+ }
+
+
+ /**
+ * Sets the attribute token.
+ *
+ * @param attributeToken the attribute token
+ *
+ * @return true, if setting the attribute token was successful, false otherwise
+ */
+ public boolean setAttributeToken( LdapFilterToken attributeToken )
+ {
+ return this.setStartToken( attributeToken );
+ }
+
+
+ /**
+ * Gets the attribute token.
+ *
+ * @return the attribute token, null if not set
+ */
+ public LdapFilterToken getAttributeToken()
+ {
+ return getStartToken();
+ }
+
+
+ /**
+ * Sets the filtertype token.
+ *
+ * @param filtertypeToken the filtertype token
+ *
+ * @return true, if setting the filtertype token was successful, false otherwise
+ */
+ public boolean setFiltertypeToken( LdapFilterToken filtertypeToken )
+ {
+ if ( this.filtertypeToken == null
+ && filtertypeToken != null
+ && ( filtertypeToken.getType() == LdapFilterToken.EQUAL
+ || filtertypeToken.getType() == LdapFilterToken.GREATER
+ || filtertypeToken.getType() == LdapFilterToken.LESS
+ || filtertypeToken.getType() == LdapFilterToken.APROX || filtertypeToken.getType() == LdapFilterToken.PRESENT ) )
+ {
+ this.filtertypeToken = filtertypeToken;
+ return true;
+ }
+ else
+ {
+ return false;
+ }
+ }
+
+
+ /**
+ * Gets the filter token.
+ *
+ * @return the filter token, null if not set
+ */
+ public LdapFilterToken getFilterToken()
+ {
+ return filtertypeToken;
+ }
+
+
+ /**
+ * Sets the value token.
+ *
+ * @param valueToken the value token
+ *
+ * @return true, if setting the value token was successful, false otherwise
+ */
+ public boolean setValueToken( LdapFilterToken valueToken )
+ {
+ if ( this.valueToken == null && valueToken != null && valueToken.getType() == LdapFilterToken.VALUE )
+ {
+ this.valueToken = valueToken;
+ return true;
+ }
+ else
+ {
+ return false;
+ }
+ }
+
+
+ /**
+ * Gets the value token.
+ *
+ * @return the value token, null if not set
+ */
+ public LdapFilterToken getValueToken()
+ {
+ return valueToken;
+ }
+
+
+ /**
+ * @see org.apache.directory.studio.ldapbrowser.core.model.filter.LdapFilterComponent#isValid()
+ */
+ public boolean isValid()
+ {
+ return startToken != null && filtertypeToken != null
+ && ( valueToken != null || filtertypeToken.getType() == LdapFilterToken.PRESENT );
+ }
+
+
+ /**
+ * @see org.apache.directory.studio.ldapbrowser.core.model.filter.LdapFilterComponent#getTokens()
+ */
+ public LdapFilterToken[] getTokens()
+ {
+ // collect tokens
+ List<LdapFilterToken> tokenList = new ArrayList<LdapFilterToken>();
+ if ( startToken != null )
+ {
+ tokenList.add( startToken );
+ }
+ if ( filtertypeToken != null )
+ {
+ tokenList.add( filtertypeToken );
+ }
+ if ( valueToken != null )
+ {
+ tokenList.add( valueToken );
+ }
+
+ // sort tokens
+ LdapFilterToken[] tokens = tokenList.toArray( new LdapFilterToken[tokenList.size()] );
+ Arrays.sort( tokens );
+
+ // return
+ return tokens;
+ }
+
+
+ /**
+ * @see java.lang.Object#toString()
+ */
+ public String toString()
+ {
+ return ( startToken != null ? startToken.getValue() : "" )
+ + ( filtertypeToken != null ? filtertypeToken.getValue() : "" )
+ + ( valueToken != null ? valueToken.getValue() : "" );
+ }
+
+
+ /**
+ * This implementation does nothing and returns always false.
+ *
+ * @see org.apache.directory.studio.ldapbrowser.core.model.filter.LdapFilterComponent#addFilter(org.apache.directory.studio.ldapbrowser.core.model.filter.LdapFilter)
+ */
+ public boolean addFilter( LdapFilter filter )
+ {
+ return false;
+ }
+
+
+ /**
+ * @see org.apache.directory.studio.ldapbrowser.core.model.filter.LdapFilterComponent#getInvalidFilters()
+ */
+ public LdapFilter[] getInvalidFilters()
+ {
+ if ( isValid() )
+ {
+ return new LdapFilter[0];
+ }
+ else
+ {
+ return new LdapFilter[]
+ { parent };
+ }
+ }
+
+
+ /**
+ * @see org.apache.directory.studio.ldapbrowser.core.model.filter.LdapFilterComponent#getFilter(int)
+ */
+ public LdapFilter getFilter( int offset )
+ {
+ if ( startToken != null && startToken.getOffset() <= offset
+ && offset < startToken.getOffset() + startToken.getLength() )
+ {
+ return parent;
+ }
+ else if ( filtertypeToken != null && filtertypeToken.getOffset() <= offset
+ && offset < filtertypeToken.getOffset() + filtertypeToken.getLength() )
+ {
+ return parent;
+ }
+ else if ( valueToken != null && valueToken.getOffset() <= offset
+ && offset < valueToken.getOffset() + valueToken.getLength() )
+ {
+ return parent;
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+
+ /**
+ * @see org.apache.directory.studio.ldapbrowser.core.model.filter.LdapFilterComponent#getInvalidCause()
+ */
+ public String getInvalidCause()
+ {
+ if ( startToken == null )
+ {
+ return "Missing attribute name";
+ }
+ else if ( filtertypeToken == null )
+ {
+ return "Missing filter type, select one of '=', '>=', '<=','~='";
+ }
+ else if ( valueToken == null )
+ {
+ return "Missing value";
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+}
Propchange: directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/model/filter/LdapFilterItemComponent.java
------------------------------------------------------------------------------
svn:eol-style = native
Added: directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/model/filter/LdapNotFilterComponent.java
URL: http://svn.apache.org/viewvc/directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/model/filter/LdapNotFilterComponent.java?rev=592082&view=auto
==============================================================================
--- directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/model/filter/LdapNotFilterComponent.java (added)
+++ directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/model/filter/LdapNotFilterComponent.java Mon Nov 5 08:51:43 2007
@@ -0,0 +1,109 @@
+/*
+ * 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 org.apache.directory.studio.ldapbrowser.core.model.filter.parser.LdapFilterToken;
+
+
+/**
+ * The LdapNotFilterComponent represents an NOT filter branch.
+ *
+ * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+ * @version $Rev$, $Date$
+ */
+public class LdapNotFilterComponent extends LdapFilterComponent
+{
+
+ /**
+ * Creates a new instance of LdapNotFilterComponent.
+ *
+ * @param parent the parent filter
+ */
+ public LdapNotFilterComponent( LdapFilter parent )
+ {
+ super( parent );
+ }
+
+
+ /**
+ * @see org.apache.directory.studio.ldapbrowser.core.model.filter.LdapFilterComponent#setStartToken(org.apache.directory.studio.ldapbrowser.core.model.filter.parser.LdapFilterToken)
+ */
+ public boolean setStartToken( LdapFilterToken notToken )
+ {
+ if ( notToken != null && notToken.getType() == LdapFilterToken.NOT )
+ {
+ return super.setStartToken( notToken );
+ }
+ else
+ {
+ return false;
+ }
+ }
+
+
+ /**
+ * @see org.apache.directory.studio.ldapbrowser.core.model.filter.LdapFilterComponent#addFilter(org.apache.directory.studio.ldapbrowser.core.model.filter.LdapFilter)
+ */
+ public boolean addFilter( LdapFilter filter )
+ {
+ if ( filterList.isEmpty() )
+ {
+ return super.addFilter( filter );
+ }
+ else
+ {
+ // There is already a filter in the list. A NOT filter
+ // can only contain one filter.
+ return false;
+ }
+ }
+
+
+ /**
+ * @see org.apache.directory.studio.ldapbrowser.core.model.filter.LdapFilterComponent#getInvalidCause()
+ */
+ public String getInvalidCause()
+ {
+ if ( startToken == null )
+ {
+ return "Missing NOT character '!'";
+ }
+ else if ( filterList == null || filterList.isEmpty() )
+ {
+ return "Missing filter expression";
+ }
+ else
+ {
+ return "Invalid NOT filter";
+ }
+ }
+
+
+ /**
+ * @see java.lang.Object#toString()
+ */
+ public String toString()
+ {
+ return ( startToken != null ? "!" : "" ) + ( !filterList.isEmpty() ? filterList.get( 0 ).toString() : "" );
+ }
+
+}
Propchange: directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/model/filter/LdapNotFilterComponent.java
------------------------------------------------------------------------------
svn:eol-style = native
Added: directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/model/filter/LdapOrFilterComponent.java
URL: http://svn.apache.org/viewvc/directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/model/filter/LdapOrFilterComponent.java?rev=592082&view=auto
==============================================================================
--- directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/model/filter/LdapOrFilterComponent.java (added)
+++ directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/model/filter/LdapOrFilterComponent.java Mon Nov 5 08:51:43 2007
@@ -0,0 +1,102 @@
+/*
+ * 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.Iterator;
+
+import org.apache.directory.studio.ldapbrowser.core.model.filter.parser.LdapFilterToken;
+
+
+/**
+ * The LdapOrFilterComponent represents an OR filter branch.
+ *
+ * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+ * @version $Rev$, $Date$
+ */
+public class LdapOrFilterComponent extends LdapFilterComponent
+{
+
+ /**
+ * Creates a new instance of LdapOrFilterComponent.
+ *
+ * @param parent the parent filter
+ */
+ public LdapOrFilterComponent( LdapFilter parent )
+ {
+ super( parent );
+ }
+
+
+ /**
+ * @see org.apache.directory.studio.ldapbrowser.core.model.filter.LdapFilterComponent#setStartToken(org.apache.directory.studio.ldapbrowser.core.model.filter.parser.LdapFilterToken)
+ */
+ public boolean setStartToken( LdapFilterToken orToken )
+ {
+ if ( orToken != null && orToken.getType() == LdapFilterToken.OR )
+ {
+ return super.setStartToken( orToken );
+ }
+ else
+ {
+ return false;
+ }
+ }
+
+
+ /**
+ * @see org.apache.directory.studio.ldapbrowser.core.model.filter.LdapFilterComponent#getInvalidCause()
+ */
+ public String getInvalidCause()
+ {
+ if ( startToken == null )
+ {
+ return "Missing OR character '|'";
+ }
+ else if ( filterList == null || filterList.isEmpty() )
+ {
+ return "Missing filters";
+ }
+ else
+ {
+ return "Invalid OR filter";
+ }
+ }
+
+
+ /**
+ * @see java.lang.Object#toString()
+ */
+ public String toString()
+ {
+ String s = startToken != null ? "|" : "";
+ for ( Iterator it = filterList.iterator(); it.hasNext(); )
+ {
+ LdapFilter filter = ( LdapFilter ) it.next();
+ if ( filter != null )
+ {
+ s += filter.toString();
+ }
+ }
+ return s;
+ }
+
+}
Propchange: directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/model/filter/LdapOrFilterComponent.java
------------------------------------------------------------------------------
svn:eol-style = native
Added: directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/model/filter/parser/LdapFilterParser.java
URL: http://svn.apache.org/viewvc/directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/model/filter/parser/LdapFilterParser.java?rev=592082&view=auto
==============================================================================
--- directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/model/filter/parser/LdapFilterParser.java (added)
+++ directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/model/filter/parser/LdapFilterParser.java Mon Nov 5 08:51:43 2007
@@ -0,0 +1,336 @@
+/*
+ * 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.parser;
+
+
+import java.util.Stack;
+
+import org.apache.directory.studio.ldapbrowser.core.model.filter.LdapAndFilterComponent;
+import org.apache.directory.studio.ldapbrowser.core.model.filter.LdapFilter;
+import org.apache.directory.studio.ldapbrowser.core.model.filter.LdapFilterComponent;
+import org.apache.directory.studio.ldapbrowser.core.model.filter.LdapFilterExtensibleComponent;
+import org.apache.directory.studio.ldapbrowser.core.model.filter.LdapFilterItemComponent;
+import org.apache.directory.studio.ldapbrowser.core.model.filter.LdapNotFilterComponent;
+import org.apache.directory.studio.ldapbrowser.core.model.filter.LdapOrFilterComponent;
+
+
+/**
+ * The LdapFilterParser implements a parser for LDAP filters.
+ *
+ * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+ * @version $Rev$, $Date$
+ */
+public class LdapFilterParser
+{
+
+ /** The scanner. */
+ private LdapFilterScanner scanner;
+
+ /** The filter stack. */
+ private Stack<LdapFilter> filterStack;
+
+ /** The parsed LDAP filter model. */
+ private LdapFilter model;
+
+
+ /**
+ * Creates a new instance of LdapFilterParser.
+ */
+ public LdapFilterParser()
+ {
+ this.scanner = new LdapFilterScanner();
+ this.model = new LdapFilter();
+ }
+
+
+ /**
+ * Gets the parsed LDAP filter model.
+ *
+ * @return the parsed model
+ */
+ public LdapFilter getModel()
+ {
+ return model;
+ }
+
+
+ /**
+ * Parses the given LDAP filter.
+ *
+ * @param ldapFilter the LDAP filter
+ */
+ public void parse( String ldapFilter )
+ {
+ // reset state
+ filterStack = new Stack<LdapFilter>();
+ scanner.reset( ldapFilter );
+ model = new LdapFilter();
+
+ // handle error tokens before filter
+ LdapFilterToken token = scanner.nextToken();
+ while ( token.getType() != LdapFilterToken.LPAR && token.getType() != LdapFilterToken.EOF )
+ {
+ handleError( false, token, model );
+ token = scanner.nextToken();
+ }
+
+ // check filter start
+ if ( token.getType() == LdapFilterToken.LPAR )
+ {
+ // start top level filter
+ model.setStartToken( token );
+ filterStack.push( model );
+
+ // loop till filter end or EOF
+ do
+ {
+ // next token
+ token = scanner.nextToken();
+
+ switch ( token.getType() )
+ {
+ case LdapFilterToken.LPAR:
+ {
+ LdapFilter newFilter = new LdapFilter();
+ newFilter.setStartToken( token );
+
+ LdapFilter currentFilter = filterStack.peek();
+ LdapFilterComponent filterComponent = currentFilter.getFilterComponent();
+ if ( filterComponent != null && filterComponent.addFilter( newFilter ) )
+ {
+ filterStack.push( newFilter );
+ }
+ else
+ {
+ currentFilter.addOtherToken( token );
+ }
+
+ break;
+ }
+ case LdapFilterToken.RPAR:
+ {
+ LdapFilter currentFilter = filterStack.pop();
+ handleError( currentFilter.setStopToken( token ), token, currentFilter );
+ /*
+ * if(!filterStack.isEmpty()) { LdapFilter parentFilter =
+ * (LdapFilter) filterStack.peek(); LdapFilterComponent
+ * filterComponent = parentFilter.getFilterComponent();
+ * filterComponent.addFilter(currentFilter); }
+ */
+ break;
+ }
+ case LdapFilterToken.AND:
+ {
+ LdapFilter currentFilter = filterStack.peek();
+ LdapAndFilterComponent filterComponent = new LdapAndFilterComponent( currentFilter );
+ filterComponent.setStartToken( token );
+ handleError( currentFilter.setFilterComponent( filterComponent ), token, currentFilter );
+ break;
+ }
+ case LdapFilterToken.OR:
+ {
+ LdapFilter currentFilter = filterStack.peek();
+ LdapOrFilterComponent filterComponent = new LdapOrFilterComponent( currentFilter );
+ filterComponent.setStartToken( token );
+ handleError( currentFilter.setFilterComponent( filterComponent ), token, currentFilter );
+ break;
+ }
+ case LdapFilterToken.NOT:
+ {
+ LdapFilter currentFilter = filterStack.peek();
+ LdapNotFilterComponent filterComponent = new LdapNotFilterComponent( currentFilter );
+ filterComponent.setStartToken( token );
+ handleError( currentFilter.setFilterComponent( filterComponent ), token, currentFilter );
+ break;
+ }
+ case LdapFilterToken.ATTRIBUTE:
+ {
+ LdapFilter currentFilter = filterStack.peek();
+ LdapFilterItemComponent filterComponent = new LdapFilterItemComponent( currentFilter );
+ filterComponent.setAttributeToken( token );
+ handleError( currentFilter.setFilterComponent( filterComponent ), token, currentFilter );
+ break;
+ }
+ case LdapFilterToken.VALUE:
+ {
+ LdapFilter currentFilter = filterStack.peek();
+ LdapFilterComponent filterComponent = currentFilter.getFilterComponent();
+ if( filterComponent instanceof LdapFilterItemComponent )
+ {
+ handleError( ( filterComponent instanceof LdapFilterItemComponent )
+ && ( ( LdapFilterItemComponent ) filterComponent ).setValueToken( token ), token,
+ currentFilter );
+ }
+ else if( filterComponent instanceof LdapFilterExtensibleComponent )
+ {
+ handleError( ( filterComponent instanceof LdapFilterExtensibleComponent )
+ && ( ( LdapFilterExtensibleComponent ) filterComponent ).setValueToken( token ), token,
+ currentFilter );
+ }
+ else {
+ handleError( false, token, currentFilter );
+ }
+ break;
+ }
+ case LdapFilterToken.EQUAL:
+ case LdapFilterToken.GREATER:
+ case LdapFilterToken.LESS:
+ case LdapFilterToken.APROX:
+ case LdapFilterToken.PRESENT:
+ {
+ LdapFilter currentFilter = filterStack.peek();
+ LdapFilterComponent filterComponent = currentFilter.getFilterComponent();
+ if( filterComponent instanceof LdapFilterItemComponent )
+ {
+ handleError( ( filterComponent instanceof LdapFilterItemComponent )
+ && ( ( LdapFilterItemComponent ) filterComponent ).setFiltertypeToken( token ), token,
+ currentFilter );
+ }
+ else if( filterComponent instanceof LdapFilterExtensibleComponent )
+ {
+ handleError( ( filterComponent instanceof LdapFilterExtensibleComponent )
+ && ( ( LdapFilterExtensibleComponent ) filterComponent ).setEqualsToken( token ), token,
+ currentFilter );
+ }
+ else {
+ handleError( false, token, currentFilter );
+ }
+ break;
+ }
+ case LdapFilterToken.WHITESPACE:
+ {
+ LdapFilter currentFilter = filterStack.peek();
+ currentFilter.addOtherToken( token );
+ break;
+ }
+ case LdapFilterToken.EXTENSIBLE_ATTRIBUTE:
+ {
+ LdapFilter currentFilter = ( LdapFilter ) filterStack.peek();
+ LdapFilterExtensibleComponent filterComponent = new LdapFilterExtensibleComponent( currentFilter );
+ filterComponent.setAttributeToken( token );
+ handleError( currentFilter.setFilterComponent( filterComponent ), token, currentFilter );
+ break;
+ }
+ case LdapFilterToken.EXTENSIBLE_DNATTR_COLON:
+ {
+ LdapFilter currentFilter = ( LdapFilter ) filterStack.peek();
+ LdapFilterComponent filterComponent = currentFilter.getFilterComponent();
+ if( filterComponent == null )
+ {
+ filterComponent = new LdapFilterExtensibleComponent( currentFilter );
+ (( LdapFilterExtensibleComponent ) filterComponent ).setDnAttrColonToken( token );
+ handleError( currentFilter.setFilterComponent( filterComponent ), token, currentFilter );
+ }
+ else
+ {
+ handleError( ( filterComponent instanceof LdapFilterExtensibleComponent )
+ && ( ( LdapFilterExtensibleComponent ) filterComponent ).setDnAttrColonToken( token ), token,
+ currentFilter );
+ }
+ break;
+ }
+ case LdapFilterToken.EXTENSIBLE_DNATTR:
+ {
+ LdapFilter currentFilter = ( LdapFilter ) filterStack.peek();
+ LdapFilterComponent filterComponent = currentFilter.getFilterComponent();
+ handleError( ( filterComponent instanceof LdapFilterExtensibleComponent )
+ && ( ( LdapFilterExtensibleComponent ) filterComponent ).setDnAttrToken( token ), token,
+ currentFilter );
+ break;
+ }
+ case LdapFilterToken.EXTENSIBLE_MATCHINGRULEOID_COLON:
+ {
+ LdapFilter currentFilter = ( LdapFilter ) filterStack.peek();
+ LdapFilterComponent filterComponent = currentFilter.getFilterComponent();
+ if( filterComponent == null )
+ {
+ filterComponent = new LdapFilterExtensibleComponent( currentFilter );
+ (( LdapFilterExtensibleComponent ) filterComponent ).setMatchingRuleColonToken( token );
+ handleError( currentFilter.setFilterComponent( filterComponent ), token, currentFilter );
+ }
+ else
+ {
+ handleError( ( filterComponent instanceof LdapFilterExtensibleComponent )
+ && ( ( LdapFilterExtensibleComponent ) filterComponent ).setMatchingRuleColonToken( token ), token,
+ currentFilter );
+ }
+ break;
+ }
+ case LdapFilterToken.EXTENSIBLE_MATCHINGRULEOID:
+ {
+ LdapFilter currentFilter = ( LdapFilter ) filterStack.peek();
+ LdapFilterComponent filterComponent = currentFilter.getFilterComponent();
+ handleError( ( filterComponent instanceof LdapFilterExtensibleComponent )
+ && ( ( LdapFilterExtensibleComponent ) filterComponent ).setMatchingRuleToken( token ), token,
+ currentFilter );
+ break;
+ }
+ case LdapFilterToken.EXTENSIBLE_EQUALS_COLON:
+ {
+ LdapFilter currentFilter = ( LdapFilter ) filterStack.peek();
+ LdapFilterComponent filterComponent = currentFilter.getFilterComponent();
+ handleError( ( filterComponent instanceof LdapFilterExtensibleComponent )
+ && ( ( LdapFilterExtensibleComponent ) filterComponent ).setEqualsColonToken( token ), token,
+ currentFilter );
+ break;
+ }
+
+ case LdapFilterToken.EOF:
+ {
+ model.addOtherToken( token );
+ break;
+ }
+ default:
+ {
+ LdapFilter currentFilter = filterStack.peek();
+ handleError( false, token, currentFilter );
+ }
+ }
+ }
+ while ( !filterStack.isEmpty() && token.getType() != LdapFilterToken.EOF );
+ }
+
+ // handle error token after filter
+ token = scanner.nextToken();
+ while ( token.getType() != LdapFilterToken.EOF )
+ {
+ handleError( false, token, model );
+ token = scanner.nextToken();
+ }
+ }
+
+
+ /**
+ * Helper method to handle parse errors.
+ *
+ * @param success the success flag
+ * @param filter the filter
+ * @param token the token
+ */
+ private void handleError( boolean success, LdapFilterToken token, LdapFilter filter )
+ {
+ if ( !success )
+ {
+ filter.addOtherToken( new LdapFilterToken( LdapFilterToken.ERROR, token.getValue(), token.getOffset() ) );
+ }
+ }
+
+}
Propchange: directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/model/filter/parser/LdapFilterParser.java
------------------------------------------------------------------------------
svn:eol-style = native
Added: directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/model/filter/parser/LdapFilterScanner.java
URL: http://svn.apache.org/viewvc/directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/model/filter/parser/LdapFilterScanner.java?rev=592082&view=auto
==============================================================================
--- directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/model/filter/parser/LdapFilterScanner.java (added)
+++ directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/model/filter/parser/LdapFilterScanner.java Mon Nov 5 08:51:43 2007
@@ -0,0 +1,493 @@
+/*
+ * 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.parser;
+
+
+/**
+ * The LdapFilterScanner is a scanner for LDAP filters.
+ *
+ * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+ * @version $Rev$, $Date$
+ */
+public class LdapFilterScanner
+{
+
+ // From RFC 2254:
+ // -------------
+ // The string representation of an LDAP search filter is defined by the
+ // following grammar, following the ABNF notation defined in [5]. The
+ // filter format uses a prefix notation.
+ //
+ // filter = "(" filtercomp ")"
+ // filtercomp = and / or / not / item
+ // and = "&" filterlist
+ // or = "|" filterlist
+ // not = "!" filter
+ // filterlist = 1*filter
+ // item = simple / present / substring / extensible
+ // simple = attr filtertype value
+ // filtertype = equal / approx / greater / less
+ // equal = "="
+ // approx = "~="
+ // greater = ">="
+ // less = "<="
+ // extensible = attr [":dn"] [":" matchingrule] ":=" value
+ // / [":dn"] ":" matchingrule ":=" value
+ // present = attr "=*"
+ // substring = attr "=" [initial] any [final]
+ // initial = value
+ // any = "*" *(value "*")
+ // final = value
+ // attr = AttributeDescription from Section 4.1.5 of [1]
+ // matchingrule = MatchingRuleId from Section 4.1.9 of [1]
+ // value = AttributeValue from Section 4.1.6 of [1]
+ //
+ // The attr, matchingrule, and value constructs are as described in the
+ // corresponding section of [1] given above.
+ //
+ // If a value should contain any of the following characters
+ //
+ // Character ASCII value
+ // ---------------------------
+ // * 0x2a
+ // ( 0x28
+ // ) 0x29
+ // \ 0x5c
+ // NUL 0x00
+ //
+ // the character must be encoded as the backslash '\' character (ASCII
+ // 0x5c) followed by the two hexadecimal digits representing the ASCII
+ // value of the encoded character. The case of the two hexadecimal
+ // digits is not significant.
+
+ /** The filter to scan */
+ private String filter;
+
+ /** The current position */
+ private int pos;
+
+ /** The last token type. */
+ private int lastTokenType;
+
+
+ /**
+ * Creates a new instance of LdapFilterScanner.
+ */
+ public LdapFilterScanner()
+ {
+ super();
+ this.filter = "";
+ }
+
+
+
+ /**
+ * Resets this scanner.
+ *
+ * @param filter the new filter to scan
+ */
+ public void reset( String filter )
+ {
+ this.filter = filter;
+ this.pos = -1;
+ this.lastTokenType = LdapFilterToken.NEW;
+ }
+
+
+ /**
+ * Gets the character at the current position.
+ *
+ * @return the character at the current position
+ */
+ private char currentChar()
+ {
+ return 0 <= pos && pos < filter.length() ? filter.charAt( pos ) : '\u0000';
+ }
+
+
+
+ /**
+ * Increments the position counter and gets
+ * the character at that positon.
+ *
+ * @return the character at the next position
+ */
+ private char nextChar()
+ {
+ pos++;
+ return currentChar();
+ }
+
+
+ /**
+ * Decrements the position counter and gets
+ * the character at that positon.
+ *
+ * @return the character at the previous position
+ */
+ private char prevChar()
+ {
+ pos--;
+ return currentChar();
+ }
+
+
+ /**
+ * Increments the position counter as long as there are
+ * line breaks and gets the character at that positon.
+ *
+ * @return the character at the next position
+ */
+ private char nextNonLinebreakChar()
+ {
+ while ( nextChar() == '\n' );
+ return currentChar();
+ }
+
+
+ /**
+ * Decrements the position counter as long as there are
+ * line breaks and gets the character at that positon.
+ *
+ * @return the character at the previous position
+ */
+ private char prevNonLinebreakChar()
+ {
+ while ( prevChar() == '\n' );
+ return currentChar();
+ }
+
+
+ /**
+ * Gets the next token.
+ *
+ * @return the next token
+ */
+ public LdapFilterToken nextToken()
+ {
+ char c;
+
+ // check for EOF
+ c = nextChar();
+ if ( c == '\u0000' )
+ {
+ return new LdapFilterToken( LdapFilterToken.EOF, "", pos );
+ }
+ else
+ {
+ prevChar();
+ }
+
+ // check for ignorable whitespaces
+ c = nextChar();
+ if ( Character.isWhitespace( c )
+ && ( lastTokenType == LdapFilterToken.RPAR || lastTokenType == LdapFilterToken.AND
+ || lastTokenType == LdapFilterToken.OR || lastTokenType == LdapFilterToken.NOT ) )
+ {
+ StringBuffer sb = new StringBuffer();
+ while ( Character.isWhitespace( c ) )
+ {
+ sb.append( c );
+ c = nextChar();
+ }
+ prevChar();
+ return new LdapFilterToken( LdapFilterToken.WHITESPACE, sb.toString(), pos - sb.length() + 1 );
+ }
+ else
+ {
+ prevChar();
+ }
+
+ // check special characters
+ c = nextChar();
+ switch ( c )
+ {
+ case '(':
+ this.lastTokenType = LdapFilterToken.LPAR;
+ return new LdapFilterToken( this.lastTokenType, "(", pos );
+ case ')':
+ this.lastTokenType = LdapFilterToken.RPAR;
+ return new LdapFilterToken( this.lastTokenType, ")", pos );
+ case '&':
+ if ( lastTokenType == LdapFilterToken.LPAR )
+ {
+ // if(nextNonWhitespaceChar()=='(') {
+ // prevNonWhitespaceChar();
+ this.lastTokenType = LdapFilterToken.AND;
+ return new LdapFilterToken( this.lastTokenType, "&", pos );
+ // }
+ // else {
+ // prevNonWhitespaceChar();
+ // }
+ }
+ break;
+ case '|':
+ if ( lastTokenType == LdapFilterToken.LPAR )
+ {
+ // if(nextNonWhitespaceChar()=='(') {
+ // prevNonWhitespaceChar();
+ this.lastTokenType = LdapFilterToken.OR;
+ return new LdapFilterToken( this.lastTokenType, "|", pos );
+ // }
+ // else {
+ // prevNonWhitespaceChar();
+ // }
+ }
+ break;
+ case '!':
+ if ( lastTokenType == LdapFilterToken.LPAR )
+ {
+ // if(nextNonWhitespaceChar()=='(') {
+ // prevNonWhitespaceChar();
+ this.lastTokenType = LdapFilterToken.NOT;
+ return new LdapFilterToken( this.lastTokenType, "!", pos );
+ // }
+ // else {
+ // prevNonWhitespaceChar();
+ // }
+ }
+ break;
+ case '=':
+ if ( lastTokenType == LdapFilterToken.ATTRIBUTE )
+ {
+ if ( nextChar() == '*' )
+ {
+ char t = nextChar();
+ if ( t == ')' || t == '\u0000' )
+ {
+ prevChar();
+ this.lastTokenType = LdapFilterToken.PRESENT;
+ return new LdapFilterToken( this.lastTokenType, "=*", pos - 1 );
+ }
+ else
+ {
+ prevChar();
+ prevChar();
+ this.lastTokenType = LdapFilterToken.EQUAL;
+ return new LdapFilterToken( this.lastTokenType, "=", pos );
+ }
+ }
+ else
+ {
+ prevChar();
+ this.lastTokenType = LdapFilterToken.EQUAL;
+ return new LdapFilterToken( this.lastTokenType, "=", pos );
+ }
+ }
+ else if ( lastTokenType == LdapFilterToken.EXTENSIBLE_EQUALS_COLON )
+ {
+ this.lastTokenType = LdapFilterToken.EQUAL;
+ return new LdapFilterToken( this.lastTokenType, "=", pos );
+ }
+ break;
+ case '>':
+ if ( lastTokenType == LdapFilterToken.ATTRIBUTE )
+ {
+ if ( nextChar() == '=' )
+ {
+ this.lastTokenType = LdapFilterToken.GREATER;
+ return new LdapFilterToken( this.lastTokenType, ">=", pos - 1 );
+ }
+ else
+ {
+ prevChar();
+ }
+ }
+ break;
+ case '<':
+ if ( lastTokenType == LdapFilterToken.ATTRIBUTE )
+ {
+ if ( nextChar() == '=' )
+ {
+ this.lastTokenType = LdapFilterToken.LESS;
+ return new LdapFilterToken( this.lastTokenType, "<=", pos - 1 );
+ }
+ else
+ {
+ prevChar();
+ }
+ }
+ break;
+ case '~':
+ if ( lastTokenType == LdapFilterToken.ATTRIBUTE )
+ {
+ if ( nextChar() == '=' )
+ {
+ this.lastTokenType = LdapFilterToken.APROX;
+ return new LdapFilterToken( this.lastTokenType, "~=", pos - 1 );
+ }
+ else
+ {
+ prevChar();
+ }
+ }
+ break;
+ case ':':
+ char t1 = nextChar();
+ char t2 = nextChar();
+ char t3 = nextChar();
+ prevChar();
+ prevChar();
+ prevChar();
+ if ( ( lastTokenType == LdapFilterToken.LPAR || lastTokenType == LdapFilterToken.EXTENSIBLE_ATTRIBUTE )
+ &&
+ (
+// ( t1 == ':' && t2 != '=' )
+// ||
+// ( ( t1 == 'd' || t1 == 'D' ) && t2 == ':' && t3 == ':' )
+// ||
+ ( ( t1 == 'd' || t1 == 'D' ) && ( t2 == 'n' || t2 == 'N' ) && ( t3 == ':' ) )
+ )
+ )
+ {
+ this.lastTokenType = LdapFilterToken.EXTENSIBLE_DNATTR_COLON;
+ return new LdapFilterToken( this.lastTokenType, ":", pos );
+ }
+ else if ( ( lastTokenType == LdapFilterToken.EXTENSIBLE_ATTRIBUTE
+ || lastTokenType == LdapFilterToken.EXTENSIBLE_DNATTR
+ || lastTokenType == LdapFilterToken.EXTENSIBLE_MATCHINGRULEOID
+ || lastTokenType == LdapFilterToken.EXTENSIBLE_MATCHINGRULEOID_COLON )
+ && t1 == '=' )
+ {
+ this.lastTokenType = LdapFilterToken.EXTENSIBLE_EQUALS_COLON;
+ return new LdapFilterToken( this.lastTokenType, ":", pos );
+ }
+ else if ( ( lastTokenType == LdapFilterToken.LPAR
+ || lastTokenType == LdapFilterToken.EXTENSIBLE_ATTRIBUTE
+ || lastTokenType == LdapFilterToken.EXTENSIBLE_DNATTR
+ || lastTokenType == LdapFilterToken.EXTENSIBLE_DNATTR_COLON ) )
+ {
+ this.lastTokenType = LdapFilterToken.EXTENSIBLE_MATCHINGRULEOID_COLON;
+ return new LdapFilterToken( this.lastTokenType, ":", pos );
+ }
+ break;
+
+ } // switch
+ prevChar();
+
+ // check attribute or extensible attribute
+ if ( this.lastTokenType == LdapFilterToken.LPAR )
+ {
+ StringBuffer sb = new StringBuffer();
+
+ // first char must be non-whitespace
+ c = nextChar();
+ while ( c != ':' && c != '=' && c != '<' && c != '>' && c != '~' && c != '(' && c != ')' && c != '\u0000'
+ && !Character.isWhitespace( c ) )
+ {
+ sb.append( c );
+ c = nextChar();
+ }
+ prevChar();
+
+ if ( sb.length() > 0 )
+ {
+ boolean isExtensible = ( c == ':' );
+ if(isExtensible)
+ {
+ this.lastTokenType = LdapFilterToken.EXTENSIBLE_ATTRIBUTE;
+ return new LdapFilterToken( this.lastTokenType, sb.toString(), pos - sb.length() + 1 );
+ }
+ else
+ {
+ this.lastTokenType = LdapFilterToken.ATTRIBUTE;
+ return new LdapFilterToken( this.lastTokenType, sb.toString(), pos - sb.length() + 1 );
+ }
+ }
+ }
+
+ // check value
+ if ( lastTokenType == LdapFilterToken.EQUAL || lastTokenType == LdapFilterToken.GREATER
+ || lastTokenType == LdapFilterToken.LESS || lastTokenType == LdapFilterToken.APROX )
+ {
+
+ StringBuffer sb = new StringBuffer();
+ c = nextNonLinebreakChar();
+ while ( c != '(' && c != ')' && c != '\u0000' )
+ {
+ sb.append( c );
+ c = nextNonLinebreakChar();
+ }
+ prevNonLinebreakChar();
+
+ if ( sb.length() > 0 )
+ {
+ this.lastTokenType = LdapFilterToken.VALUE;
+ return new LdapFilterToken( this.lastTokenType, sb.toString(), pos - sb.length() + 1 );
+ }
+ }
+
+ // check extensible dn
+ if ( lastTokenType == LdapFilterToken.EXTENSIBLE_DNATTR_COLON )
+ {
+ char t1 = nextChar();
+ char t2 = nextChar();
+ char t3 = nextChar();
+ prevChar();
+ if ( ( t1 == 'd' || t1 == 'D' )
+ && ( t2 == 'n' || t2 == 'N' )
+ && ( t3 == ':' || t3 == '\u0000' ) )
+ {
+ this.lastTokenType = LdapFilterToken.EXTENSIBLE_DNATTR;
+ return new LdapFilterToken( this.lastTokenType, ""+t1+t2, pos - 1 );
+ }
+ prevChar();
+ prevChar();
+ }
+
+ // check extensible matchingrule
+ if ( lastTokenType == LdapFilterToken.EXTENSIBLE_MATCHINGRULEOID_COLON )
+ {
+ StringBuffer sb = new StringBuffer();
+
+ // first char must be non-whitespace
+ c = nextChar();
+ while ( c != ':' && c != '=' && c != '<' && c != '>' && c != '~' && c != '(' && c != ')' && c != '\u0000'
+ && !Character.isWhitespace( c ) )
+ {
+ sb.append( c );
+ c = nextChar();
+ }
+ prevChar();
+
+ if ( sb.length() > 0 )
+ {
+ this.lastTokenType = LdapFilterToken.EXTENSIBLE_MATCHINGRULEOID;
+ return new LdapFilterToken( this.lastTokenType, sb.toString(), pos - sb.length() + 1 );
+ }
+ }
+
+ // no match
+ StringBuffer sb = new StringBuffer();
+ c = nextChar();
+ while ( c != '(' && c != ')' && c != '\u0000' )
+ {
+ sb.append( c );
+ c = nextChar();
+ }
+ prevChar();
+ // this.lastTokenType = LdapFilterToken.UNKNOWN;
+ // return new LdapFilterToken(this.lastTokenType, sb.toString(),
+ // pos-sb.length());
+ return new LdapFilterToken( LdapFilterToken.UNKNOWN, sb.toString(), pos - sb.length() + 1 );
+ }
+
+}
Propchange: directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/model/filter/parser/LdapFilterScanner.java
------------------------------------------------------------------------------
svn:eol-style = native
Added: directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/model/filter/parser/LdapFilterToken.java
URL: http://svn.apache.org/viewvc/directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/model/filter/parser/LdapFilterToken.java?rev=592082&view=auto
==============================================================================
--- directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/model/filter/parser/LdapFilterToken.java (added)
+++ directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/model/filter/parser/LdapFilterToken.java Mon Nov 5 08:51:43 2007
@@ -0,0 +1,199 @@
+/*
+ * 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.parser;
+
+
+/**
+ * The LdapFilterToken is used to exchange tokens from the scanner to the parser.
+ *
+ * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+ * @version $Rev$, $Date$
+ */
+public class LdapFilterToken implements Comparable
+{
+
+ /** The token identifier for a new filter */
+ public static final int NEW = Integer.MIN_VALUE;
+
+ /** The token identifier for an error token */
+ public static final int ERROR = -2;
+
+ /** The token identifier for end of file */
+ public static final int EOF = -1;
+
+ /** The token identifier for an unknown token */
+ public static final int UNKNOWN = 0;
+
+ /** The token identifier for a whitespace */
+ public static final int WHITESPACE = 1;
+
+ /** The token identifier for the left parenthesis ( */
+ public static final int LPAR = 11;
+
+ /** The token identifier for the right parenthesis ) */
+ public static final int RPAR = 12;
+
+ /** The token identifier for the and operator & */
+ public static final int AND = 21;
+
+ /** The token identifier for the or operator | */
+ public static final int OR = 22;
+
+ /** The token identifier for the not operator ! */
+ public static final int NOT = 23;
+
+ /** The token identifier for the attribute = */
+ public static final int ATTRIBUTE = 31;
+
+ /** The token identifier for the equal filter type = */
+ public static final int EQUAL = 41;
+
+ /** The token identifier for the approx filter type ~= */
+ public static final int APROX = 42;
+
+ /** The token identifier for the greater or equal filter type >= */
+ public static final int GREATER = 43;
+
+ /** The token identifier for the less or equal filter type <= */
+ public static final int LESS = 44;
+
+ /** The token identifier for the present filter type =* */
+ public static final int PRESENT = 45;
+
+ /** The token identifier for a value. */
+ public static final int VALUE = 51;
+
+ /** The token identifier for the asterisk. */
+ public static final int ASTERISK = 52;
+
+ /** The token identifier for the attribute type in extensible filters. */
+ public static final int EXTENSIBLE_ATTRIBUTE = 61;
+
+ /** The token identifier for the colon before the DN flag in extensible filters. */
+ public static final int EXTENSIBLE_DNATTR_COLON = 62;
+
+ /** The token identifier for the DN flag in extensible filters. */
+ public static final int EXTENSIBLE_DNATTR = 63;
+
+ /** The token identifier for the colon before the matching rule OID in extensible filters. */
+ public static final int EXTENSIBLE_MATCHINGRULEOID_COLON = 64;
+
+ /** The token identifier for the matching rule OID in extensible filters. */
+ public static final int EXTENSIBLE_MATCHINGRULEOID = 65;
+
+ /** The token identifier for the colon before the equals in extensible filters. */
+ public static final int EXTENSIBLE_EQUALS_COLON = 66;
+
+ /** The offset. */
+ private int offset;
+
+ /** The type. */
+ private int type;
+
+ /** The value. */
+ private String value;
+
+
+ /**
+ * Creates a new instance of LdapFilterToken.
+ *
+ * @param type the type
+ * @param value the value
+ * @param offset the offset
+ */
+ public LdapFilterToken( int type, String value, int offset )
+ {
+ this.type = type;
+ this.value = value;
+ this.offset = offset;
+ }
+
+
+ /**
+ * Returns the start position of the token in the original filter
+ *
+ * @return the start positon of the token
+ */
+ public int getOffset()
+ {
+ return offset;
+ }
+
+
+ /**
+ * Returns the length of the token in the original filter
+ *
+ * @return the length of the token
+ */
+ public int getLength()
+ {
+ return value.length();
+ }
+
+
+ /**
+ * Gets the token type.
+ *
+ * @return the token type
+ */
+ public int getType()
+ {
+ return type;
+ }
+
+
+ /**
+ * Gets the value of the token in the original filter.
+ *
+ * @return the value of the token
+ */
+ public String getValue()
+ {
+ return value;
+ }
+
+
+ /**
+ * @see java.lang.Object#toString()
+ */
+ public String toString()
+ {
+ return "(" + offset + ") " + "(" + type + ") " + value;
+ }
+
+
+ /**
+ * @see java.lang.Comparable#compareTo(java.lang.Object)
+ */
+ public int compareTo( Object o )
+ {
+ if ( o instanceof LdapFilterToken )
+ {
+ LdapFilterToken token = ( LdapFilterToken ) o;
+ return this.offset - token.offset;
+ }
+ else
+ {
+ throw new ClassCastException( "Not instanceof LapFilterToken: " + o.getClass().getName() );
+ }
+ }
+
+}
Propchange: directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/model/filter/parser/LdapFilterToken.java
------------------------------------------------------------------------------
svn:eol-style = native