1 package br.com.ibnetwork.guara.message.impl;
2
3 import java.io.File;
4 import java.io.FileFilter;
5 import java.util.ArrayList;
6 import java.util.HashMap;
7 import java.util.Iterator;
8 import java.util.List;
9 import java.util.Locale;
10 import java.util.Map;
11
12 import org.apache.avalon.framework.activity.Initializable;
13 import org.apache.avalon.framework.configuration.Configurable;
14 import org.apache.avalon.framework.configuration.Configuration;
15 import org.apache.avalon.framework.configuration.ConfigurationException;
16 import org.apache.avalon.framework.configuration.DefaultConfigurationBuilder;
17 import org.apache.avalon.framework.service.ServiceException;
18 import org.apache.avalon.framework.service.ServiceManager;
19 import org.apache.avalon.framework.service.Serviceable;
20 import org.apache.commons.io.filefilter.DirectoryFileFilter;
21 import org.apache.commons.io.filefilter.SuffixFileFilter;
22 import org.apache.commons.lang.StringUtils;
23 import org.apache.commons.logging.Log;
24 import org.apache.commons.logging.LogFactory;
25
26 import br.com.ibnetwork.guara.message.SystemMessage;
27 import br.com.ibnetwork.guara.message.SystemMessageBroker;
28 import br.com.ibnetwork.guara.message.SystemMessageException;
29
30
31 public class XMLSystemMessageBroker
32 implements SystemMessageBroker, Serviceable, Configurable,Initializable
33 {
34 private Log logger;
35
36 private Locale defaultLocale;
37
38 private boolean isLenient;
39
40 private Map messages;
41
42 private String messageRepoBasePath;
43
44 private DefaultConfigurationBuilder reader;
45
46 public void service(ServiceManager manager)
47 throws ServiceException
48 {
49 logger = LogFactory.getLog(XMLSystemMessageBroker.class);
50 }
51
52 public void configure(Configuration conf)
53 throws ConfigurationException
54 {
55 String language = conf.getChild("localeConfig").getAttribute("language");
56 String country = conf.getChild("localeConfig").getAttribute("country");
57 defaultLocale = new Locale(language,country);
58 messageRepoBasePath = conf.getChild("repository").getAttribute("path");
59 logger.info("SystemMessage repository is ["+messageRepoBasePath+"]");
60 isLenient = conf.getChild("isLenient").getAttributeAsBoolean("value",false);
61 }
62
63 public void initialize()
64 throws Exception
65 {
66 File base = new File(messageRepoBasePath);
67 reader = new DefaultConfigurationBuilder();
68 File localeDirs[] = base.listFiles((FileFilter)DirectoryFileFilter.INSTANCE);
69 messages = new HashMap(localeDirs.length);
70 for (int i = 0; i < localeDirs.length; i++)
71 {
72 File localeDir = localeDirs[i];
73 Locale locale = buildLocaleFromFileName(localeDir);
74 List localeMessages = extractMessages(localeDir);
75 messages.put(locale,localeMessages);
76 }
77 }
78
79 private List extractMessages(File baseDir)
80 throws Exception
81 {
82 List result = new ArrayList();
83 String fileNames[] = baseDir.list(new SuffixFileFilter(".xml"));
84 for (int j = 0; j < fileNames.length; j++)
85 {
86 String fileName = baseDir.getAbsolutePath() + File.separator + fileNames[j];
87 SystemMessage[] fileMessages = readMessagesFromFile(fileName);
88 if(fileMessages == null)
89 {
90 return result;
91 }
92 for (int k = 0; k < fileMessages.length; k++)
93 {
94 SystemMessage message = fileMessages[k];
95 result.add(message);
96 logger.debug("Adding message id["+message.getId()+"] from file["+fileName+"]");
97 }
98 }
99 return result;
100 }
101
102 private Locale buildLocaleFromFileName(File dir)
103 {
104 String dirName = dir.getName();
105 String[] parts = StringUtils.split(dirName,"_");
106
107 String language = parts[0];
108 if(parts.length > 1)
109 {
110 String country = parts[1];
111 return new Locale(language,country);
112 }
113 else
114 {
115 return new Locale(language);
116 }
117 }
118
119 private SystemMessage[] readMessagesFromFile(String fileName)
120 throws Exception
121 {
122 logger.info("Reading messages from file ["+fileName+"]");
123 Configuration[] conf = reader.buildFromFile(fileName).getChildren("message");
124 SystemMessage[] result = new SystemMessage[conf.length];
125 for (int i = 0; i < conf.length; i++)
126 {
127 Configuration msgConf = conf[i];
128 SystemMessage message = createMessageInstance(msgConf);
129 result[i] = message;
130 }
131 return result;
132 }
133
134 private SystemMessage createMessageInstance(Configuration msgConf)
135 throws Exception
136 {
137 String id = msgConf.getAttribute("id");
138 String type = msgConf.getAttribute("type",SystemMessage.DEFAULT_MESSAGE_TYPE);
139 String text = msgConf.getValue();
140 SystemMessage msg = new SystemMessageDefaultImpl(id,text,type);
141 return msg;
142 }
143
144 public Locale getDefaultLocale()
145 {
146 return defaultLocale;
147 }
148
149 public boolean isLenient()
150 {
151 return isLenient;
152 }
153
154 public SystemMessage getSystemMessage(String msgId)
155 throws SystemMessageException
156 {
157 return getSystemMessage(msgId,defaultLocale);
158 }
159
160 public SystemMessage getSystemMessage(String msgId, Locale locale)
161 throws SystemMessageException
162 {
163 return findMessage(msgId,locale);
164 }
165
166 private SystemMessage findMessage(String msgId,Locale locale)
167 throws SystemMessageException
168 {
169 List localeMessages = (List) messages.get(locale);
170 for (Iterator iter = localeMessages.iterator(); iter.hasNext();)
171 {
172 SystemMessage msg = (SystemMessage) iter.next();
173 if(msg.getId().equals(msgId))
174 {
175 return msg;
176 }
177 }
178 if(isLenient)
179 {
180 return null;
181 }
182 throw new SystemMessageException("Message id["+msgId+"] not found.Locale ["+locale+"]");
183 }
184 }