Bundletool dev
[mir.git] / source / mir / misc / MessageMethodModel.java
1 /*\r
2  * Copyright (C) 2001, 2002  The Mir-coders group\r
3  *\r
4  * This file is part of Mir.\r
5  *\r
6  * Mir is free software; you can redistribute it and/or modify\r
7  * it under the terms of the GNU General Public License as published by\r
8  * the Free Software Foundation; either version 2 of the License, or\r
9  * (at your option) any later version.\r
10  *\r
11  * Mir is distributed in the hope that it will be useful,\r
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
14  * GNU General Public License for more details.\r
15  *\r
16  * You should have received a copy of the GNU General Public License\r
17  * along with Mir; if not, write to the Free Software\r
18  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\r
19  *\r
20  * In addition, as a special exception, The Mir-coders gives permission to link\r
21  * the code of this program with the com.oreilly.servlet library, any library\r
22  * licensed under the Apache Software License, The Sun (tm) Java Advanced\r
23  * Imaging library (JAI), The Sun JIMI library (or with modified versions of\r
24  * the above that use the same license as the above), and distribute linked\r
25  * combinations including the two.  You must obey the GNU General Public\r
26  * License in all respects for all of the code used other than the above\r
27  * mentioned libraries.  If you modify this file, you may extend this exception\r
28  * to your version of the file, but you are not obligated to do so.  If you do\r
29  * not wish to do so, delete this exception statement from your version.\r
30  */\r
31 \r
32 package mir.misc;\r
33 \r
34 import java.util.List;\r
35 import java.util.Locale;\r
36 \r
37 import org.apache.struts.util.MessageResources;\r
38 \r
39 import freemarker.template.SimpleScalar;\r
40 import freemarker.template.TemplateMethodModel;\r
41 import freemarker.template.TemplateModel;\r
42 \r
43 /**\r
44  * A FreeMarker <code>TemplateMethodModel</code> that provides access to a\r
45  * Struts <code>MessageResources</code>, for use in Interantionalized templates.\r
46  *\r
47  * @author Kellan <kellan@protest.net>\r
48  */\r
49 \r
50 public class MessageMethodModel implements TemplateMethodModel {\r
51 \r
52   /**\r
53    * The perferred locale for this instance of MessageMethod.\r
54    */\r
55   private Locale locale;\r
56 \r
57   /**\r
58    * The MessageResources to query, a single instance shared for\r
59    * the lifetime of servlet.\r
60    */\r
61   private MessageResources messages;\r
62   private MessageResources messages2;\r
63 \r
64 \r
65   /**\r
66    * Construct a MessageMethod that uses the JVM's default locale.\r
67    *\r
68    * @param message The MessageResources object to query\r
69    */\r
70   public MessageMethodModel(MessageResources messages) {\r
71     this(null, messages);\r
72   }\r
73 \r
74   /**\r
75    * Construct a MessageMethod\r
76    *\r
77    * @param locale a Locale object, persumably initialized\r
78    *               from users Accept-Language header field\r
79    *\r
80    * @param message The MessageResources object to query\r
81    */\r
82   public MessageMethodModel(Locale aLocale, MessageResources aMessages) {\r
83     this(aLocale, aMessages, null);\r
84   }\r
85 \r
86   public MessageMethodModel(Locale aLocale, MessageResources aMessages,\r
87                             MessageResources aMessages2) {\r
88     locale = aLocale;\r
89     messages = aMessages;\r
90     messages2 = aMessages2;\r
91   }\r
92 \r
93   /**\r
94    * Takes the first argument as a resource key, then looks up\r
95    * a string in the MessagesResources, based on that key, and the Locale\r
96    *\r
97    * TODO: error messages should be i18n :)\r
98    *\r
99    * @param arguments List passed in by FM, first arguement is a string used as the key\r
100    *                  all subsequent arguments are used as described in MessageResources\r
101    *                  (they are filled into the placehoders of the string being returned)\r
102    */\r
103   public TemplateModel exec(List arguments) {\r
104     if (arguments != null) {\r
105       String key = (String) arguments.get(0);\r
106       arguments.remove(0);\r
107       String mesg = null;\r
108 \r
109       if (messages!=null)\r
110         mesg = messages.getMessage(locale, key, arguments.toArray());\r
111 \r
112       if (mesg == null && messages2!=null) {\r
113         mesg = messages2.getMessage(locale, key, arguments.toArray());\r
114       }\r
115 \r
116       if (mesg == null) {\r
117         return new SimpleScalar(errUnknownTag + key);\r
118       }\r
119       return new SimpleScalar(mesg);\r
120     }\r
121     else {\r
122       return missingKeyScalar;\r
123     }\r
124   }\r
125 \r
126   // i'm not real clear on how this is used - kellan :)\r
127   public boolean isEmpty() {\r
128     if (messages == null)\r
129       return true;\r
130     else\r
131       return false;\r
132   }\r
133 \r
134   private static String errUnknownTag = "MESSAGE NOT FOUND: ";\r
135   private static String missingKey = "MESSAGE CALL WITHOUT KEY";\r
136   private static SimpleScalar missingKeyScalar = new SimpleScalar(missingKey);\r
137 }\r