KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > compiere > util > Msg


1 /******************************************************************************
2  * The contents of this file are subject to the Compiere License Version 1.1
3  * ("License"); You may not use this file except in compliance with the License
4  * You may obtain a copy of the License at http://www.compiere.org/license.html
5  * Software distributed under the License is distributed on an "AS IS" basis,
6  * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for
7  * the specific language governing rights and limitations under the License.
8  * The Original Code is Compiere ERP & CRM Business Solution
9  * The Initial Developer of the Original Code is Jorg Janke and ComPiere, Inc.
10  * Portions created by Jorg Janke are Copyright (C) 1999-2001 Jorg Janke, parts
11  * created by ComPiere are Copyright (C) ComPiere, Inc.; All Rights Reserved.
12  * Contributor(s): ______________________________________.
13  *****************************************************************************/

14 package org.compiere.util;
15
16 import java.sql.*;
17 import java.util.*;
18 import java.text.*;
19 import java.io.*;
20
21 import org.compiere.Compiere;
22
23 /**
24  * Reads all Messages and stores them in a HashMap
25  *
26  * @author Jorg Janke
27  * @version $Id: Msg.java,v 1.9 2003/10/10 01:01:05 jjanke Exp $
28  */

29 public final class Msg
30 {
31     /** Initial size of HashMap */
32     private static final int MAP_SIZE = 750;
33     /** Separator between Msg and optional Tip */
34     private static final String JavaDoc SEPARATOR = Env.NL + Env.NL;
35
36     /** Singleton */
37     private static Msg s_msg = null;
38
39     /** Logger */
40     private static Logger s_log = Logger.getCLogger (Msg.class);
41
42     /**
43      * Get Message Object
44      * @return Mag
45      */

46     private static Msg get()
47     {
48         if (s_msg == null)
49             s_msg = new Msg();
50         return s_msg;
51     } // get
52

53     /*************************************************************************/
54
55     /**
56      * Constructor
57      */

58     private Msg()
59     {
60     } // Mag
61

62     /** The Map */
63     private CCache m_languages = new CCache("msg_lang", 2);
64
65     /**
66      * Get Language specific Message Map
67      * @param ad_language Language Key
68      * @return HashMap of Language
69      */

70     private CCache getMsgMap (String JavaDoc ad_language)
71     {
72         String JavaDoc AD_Language = ad_language;
73         if (AD_Language == null || AD_Language.length() == 0)
74             AD_Language = Language.getBaseAD_Language();
75         // Do we have the language ?
76
CCache retValue = (CCache)m_languages.get(AD_Language);
77         if (retValue != null)
78             return retValue;
79
80         // Load Language
81
retValue = initMsg(AD_Language);
82         if (retValue != null)
83         {
84             m_languages.put(AD_Language, retValue);
85             return retValue;
86         }
87         return retValue;
88     } // getMsgMap
89

90
91     /**
92      * Init message HashMap
93      * @param AD_Language Language
94      * @return Cache HashMap
95      */

96     private CCache initMsg (String JavaDoc AD_Language)
97     {
98         CCache msg = new CCache ("msg", MAP_SIZE);
99         //
100
if (!DB.isConnected())
101         {
102             s_log.error("initMsg - no DB Connection");
103             return null;
104         }
105         try
106         {
107             PreparedStatement pstmt = null;
108             if (AD_Language == null || AD_Language.length() == 0 || Env.isBaseLanguage(AD_Language, "AD_Language"))
109                 pstmt = DB.prepareStatement("SELECT Value, MsgText, MsgTip FROM AD_Message");
110             else
111             {
112                 pstmt = DB.prepareStatement("SELECT m.Value, t.MsgText, t.MsgTip "
113                     + "FROM AD_Message_Trl t, AD_Message m "
114                     + "WHERE m.AD_Message_ID=t.AD_Message_ID"
115                     + " AND t.AD_Language=?");
116                 pstmt.setString(1, AD_Language);
117             }
118             ResultSet rs = pstmt.executeQuery();
119
120             // get values
121
while (rs.next())
122             {
123                 String JavaDoc AD_Message = rs.getString(1);
124                 StringBuffer JavaDoc MsgText = new StringBuffer JavaDoc();
125                 MsgText.append(rs.getString(2));
126                 String JavaDoc MsgTip = rs.getString(3);
127                 //
128
if (MsgTip != null) // messageTip on next line, if exists
129
MsgText.append(" ").append(SEPARATOR).append(MsgTip);
130                 msg.put(AD_Message, MsgText.toString());
131             }
132
133             rs.close();
134             pstmt.close();
135         }
136         catch (SQLException e)
137         {
138             s_log.error("initMsg", e);
139             return null;
140         }
141         //
142
if (msg.size() < 100)
143         {
144             s_log.error("initMsg - Too few (" + msg.size() + ") Records found for " + AD_Language);
145             return null;
146         }
147         s_log.info("initMsg records=" + msg.size() + " - " + AD_Language);
148         return msg;
149     } // initMsg
150

151     /**
152      * Reset Message cache
153      */

154     public void reset()
155     {
156         if (m_languages == null)
157             return;
158
159         // clear all languages
160
Iterator iterator = m_languages.values().iterator();
161         while (iterator.hasNext())
162         {
163             HashMap hm = (HashMap)iterator.next();
164             hm.clear();
165         }
166         m_languages.clear();
167     } // reset
168

169     /**
170      * Return an array of the installed Languages
171      * @return Array of loaded Languages or null
172      */

173     public String JavaDoc[] getLanguages()
174     {
175         if (m_languages == null)
176             return null;
177         String JavaDoc[] retValue = new String JavaDoc[m_languages.size()];
178         m_languages.keySet().toArray(retValue);
179         return retValue;
180     } // getLanguages
181

182     /**
183      * Check if Language is loaded
184      * @param language Language code
185      * @return true, if language is loaded
186      */

187     public boolean isLoaded (String JavaDoc language)
188     {
189         if (m_languages == null)
190             return false;
191         return m_languages.containsKey(language);
192     } // isLoaded
193

194     /**
195      * Lookup term
196      * @param AD_Language language
197      * @param text text
198      * @return translated term or null
199      */

200     private String JavaDoc lookup (String JavaDoc AD_Language, String JavaDoc text)
201     {
202         if (text == null)
203             return null;
204         if (AD_Language == null || AD_Language.length() == 0)
205             return text;
206         // hardcoded trl
207
if (text.equals("/") || text.equals("\\"))
208             return File.separator;
209         if (text.equals(";") || text.equals(":"))
210             return File.pathSeparator;
211         if (text.equals("COMPIERE_HOME"))
212             return Compiere.getCompiereHome();
213         if (text.equals("bat") || text.equals("sh"))
214         {
215             if (System.getProperty("os.name").startsWith("Win"))
216                 return "bat";
217             return "sh";
218         }
219         if (text.equals("CopyRight"))
220             return Compiere.COPYRIGHT;
221         //
222
HashMap langMap = getMsgMap(AD_Language);
223         if (langMap == null)
224             return text;
225         return (String JavaDoc)langMap.get(text);
226     } // lookup
227

228     /*************************************************************************/
229
230     /**
231      * Get translated text for AD_Message
232      * @param ad_language - Language
233      * @param AD_Message - Message Key
234      * @return translated text
235      */

236     public static String JavaDoc getMsg (String JavaDoc ad_language, String JavaDoc AD_Message)
237     {
238         if (AD_Message == null || AD_Message.length() == 0)
239             return "";
240         //
241
String JavaDoc AD_Language = ad_language;
242         if (AD_Language == null || AD_Language.length() == 0)
243             AD_Language = Language.getBaseAD_Language();
244         //
245
String JavaDoc retStr = get().lookup (AD_Language, AD_Message);
246         //
247
if (retStr == null || retStr.length() == 0)
248         {
249             if (Log.isTraceLevel(Log.l6_Database))
250             {
251                 s_log.error("getMsg - NOT found: " + AD_Message);
252             // Trace.printStack();
253
}
254             return AD_Message;
255         }
256
257         return retStr;
258     } // getMsg
259

260     /**
261      * Get translated text message for AD_Message
262      * @param ctx Context to retrieve language
263      * @param AD_Message - Message Key
264      * @return translated text
265      */

266     public static String JavaDoc getMsg (Properties ctx, String JavaDoc AD_Message)
267     {
268         return getMsg (Env.getAD_Language(ctx), AD_Message);
269     } // getMeg
270

271     /**
272      * Get translated text message for AD_Message
273      * @param language Language
274      * @param AD_Message - Message Key
275      * @return translated text
276      */

277     public static String JavaDoc getMsg (Language language, String JavaDoc AD_Message)
278     {
279         return getMsg (language.getAD_Language(), AD_Message);
280     } // getMeg
281

282     /**
283      * Get translated text message for AD_Message
284      * @param ad_language - Language
285      * @param AD_Message - Message Key
286      * @param getText if true only return Text, if false only return Tip
287      * @return translated text
288      */

289     public static String JavaDoc getMsg (String JavaDoc ad_language, String JavaDoc AD_Message, boolean getText)
290     {
291         String JavaDoc retStr = getMsg (ad_language, AD_Message);
292         int pos = retStr.indexOf(SEPARATOR);
293         // No Tip
294
if (pos == -1)
295         {
296             if (getText)
297                 return retStr;
298             else
299                 return "";
300         }
301         else // with Tip
302
{
303             if (getText)
304                 retStr = retStr.substring (0, pos);
305             else
306             {
307                 int start = pos + SEPARATOR.length();
308                 int end = retStr.length();
309                 retStr = retStr.substring (start);
310             }
311         }
312         return retStr;
313     } // getMsg
314

315     /**
316      * Get translated text message for AD_Message
317      * @param ctx Context to retrieve language
318      * @param AD_Message Message Key
319      * @param getText if true only return Text, if false only return Tip
320      * @return translated text
321      */

322     public static String JavaDoc getMsg (Properties ctx, String JavaDoc AD_Message, boolean getText)
323     {
324         return getMsg (Env.getAD_Language(ctx), AD_Message, getText);
325     } // getMsg
326

327     /**
328      * Get translated text message for AD_Message
329      * @param language Language
330      * @param AD_Message Message Key
331      * @param getText if true only return Text, if false only return Tip
332      * @return translated text
333      */

334     public static String JavaDoc getMsg (Language language, String JavaDoc AD_Message, boolean getText)
335     {
336         return getMsg (language.getAD_Language(), AD_Message, getText);
337     } // getMsg
338

339     /**
340      * Get clear text for AD_Message with parameters
341      * @param ctx Context to retrieve language
342      * @param AD_Message Message yey
343      * @param args MessageFormat arguments
344      * @return translated text
345      * @see java.text.MessageFormat for formatting options
346      */

347     public static String JavaDoc getMsg(Properties ctx, String JavaDoc AD_Message, Object JavaDoc[] args)
348     {
349         return getMsg (Env.getAD_Language(ctx), AD_Message, args);
350     } // getMsg
351

352     /**
353      * Get clear text for AD_Message with parameters
354      * @param language Language
355      * @param AD_Message Message yey
356      * @param args MessageFormat arguments
357      * @return translated text
358      * @see java.text.MessageFormat for formatting options
359      */

360     public static String JavaDoc getMsg(Language language, String JavaDoc AD_Message, Object JavaDoc[] args)
361     {
362         return getMsg (language.getAD_Language(), AD_Message, args);
363     } // getMsg
364

365     /**
366      * Get clear text for AD_Message with parameters
367      * @param ad_language Language
368      * @param AD_Message Message yey
369      * @param args MessageFormat arguments
370      * @return translated text
371      * @see java.text.MessageFormat for formatting options
372      */

373     public static String JavaDoc getMsg (String JavaDoc ad_language, String JavaDoc AD_Message, Object JavaDoc[] args)
374     {
375         String JavaDoc retStr = getMsg(ad_language, AD_Message);
376         retStr = MessageFormat.format(retStr, args); // format string
377
return retStr;
378     } // getMsg
379

380     /*************************************************************************/
381
382     /**
383      * Get Amount in Words
384      * @param language language
385      * @param amount numeric amount (352.80)
386      * @return amount in words (three*five*two 80/100)
387      */

388     public static String JavaDoc getAmtInWords (Language language, String JavaDoc amount)
389     {
390         if (amount == null || language == null)
391             return amount;
392         //
393
StringBuffer JavaDoc sb = new StringBuffer JavaDoc();
394         int pos = amount.lastIndexOf('.');
395         int pos2 = amount.lastIndexOf(',');
396         if (pos2 > pos)
397             pos = pos2;
398         for (int i = 0; i < amount.length(); i++)
399         {
400             if (pos == i) // we are done
401
{
402                 String JavaDoc cents = amount.substring(i+1);
403                 sb.append(' ').append(cents).append("/100");
404                 break;
405             }
406             else
407             {
408                 char c = amount.charAt(i);
409                 if (c == ',' || c == '.') // skip thousand separator
410
continue;
411                 if (sb.length() > 0)
412                     sb.append("*");
413                 sb.append(getMsg(language, String.valueOf(c)));
414             }
415         }
416         return sb.toString();
417     } // getAmtInWords
418

419
420     /*************************************************************************/
421
422     /**
423      * Get Translation for Element
424      * @param ad_language language
425      * @param ColumnName column name
426      * @param isSOTrx if false PO terminology is used (if exists)
427      * @return Name of the Column or "" if not found
428      */

429     public static String JavaDoc getElement (String JavaDoc ad_language, String JavaDoc ColumnName, boolean isSOTrx)
430     {
431         if (ColumnName == null || ColumnName.equals(""))
432             return "";
433         String JavaDoc AD_Language = ad_language;
434         if (AD_Language == null || AD_Language.length() == 0)
435             AD_Language = Language.getBaseAD_Language();
436
437         // Check AD_Element
438
String JavaDoc retStr = "";
439         try
440         {
441             PreparedStatement pstmt = null;
442             try
443             {
444                 if (AD_Language == null || AD_Language.length() == 0 || Env.isBaseLanguage(AD_Language, "AD_Element"))
445                     pstmt = DB.prepareStatement("SELECT Name, PO_Name FROM AD_Element WHERE UPPER(ColumnName)=?");
446                 else
447                 {
448                     pstmt = DB.prepareStatement("SELECT t.Name, t.PO_Name FROM AD_Element_Trl t, AD_Element e "
449                         + "WHERE t.AD_Element_ID=e.AD_Element_ID AND UPPER(e.ColumnName)=? "
450                         + "AND t.AD_Language=?");
451                     pstmt.setString(2, AD_Language);
452                 }
453             }
454             catch (Exception JavaDoc e)
455             {
456                 return ColumnName;
457             }
458             pstmt.setString(1, ColumnName.toUpperCase());
459             ResultSet rs = pstmt.executeQuery();
460             if (rs.next())
461             {
462                 retStr = rs.getString(1);
463                 if (!isSOTrx)
464                 {
465                     String JavaDoc temp = rs.getString(2);
466                     if (temp != null && temp.length() > 0)
467                         retStr = temp;
468                 }
469             }
470             rs.close();
471             pstmt.close();
472         }
473         catch (SQLException e)
474         {
475             s_log.error ("getElement", e);
476             return "";
477         }
478         if (retStr != null)
479             return retStr.trim();
480         return retStr;
481     } // getElement
482

483     /**
484      * Get Translation for Element using Sales terminology
485      * @param ctx context
486      * @param ColumnName column name
487      * @return Name of the Column or "" if not found
488      */

489     public static String JavaDoc getElement (Properties ctx, String JavaDoc ColumnName)
490     {
491         return getElement (Env.getAD_Language(ctx), ColumnName, true);
492     } // getElement
493

494     /**
495      * Get Translation for Element
496      * @param ctx context
497      * @param ColumnName column name
498      * @param isSOTrx sales transaction
499      * @return Name of the Column or "" if not found
500      */

501     public static String JavaDoc getElement (Properties ctx, String JavaDoc ColumnName, boolean isSOTrx)
502     {
503         return getElement (Env.getAD_Language(ctx), ColumnName, isSOTrx);
504     } // getElement
505

506
507     /*************************************************************************/
508
509     /**
510      * "Translate" text.
511      * <pre>
512      * - Check AD_Message.AD_Message -> MsgText
513      * - Check AD_Element.ColumnName -> Name
514      * </pre>
515      * If checking AD_Element, the SO terminology is used.
516      * @param ad_language Language
517      * @param text Text
518      * @return translated text or original text if not found
519      */

520     public static String JavaDoc translate(String JavaDoc ad_language, String JavaDoc text)
521     {
522         if (text == null || text.equals(""))
523             return "";
524         String JavaDoc AD_Language = ad_language;
525         if (AD_Language == null || AD_Language.length() == 0)
526             AD_Language = Language.getBaseAD_Language();
527
528         // Check AD_Message
529
String JavaDoc retStr = get().lookup (AD_Language, text);
530         if (retStr != null)
531             return retStr;
532
533         // Check AD_Element
534
retStr = getElement(AD_Language, text, true);
535         if (!retStr.equals(""))
536             return retStr.trim();
537
538         // Nothing found
539
if (!text.startsWith("*") && Log.getTraceLevel() > Log.l6_Database)
540             s_log.warn("translate - NOT found: " + text);
541         return text;
542     } // translate
543

544     /**
545      * "Translate" text.
546      * <pre>
547      * - Check Context
548      * - Check AD_Message.AD_Message -> MsgText
549      * - Check AD_Element.ColumnName -> Name
550      * </pre>
551      * @param ctx Context
552      * @param text Text
553      * @return translated text or original text if not found
554      */

555     public static String JavaDoc translate(Properties ctx, String JavaDoc text)
556     {
557         String JavaDoc s = (String JavaDoc)ctx.get(text);
558         if (s != null && s.length() > 0)
559             return s;
560         return translate (Env.getAD_Language(ctx), text);
561     } // translate
562

563     /**
564      * "Translate" text.
565      * <pre>
566      * - Check AD_Message.AD_Message -> MsgText
567      * - Check AD_Element.ColumnName -> Name
568      * </pre>
569      * @param language Language
570      * @param text Text
571      * @return translated text or original text if not found
572      */

573     public static String JavaDoc translate(Language language, String JavaDoc text)
574     {
575         return translate (language.getAD_Language(), text);
576     } // translate
577

578     /**
579      * Translate elements enclosed in @
580      * @param ctx Context
581      * @param text Text
582      * @return translated text or original text if not found
583      */

584     public static String JavaDoc parseTranslation(Properties ctx, String JavaDoc text)
585     {
586         if (text == null || text.length() == 0)
587             return text;
588
589         String JavaDoc inStr = text;
590         String JavaDoc token;
591         StringBuffer JavaDoc outStr = new StringBuffer JavaDoc();
592
593         int i = inStr.indexOf("@");
594         while (i != -1)
595         {
596             outStr.append(inStr.substring(0, i)); // up to @
597
inStr = inStr.substring(i+1, inStr.length()); // from first @
598

599             int j = inStr.indexOf("@"); // next @
600
if (j < 0) // no second tag
601
{
602                 inStr = "@" + inStr;
603                 break;
604             }
605
606             token = inStr.substring(0, j);
607             outStr.append(translate(ctx, token)); // replace context
608

609             inStr = inStr.substring(j+1, inStr.length()); // from second @
610
i = inStr.indexOf("@");
611         }
612
613         outStr.append(inStr); // add remainder
614
return outStr.toString();
615     } // parseTranslation
616

617 } // Msg
618
Popular Tags