001/* 002 * Licensed to the Apache Software Foundation (ASF) under one 003 * or more contributor license agreements. See the NOTICE file 004 * distributed with this work for additional information 005 * regarding copyright ownership. The ASF licenses this file 006 * to you under the Apache License, Version 2.0 (the 007 * "License"); you may not use this file except in compliance 008 * with the License. You may obtain a copy of the License at 009 * 010 * https://www.apache.org/licenses/LICENSE-2.0 011 * 012 * Unless required by applicable law or agreed to in writing, 013 * software distributed under the License is distributed on an 014 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 015 * KIND, eCopyOfUuidSyntaxCheckerither express or implied. See the License for the 016 * specific language governing permissions and limitations 017 * under the License. 018 * 019 */ 020package org.apache.directory.api.ldap.model.schema.syntaxCheckers; 021 022 023import org.apache.directory.api.i18n.I18n; 024import org.apache.directory.api.ldap.model.constants.SchemaConstants; 025import org.apache.directory.api.ldap.model.schema.SyntaxChecker; 026 027 028/** 029 * An CSN SID syntax checker. 030 * 031 * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a> 032 */ 033@SuppressWarnings("serial") 034public final class CsnSidSyntaxChecker extends SyntaxChecker 035{ 036 /** 037 * A static instance of CsnSidSyntaxChecker 038 */ 039 public static final CsnSidSyntaxChecker INSTANCE = new CsnSidSyntaxChecker( SchemaConstants.CSN_SID_SYNTAX ); 040 041 /** 042 * A static Builder for this class 043 */ 044 public static final class Builder extends SCBuilder<CsnSidSyntaxChecker> 045 { 046 /** 047 * The Builder constructor 048 */ 049 private Builder() 050 { 051 super( SchemaConstants.CSN_SID_SYNTAX ); 052 } 053 054 055 /** 056 * Create a new instance of CsnSidSyntaxChecker 057 * @return A new instance of CsnSidSyntaxChecker 058 */ 059 @Override 060 public CsnSidSyntaxChecker build() 061 { 062 return new CsnSidSyntaxChecker( oid ); 063 } 064 } 065 066 067 /** 068 * Creates a new instance of CsnSyntaxChecker. 069 * 070 * @param oid The OID to use for this SyntaxChecker 071 */ 072 private CsnSidSyntaxChecker( String oid ) 073 { 074 super( oid ); 075 } 076 077 078 /** 079 * @return An instance of the Builder for this class 080 */ 081 public static Builder builder() 082 { 083 return new Builder(); 084 } 085 086 087 /** 088 * {@inheritDoc} 089 */ 090 @Override 091 public boolean isValidSyntax( Object value ) 092 { 093 if ( value == null ) 094 { 095 if ( LOG.isDebugEnabled() ) 096 { 097 LOG.debug( I18n.err( I18n.ERR_13210_SYNTAX_INVALID, "null" ) ); 098 } 099 100 return false; 101 } 102 103 if ( !( value instanceof String ) ) 104 { 105 if ( LOG.isDebugEnabled() ) 106 { 107 LOG.debug( I18n.err( I18n.ERR_13210_SYNTAX_INVALID, value ) ); 108 } 109 110 return false; 111 } 112 113 String sidStr = ( String ) value; 114 115 if ( sidStr.length() > 3 ) 116 { 117 if ( LOG.isDebugEnabled() ) 118 { 119 LOG.debug( I18n.err( I18n.ERR_13210_SYNTAX_INVALID, value ) ); 120 } 121 122 return false; 123 } 124 125 // The SID must be an hexadecimal number between 0x00 and 0xFFF 126 127 try 128 { 129 int sid = Integer.parseInt( sidStr, 16 ); 130 131 if ( ( sid < 0 ) || ( sid > 0x0fff ) ) 132 { 133 if ( LOG.isDebugEnabled() ) 134 { 135 LOG.debug( I18n.err( I18n.ERR_13210_SYNTAX_INVALID, value ) ); 136 } 137 138 return false; 139 } 140 } 141 catch ( NumberFormatException nfe ) 142 { 143 if ( LOG.isDebugEnabled() ) 144 { 145 LOG.debug( I18n.err( I18n.ERR_13210_SYNTAX_INVALID, value ) ); 146 } 147 148 return false; 149 } 150 151 if ( LOG.isDebugEnabled() ) 152 { 153 LOG.debug( I18n.msg( I18n.MSG_13701_SYNTAX_VALID, value ) ); 154 } 155 156 return true; 157 } 158}