View Javadoc

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 }