AbstractMessageFormatTemplateMethod.java

  1. /*
  2.  * Copyright (c) 2002-2022, City of 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.portal.service.template;

  35. import freemarker.core.Environment;

  36. import freemarker.template.TemplateDateModel;
  37. import freemarker.template.TemplateMethodModelEx;
  38. import freemarker.template.TemplateModel;
  39. import freemarker.template.TemplateModelException;
  40. import freemarker.template.TemplateNumberModel;
  41. import freemarker.template.TemplateScalarModel;

  42. import java.text.MessageFormat;

  43. import java.util.List;
  44. import java.util.Locale;

  45. public abstract class AbstractMessageFormatTemplateMethod implements TemplateMethodModelEx
  46. {
  47.     @Override
  48.     public Object exec( @SuppressWarnings( "rawtypes" ) List arguments ) throws TemplateModelException
  49.     {
  50.         int argsSize = arguments.size( );

  51.         if ( argsSize < 1 )
  52.         {
  53.             throw new TemplateModelException( "Must be called with at least one argument (the message key)" );
  54.         }

  55.         String key = ( (TemplateScalarModel) arguments.get( 0 ) ).getAsString( );
  56.         Locale locale = Environment.getCurrentEnvironment( ).getLocale( );

  57.         if ( argsSize == 1 )
  58.         {
  59.             // no arguments, the message is not a MessageFormat
  60.             return getPattern( key, locale );
  61.         }

  62.         Object [ ] args = new Object [ argsSize - 1];

  63.         for ( int i = 1; i < argsSize; i++ )
  64.         {
  65.             TemplateModel arg = (TemplateModel) arguments.get( i );

  66.             if ( arg instanceof TemplateScalarModel )
  67.             {
  68.                 args [i - 1] = ( (TemplateScalarModel) arg ).getAsString( );
  69.             }
  70.             else
  71.                 if ( arg instanceof TemplateNumberModel )
  72.                 {
  73.                     args [i - 1] = ( (TemplateNumberModel) arg ).getAsNumber( );
  74.                 }
  75.                 else
  76.                     if ( arg instanceof TemplateDateModel )
  77.                     {
  78.                         args [i - 1] = ( (TemplateDateModel) arg ).getAsDate( );
  79.                     }
  80.                     else
  81.                     {
  82.                         throw new TemplateModelException( "Unsupported argument type : " + arg );
  83.                     }
  84.         }

  85.         return new MessageFormat( getPattern( key, locale ), locale ).format( args, new StringBuffer( ), null ).toString( );
  86.     }

  87.     protected abstract String getPattern( String key, Locale locale );
  88. }