1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34 package fr.paris.lutece.plugins.directory.utils.sort;
35
36 import fr.paris.lutece.plugins.directory.business.EntryTypeGeolocation;
37 import fr.paris.lutece.plugins.directory.business.IEntry;
38 import fr.paris.lutece.plugins.directory.business.Record;
39 import fr.paris.lutece.plugins.directory.business.RecordField;
40 import fr.paris.lutece.portal.service.util.AppLogService;
41 import fr.paris.lutece.util.sort.AttributeComparator;
42
43 import java.util.ArrayList;
44 import java.util.Collections;
45 import java.util.Comparator;
46 import java.util.Date;
47 import java.util.List;
48
49
50
51
52
53
54 public class RecordComparator implements Comparator<Record>
55 {
56 private static final String CONSTANT_VALUE = "value";
57 private static final String EMPTY_STRING = "";
58 private IEntry _entry;
59 private boolean _bIsAscSort;
60
61
62
63
64
65
66
67
68
69 public RecordComparator( IEntry entry, boolean bIsAscSort )
70 {
71 _entry = entry;
72 _bIsAscSort = bIsAscSort;
73 }
74
75
76
77
78
79
80
81
82
83
84 @Override
85 public int compare( Record r1, Record r2 )
86 {
87 int nStatus = 0;
88 RecordField rf1 = getRecordFieldToCompare( r1 );
89 RecordField rf2 = getRecordFieldToCompare( r2 );
90
91 if ( ( rf1 != null ) && ( rf2 != null ) )
92 {
93 if ( _entry instanceof fr.paris.lutece.plugins.directory.business.EntryTypeDate )
94 {
95 try
96 {
97 Long lTime1 = Long.parseLong( rf1.getValue( ) );
98 Date date1 = new Date( lTime1 );
99 Long lTime2 = Long.parseLong( rf2.getValue( ) );
100 Date date2 = new Date( lTime2 );
101 nStatus = date1.compareTo( date2 );
102 }
103 catch( Exception e )
104 {
105 AppLogService.error( e );
106 }
107 }
108 else
109 if ( _entry instanceof fr.paris.lutece.plugins.directory.business.EntryTypeNumbering )
110 {
111 try
112 {
113 nStatus = Integer.parseInt( rf1.getValue( ) ) - Integer.parseInt( rf2.getValue( ) );
114 }
115 catch( Exception e )
116 {
117 AppLogService.error( e );
118 }
119 }
120 else
121 {
122 if ( ( rf1.getValue( ) == null ) && ( rf2.getValue( ) != null ) )
123 {
124 nStatus = -1;
125 }
126 else
127 if ( ( rf1.getValue( ) != null ) && ( rf2.getValue( ) == null ) )
128 {
129 nStatus = 1;
130 }
131 else
132 if ( ( rf1.getValue( ) != null ) && ( rf2.getValue( ) != null ) )
133 {
134 nStatus = rf1.getValue( ).compareToIgnoreCase( rf2.getValue( ) );
135 }
136 }
137 }
138
139 if ( !_bIsAscSort )
140 {
141 nStatus = nStatus * ( -1 );
142 }
143
144 return nStatus;
145 }
146
147
148
149
150
151
152
153
154 private RecordField getRecordFieldToCompare( Record r )
155 {
156 RecordField rf = null;
157
158 if ( _entry instanceof fr.paris.lutece.plugins.directory.business.EntryTypeCheckBox
159 || _entry instanceof fr.paris.lutece.plugins.directory.business.EntryTypeSelect )
160 {
161 List<RecordField> listRecordFields = new ArrayList<RecordField>( );
162
163 for ( RecordField recordField : r.getListRecordField( ) )
164 {
165 if ( recordField.getEntry( ).getIdEntry( ) == _entry.getIdEntry( ) )
166 {
167 if ( recordField.getValue( ) == null )
168 {
169 recordField.setValue( EMPTY_STRING );
170 }
171
172 listRecordFields.add( recordField );
173 }
174 }
175
176 Collections.sort( listRecordFields, new AttributeComparator( CONSTANT_VALUE, _bIsAscSort ) );
177
178 if ( listRecordFields.size( ) > 0 )
179 {
180 rf = listRecordFields.get( 0 );
181 }
182 }
183 else
184 if ( _entry instanceof fr.paris.lutece.plugins.directory.business.EntryTypeGeolocation )
185 {
186 for ( RecordField recordField : r.getListRecordField( ) )
187 {
188 if ( ( recordField.getEntry( ).getIdEntry( ) == _entry.getIdEntry( ) )
189 && recordField.getField( ).getTitle( ).equals( EntryTypeGeolocation.CONSTANT_ADDRESS ) )
190 {
191 rf = recordField;
192 }
193 }
194 }
195 else
196 if ( _entry instanceof fr.paris.lutece.plugins.directory.business.EntryTypeDate
197 || _entry instanceof fr.paris.lutece.plugins.directory.business.EntryTypeDirectory
198 || _entry instanceof fr.paris.lutece.plugins.directory.business.EntryTypeMail
199 || _entry instanceof fr.paris.lutece.plugins.directory.business.EntryTypeUrl
200 || _entry instanceof fr.paris.lutece.plugins.directory.business.EntryTypeNumbering
201 || _entry instanceof fr.paris.lutece.plugins.directory.business.EntryTypeSQL
202 || _entry instanceof fr.paris.lutece.plugins.directory.business.EntryTypeText
203 || _entry instanceof fr.paris.lutece.plugins.directory.business.EntryTypeTextArea
204 || _entry instanceof fr.paris.lutece.plugins.directory.business.EntryTypeRadioButton
205 || _entry instanceof fr.paris.lutece.plugins.directory.business.EntryTypeRichText
206 || _entry instanceof fr.paris.lutece.plugins.directory.business.EntryTypeInternalLink
207 || _entry instanceof fr.paris.lutece.plugins.directory.business.EntryTypeMyLuteceUser )
208 {
209 for ( RecordField recordField : r.getListRecordField( ) )
210 {
211 if ( recordField.getEntry( ).getIdEntry( ) == _entry.getIdEntry( ) )
212 {
213 rf = recordField;
214 }
215 }
216 }
217
218 return rf;
219 }
220 }