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.announce.modules.solr.search;
35
36 import fr.paris.lutece.plugins.announce.business.Announce;
37 import fr.paris.lutece.plugins.announce.business.AnnounceHome;
38 import fr.paris.lutece.plugins.announce.business.AnnounceSort;
39 import fr.paris.lutece.plugins.announce.service.AnnouncePlugin;
40 import fr.paris.lutece.plugins.announce.service.announcesearch.AnnounceSearchItem;
41 import fr.paris.lutece.plugins.announce.utils.AnnounceUtils;
42 import fr.paris.lutece.plugins.search.solr.business.field.Field;
43 import fr.paris.lutece.plugins.search.solr.indexer.SolrIndexer;
44 import fr.paris.lutece.plugins.search.solr.indexer.SolrIndexerService;
45 import fr.paris.lutece.plugins.search.solr.indexer.SolrItem;
46 import fr.paris.lutece.plugins.search.solr.util.SolrConstants;
47 import fr.paris.lutece.portal.service.content.XPageAppService;
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.util.AppLogService;
51 import fr.paris.lutece.portal.service.util.AppPropertiesService;
52 import fr.paris.lutece.util.url.UrlItem;
53
54 import org.apache.tika.exception.TikaException;
55 import org.apache.tika.metadata.Metadata;
56 import org.apache.tika.parser.ParseContext;
57 import org.apache.tika.parser.html.HtmlParser;
58 import org.apache.tika.sax.BodyContentHandler;
59 import org.xml.sax.ContentHandler;
60 import org.xml.sax.SAXException;
61
62 import java.io.ByteArrayInputStream;
63 import java.io.IOException;
64 import java.io.InputStream;
65 import java.io.Reader;
66 import java.io.StringReader;
67 import java.nio.charset.StandardCharsets;
68 import java.util.ArrayList;
69 import java.util.List;
70
71
72
73
74
75 public class SolrAnnounceIndexer implements SolrIndexer
76 {
77
78 private static final String PARAMETER_ANNOUNCE_ID = "announce_id";
79
80 private static final String PROPERTY_DESCRIPTION = "announce-solr.indexer.description";
81 private static final String PROPERTY_NAME = "announce-solr.indexer.name";
82 private static final String PROPERTY_VERSION = "announce-solr.indexer.version";
83 private static final String PROPERTY_INDEXER_ENABLE = "announce-solr.indexer.enable";
84 private static final String PROPERTY_TAGS_LABEL = "announce-solr.indexer.tags.label";
85 private static final String PROPERTY_TAGS_DESCRIPTION = "announce-solr.indexer.tags.description";
86 private static final String SHORT_NAME = "announce";
87
88 private static final String BLANK = " ";
89 private static final List<String> LIST_RESSOURCES_NAME = new ArrayList<String>( );
90
91 private static final String ANNOUNCE_INDEXATION_ERROR = "[SolrAnnounceIndexer] An error occured during the indexation of the announce number ";
92
93
94
95
96 public SolrAnnounceIndexer( )
97 {
98 super( );
99
100 LIST_RESSOURCES_NAME.add( Announce.RESOURCE_TYPE );
101 }
102
103
104
105
106 @Override
107 public String getDescription( )
108 {
109 return AppPropertiesService.getProperty( PROPERTY_DESCRIPTION );
110 }
111
112
113
114
115 @Override
116 public String getName( )
117 {
118 return AppPropertiesService.getProperty( PROPERTY_NAME );
119 }
120
121
122
123
124 @Override
125 public String getVersion( )
126 {
127 return AppPropertiesService.getProperty( PROPERTY_VERSION );
128 }
129
130
131
132
133 @Override
134 public List<String> indexDocuments( )
135 {
136 Plugin plugin = PluginService.getPlugin( AnnouncePlugin.PLUGIN_NAME );
137
138 List<String> lstErrors = new ArrayList<String>( );
139
140
141
142 for ( Announce announce : AnnounceHome.findAllPublished( AnnounceSort.DEFAULT_SORT ) )
143 {
144 try
145 {
146 if ( !announce.getSuspended( ) && !announce.getSuspendedByUser( ) )
147 {
148 UrlItem urlAnnounce = new UrlItem( SolrIndexerService.getBaseUrl( ) );
149 urlAnnounce.addParameter( XPageAppService.PARAM_XPAGE_APP,
150 AppPropertiesService.getProperty( AnnounceUtils.PARAMETER_PAGE_ANNOUNCE ) );
151 urlAnnounce.addParameter( PARAMETER_ANNOUNCE_ID, announce.getId( ) );
152
153 SolrItem item = getDocument( announce, urlAnnounce.getUrl( ), plugin );
154 SolrIndexerService.write( item );
155 }
156 }
157 catch ( Exception e )
158 {
159 lstErrors.add( SolrIndexerService.buildErrorMessage( e ) );
160 AppLogService.error( ANNOUNCE_INDEXATION_ERROR + announce.getId( ), e );
161 }
162 }
163
164 return lstErrors;
165 }
166
167
168
169
170 @Override
171 public boolean isEnable( )
172 {
173 return "true".equalsIgnoreCase( AppPropertiesService.getProperty( PROPERTY_INDEXER_ENABLE ) );
174 }
175
176
177
178
179 @Override
180 public List<Field> getAdditionalFields( )
181 {
182 List<Field> fields = new ArrayList<Field>( );
183 Field field = new Field( );
184 field.setEnableFacet( false );
185 field.setName( AnnounceSearchItem.FIELD_TAGS );
186 field.setLabel( AppPropertiesService.getProperty( PROPERTY_TAGS_LABEL ) );
187 field.setDescription( AppPropertiesService.getProperty( PROPERTY_TAGS_DESCRIPTION ) );
188 fields.add( field );
189
190 return fields;
191 }
192
193
194
195
196 @Override
197 public List<SolrItem> getDocuments( String strDocument )
198 {
199 List<SolrItem> listDocs = new ArrayList<SolrItem>( );
200 Plugin plugin = PluginService.getPlugin( AnnouncePlugin.PLUGIN_NAME );
201
202 for ( Announce announce : AnnounceHome.findAllPublished( AnnounceSort.DEFAULT_SORT ) )
203 {
204 if ( !announce.getSuspended( ) && !announce.getSuspendedByUser( ) )
205 {
206 UrlItem urlAnnounce = new UrlItem( SolrIndexerService.getBaseUrl( ) );
207 urlAnnounce.addParameter( XPageAppService.PARAM_XPAGE_APP, AnnounceUtils.PARAMETER_PAGE_ANNOUNCE );
208 urlAnnounce.addParameter( PARAMETER_ANNOUNCE_ID, announce.getId( ) );
209
210 SolrItem docAnnounce;
211
212 try
213 {
214 docAnnounce = getDocument( announce, urlAnnounce.getUrl( ), plugin );
215 listDocs.add( docAnnounce );
216 }
217 catch ( Exception e )
218 {
219 throw new RuntimeException( );
220 }
221 }
222 }
223
224 return listDocs;
225 }
226
227
228
229
230
231
232
233
234
235
236 private SolrItem getDocument( Announce announce, String strUrl, Plugin plugin )
237 throws IOException, InterruptedException
238 {
239
240 SolrItem item = new SolrItem( );
241
242
243 List<String> categories = new ArrayList<String>( );
244 categories.add( announce.getCategory( ).getLabel( ) );
245 item.setCategorie( categories );
246
247
248 item.addDynamicField( AnnounceSearchItem.FIELD_TAGS, announce.getTags( ) );
249
250
251 item.setUrl( strUrl );
252
253
254 item.setUid( getResourceUid( String.valueOf( announce.getId( ) ), Announce.RESOURCE_TYPE ) );
255
256
257 item.setDate( announce.getDateCreation( ) );
258
259
260 String strContentToIndex = getContentToIndex( announce, plugin );
261
262 HtmlParser parser = new HtmlParser( );
263 ContentHandler handler = new BodyContentHandler();
264 Metadata metadata = new Metadata();
265 InputStream stream = new ByteArrayInputStream(strContentToIndex.getBytes(StandardCharsets.UTF_8));
266 try {
267 parser.parse(stream, handler, metadata, new ParseContext());
268 } catch (SAXException e) {
269 e.printStackTrace();
270 } catch (TikaException e) {
271 e.printStackTrace();
272 }
273
274
275 item.setContent( handler.toString( ) );
276
277
278 item.setTitle( announce.getTitle( ) );
279
280
281 item.setSite( SolrIndexerService.getWebAppName( ) );
282
283
284 item.setType( AnnouncePlugin.PLUGIN_NAME );
285
286
287 return item;
288 }
289
290
291
292
293
294
295
296 private static String getContentToIndex( Announce announce, Plugin plugin )
297 {
298 StringBuffer sbContentToIndex = new StringBuffer( );
299
300 sbContentToIndex.append( announce.getTitle( ) );
301 sbContentToIndex.append( BLANK );
302 sbContentToIndex.append( announce.getDescription( ) );
303 sbContentToIndex.append( BLANK );
304 sbContentToIndex.append( announce.getTags( ) );
305
306 return sbContentToIndex.toString( );
307 }
308
309
310
311
312 @Override
313 public String getResourceUid( String strResourceId, String strResourceType )
314 {
315 StringBuffer sb = new StringBuffer( strResourceId );
316 sb.append( SolrConstants.CONSTANT_UNDERSCORE ).append( SHORT_NAME );
317
318 return sb.toString( );
319 }
320
321
322
323
324 @Override
325 public List<String> getResourcesName( )
326 {
327 return LIST_RESSOURCES_NAME;
328 }
329 }