001    /*
002     * CDDL HEADER START
003     *
004     * The contents of this file are subject to the terms of the
005     * Common Development and Distribution License, Version 1.0 only
006     * (the "License").  You may not use this file except in compliance
007     * with the License.
008     *
009     * You can obtain a copy of the license at
010     * trunk/opends/resource/legal-notices/OpenDS.LICENSE
011     * or https://OpenDS.dev.java.net/OpenDS.LICENSE.
012     * See the License for the specific language governing permissions
013     * and limitations under the License.
014     *
015     * When distributing Covered Code, include this CDDL HEADER in each
016     * file and include the License file at
017     * trunk/opends/resource/legal-notices/OpenDS.LICENSE.  If applicable,
018     * add the following below this CDDL HEADER, with the fields enclosed
019     * by brackets "[]" replaced with your own identifying information:
020     *      Portions Copyright [yyyy] [name of copyright owner]
021     *
022     * CDDL HEADER END
023     *
024     *
025     *      Copyright 2006-2008 Sun Microsystems, Inc.
026     */
027    package org.opends.server.api;
028    
029    
030    
031    import java.util.AbstractSet;
032    import java.util.Collection;
033    import java.util.HashSet;
034    import java.util.Iterator;
035    
036    import org.opends.server.types.Entry;
037    
038    
039    
040    /**
041     * This class implements the {@code Set} interface for
042     * {@link org.opends.server.api.SubtreeSpecification}s.
043     * <p>
044     * It is backed by a {@code HashSet} but provides additional
045     * functionality, {@link #isWithinScope(Entry)}, for determining
046     * whether or not an entry is within the scope of one or more
047     * contained {@code SubtreeSpecification}s.
048     */
049    @org.opends.server.types.PublicAPI(
050         stability=org.opends.server.types.StabilityLevel.VOLATILE,
051         mayInstantiate=true,
052         mayExtend=false,
053         mayInvoke=true)
054    public final class SubtreeSpecificationSet
055           extends AbstractSet<SubtreeSpecification>
056    {
057      // Underlying implementation is simply a set.
058      private HashSet<SubtreeSpecification> pimpl;
059    
060    
061    
062      /**
063       * Constructs a new empty subtree specification set.
064       */
065      public SubtreeSpecificationSet()
066      {
067        this.pimpl = new HashSet<SubtreeSpecification>();
068      }
069    
070    
071    
072      /**
073       * Constructs a new subtree specification set containing the
074       * elements in the specified collection.
075       *
076       * @param  c  The subtree specification collection whose elements
077       *            are to be placed into this set.
078       */
079      public SubtreeSpecificationSet(
080                  Collection<? extends SubtreeSpecification> c)
081      {
082        this.pimpl = new HashSet<SubtreeSpecification>(c);
083      }
084    
085    
086    
087      /**
088       * Returns {@code true} if the specified entry is within the scope
089       * of a subtree specifications contained in the set.
090       *
091       * @param  entry  The entry to be checked for containment.
092       *
093       * @return  Returns {@code true} if the set contains the specified
094       *          entry.
095       */
096      public boolean isWithinScope(Entry entry)
097      {
098        for (SubtreeSpecification subtreeSpecification : pimpl)
099        {
100          if (subtreeSpecification.isWithinScope(entry))
101          {
102            return true;
103          }
104        }
105    
106        return false;
107      }
108    
109    
110    
111      /**
112       * Adds the provided subtree specification object to this set.
113       *
114       * @param  e  The subtree specification object to be added.
115       *
116       * @return  {@code true} if the element was added to the set, or
117       *          {@code false} if the element was already contained in
118       *          the set.
119       */
120      @Override
121      public boolean add(SubtreeSpecification e)
122      {
123        return pimpl.add(e);
124      }
125    
126    
127    
128      /**
129       * Retrieves an iterator that may be used to step through the values
130       * in this set.
131       *
132       * @return  An iterator that may be used to step through the values
133       *          in this set.
134       */
135      @Override
136      public Iterator<SubtreeSpecification> iterator()
137      {
138        return pimpl.iterator();
139      }
140    
141    
142    
143      /**
144       * Indicates whether this set contains the provided object.
145       *
146       * @param  o  The object for which to make the determination.
147       *
148       * @return  {@code true} if this set contains the provided object,
149       *          or {@code false} if not.
150       */
151      @Override
152      public boolean contains(Object o)
153      {
154        return pimpl.contains(o);
155      }
156    
157    
158    
159      /**
160       * Retrieves the number of elements contained in this set.
161       *
162       * @return  The number of elements contained in this set.
163       */
164      @Override
165      public int size()
166      {
167        return pimpl.size();
168      }
169    }
170