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.schema;
028    
029    
030    
031    import org.opends.server.admin.std.server.AttributeSyntaxCfg;
032    import org.opends.server.api.ApproximateMatchingRule;
033    import org.opends.server.api.AttributeSyntax;
034    import org.opends.server.api.EqualityMatchingRule;
035    import org.opends.server.api.OrderingMatchingRule;
036    import org.opends.server.api.SubstringMatchingRule;
037    import org.opends.server.config.ConfigException;
038    import org.opends.server.core.DirectoryServer;
039    import org.opends.server.types.ByteString;
040    
041    
042    
043    import static org.opends.server.loggers.ErrorLogger.*;
044    import static org.opends.messages.SchemaMessages.*;
045    import org.opends.messages.MessageBuilder;
046    import static org.opends.server.schema.SchemaConstants.*;
047    import static org.opends.server.util.StaticUtils.*;
048    
049    
050    /**
051     * This class defines the OID syntax, which holds either an identifier name or
052     * a numeric OID.  Equality and substring matching will be allowed by default.
053     */
054    public class OIDSyntax
055           extends AttributeSyntax<AttributeSyntaxCfg>
056    {
057      // The default equality matching rule for this syntax.
058      private EqualityMatchingRule defaultEqualityMatchingRule;
059    
060      // The default substring matching rule for this syntax.
061      private SubstringMatchingRule defaultSubstringMatchingRule;
062    
063    
064    
065      /**
066       * Creates a new instance of this syntax.  Note that the only thing that
067       * should be done here is to invoke the default constructor for the
068       * superclass.  All initialization should be performed in the
069       * <CODE>initializeSyntax</CODE> method.
070       */
071      public OIDSyntax()
072      {
073        super();
074      }
075    
076    
077    
078      /**
079       * {@inheritDoc}
080       */
081      public void initializeSyntax(AttributeSyntaxCfg configuration)
082             throws ConfigException
083      {
084        defaultEqualityMatchingRule =
085             DirectoryServer.getEqualityMatchingRule(EMR_OID_OID);
086        if (defaultEqualityMatchingRule == null)
087        {
088          logError(ERR_ATTR_SYNTAX_UNKNOWN_EQUALITY_MATCHING_RULE.get(
089              EMR_OID_OID, SYNTAX_OID_NAME));
090        }
091    
092        defaultSubstringMatchingRule =
093             DirectoryServer.getSubstringMatchingRule(SMR_CASE_IGNORE_OID);
094        if (defaultSubstringMatchingRule == null)
095        {
096          logError(ERR_ATTR_SYNTAX_UNKNOWN_SUBSTRING_MATCHING_RULE.get(
097              SMR_CASE_IGNORE_OID, SYNTAX_OID_NAME));
098        }
099      }
100    
101    
102    
103      /**
104       * Retrieves the common name for this attribute syntax.
105       *
106       * @return  The common name for this attribute syntax.
107       */
108      public String getSyntaxName()
109      {
110        return SYNTAX_OID_NAME;
111      }
112    
113    
114    
115      /**
116       * Retrieves the OID for this attribute syntax.
117       *
118       * @return  The OID for this attribute syntax.
119       */
120      public String getOID()
121      {
122        return SYNTAX_OID_OID;
123      }
124    
125    
126    
127      /**
128       * Retrieves a description for this attribute syntax.
129       *
130       * @return  A description for this attribute syntax.
131       */
132      public String getDescription()
133      {
134        return SYNTAX_OID_DESCRIPTION;
135      }
136    
137    
138    
139      /**
140       * Retrieves the default equality matching rule that will be used for
141       * attributes with this syntax.
142       *
143       * @return  The default equality matching rule that will be used for
144       *          attributes with this syntax, or <CODE>null</CODE> if equality
145       *          matches will not be allowed for this type by default.
146       */
147      public EqualityMatchingRule getEqualityMatchingRule()
148      {
149        return defaultEqualityMatchingRule;
150      }
151    
152    
153    
154      /**
155       * Retrieves the default ordering matching rule that will be used for
156       * attributes with this syntax.
157       *
158       * @return  The default ordering matching rule that will be used for
159       *          attributes with this syntax, or <CODE>null</CODE> if ordering
160       *          matches will not be allowed for this type by default.
161       */
162      public OrderingMatchingRule getOrderingMatchingRule()
163      {
164        // There is no ordering matching rule by default.
165        return null;
166      }
167    
168    
169    
170      /**
171       * Retrieves the default substring matching rule that will be used for
172       * attributes with this syntax.
173       *
174       * @return  The default substring matching rule that will be used for
175       *          attributes with this syntax, or <CODE>null</CODE> if substring
176       *          matches will not be allowed for this type by default.
177       */
178      public SubstringMatchingRule getSubstringMatchingRule()
179      {
180        return defaultSubstringMatchingRule;
181      }
182    
183    
184    
185      /**
186       * Retrieves the default approximate matching rule that will be used for
187       * attributes with this syntax.
188       *
189       * @return  The default approximate matching rule that will be used for
190       *          attributes with this syntax, or <CODE>null</CODE> if approximate
191       *          matches will not be allowed for this type by default.
192       */
193      public ApproximateMatchingRule getApproximateMatchingRule()
194      {
195        // There is no approximate matching rule by default.
196        return null;
197      }
198    
199    
200    
201      /**
202       * Indicates whether the provided value is acceptable for use in an attribute
203       * with this syntax.  If it is not, then the reason may be appended to the
204       * provided buffer.
205       *
206       * @param  value          The value for which to make the determination.
207       * @param  invalidReason  The buffer to which the invalid reason should be
208       *                        appended.
209       *
210       * @return  <CODE>true</CODE> if the provided value is acceptable for use with
211       *          this syntax, or <CODE>false</CODE> if not.
212       */
213      public boolean valueIsAcceptable(ByteString value,
214                                       MessageBuilder invalidReason)
215      {
216        String lowerValue = toLowerCase(value.stringValue());
217        return isValidSchemaElement(lowerValue, 0, lowerValue.length(),
218                invalidReason);
219      }
220    }
221