1 package com.blandware.atleap.service.core.impl; 2 3 import com.blandware.atleap.common.util.ApplicationResourceStorage; 4 import com.blandware.atleap.common.util.ConvertUtil; 5 import com.blandware.atleap.common.util.PartialCollection; 6 import com.blandware.atleap.common.util.QueryInfo; 7 import com.blandware.atleap.model.core.ApplicationResource; 8 import com.blandware.atleap.model.core.ContentLocale; 9 import com.blandware.atleap.persistence.core.ApplicationResourceDAO; 10 import com.blandware.atleap.persistence.core.ContentLocaleDAO; 11 import com.blandware.atleap.service.core.ApplicationResourceManager; 12 import com.blandware.atleap.service.exception.BeanNotFoundException; 13 14 import java.io.IOException ; 15 import java.io.InputStream ; 16 import java.io.PrintWriter ; 17 import java.io.StringWriter ; 18 import java.util.Enumeration ; 19 import java.util.HashMap ; 20 import java.util.Iterator ; 21 import java.util.List ; 22 import java.util.Locale ; 23 import java.util.Map ; 24 import java.util.Properties ; 25 26 35 public class ApplicationResourceManagerImpl extends BaseManagerImpl implements ApplicationResourceManager { 36 37 40 protected String resourceBundleName; 41 42 45 protected ApplicationResourceDAO applicationResourceDAO; 46 47 50 protected ContentLocaleDAO contentLocaleDAO; 51 52 57 public void setResourceBundleName(String resourceBundleName) { 58 this.resourceBundleName = resourceBundleName; 59 } 60 61 66 public void setApplicationResourceDAO(ApplicationResourceDAO applicationResourceDAO) { 67 this.applicationResourceDAO = applicationResourceDAO; 68 } 69 70 75 public void setContentLocaleDAO(ContentLocaleDAO contentLocaleDAO) { 76 this.contentLocaleDAO = contentLocaleDAO; 77 } 78 79 82 public ApplicationResourceStorage loadResources(boolean overrideDynamicValues) { 83 ApplicationResourceStorage applicationResourceStorage = new ApplicationResourceStorage(); 84 85 List availableLocales = contentLocaleDAO.listContentLocales(null).asList(); 87 88 for ( Iterator i = availableLocales.iterator(); i.hasNext(); ) { 90 ContentLocale contentLocale = (ContentLocale) i.next(); 91 applicationResourceStorage.mergeBundle(loadBundle(contentLocale, overrideDynamicValues)); 92 } 93 94 List resources = listApplicationResources(null).asList(); 96 for ( Iterator i = resources.iterator(); i.hasNext(); ) { 97 ApplicationResource resource = (ApplicationResource) i.next(); 98 ApplicationResource.ApplicationResourceID id = resource.getId(); 99 String key = id.getKey(); 100 String localeIdentifier = id.getLocale().getIdentifier(); 101 Locale locale = new Locale(localeIdentifier); 102 if ( !applicationResourceStorage.isMessagePresent(locale, key) ) { 103 applicationResourceDAO.deleteApplicationResource(resource); 104 } 105 } 106 107 return applicationResourceStorage; 108 } 109 110 113 public ApplicationResourceStorage.Bundle loadBundle(ContentLocale locale) { 114 return loadBundle(locale, false); 115 } 116 117 120 public void dropBundle(String localeIdentifier) { 121 Map queryParameters = new HashMap (); 122 queryParameters.put("localeIdentifier", localeIdentifier); 123 QueryInfo queryInfo = new QueryInfo(); 124 queryInfo.setQueryParameters(queryParameters); 125 List resources = listApplicationResources(queryInfo).asList(); 126 for ( Iterator i = resources.iterator(); i.hasNext(); ) { 127 ApplicationResource resource = (ApplicationResource) i.next(); 128 applicationResourceDAO.deleteApplicationResource(resource); 129 } 130 } 131 132 135 public ApplicationResource retrieveApplicationResource(String key, String localeIdentifier) { 136 ContentLocale locale = contentLocaleDAO.retrieveContentLocale(localeIdentifier); 137 return retrieveApplicationResource(key, locale); 138 } 139 140 143 public void updateApplicationResource(String localeIdentifier, String key, String value, Long version) throws BeanNotFoundException { 144 ApplicationResource resource = retrieveApplicationResource(key, localeIdentifier); 145 if ( resource == null ) { 146 ContentLocale locale = contentLocaleDAO.retrieveContentLocale(localeIdentifier); 148 if ( locale == null ) { 149 throw new BeanNotFoundException("Locale with identifier '" + localeIdentifier + "' does not exist"); 150 } else { 151 resource = new ApplicationResource(locale, key, null); 152 } 153 } else { 154 applicationResourceDAO.removeFromCache(resource); 155 } 156 byte[] valueBytes = ConvertUtil.convertToByteArray(value); 157 if ( resource.getValue() == null || !resource.getValue().equals(valueBytes) ) { 158 resource.setValue(valueBytes); 159 160 if (version != null) 161 resource.setVersion(version); 162 163 applicationResourceDAO.updateApplicationResource(resource); 165 } 166 } 167 168 171 public PartialCollection listApplicationResources(QueryInfo queryInfo) { 172 return applicationResourceDAO.listApplicationResources(queryInfo); 173 } 174 175 183 protected ApplicationResourceStorage.Bundle loadBundle(ContentLocale contentLocale, boolean overrideDynamicValues) { 184 Locale locale = new Locale(contentLocale.getIdentifier()); 185 ApplicationResourceStorage.Bundle bundle = new ApplicationResourceStorage.Bundle(locale); 186 187 String bundleName = resourceBundleName.replace('.', '/') + "_" + contentLocale.getIdentifier(); 188 189 bundleName += ".properties"; 190 InputStream in = null; 191 Properties props = new Properties (); 192 193 ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); 194 if ( classLoader == null ) { 195 classLoader = getClass().getClassLoader(); 196 } 197 198 in = classLoader.getResourceAsStream(bundleName); 199 if ( in != null ) { 200 try { 201 props.load(in); 202 } catch ( IOException e ) { 203 if ( log.isErrorEnabled() ) { 204 log.error("Failed to load resource bundle for locale '" + contentLocale.getIdentifier() + "'. Cause: "); 205 StringWriter sw = new StringWriter (); 207 e.printStackTrace(new PrintWriter (sw)); 208 log.error(sw.toString()); 209 } 210 } finally { 211 try { 212 in.close(); 213 } catch ( Exception e ) { 214 } 215 } 216 } 217 218 Enumeration keys = props.propertyNames(); 220 while ( keys.hasMoreElements() ) { 221 String key = (String ) keys.nextElement(); 222 String value = props.getProperty(key); 223 if ( value == null ) { 224 value = new String (); 225 } 226 ApplicationResource resource = retrieveApplicationResource(key, contentLocale); 227 byte[] valueBytes = ConvertUtil.convertToByteArray(value); 228 if ( resource == null ) { 229 resource = new ApplicationResource(contentLocale, key, value); 230 applicationResourceDAO.createApplicationResource(resource); 231 } else if ( overrideDynamicValues && !valueBytes.equals(resource.getValue()) ) { 232 resource.setValue(valueBytes); 233 applicationResourceDAO.updateApplicationResource(resource); 234 } else { 235 value = ConvertUtil.convertToString(resource.getValue()); 236 } 237 bundle.putMessage(key, value); 238 } 239 240 return bundle; 241 } 242 243 251 protected ApplicationResource retrieveApplicationResource(String key, ContentLocale locale) { 252 ApplicationResource.ApplicationResourceID id = new ApplicationResource.ApplicationResourceID(locale, key); 253 return applicationResourceDAO.retrieveApplicationResource(id); 254 } 255 256 } 257 | Popular Tags |