001 /*
002 * Copyright 2008-2014 UnboundID Corp.
003 * All Rights Reserved.
004 */
005 /*
006 * Copyright (C) 2008-2014 UnboundID Corp.
007 *
008 * This program is free software; you can redistribute it and/or modify
009 * it under the terms of the GNU General Public License (GPLv2 only)
010 * or the terms of the GNU Lesser General Public License (LGPLv2.1 only)
011 * as published by the Free Software Foundation.
012 *
013 * This program is distributed in the hope that it will be useful,
014 * but WITHOUT ANY WARRANTY; without even the implied warranty of
015 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
016 * GNU General Public License for more details.
017 *
018 * You should have received a copy of the GNU General Public License
019 * along with this program; if not, see <http://www.gnu.org/licenses>.
020 */
021 package com.unboundid.ldap.matchingrules;
022
023
024
025 import com.unboundid.asn1.ASN1OctetString;
026 import com.unboundid.ldap.sdk.LDAPException;
027 import com.unboundid.ldap.sdk.ResultCode;
028
029 import static com.unboundid.ldap.matchingrules.MatchingRuleMessages.*;
030 import static com.unboundid.util.StaticUtils.*;
031
032
033
034 /**
035 * This class provides an implementation of a matching rule that performs
036 * equality comparisons against Boolean values, which should be either "TRUE" or
037 * "FALSE". Substring and ordering matching are not supported.
038 */
039 public final class BooleanMatchingRule
040 extends MatchingRule
041 {
042 /**
043 * The singleton instance that will be returned from the {@code getInstance}
044 * method.
045 */
046 private static final BooleanMatchingRule INSTANCE =
047 new BooleanMatchingRule();
048
049
050
051 /**
052 * The pre-defined value that will be used as the normalized representation
053 * of a "TRUE" value.
054 */
055 private static final ASN1OctetString TRUE_VALUE = new ASN1OctetString("TRUE");
056
057
058
059 /**
060 * The pre-defined value that will be used as the normalized representation
061 * of a "FALSE" value.
062 */
063 private static final ASN1OctetString FALSE_VALUE =
064 new ASN1OctetString("FALSE");
065
066
067
068 /**
069 * The name for the booleanMatch equality matching rule.
070 */
071 public static final String EQUALITY_RULE_NAME = "booleanMatch";
072
073
074
075 /**
076 * The name for the booleanMatch equality matching rule, formatted in all
077 * lowercase characters.
078 */
079 static final String LOWER_EQUALITY_RULE_NAME =
080 toLowerCase(EQUALITY_RULE_NAME);
081
082
083
084 /**
085 * The OID for the booleanMatch equality matching rule.
086 */
087 public static final String EQUALITY_RULE_OID = "2.5.13.13";
088
089
090
091 /**
092 * The serial version UID for this serializable class.
093 */
094 private static final long serialVersionUID = 5137725892611277972L;
095
096
097
098 /**
099 * Creates a new instance of this Boolean matching rule.
100 */
101 public BooleanMatchingRule()
102 {
103 // No implementation is required.
104 }
105
106
107
108 /**
109 * Retrieves a singleton instance of this matching rule.
110 *
111 * @return A singleton instance of this matching rule.
112 */
113 public static BooleanMatchingRule getInstance()
114 {
115 return INSTANCE;
116 }
117
118
119
120 /**
121 * {@inheritDoc}
122 */
123 @Override()
124 public String getEqualityMatchingRuleName()
125 {
126 return EQUALITY_RULE_NAME;
127 }
128
129
130
131 /**
132 * {@inheritDoc}
133 */
134 @Override()
135 public String getEqualityMatchingRuleOID()
136 {
137 return EQUALITY_RULE_OID;
138 }
139
140
141
142 /**
143 * {@inheritDoc}
144 */
145 @Override()
146 public String getOrderingMatchingRuleName()
147 {
148 return null;
149 }
150
151
152
153 /**
154 * {@inheritDoc}
155 */
156 @Override()
157 public String getOrderingMatchingRuleOID()
158 {
159 return null;
160 }
161
162
163
164 /**
165 * {@inheritDoc}
166 */
167 @Override()
168 public String getSubstringMatchingRuleName()
169 {
170 return null;
171 }
172
173
174
175 /**
176 * {@inheritDoc}
177 */
178 @Override()
179 public String getSubstringMatchingRuleOID()
180 {
181 return null;
182 }
183
184
185
186 /**
187 * {@inheritDoc}
188 */
189 @Override()
190 public boolean valuesMatch(final ASN1OctetString value1,
191 final ASN1OctetString value2)
192 throws LDAPException
193 {
194 return normalize(value1).equals(normalize(value2));
195 }
196
197
198
199 /**
200 * {@inheritDoc}
201 */
202 @Override()
203 public boolean matchesSubstring(final ASN1OctetString value,
204 final ASN1OctetString subInitial,
205 final ASN1OctetString[] subAny,
206 final ASN1OctetString subFinal)
207 throws LDAPException
208 {
209 throw new LDAPException(ResultCode.INAPPROPRIATE_MATCHING,
210 ERR_BOOLEAN_SUBSTRING_MATCHING_NOT_SUPPORTED.get());
211 }
212
213
214
215 /**
216 * {@inheritDoc}
217 */
218 @Override()
219 public int compareValues(final ASN1OctetString value1,
220 final ASN1OctetString value2)
221 throws LDAPException
222 {
223 throw new LDAPException(ResultCode.INAPPROPRIATE_MATCHING,
224 ERR_BOOLEAN_ORDERING_MATCHING_NOT_SUPPORTED.get());
225 }
226
227
228
229 /**
230 * {@inheritDoc}
231 */
232 @Override()
233 public ASN1OctetString normalize(final ASN1OctetString value)
234 throws LDAPException
235 {
236 final byte[] valueBytes = value.getValue();
237
238 if ((valueBytes.length == 4) &&
239 ((valueBytes[0] == 'T') || (valueBytes[0] == 't')) &&
240 ((valueBytes[1] == 'R') || (valueBytes[1] == 'r')) &&
241 ((valueBytes[2] == 'U') || (valueBytes[2] == 'u')) &&
242 ((valueBytes[3] == 'E') || (valueBytes[3] == 'e')))
243 {
244 return TRUE_VALUE;
245 }
246 else if ((valueBytes.length == 5) &&
247 ((valueBytes[0] == 'F') || (valueBytes[0] == 'f')) &&
248 ((valueBytes[1] == 'A') || (valueBytes[1] == 'a')) &&
249 ((valueBytes[2] == 'L') || (valueBytes[2] == 'l')) &&
250 ((valueBytes[3] == 'S') || (valueBytes[3] == 's')) &&
251 ((valueBytes[4] == 'E') || (valueBytes[4] == 'e')))
252 {
253 return FALSE_VALUE;
254 }
255 else
256 {
257 throw new LDAPException(ResultCode.INVALID_ATTRIBUTE_SYNTAX,
258 ERR_BOOLEAN_INVALID_VALUE.get());
259 }
260 }
261
262
263
264 /**
265 * {@inheritDoc}
266 */
267 @Override()
268 public ASN1OctetString normalizeSubstring(final ASN1OctetString value,
269 final byte substringType)
270 throws LDAPException
271 {
272 throw new LDAPException(ResultCode.INAPPROPRIATE_MATCHING,
273 ERR_BOOLEAN_SUBSTRING_MATCHING_NOT_SUPPORTED.get());
274 }
275 }