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 }