1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 package org.apache.directory.api.ldap.model.schema.comparators;
21
22
23 import java.io.Serializable;
24 import java.math.BigInteger;
25
26 import org.apache.directory.api.i18n.I18n;
27 import org.apache.directory.api.ldap.model.entry.Value;
28 import org.apache.directory.api.ldap.model.exception.LdapException;
29 import org.apache.directory.api.ldap.model.schema.LdapComparator;
30 import org.apache.directory.api.ldap.model.schema.normalizers.NumericNormalizer;
31 import org.slf4j.Logger;
32 import org.slf4j.LoggerFactory;
33
34
35
36
37
38
39
40 public class IntegerComparator extends LdapComparator<Object> implements Serializable
41 {
42
43 private static final long serialVersionUID = 2L;
44
45
46 private static final Logger LOG = LoggerFactory.getLogger( IntegerComparator.class );
47
48
49
50
51
52
53
54
55 public IntegerComparator( String oid )
56 {
57 super( oid );
58 }
59
60
61
62
63
64 @Override
65 public int compare( Object v1, Object v2 )
66 {
67
68 if ( v1 == null )
69 {
70 if ( v2 == null )
71 {
72 return 0;
73 }
74 else
75 {
76 return -1;
77 }
78 }
79 else if ( v2 == null )
80 {
81 return 1;
82 }
83
84 if ( v1 instanceof String )
85 {
86 return compare( ( String ) v1, ( String ) v2 );
87 }
88 else if ( v1 instanceof Value )
89 {
90 return compare( ( ( Value ) v1 ).getString(), ( ( Value ) v2 ).getString() );
91 }
92 else
93 {
94 return Long.compare( ( Long ) v1, ( Long ) v2 );
95 }
96 }
97
98
99
100
101
102
103
104
105
106
107 private int compare( String backendValue, String assertValue )
108 {
109 if ( LOG.isDebugEnabled() )
110 {
111 LOG.debug( I18n.msg( I18n.MSG_13746_COMPARING_INTEGER, backendValue, assertValue ) );
112 }
113
114
115
116
117 if ( backendValue == assertValue )
118 {
119 return 0;
120 }
121
122
123
124
125 if ( ( backendValue == null ) || ( assertValue == null ) )
126 {
127 return backendValue == null ? -1 : 1;
128 }
129
130
131
132 NumericNormalizer normalizer = new NumericNormalizer();
133
134 try
135 {
136 backendValue = normalizer.normalize( backendValue );
137 }
138 catch ( LdapException le )
139 {
140 throw new IllegalArgumentException( I18n.err( I18n.ERR_13724_INVALID_VALUE, backendValue ), le );
141 }
142 try
143 {
144 assertValue = normalizer.normalize( assertValue );
145 }
146 catch ( LdapException le )
147 {
148 throw new IllegalArgumentException( I18n.err( I18n.ERR_13724_INVALID_VALUE, assertValue ), le );
149 }
150
151 try
152 {
153
154 Long l1 = Long.valueOf( backendValue );
155 Long l2 = Long.valueOf( assertValue );
156
157 return l1.compareTo( l2 );
158 }
159 catch ( NumberFormatException nfe )
160 {
161
162 BigInteger b1 = new BigInteger( backendValue );
163 BigInteger b2 = new BigInteger( assertValue );
164
165 return b1.compareTo( b2 );
166 }
167 }
168 }