View Javadoc
1   /*
2    *  Licensed to the Apache Software Foundation (ASF) under one
3    *  or more contributor license agreements.  See the NOTICE file
4    *  distributed with this work for additional information
5    *  regarding copyright ownership.  The ASF licenses this file
6    *  to you under the Apache License, Version 2.0 (the
7    *  "License"); you may not use this file except in compliance
8    *  with the License.  You may obtain a copy of the License at
9    * 
10   *    http://www.apache.org/licenses/LICENSE-2.0
11   * 
12   *  Unless required by applicable law or agreed to in writing,
13   *  software distributed under the License is distributed on an
14   *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15   *  KIND, either express or implied.  See the License for the
16   *  specific language governing permissions and limitations
17   *  under the License.
18   * 
19   */
20  package org.apache.directory.api.ldap.model.schema;
21  
22  
23  import java.util.ArrayList;
24  import java.util.List;
25  
26  import org.apache.directory.api.i18n.I18n;
27  
28  
29  /**
30   * Represents an LDAP MatchingRuleUseDescription defined in RFC 2252.
31   * <p>
32   * According to ldapbis [MODELS]:
33   * </p>
34   * 
35   * <pre>
36   *  Values of the matchingRuleUse list the attributes which are suitable
37   *  for use with an extensible matching rule.
38   * 
39   *    Matching rule use descriptions are written according to the following
40   *    ABNF:
41   * 
42   *      MatchingRuleUseDescription = LPAREN WSP
43   *          numericoid                ; object identifier
44   *          [ SP &quot;NAME&quot; SP qdescrs ]  ; short names (descriptors)
45   *          [ SP &quot;DESC&quot; SP qdstring ] ; description
46   *          [ SP &quot;OBSOLETE&quot; ]         ; not active
47   *          SP &quot;APPLIES&quot; SP oids      ; attribute types
48   *          extensions WSP RPAREN     ; extensions
49   * 
50   *    where:
51   *      [numericoid] is the object identifier of the matching rule
52   *          associated with this matching rule use description;
53   *      NAME [qdescrs] are short names (descriptors) identifying this
54   *          matching rule use;
55   *      DESC [qdstring] is a short descriptive string;
56   *      OBSOLETE indicates this matching rule use is not active;
57   *      APPLIES provides a list of attribute types the matching rule applies
58   *          to; and
59   *      [extensions] describe extensions.
60   * 
61   *  The matchingRule within the MatchingRuleUse definition can be used by an
62   *  extensible match assertion if the assertion is based on the attributes
63   *  listed within the MatchingRuleUse definition.  If an extensible match
64   *  assertion is based on attributes other than those listed within the
65   *  MatchingRuleUse definition then the assertion is deemed undefined.
66   * 
67   *  Also according to 3.3.20 of [SYNTAXES] (ldapbis working group):
68   * 
69   *  A value of the Matching Rule Use Description syntax indicates the
70   *  attribute types to which a matching rule may be applied in an
71   *  extensibleMatch search filter [PROT].  The LDAP-specific encoding of
72   *  a value of this syntax is defined by the &lt;MatchingRuleUseDescription&gt;
73   *  rule in [MODELS] above.
74   * </pre>
75   * 
76   * @see <a
77   *      href="http://www.ietf.org/internet-drafts/draft-ietf-ldapbis-models-11.txt">ldapbis
78   *      [MODELS]</a>
79   * @see <a
80   *      href="http://www.ietf.org/internet-drafts/draft-ietf-ldapbis-syntaxes-09.txt">ldapbis
81   *      [SYNTAXES]</a>
82   * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
83   */
84  public class MatchingRuleUse extends AbstractSchemaObject
85  {
86      /** The mandatory serialVersionUID */
87      public static final long serialVersionUID = 1L;
88  
89      /** The list of attributes types OID the matching rule applies to */
90      private List<String> applicableAttributeOids;
91  
92      /** The list of attributes types the matching rule applies to */
93      private List<AttributeType> applicableAttributes;
94  
95  
96      /**
97       * Creates a new instance of MatchingRuleUseDescription
98       * 
99       * @param oid the MatchingRuleUse's OID
100      */
101     public MatchingRuleUse( String oid )
102     {
103         super( SchemaObjectType.MATCHING_RULE_USE, oid );
104 
105         applicableAttributeOids = new ArrayList<>();
106         applicableAttributes = new ArrayList<>();
107     }
108 
109 
110     /**
111      * @return The matchingRule's list of AttributeType OIDs the MRU applies to
112      */
113     public List<String> getApplicableAttributeOids()
114     {
115         return applicableAttributeOids;
116     }
117 
118 
119     /**
120      * @return The matchingRule's list of AttributeType OIDs the MRU applies to
121      */
122     public List<AttributeType> getApplicableAttributes()
123     {
124         return applicableAttributes;
125     }
126 
127 
128     /**
129      * Set the matchingRule's AttributeType OIDs the MRU applies to.
130      *
131      * @param applicableAttributeOids The AttributeType OIDs list
132      */
133     public void setApplicableAttributeOids( List<String> applicableAttributeOids )
134     {
135         if ( locked )
136         {
137             throw new UnsupportedOperationException( I18n.err( I18n.ERR_04441, getName() ) );
138         }
139 
140         if ( !isReadOnly )
141         {
142             this.applicableAttributeOids = applicableAttributeOids;
143         }
144     }
145 
146 
147     /**
148      * Set the matchingRule's AttributeType the MRU applies to.
149      *
150      * @param applicableAttributes The AttributeType list
151      */
152     public void setApplicableAttributes( List<AttributeType> applicableAttributes )
153     {
154         if ( locked )
155         {
156             throw new UnsupportedOperationException( I18n.err( I18n.ERR_04441, getName() ) );
157         }
158 
159         if ( !isReadOnly )
160         {
161             this.applicableAttributes = applicableAttributes;
162 
163             // update the OIDS now
164             applicableAttributeOids.clear();
165 
166             for ( AttributeType at : applicableAttributes )
167             {
168                 applicableAttributeOids.add( at.getOid() );
169             }
170         }
171     }
172 
173 
174     /**
175      * Add a matchingRule's AttributeType OIDs the MRU applies to.
176      *
177      * @param oid A matchingRule's AttributeType OIDs the MRU applies to
178      */
179     public void addApplicableAttributeOids( String oid )
180     {
181         if ( locked )
182         {
183             throw new UnsupportedOperationException( I18n.err( I18n.ERR_04441, getName() ) );
184         }
185 
186         if ( !isReadOnly && !applicableAttributeOids.contains( oid ) )
187         {
188             applicableAttributeOids.add( oid );
189         }
190     }
191 
192 
193     /**
194      * Add a matchingRule's AttributeType the MRU applies to.
195      *
196      * @param attributeType A matchingRule's AttributeType the MRU applies to
197      */
198     public void addApplicableAttribute( AttributeType attributeType )
199     {
200         if ( locked )
201         {
202             throw new UnsupportedOperationException( I18n.err( I18n.ERR_04441, getName() ) );
203         }
204 
205         if ( !isReadOnly && !applicableAttributeOids.contains( attributeType.getOid() ) )
206         {
207             applicableAttributes.add( attributeType );
208             applicableAttributeOids.add( attributeType.getOid() );
209         }
210     }
211 
212 
213     /**
214      * @see Object#toString()
215      */
216     @Override
217     public String toString()
218     {
219         return SchemaObjectRenderer.OPEN_LDAP_SCHEMA_RENDERER.render( this );
220     }
221 
222 
223     /**
224      * Copy an MatchingRuleUse
225      */
226     @Override
227     public MatchingRuleUse copy()
228     {
229         MatchingRuleUse copy = new MatchingRuleUse( oid );
230 
231         // Copy the SchemaObject common data
232         copy.copy( this );
233 
234         // Clone the APPLY AttributeTypes
235         copy.applicableAttributeOids = new ArrayList<>();
236 
237         // Copy the APPLIES oid list
238         for ( String oid : applicableAttributeOids )
239         {
240             copy.applicableAttributeOids.add( oid );
241         }
242 
243         // Copy the APPLIES list (will be empty)
244         copy.applicableAttributes = new ArrayList<>();
245 
246         return copy;
247     }
248 
249 
250     /**
251      * @see Object#equals(Object)
252      */
253     @Override
254     public boolean equals( Object o )
255     {
256         if ( !super.equals( o ) )
257         {
258             return false;
259         }
260 
261         if ( !( o instanceof MatchingRuleUse ) )
262         {
263             return false;
264         }
265 
266         @SuppressWarnings("unused")
267         MatchingRuleUse that = ( MatchingRuleUse ) o;
268 
269         // TODO : complete the checks
270         return true;
271     }
272 
273 
274     /**
275      * {@inheritDoc}
276      */
277     @Override
278     public void clear()
279     {
280         // Clear the common elements
281         super.clear();
282 
283         // Clear the references
284         applicableAttributes.clear();
285         applicableAttributeOids.clear();
286     }
287 }