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    
048    
049    /**
050     * This class implements the postal address attribute syntax, which is a list of
051     * UCS (Universal Character Set, as defined in the ISO 10646 specification and
052     * includes UTF-8 and UTF-16) strings separated by dollar signs.  By default,
053     * they will be treated in a case-insensitive manner, and equality and substring
054     * matching will be allowed.
055     */
056    public class PostalAddressSyntax
057           extends AttributeSyntax<AttributeSyntaxCfg>
058    {
059      // The default equality matching rule for this syntax.
060      private EqualityMatchingRule defaultEqualityMatchingRule;
061    
062      // The default substring matching rule for this syntax.
063      private SubstringMatchingRule defaultSubstringMatchingRule;
064    
065    
066    
067      /**
068       * Creates a new instance of this syntax.  Note that the only thing that
069       * should be done here is to invoke the default constructor for the
070       * superclass.  All initialization should be performed in the
071       * <CODE>initializeSyntax</CODE> method.
072       */
073      public PostalAddressSyntax()
074      {
075        super();
076      }
077    
078    
079    
080      /**
081       * {@inheritDoc}
082       */
083      public void initializeSyntax(AttributeSyntaxCfg configuration)
084             throws ConfigException
085      {
086        defaultEqualityMatchingRule =
087             DirectoryServer.getEqualityMatchingRule(EMR_CASE_IGNORE_OID);
088        if (defaultEqualityMatchingRule == null)
089        {
090          logError(ERR_ATTR_SYNTAX_UNKNOWN_EQUALITY_MATCHING_RULE.get(
091              EMR_CASE_IGNORE_OID, SYNTAX_DIRECTORY_STRING_NAME));
092        }
093    
094        defaultSubstringMatchingRule =
095             DirectoryServer.getSubstringMatchingRule(SMR_CASE_IGNORE_OID);
096        if (defaultSubstringMatchingRule == null)
097        {
098          logError(ERR_ATTR_SYNTAX_UNKNOWN_SUBSTRING_MATCHING_RULE.get(
099              SMR_CASE_IGNORE_OID, SYNTAX_DIRECTORY_STRING_NAME));
100        }
101      }
102    
103    
104    
105      /**
106       * Retrieves the common name for this attribute syntax.
107       *
108       * @return  The common name for this attribute syntax.
109       */
110      public String getSyntaxName()
111      {
112        return SYNTAX_POSTAL_ADDRESS_NAME;
113      }
114    
115    
116    
117      /**
118       * Retrieves the OID for this attribute syntax.
119       *
120       * @return  The OID for this attribute syntax.
121       */
122      public String getOID()
123      {
124        return SYNTAX_POSTAL_ADDRESS_OID;
125      }
126    
127    
128    
129      /**
130       * Retrieves a description for this attribute syntax.
131       *
132       * @return  A description for this attribute syntax.
133       */
134      public String getDescription()
135      {
136        return SYNTAX_POSTAL_ADDRESS_DESCRIPTION;
137      }
138    
139    
140    
141      /**
142       * Retrieves the default equality matching rule that will be used for
143       * attributes with this syntax.
144       *
145       * @return  The default equality matching rule that will be used for
146       *          attributes with this syntax, or <CODE>null</CODE> if equality
147       *          matches will not be allowed for this type by default.
148       */
149      public EqualityMatchingRule getEqualityMatchingRule()
150      {
151        return defaultEqualityMatchingRule;
152      }
153    
154    
155    
156      /**
157       * Retrieves the default ordering matching rule that will be used for
158       * attributes with this syntax.
159       *
160       * @return  The default ordering matching rule that will be used for
161       *          attributes with this syntax, or <CODE>null</CODE> if ordering
162       *          matches will not be allowed for this type by default.
163       */
164      public OrderingMatchingRule getOrderingMatchingRule()
165      {
166        // Ordering matching will not be allowed by default.
167        return null;
168      }
169    
170    
171    
172      /**
173       * Retrieves the default substring matching rule that will be used for
174       * attributes with this syntax.
175       *
176       * @return  The default substring matching rule that will be used for
177       *          attributes with this syntax, or <CODE>null</CODE> if substring
178       *          matches will not be allowed for this type by default.
179       */
180      public SubstringMatchingRule getSubstringMatchingRule()
181      {
182        return defaultSubstringMatchingRule;
183      }
184    
185    
186    
187      /**
188       * Retrieves the default approximate matching rule that will be used for
189       * attributes with this syntax.
190       *
191       * @return  The default approximate matching rule that will be used for
192       *          attributes with this syntax, or <CODE>null</CODE> if approximate
193       *          matches will not be allowed for this type by default.
194       */
195      public ApproximateMatchingRule getApproximateMatchingRule()
196      {
197        // Approximate matching will not be allowed by default.
198        return null;
199      }
200    
201    
202    
203      /**
204       * Indicates whether the provided value is acceptable for use in an attribute
205       * with this syntax.  If it is not, then the reason may be appended to the
206       * provided buffer.
207       *
208       * @param  value          The value for which to make the determination.
209       * @param  invalidReason  The buffer to which the invalid reason should be
210       *                        appended.
211       *
212       * @return  <CODE>true</CODE> if the provided value is acceptable for use with
213       *          this syntax, or <CODE>false</CODE> if not.
214       */
215      public boolean valueIsAcceptable(ByteString value,
216                                       MessageBuilder invalidReason)
217      {
218        // We'll allow any value.
219        return true;
220      }
221    }
222