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.digglike.service.search;
35
36 import fr.paris.lutece.plugins.digglike.business.CommentSubmit;
37 import fr.paris.lutece.plugins.digglike.business.Digg;
38 import fr.paris.lutece.plugins.digglike.business.DiggFilter;
39 import fr.paris.lutece.plugins.digglike.business.DiggHome;
40 import fr.paris.lutece.plugins.digglike.business.DiggSubmit;
41 import fr.paris.lutece.plugins.digglike.business.SubmitFilter;
42 import fr.paris.lutece.plugins.digglike.service.DiggSubmitService;
43 import fr.paris.lutece.plugins.digglike.service.DigglikePlugin;
44 import fr.paris.lutece.plugins.digglike.service.digglikesearch.DigglikeSearchItem;
45 import fr.paris.lutece.plugins.digglike.web.DiggApp;
46 import fr.paris.lutece.portal.service.content.XPageAppService;
47 import fr.paris.lutece.portal.service.message.SiteMessageException;
48 import fr.paris.lutece.portal.service.plugin.Plugin;
49 import fr.paris.lutece.portal.service.plugin.PluginService;
50 import fr.paris.lutece.portal.service.search.IndexationService;
51 import fr.paris.lutece.portal.service.search.SearchIndexer;
52 import fr.paris.lutece.portal.service.search.SearchItem;
53 import fr.paris.lutece.portal.service.util.AppException;
54 import fr.paris.lutece.portal.service.util.AppPathService;
55 import fr.paris.lutece.portal.service.util.AppPropertiesService;
56 import fr.paris.lutece.util.url.UrlItem;
57
58 import java.io.ByteArrayInputStream;
59 import java.io.IOException;
60 import java.io.StringWriter;
61 import java.util.ArrayList;
62 import java.util.List;
63
64 import org.apache.lucene.document.Document;
65 import org.apache.lucene.document.Field;
66 import org.apache.lucene.document.FieldType;
67 import org.apache.lucene.document.StringField;
68 import org.apache.lucene.document.TextField;
69 import org.apache.tika.exception.TikaException;
70 import org.apache.tika.metadata.Metadata;
71 import org.apache.tika.parser.ParseContext;
72 import org.apache.tika.parser.html.HtmlParser;
73 import org.apache.tika.sax.BodyContentHandler;
74 import org.xml.sax.ContentHandler;
75 import org.xml.sax.SAXException;
76
77
78
79
80
81
82 public class DigglikeIndexer implements SearchIndexer
83 {
84 public static final String INDEX_TYPE_DIGG = "digg";
85 public static final String PROPERTY_INDEXER_NAME = "digglike.indexer.name";
86 public static final String SHORT_NAME = "dgl";
87 private static final String ENABLE_VALUE_TRUE = "1";
88 private static final String PROPERTY_INDEXER_DESCRIPTION = "digglike.indexer.description";
89 private static final String PROPERTY_INDEXER_VERSION = "digglike.indexer.version";
90 private static final String PROPERTY_INDEXER_ENABLE = "digglike.indexer.enable";
91 private static final String PROPERTY_XPAGE_APPLICATION_ID = "digglike.xpage.applicationId";
92 private static final String JSP_SEARCH_DIGG = "jsp/site/Portal.jsp?page=digg";
93
94
95 private static final String PARAMETER_ID_DIGG = "id_digg";
96 private static final String PARAMETER_ID_DIGG_SUBMIT = "id_digg_submit";
97
98
99
100
101
102 public String getDescription( )
103 {
104 return AppPropertiesService.getProperty( PROPERTY_INDEXER_DESCRIPTION );
105 }
106
107
108
109
110
111
112
113 public void indexDocuments( ) throws IOException, InterruptedException, SiteMessageException
114 {
115 Plugin plugin = PluginService.getPlugin( DigglikePlugin.PLUGIN_NAME );
116
117
118 DiggFilter diggFilter = new DiggFilter( );
119 diggFilter.setIdState( Digg.STATE_ENABLE );
120
121 List<Digg> diggActivatedList = DiggHome.getDiggList( diggFilter, plugin );
122 List<Integer> diggSubmitActivatedList;
123
124 SubmitFilter submitFilter = new SubmitFilter( );
125
126 submitFilter.getSortBy( ).add( SubmitFilter.SORT_BY_SCORE_DESC );
127 submitFilter.getSortBy( ).add( SubmitFilter.SORT_BY_DATE_RESPONSE_DESC );
128
129 for ( Digg digg : diggActivatedList )
130 {
131 submitFilter.setIdDigg( digg.getIdDigg( ) );
132 diggSubmitActivatedList = DiggSubmitService.getService( ).getDiggSubmitListId( submitFilter, plugin );
133
134 for ( Integer idDiggSubmit : diggSubmitActivatedList )
135 {
136
137
138 List<Document> listDocDiggSubmit = null;
139
140 try
141 {
142 listDocDiggSubmit = getDocuments( idDiggSubmit.toString( ) );
143 }
144 catch ( Exception e )
145 {
146 String strMessage = "Digg ID : " + digg.getIdDigg( );
147 IndexationService.error( this, e, strMessage );
148 }
149
150 if ( ( listDocDiggSubmit != null ) && ( listDocDiggSubmit.size( ) != 0 ) )
151 {
152 for ( Document docDiggSubmit : listDocDiggSubmit )
153 {
154 IndexationService.write( docDiggSubmit );
155 }
156 }
157 }
158 }
159 }
160
161
162
163
164
165
166
167
168
169 public List<Document> getDocuments( String strIdDiggSubmit ) throws IOException, InterruptedException,
170 SiteMessageException
171 {
172 List<org.apache.lucene.document.Document> listDocs = new ArrayList<org.apache.lucene.document.Document>( );
173 String strPortalUrl = AppPathService.getPortalUrl( );
174 Integer nIdDiggSubmit = Integer.parseInt( strIdDiggSubmit );
175 Plugin plugin = PluginService.getPlugin( DigglikePlugin.PLUGIN_NAME );
176 DiggSubmit diggSubmit = DiggSubmitService.getService( ).findByPrimaryKey( nIdDiggSubmit, true, plugin );
177
178
179
180
181 if ( diggSubmit != null )
182 {
183
184
185 UrlItem url = new UrlItem( strPortalUrl );
186 url.addParameter( XPageAppService.PARAM_XPAGE_APP,
187 AppPropertiesService.getProperty( PROPERTY_XPAGE_APPLICATION_ID, "digg" ) );
188 url.addParameter( PARAMETER_ID_DIGG, diggSubmit.getDigg( ).getIdDigg( ) );
189 url.addParameter( PARAMETER_ID_DIGG_SUBMIT, diggSubmit.getIdDiggSubmit( ) );
190 url.addParameter( DiggApp.PARAMETER_DIGG_DETAIL, 1 );
191
192
193
194 org.apache.lucene.document.Document docDiggSubmit = getDocument( diggSubmit, url.getUrl( ) );
195 listDocs.add( docDiggSubmit );
196 }
197
198
199 return listDocs;
200 }
201
202
203
204
205
206
207
208
209
210
211
212
213 public static org.apache.lucene.document.Document getDocument( DiggSubmit diggSubmit, String strUrl )
214 throws IOException, InterruptedException
215 {
216
217 org.apache.lucene.document.Document doc = new org.apache.lucene.document.Document( );
218
219 FieldType ft = new FieldType( StringField.TYPE_STORED );
220 ft.setOmitNorms( false );
221
222 FieldType ftNo = new FieldType( StringField.TYPE_STORED );
223 ftNo.setIndexed( false );
224 ftNo.setTokenized( false );
225 ftNo.setOmitNorms( false );
226
227
228
229 doc.add( new Field( SearchItem.FIELD_URL, strUrl, ft ) );
230
231 doc.add( new Field( DigglikeSearchItem.FIELD_ID_DIGG, String.valueOf( diggSubmit.getDigg( ).getIdDigg( ) ), ft ) );
232 doc.add( new Field( DigglikeSearchItem.FIELD_ID_DIGG_SUBMIT, Integer.toString( diggSubmit.getIdDiggSubmit( ) ),
233 ft ) );
234
235
236
237
238 doc.add( new Field( DigglikeSearchItem.FIELD_UID, String.valueOf( diggSubmit.getIdDiggSubmit( ) ) + "_"
239 + SHORT_NAME, ft ) );
240
241 doc.add( new Field( DigglikeSearchItem.FIELD_STATE, Integer.toString( diggSubmit.getDiggSubmitState( )
242 .getIdDiggSubmitState( ) ), ft ) );
243
244 StringWriter writerFieldContent = new StringWriter( );
245 writerFieldContent.write( diggSubmit.getDiggSubmitValue( ) );
246
247
248 if ( diggSubmit.getComments( ) != null )
249 {
250 for ( CommentSubmit comment : diggSubmit.getComments( ) )
251 {
252 writerFieldContent.write( comment.getValue( ) );
253 }
254 }
255
256 ContentHandler handler = new BodyContentHandler( );
257 Metadata metadata = new Metadata( );
258 try
259 {
260 new HtmlParser( ).parse( new ByteArrayInputStream( writerFieldContent.toString( ).getBytes( ) ), handler,
261 metadata, new ParseContext( ) );
262 }
263 catch ( SAXException e )
264 {
265 throw new AppException( "Error during page parsing." );
266 }
267 catch ( TikaException e )
268 {
269 throw new AppException( "Error during page parsing." );
270 }
271
272
273
274 StringBuilder sb = new StringBuilder( handler.toString( ) );
275
276
277 doc.add( new Field( DigglikeSearchItem.FIELD_CONTENTS, sb.toString( ), TextField.TYPE_NOT_STORED ) );
278
279
280
281 doc.add( new Field( DigglikeSearchItem.FIELD_TITLE, diggSubmit.getDiggSubmitTitle( ), ftNo ) );
282
283
284
285
286 doc.add( new Field( DigglikeSearchItem.FIELD_TYPE, INDEX_TYPE_DIGG, ft ) );
287
288 Plugin plugin = PluginService.getPlugin( DigglikePlugin.PLUGIN_NAME );
289 Digg digg = DiggHome.findByPrimaryKey( diggSubmit.getDigg( ).getIdDigg( ), plugin );
290
291 if( digg.getRole() != null )
292 {
293 doc.add( new Field( SearchItem.FIELD_ROLE, digg.getRole( ), ft ) );
294 }
295
296
297 return doc;
298 }
299
300
301
302
303
304 public String getName( )
305 {
306 return AppPropertiesService.getProperty( PROPERTY_INDEXER_NAME );
307 }
308
309
310
311
312
313 public String getVersion( )
314 {
315 return AppPropertiesService.getProperty( PROPERTY_INDEXER_VERSION );
316 }
317
318
319
320
321
322 public boolean isEnable( )
323 {
324 boolean bReturn = false;
325 String strEnable = AppPropertiesService.getProperty( PROPERTY_INDEXER_ENABLE );
326
327 if ( ( strEnable != null )
328 && ( strEnable.equalsIgnoreCase( Boolean.TRUE.toString( ) ) || strEnable.equals( ENABLE_VALUE_TRUE ) )
329 && PluginService.isPluginEnable( DigglikePlugin.PLUGIN_NAME ) )
330 {
331 bReturn = true;
332 }
333
334 return bReturn;
335 }
336
337
338
339
340 public List<String> getListType( )
341 {
342 List<String> listType = new ArrayList<String>( );
343 listType.add( INDEX_TYPE_DIGG );
344
345 return listType;
346 }
347
348
349
350
351 public String getSpecificSearchAppUrl( )
352 {
353 return JSP_SEARCH_DIGG;
354 }
355 }