View Javadoc
1   /*
2    * Copyright (c) 2002-2019, Mairie de Paris
3    * All rights reserved.
4    *
5    * Redistribution and use in source and binary forms, with or without
6    * modification, are permitted provided that the following conditions
7    * are met:
8    *
9    *  1. Redistributions of source code must retain the above copyright notice
10   *     and the following disclaimer.
11   *
12   *  2. Redistributions in binary form must reproduce the above copyright notice
13   *     and the following disclaimer in the documentation and/or other materials
14   *     provided with the distribution.
15   *
16   *  3. Neither the name of 'Mairie de Paris' nor 'Lutece' nor the names of its
17   *     contributors may be used to endorse or promote products derived from
18   *     this software without specific prior written permission.
19   *
20   * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
21   * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22   * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23   * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE
24   * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
25   * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
26   * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
27   * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
28   * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
29   * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
30   * POSSIBILITY OF SUCH DAMAGE.
31   *
32   * License 1.0
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   * This class provides the user interface to manage FriendlyUrl features ( manage, create, modify, remove )
68   */
69  public class FriendlyUrlJspBean extends SEOPanelJspBean
70  {
71      // //////////////////////////////////////////////////////////////////////////
72      // Constants
73  
74      // Right
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      // parameters
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      // templates
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     // properties for page titles
114     private static final String PROPERTY_PAGE_TITLE_MANAGE_FRIENDLY_URLS = "seo.manage_friendly_urls.pageTitle";
115 
116     // Markers
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     // Jsp Definition
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     // Properties
134     private static final String PROPERTY_DEFAULT_LIST_URLREWRITERRULE_PER_PAGE = "seo.listFriendlyUrls.itemsPerPage";
135 
136     // Messages
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     // Variables
141     private int _nDefaultItemsPerPage;
142     private String _strCurrentPageIndex;
143     private int _nItemsPerPage;
144 
145     /**
146      * Returns the list of friendly_url
147      *
148      * @param request
149      *            The Http request
150      * @return the friendly_urls list
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      * Provides the create url page
179      *
180      * @param request
181      *            The HTTP request
182      * @return The page
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      * Create a new url
200      *
201      * @param request
202      *            The HTTP request
203      * @return the forward url
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      * Provides the modify url page
222      *
223      * @param request
224      *            The HTTP request
225      * @return The page
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      * Modify url's attributes
246      *
247      * @param request
248      *            The HTTP request
249      * @return The forward url
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      * Fills url infos from the request
271      *
272      * @param request
273      *            The HTTP request
274      * @param url
275      *            The url object to fill
276      * @return An ErrorUrl or null if no error
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( "&", "&amp;" ) );
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      * Confirm the url deletion
304      *
305      * @param request
306      *            The HTTP request
307      * @return The forward url
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      * Delete the url
321      *
322      * @param request
323      *            The HTTP request
324      * @return The forward url
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      * Remove all URL
338      * 
339      * @param request
340      *            The HTTP request
341      * @return The forward url
342      */
343     public String doDeleteAllUrls( HttpServletRequest request )
344     {
345         FriendlyUrlHome.removeAll( );
346 
347         return JSP_MANAGE_FRIENDLY_URLS;
348     }
349 
350     /**
351      * Generate the url file
352      *
353      * @param request
354      *            The HTTP request
355      * @return The forward url
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      * Returns the Generate Alias Rules page
380      *
381      * @param request
382      *            The HTTP request
383      * @return The page
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      * Returns the Generate Alias Rules page
399      *
400      * @param request
401      *            The HTTP request
402      * @return The page
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      * Retrieve an option value from the request
423      * 
424      * @param request
425      *            The HTTP request
426      * @param strParameter
427      *            The parameter
428      * @return The value
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      * Enable or disable the replace post processor service
439      *
440      * @param request
441      *            The HTTP request
442      * @return The page
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      * Toggle replace URL in content (enabled/disabled)
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      * Toggle add Canonical URL in content (enabled/disabled)
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      * Toggle start Friendly URL daemon (enabled/disabled)
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      * Save update to generator settings
529      * 
530      * @param request
531      *            The HTTP request
532      * @return The forward URL
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     // Panel
549 
550     /**
551      * {@inheritDoc }
552      */
553     @Override
554     public String getPanelTitle( )
555     {
556         return I18nService.getLocalizedString( PROPERTY_TITLE, getPanelLocale( ) );
557     }
558 
559     /**
560      * {@inheritDoc }
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      * {@inheritDoc }
580      */
581     @Override
582     public int getPanelOrder( )
583     {
584         return PANEL_ORDER;
585     }
586 
587     /**
588      * {@inheritDoc }
589      */
590     @Override
591     public String getPanelKey( )
592     {
593         return PANEL_KEY;
594     }
595 }