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.seo.web;
35
36 import fr.paris.lutece.plugins.seo.business.FriendlyUrl;
37 import fr.paris.lutece.plugins.seo.business.FriendlyUrlHome;
38 import fr.paris.lutece.plugins.seo.service.CanonicalUrlService;
39 import fr.paris.lutece.plugins.seo.service.FriendlyUrlService;
40 import fr.paris.lutece.plugins.seo.service.RuleFileService;
41 import fr.paris.lutece.plugins.seo.service.SEODataKeys;
42 import fr.paris.lutece.plugins.seo.service.generator.FriendlyUrlGeneratorService;
43 import fr.paris.lutece.plugins.seo.service.generator.GeneratorOptions;
44 import fr.paris.lutece.plugins.seo.service.sitemap.SitemapUtils;
45 import fr.paris.lutece.portal.service.datastore.DatastoreService;
46 import fr.paris.lutece.portal.service.i18n.I18nService;
47 import fr.paris.lutece.portal.service.message.AdminMessage;
48 import fr.paris.lutece.portal.service.message.AdminMessageService;
49 import fr.paris.lutece.portal.service.template.AppTemplateService;
50 import fr.paris.lutece.portal.service.util.AppLogService;
51 import fr.paris.lutece.portal.service.util.AppPropertiesService;
52 import fr.paris.lutece.portal.web.constants.Messages;
53 import fr.paris.lutece.portal.web.util.LocalizedPaginator;
54 import fr.paris.lutece.util.html.HtmlTemplate;
55 import fr.paris.lutece.util.html.Paginator;
56 import fr.paris.lutece.util.url.UrlItem;
57
58 import java.io.IOException;
59
60 import java.util.HashMap;
61 import java.util.List;
62 import java.util.Map;
63
64 import javax.servlet.http.HttpServletRequest;
65
66
67
68
69 public class FriendlyUrlJspBean extends SEOPanelJspBean
70 {
71
72
73
74
75 public static final String RIGHT_MANAGE_SEO = SEOJspBean.RIGHT_MANAGE_SEO;
76
77 public static final String PARAMETER_URL_ID = "id_url";
78 public static final String PARAMETER_TOGGLE = "toggle";
79 public static final String PARAMETER_FROM = "rule_from";
80 public static final String PARAMETER_TO = "rule_to";
81 public static final String PARAMETER_CANONICAL = "canonical";
82 public static final String PARAMETER_SITEMAP = "sitemap";
83 public static final String PARAMETER_CHANGE_FREQ = "change_freq";
84 public static final String PARAMETER_PRIORITY = "priority";
85
86 public static final String TOGGLE_CANONICAL_URLS = "add_canonical_url";
87 public static final String TOGGLE_REPLACE_URL = "replace_url_in_content";
88 public static final String TOGGLE_FRIENDLY_URL_DAEMON = "friendly_url_daemon_enabled";
89
90
91 private static final String PARAMETER_GENERATOR_KEY = "generator_key";
92 private static final String PARAMETER_URLREWRITERRULE_PAGE_INDEX = "page_index";
93 private static final String PARAMETER_OPTION_FORCE_UPDATE = "option_force_update";
94 private static final String PARAMETER_OPTION_ADD_PATH = "option_add_path";
95 private static final String PARAMETER_OPTION_HTML_SUFFIX = "option_html_suffix";
96 private static final String VALUE_ON = "on";
97
98
99 private static final String TEMPLATE_MANAGE_FRIENDLY_URL = "/admin/plugins/seo/manage_friendly_urls.html";
100 private static final String TEMPLATE_CREATE_RULE = "/admin/plugins/seo/create_friendly_url.html";
101 private static final String TEMPLATE_MODIFY_RULE = "/admin/plugins/seo/modify_friendly_url.html";
102 private static final String TEMPLATE_GENERATE_ALIAS = "/admin/plugins/seo/generate_friendly_urls.html";
103 private static final String TEMPLATE_CONTENT = "/admin/plugins/seo/panel/friendly_urls_panel.html";
104 private static final String MARK_REWRITE_CONFIG_UPDATE = "rewrite_config_last_update";
105 private static final String MARK_CONFIG_UPTODATE = "config_uptodate";
106 private static final String MARK_URL_REPLACE = "url_replace";
107 private static final String MARK_CANONICAL_URLS = "canonical_urls";
108 private static final String MARK_FRIENDLY_URL_DAEMON = "friendly_url_daemon";
109 private static final String PROPERTY_TITLE = "seo.panel.friendly_urls.title";
110 private static final int PANEL_ORDER = 1;
111 private static final String PANEL_KEY = "FRIENDLY_URL";
112
113
114 private static final String PROPERTY_PAGE_TITLE_MANAGE_FRIENDLY_URLS = "seo.manage_friendly_urls.pageTitle";
115
116
117 private static final String MARK_RULE = "url";
118 private static final String MARK_FRIENDLY_URLS_LIST = "friendly_url_list";
119 private static final String MARK_PAGINATOR = "paginator";
120 private static final String MARK_NB_ITEMS_PER_PAGE = "nb_items_per_page";
121 private static final String MARK_GENERATORS_LIST = "generators_list";
122 private static final String MARK_CHANGE_FREQ_LIST = "change_freq_list";
123 private static final String MARK_SELECTED_CHANGE_FREQ = "selected_change_freq";
124 private static final String MARK_PRIORITY_LIST = "priority_list";
125 private static final String MARK_SELECTED_PRIORITY = "selected_priority";
126
127
128 private static final String JSP_DO_DELETE_URL = "jsp/admin/plugins/seo/DoRemoveFriendlyUrl.jsp";
129 private static final String JSP_URL_MANAGE_FRIENDLY_URLS = "jsp/admin/plugins/seo/ManageFriendlyUrls.jsp";
130 private static final String JSP_MANAGE_FRIENDLY_URLS = "ManageFriendlyUrls.jsp";
131 private static final String JSP_GENERATE_FRIENDLY_URLS = "GenerateAliasRules.jsp";
132
133
134 private static final String PROPERTY_DEFAULT_LIST_URLREWRITERRULE_PER_PAGE = "seo.listFriendlyUrls.itemsPerPage";
135
136
137 private static final String MESSAGE_CONFIRM_REMOVE_URL = "seo.message.confirmRemoveUrl";
138 private static final String MESSAGE_GENERATION_FAILED = "seo.message.generationSuccessful";
139
140
141 private int _nDefaultItemsPerPage;
142 private String _strCurrentPageIndex;
143 private int _nItemsPerPage;
144
145
146
147
148
149
150
151
152 public String getManageFriendlyUrls( HttpServletRequest request )
153 {
154 setPageTitleProperty( PROPERTY_PAGE_TITLE_MANAGE_FRIENDLY_URLS );
155
156 _strCurrentPageIndex = Paginator.getPageIndex( request, Paginator.PARAMETER_PAGE_INDEX, _strCurrentPageIndex );
157 _nDefaultItemsPerPage = AppPropertiesService.getPropertyInt( PROPERTY_DEFAULT_LIST_URLREWRITERRULE_PER_PAGE, 50 );
158 _nItemsPerPage = Paginator.getItemsPerPage( request, Paginator.PARAMETER_ITEMS_PER_PAGE, _nItemsPerPage, _nDefaultItemsPerPage );
159
160 UrlItem url = new UrlItem( JSP_URL_MANAGE_FRIENDLY_URLS );
161 String strUrl = url.getUrl( );
162 List<FriendlyUrl> listFriendlyUrls = FriendlyUrlHome.findAll( );
163 LocalizedPaginator paginator = new LocalizedPaginator( (List<FriendlyUrl>) listFriendlyUrls, _nItemsPerPage, strUrl,
164 PARAMETER_URLREWRITERRULE_PAGE_INDEX, _strCurrentPageIndex, getLocale( ) );
165
166 Map<String, Object> model = new HashMap<String, Object>( );
167
168 model.put( MARK_NB_ITEMS_PER_PAGE, "" + _nItemsPerPage );
169 model.put( MARK_PAGINATOR, paginator );
170 model.put( MARK_FRIENDLY_URLS_LIST, paginator.getPageItems( ) );
171
172 HtmlTemplate templateList = AppTemplateService.getTemplate( TEMPLATE_MANAGE_FRIENDLY_URL, getLocale( ), model );
173
174 return getAdminPage( templateList.getHtml( ) );
175 }
176
177
178
179
180
181
182
183
184 public String getCreateUrl( HttpServletRequest request )
185 {
186 HashMap<String, Object> model = new HashMap<String, Object>( );
187
188 model.put( MARK_CHANGE_FREQ_LIST, SitemapUtils.getChangeFrequencyValues( ) );
189 model.put( MARK_SELECTED_CHANGE_FREQ, SitemapUtils.CHANGE_FREQ_VALUES [3] );
190 model.put( MARK_PRIORITY_LIST, SitemapUtils.getPriorityValues( ) );
191 model.put( MARK_SELECTED_PRIORITY, SitemapUtils.PRIORITY_VALUES [0] );
192
193 HtmlTemplate template = AppTemplateService.getTemplate( TEMPLATE_CREATE_RULE, getLocale( ), model );
194
195 return getAdminPage( template.getHtml( ) );
196 }
197
198
199
200
201
202
203
204
205 public String doCreateUrl( HttpServletRequest request )
206 {
207 FriendlyUrlseo/business/FriendlyUrl.html#FriendlyUrl">FriendlyUrl url = new FriendlyUrl( );
208 String strErrorUrl = getData( request, url );
209
210 if ( strErrorUrl != null )
211 {
212 return strErrorUrl;
213 }
214
215 FriendlyUrlHome.create( url );
216
217 return JSP_MANAGE_FRIENDLY_URLS;
218 }
219
220
221
222
223
224
225
226
227 public String getModifyUrl( HttpServletRequest request )
228 {
229 String strRuleId = request.getParameter( PARAMETER_URL_ID );
230 int nRuleId = Integer.parseInt( strRuleId );
231
232 FriendlyUrl url = FriendlyUrlHome.findByPrimaryKey( nRuleId );
233
234 HashMap model = new HashMap( );
235 model.put( MARK_RULE, url );
236 model.put( MARK_CHANGE_FREQ_LIST, SitemapUtils.getChangeFrequencyValues( ) );
237 model.put( MARK_PRIORITY_LIST, SitemapUtils.getPriorityValues( ) );
238
239 HtmlTemplate template = AppTemplateService.getTemplate( TEMPLATE_MODIFY_RULE, getLocale( ), model );
240
241 return getAdminPage( template.getHtml( ) );
242 }
243
244
245
246
247
248
249
250
251 public String doModifyUrl( HttpServletRequest request )
252 {
253 String strRuleId = request.getParameter( PARAMETER_URL_ID );
254 int nRuleId = Integer.parseInt( strRuleId );
255
256 FriendlyUrl url = FriendlyUrlHome.findByPrimaryKey( nRuleId );
257 String strErrorUrl = getData( request, url );
258
259 if ( strErrorUrl != null )
260 {
261 return strErrorUrl;
262 }
263
264 FriendlyUrlHome.update( url );
265
266 return JSP_MANAGE_FRIENDLY_URLS;
267 }
268
269
270
271
272
273
274
275
276
277
278 private String getData( HttpServletRequest request, FriendlyUrl url )
279 {
280 String strFrom = request.getParameter( PARAMETER_FROM );
281 String strTo = request.getParameter( PARAMETER_TO );
282 String strCanonical = request.getParameter( PARAMETER_CANONICAL );
283 String strSitemap = request.getParameter( PARAMETER_SITEMAP );
284 String strChangeFreq = request.getParameter( PARAMETER_CHANGE_FREQ );
285 String strPriority = request.getParameter( PARAMETER_PRIORITY );
286
287 if ( ( strFrom == null ) || ( strFrom.equals( "" ) ) || ( strTo == null ) || ( strTo.equals( "" ) ) )
288 {
289 return AdminMessageService.getMessageUrl( request, Messages.MANDATORY_FIELDS, AdminMessage.TYPE_STOP );
290 }
291
292 url.setFriendlyUrl( strFrom );
293 url.setTechnicalUrl( strTo.replaceAll( "&", "&" ) );
294 url.setCanonical( strCanonical != null );
295 url.setSitemap( strSitemap != null );
296 url.setSitemapChangeFreq( strChangeFreq );
297 url.setSitemapPriority( strPriority );
298
299 return null;
300 }
301
302
303
304
305
306
307
308
309 public String deleteUrl( HttpServletRequest request )
310 {
311 String strUrlId = request.getParameter( PARAMETER_URL_ID );
312 UrlItem url = new UrlItem( JSP_DO_DELETE_URL );
313
314 url.addParameter( PARAMETER_URL_ID, strUrlId );
315
316 return AdminMessageService.getMessageUrl( request, MESSAGE_CONFIRM_REMOVE_URL, url.getUrl( ), AdminMessage.TYPE_CONFIRMATION );
317 }
318
319
320
321
322
323
324
325
326 public String doDeleteUrl( HttpServletRequest request )
327 {
328 String strUrlId = request.getParameter( PARAMETER_URL_ID );
329 int nUrlId = Integer.parseInt( strUrlId );
330
331 FriendlyUrlHome.remove( nUrlId );
332
333 return JSP_MANAGE_FRIENDLY_URLS;
334 }
335
336
337
338
339
340
341
342
343 public String doDeleteAllUrls( HttpServletRequest request )
344 {
345 FriendlyUrlHome.removeAll( );
346
347 return JSP_MANAGE_FRIENDLY_URLS;
348 }
349
350
351
352
353
354
355
356
357 public String doGenerate( HttpServletRequest request )
358 {
359 String strMessage;
360 int nMessageType;
361
362 try
363 {
364 RuleFileService.generateFile( );
365 }
366 catch( IOException e )
367 {
368 AppLogService.error( "Error generating url file : " + e.getMessage( ), e );
369 strMessage = MESSAGE_GENERATION_FAILED;
370 nMessageType = AdminMessage.TYPE_STOP;
371
372 return AdminMessageService.getMessageUrl( request, strMessage, getHomeUrl( request ), nMessageType );
373 }
374
375 return getHomeUrl( request );
376 }
377
378
379
380
381
382
383
384
385 public String getGenerateAliasRules( HttpServletRequest request )
386 {
387 HashMap model = new HashMap( );
388 model.put( MARK_CHANGE_FREQ_LIST, SitemapUtils.getChangeFrequencyValues( ) );
389 model.put( MARK_PRIORITY_LIST, SitemapUtils.getPriorityValues( ) );
390 model.put( MARK_GENERATORS_LIST, FriendlyUrlGeneratorService.instance( ).getGenerators( ) );
391
392 HtmlTemplate templateList = AppTemplateService.getTemplate( TEMPLATE_GENERATE_ALIAS, getLocale( ), model );
393
394 return getAdminPage( templateList.getHtml( ) );
395 }
396
397
398
399
400
401
402
403
404 public String doGenerateAliasRules( HttpServletRequest request )
405 {
406 GeneratorOptionsce/generator/GeneratorOptions.html#GeneratorOptions">GeneratorOptions options = new GeneratorOptions( );
407
408 options.setForceUpdate( getOption( request, PARAMETER_OPTION_FORCE_UPDATE ) );
409 options.setAddPath( getOption( request, PARAMETER_OPTION_ADD_PATH ) );
410 options.setHtmlSuffix( getOption( request, PARAMETER_OPTION_HTML_SUFFIX ) );
411
412 DatastoreService.setDataValue( SEODataKeys.KEY_GENERATOR_ADD_PATH, options.isAddPath( ) ? DatastoreService.VALUE_TRUE : DatastoreService.VALUE_FALSE );
413 DatastoreService.setDataValue( SEODataKeys.KEY_GENERATOR_ADD_HTML_SUFFIX,
414 options.isHtmlSuffix( ) ? DatastoreService.VALUE_TRUE : DatastoreService.VALUE_FALSE );
415
416 FriendlyUrlGeneratorService.instance( ).generate( options );
417
418 return JSP_MANAGE_FRIENDLY_URLS;
419 }
420
421
422
423
424
425
426
427
428
429
430 private boolean getOption( HttpServletRequest request, String strParameter )
431 {
432 String strValue = request.getParameter( strParameter );
433
434 return ( strValue != null ) && ( strValue.equals( VALUE_ON ) );
435 }
436
437
438
439
440
441
442
443
444 public String doToggle( HttpServletRequest request )
445 {
446 String strToggle = request.getParameter( PARAMETER_TOGGLE );
447
448 switch( strToggle )
449 {
450 case TOGGLE_REPLACE_URL:
451 toggleReplaceUrl( );
452 break;
453 case TOGGLE_CANONICAL_URLS:
454 toggleCanonicalUrls( );
455 break;
456 case TOGGLE_FRIENDLY_URL_DAEMON:
457 toggleFriendlyUrlDaemon( );
458 break;
459 default:
460 break;
461 }
462
463 return getHomeUrl( request );
464 }
465
466
467
468
469 private void toggleReplaceUrl( )
470 {
471 String strStatus = DatastoreService.getDataValue( SEODataKeys.KEY_URL_REPLACE_ENABLED, DatastoreService.VALUE_FALSE );
472
473 if ( strStatus.equals( DatastoreService.VALUE_TRUE ) )
474 {
475 DatastoreService.setDataValue( SEODataKeys.KEY_URL_REPLACE_ENABLED, DatastoreService.VALUE_FALSE );
476 FriendlyUrlService.instance( ).setUrlReplaceEnabled( false );
477 AppLogService.info( "SEO : URL replace service disabled" );
478 }
479 else
480 {
481 DatastoreService.setDataValue( SEODataKeys.KEY_URL_REPLACE_ENABLED, DatastoreService.VALUE_TRUE );
482 FriendlyUrlService.instance( ).setUrlReplaceEnabled( true );
483 AppLogService.info( "SEO : URL replace service enabled" );
484 }
485 }
486
487
488
489
490 private void toggleCanonicalUrls( )
491 {
492 String strStatus = DatastoreService.getDataValue( SEODataKeys.KEY_CANONICAL_URLS_ENABLED, DatastoreService.VALUE_FALSE );
493
494 if ( strStatus.equals( DatastoreService.VALUE_TRUE ) )
495 {
496 DatastoreService.setDataValue( SEODataKeys.KEY_CANONICAL_URLS_ENABLED, DatastoreService.VALUE_FALSE );
497 CanonicalUrlService.instance( ).setCanonicalUrlsEnabled( false );
498 AppLogService.info( "SEO : Canonical URLs disabled" );
499 }
500 else
501 {
502 DatastoreService.setDataValue( SEODataKeys.KEY_CANONICAL_URLS_ENABLED, DatastoreService.VALUE_TRUE );
503 CanonicalUrlService.instance( ).setCanonicalUrlsEnabled( true );
504 AppLogService.info( "SEO : Canonical URLs enabled" );
505 }
506 }
507
508
509
510
511 private void toggleFriendlyUrlDaemon( )
512 {
513 String strStatus = DatastoreService.getDataValue( SEODataKeys.KEY_FRIENDLY_URL_GENERATOR_DAEMON_ENABLED, DatastoreService.VALUE_FALSE );
514
515 if ( strStatus.equals( DatastoreService.VALUE_TRUE ) )
516 {
517 DatastoreService.setDataValue( SEODataKeys.KEY_FRIENDLY_URL_GENERATOR_DAEMON_ENABLED, DatastoreService.VALUE_FALSE );
518 AppLogService.info( "SEO : Friendly URL Daemon disabled" );
519 }
520 else
521 {
522 DatastoreService.setDataValue( SEODataKeys.KEY_FRIENDLY_URL_GENERATOR_DAEMON_ENABLED, DatastoreService.VALUE_TRUE );
523 AppLogService.info( "SEO : Friendly URL Daemon enabled" );
524 }
525 }
526
527
528
529
530
531
532
533
534 public String doUpdateGeneratorSettings( HttpServletRequest request )
535 {
536 String strKey = request.getParameter( PARAMETER_GENERATOR_KEY );
537 String strChangeFreq = request.getParameter( PARAMETER_CHANGE_FREQ );
538 String strPriority = request.getParameter( PARAMETER_PRIORITY );
539
540 String strPrefix = SEODataKeys.PREFIX_GENERATOR + strKey;
541 DatastoreService.setDataValue( strPrefix + SEODataKeys.SUFFIX_CHANGE_FREQ, strChangeFreq );
542 DatastoreService.setDataValue( strPrefix + SEODataKeys.SUFFIX_PRIORITY, strPriority );
543
544 return JSP_GENERATE_FRIENDLY_URLS;
545 }
546
547
548
549
550
551
552
553 @Override
554 public String getPanelTitle( )
555 {
556 return I18nService.getLocalizedString( PROPERTY_TITLE, getPanelLocale( ) );
557 }
558
559
560
561
562 @Override
563 public String getPanelContent( )
564 {
565 Map<String, Object> model = new HashMap<String, Object>( );
566 model.put( MARK_REWRITE_CONFIG_UPDATE, DatastoreService.getDataValue( SEODataKeys.KEY_REWRITE_CONFIG_UPDATE, "" ) );
567 model.put( MARK_CONFIG_UPTODATE, DatastoreService.getDataValue( SEODataKeys.KEY_CONFIG_UPTODATE, "" ).equals( DatastoreService.VALUE_TRUE ) );
568 model.put( MARK_URL_REPLACE, DatastoreService.getDataValue( SEODataKeys.KEY_URL_REPLACE_ENABLED, "" ).equals( DatastoreService.VALUE_TRUE ) );
569 model.put( MARK_CANONICAL_URLS, DatastoreService.getDataValue( SEODataKeys.KEY_CANONICAL_URLS_ENABLED, "" ).equals( DatastoreService.VALUE_TRUE ) );
570 model.put( MARK_FRIENDLY_URL_DAEMON,
571 DatastoreService.getDataValue( SEODataKeys.KEY_FRIENDLY_URL_GENERATOR_DAEMON_ENABLED, "" ).equals( DatastoreService.VALUE_TRUE ) );
572
573 HtmlTemplate template = AppTemplateService.getTemplate( TEMPLATE_CONTENT, getPanelLocale( ), model );
574
575 return template.getHtml( );
576 }
577
578
579
580
581 @Override
582 public int getPanelOrder( )
583 {
584 return PANEL_ORDER;
585 }
586
587
588
589
590 @Override
591 public String getPanelKey( )
592 {
593 return PANEL_KEY;
594 }
595 }