001 /*
002 * Copyright 2015 UnboundID Corp.
003 * All Rights Reserved.
004 */
005 /*
006 * Copyright (C) 2015 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.sdk.unboundidds.jsonfilter;
022
023
024
025 import com.unboundid.asn1.ASN1OctetString;
026 import com.unboundid.ldap.matchingrules.MatchingRule;
027 import com.unboundid.ldap.sdk.LDAPException;
028 import com.unboundid.ldap.sdk.ResultCode;
029 import com.unboundid.util.Debug;
030 import com.unboundid.util.ThreadSafety;
031 import com.unboundid.util.ThreadSafetyLevel;
032 import com.unboundid.util.json.JSONException;
033 import com.unboundid.util.json.JSONObject;
034
035 import static com.unboundid.ldap.sdk.unboundidds.jsonfilter.JFMessages.*;
036
037
038
039 /**
040 * <BLOCKQUOTE>
041 * <B>NOTE:</B> This class is part of the Commercial Edition of the UnboundID
042 * LDAP SDK for Java. It is not available for use in applications that
043 * include only the Standard Edition of the LDAP SDK, and is not supported for
044 * use in conjunction with non-UnboundID products.
045 * </BLOCKQUOTE>
046 * This class provides an implementation of a matching rule that can be used in
047 * conjunction with JSON objects.
048 */
049 @ThreadSafety(level=ThreadSafetyLevel.COMPLETELY_THREADSAFE)
050 public final class JSONObjectExactMatchingRule
051 extends MatchingRule
052 {
053 /**
054 * The singleton instance that will be returned from the {@link #getInstance}
055 * method.
056 */
057 private static final JSONObjectExactMatchingRule INSTANCE =
058 new JSONObjectExactMatchingRule();
059
060
061
062 /**
063 * The serial version UID for this serializable class.
064 */
065 private static final long serialVersionUID = -4476702301631553228L;
066
067
068
069 /**
070 * Retrieves a singleton instance of this matching rule.
071 *
072 * @return A singleton instance of this matching rule.
073 */
074 public static JSONObjectExactMatchingRule getInstance()
075 {
076 return INSTANCE;
077 }
078
079
080
081 /**
082 * Creates a new instance of this JSON matching rule.
083 */
084 public JSONObjectExactMatchingRule()
085 {
086 // No implementation is required.
087 }
088
089
090
091 /**
092 * {@inheritDoc}
093 */
094 @Override()
095 public String getEqualityMatchingRuleName()
096 {
097 return "jsonObjectExactMatch";
098 }
099
100
101
102 /**
103 * {@inheritDoc}
104 */
105 @Override()
106 public String getEqualityMatchingRuleOID()
107 {
108 return "1.3.6.1.4.1.30221.2.4.12";
109 }
110
111
112
113 /**
114 * {@inheritDoc}
115 */
116 @Override()
117 public String getOrderingMatchingRuleName()
118 {
119 // Ordering matching is not supported.
120 return null;
121 }
122
123
124
125 /**
126 * {@inheritDoc}
127 */
128 @Override()
129 public String getOrderingMatchingRuleOID()
130 {
131 // Ordering matching is not supported.
132 return null;
133 }
134
135
136
137 /**
138 * {@inheritDoc}
139 */
140 @Override()
141 public String getSubstringMatchingRuleName()
142 {
143 // Substring matching is not supported.
144 return null;
145 }
146
147
148
149 /**
150 * {@inheritDoc}
151 */
152 @Override()
153 public String getSubstringMatchingRuleOID()
154 {
155 // Substring matching is not supported.
156 return null;
157 }
158
159
160
161 /**
162 * {@inheritDoc}
163 */
164 @Override()
165 public boolean valuesMatch(final ASN1OctetString value1,
166 final ASN1OctetString value2)
167 throws LDAPException
168 {
169 final JSONObject o1;
170 try
171 {
172 o1 = new JSONObject(value1.stringValue());
173 }
174 catch (final JSONException e)
175 {
176 Debug.debugException(e);
177 throw new LDAPException(ResultCode.INVALID_ATTRIBUTE_SYNTAX,
178 e.getMessage(), e);
179 }
180
181 final JSONObject o2;
182 try
183 {
184 o2 = new JSONObject(value2.stringValue());
185 }
186 catch (final JSONException e)
187 {
188 Debug.debugException(e);
189 throw new LDAPException(ResultCode.INVALID_ATTRIBUTE_SYNTAX,
190 e.getMessage(), e);
191 }
192
193 return o1.equals(o2, false, true, false);
194 }
195
196
197
198 /**
199 * {@inheritDoc}
200 */
201 @Override()
202 public boolean matchesSubstring(final ASN1OctetString value,
203 final ASN1OctetString subInitial,
204 final ASN1OctetString[] subAny,
205 final ASN1OctetString subFinal)
206 throws LDAPException
207 {
208 // Substring matching is not supported for this matching rule.
209 throw new LDAPException(ResultCode.INAPPROPRIATE_MATCHING,
210 ERR_JSON_MATCHING_RULE_SUBSTRING_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 // Ordering matching is not supported for this matching rule.
224 throw new LDAPException(ResultCode.INAPPROPRIATE_MATCHING,
225 ERR_JSON_MATCHING_RULE_ORDERING_NOT_SUPPORTED.get());
226 }
227
228
229
230 /**
231 * {@inheritDoc}
232 */
233 @Override()
234 public ASN1OctetString normalize(final ASN1OctetString value)
235 throws LDAPException
236 {
237 final JSONObject o;
238 try
239 {
240 o = new JSONObject(value.stringValue());
241 }
242 catch (final JSONException e)
243 {
244 Debug.debugException(e);
245 throw new LDAPException(ResultCode.INVALID_ATTRIBUTE_SYNTAX,
246 e.getMessage(), e);
247 }
248
249 return new ASN1OctetString(o.toNormalizedString());
250 }
251
252
253
254 /**
255 * {@inheritDoc}
256 */
257 @Override()
258 public ASN1OctetString normalizeSubstring(final ASN1OctetString value,
259 final byte substringType)
260 throws LDAPException
261 {
262 // Substring matching is not supported for this matching rule.
263 throw new LDAPException(ResultCode.INAPPROPRIATE_MATCHING,
264 ERR_JSON_MATCHING_RULE_SUBSTRING_NOT_SUPPORTED.get());
265 }
266 }