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.syntaxCheckers;
21  
22  
23  import org.apache.directory.api.i18n.I18n;
24  import org.apache.directory.api.ldap.model.constants.SchemaConstants;
25  import org.apache.directory.api.ldap.model.schema.SyntaxChecker;
26  import org.apache.directory.api.util.Strings;
27  
28  
29  /**
30   * A SyntaxChecker which verifies that a value is an OtherMailbox according to 
31   * RFC 4517 :
32   * <pre>
33   * OtherMailbox = mailbox-type DOLLAR mailbox
34   * mailbox-type = PrintableString
35   * mailbox      = IA5String
36   * </pre>
37   * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
38   */
39  @SuppressWarnings("serial")
40  public final class OtherMailboxSyntaxChecker extends SyntaxChecker
41  {
42      /**
43       * A static instance of OtherMailboxSyntaxChecker
44       */
45      public static final OtherMailboxSyntaxChecker INSTANCE = 
46          new OtherMailboxSyntaxChecker( SchemaConstants.OTHER_MAILBOX_SYNTAX );
47      
48      /**
49       * A static Builder for this class
50       */
51      public static final class Builder extends SCBuilder<OtherMailboxSyntaxChecker>
52      {
53          /**
54           * The Builder constructor
55           */
56          private Builder()
57          {
58              super( SchemaConstants.OTHER_MAILBOX_SYNTAX );
59          }
60          
61          
62          /**
63           * Create a new instance of OtherMailboxSyntaxChecker
64           * @return A new instance of OtherMailboxSyntaxChecker
65           */
66          @Override
67          public OtherMailboxSyntaxChecker build()
68          {
69              return new OtherMailboxSyntaxChecker( oid );
70          }
71      }
72  
73      
74      /**
75       * Creates a new instance of OtherMailboxSyntaxChecker.
76       */
77      private OtherMailboxSyntaxChecker( String oid )
78      {
79          super( oid );
80      }
81  
82      
83      /**
84       * @return An instance of the Builder for this class
85       */
86      public static Builder builder()
87      {
88          return new Builder();
89      }
90  
91  
92      /**
93       * {@inheritDoc}
94       */
95      @Override
96      public boolean isValidSyntax( Object value )
97      {
98          String strValue;
99  
100         if ( value == null )
101         {
102             if ( LOG.isDebugEnabled() )
103             {
104                 LOG.debug( I18n.err( I18n.ERR_04488_SYNTAX_INVALID, "null" ) );
105             }
106             
107             return false;
108         }
109 
110         if ( value instanceof String )
111         {
112             strValue = ( String ) value;
113         }
114         else if ( value instanceof byte[] )
115         {
116             strValue = Strings.utf8ToString( ( byte[] ) value );
117         }
118         else
119         {
120             strValue = value.toString();
121         }
122 
123         if ( strValue.length() == 0 )
124         {
125             if ( LOG.isDebugEnabled() )
126             {
127                 LOG.debug( I18n.err( I18n.ERR_04488_SYNTAX_INVALID, value ) );
128             }
129             
130             return false;
131         }
132 
133         // Search for the '$' separator
134         int dollar = strValue.indexOf( '$' );
135 
136         if ( dollar == -1 )
137         {
138             // No '$' => error
139             if ( LOG.isDebugEnabled() )
140             {
141                 LOG.debug( I18n.err( I18n.ERR_04488_SYNTAX_INVALID, value ) );
142             }
143             
144             return false;
145         }
146 
147         String mailboxType = strValue.substring( 0, dollar );
148 
149         String mailbox = ( dollar < strValue.length() - 1 )
150             ? strValue.substring( dollar + 1 ) : "";
151 
152         // The mailbox should not contains a '$'
153         if ( mailbox.indexOf( '$' ) != -1 )
154         {
155             if ( LOG.isDebugEnabled() )
156             {
157                 LOG.debug( I18n.err( I18n.ERR_04488_SYNTAX_INVALID, value ) );
158             }
159             
160             return false;
161         }
162 
163         // Check that the mailboxType is a PrintableString
164         if ( !Strings.isPrintableString( mailboxType ) )
165         {
166             if ( LOG.isDebugEnabled() )
167             {
168                 LOG.debug( I18n.err( I18n.ERR_04488_SYNTAX_INVALID, value ) );
169             }
170             
171             return false;
172         }
173 
174         // Check that the mailbox is an IA5String
175         boolean result = Strings.isIA5String( mailbox );
176 
177         if ( LOG.isDebugEnabled() )
178         {
179             if ( result )
180             {
181                 LOG.debug( I18n.msg( I18n.MSG_04489_SYNTAX_VALID, value ) );
182             }
183             else
184             {
185                 LOG.debug( I18n.err( I18n.ERR_04488_SYNTAX_INVALID, value ) );
186             }
187         }
188 
189         return result;
190     }
191 }