1 16 package com.google.gwt.i18n.rebind; 17 18 import com.google.gwt.core.ext.GeneratorContext; 19 import com.google.gwt.core.ext.TreeLogger; 20 import com.google.gwt.core.ext.UnableToCompleteException; 21 import com.google.gwt.core.ext.typeinfo.JClassType; 22 import com.google.gwt.core.ext.typeinfo.JMethod; 23 import com.google.gwt.core.ext.typeinfo.NotFoundException; 24 import com.google.gwt.core.ext.typeinfo.TypeOracle; 25 import com.google.gwt.i18n.rebind.util.AbstractResource; 26 import com.google.gwt.i18n.rebind.util.ResourceFactory; 27 import com.google.gwt.user.rebind.AbstractGeneratorClassCreator; 28 import com.google.gwt.user.rebind.AbstractMethodCreator; 29 import com.google.gwt.user.rebind.ClassSourceFileComposerFactory; 30 import com.google.gwt.user.rebind.SourceWriter; 31 32 import java.io.PrintWriter ; 33 import java.util.Locale ; 34 import java.util.MissingResourceException ; 35 import java.util.Set ; 36 37 41 abstract class AbstractLocalizableImplCreator extends 42 AbstractGeneratorClassCreator { 43 44 static String generateConstantOrMessageClass(TreeLogger logger, 45 GeneratorContext context, Locale locale, JClassType targetClass) 46 throws UnableToCompleteException { 47 TypeOracle oracle = context.getTypeOracle(); 48 JClassType constantsClass; 49 JClassType messagesClass; 50 JClassType constantsWithLookupClass; 51 try { 52 constantsClass = oracle.getType(LocalizableGenerator.CONSTANTS_NAME); 53 constantsWithLookupClass = oracle.getType(LocalizableGenerator.CONSTANTS_WITH_LOOKUP_NAME); 54 messagesClass = oracle.getType(LocalizableGenerator.MESSAGES_NAME); 55 } catch (NotFoundException e) { 56 throw error(logger, e); 58 } 59 60 String name = targetClass.getName(); 61 String packageName = targetClass.getPackage().getName(); 62 63 boolean assignableToConstants = constantsClass.isAssignableFrom(targetClass); 66 boolean assignableToMessages = messagesClass.isAssignableFrom(targetClass); 67 if (!assignableToConstants && !assignableToMessages) { 68 return null; 70 } 71 72 if (assignableToConstants && assignableToMessages) { 74 throw error(logger, name + " cannot extend both Constants and Messages"); 75 } 76 77 if (targetClass.isInterface() == null) { 79 throw error(logger, name + " must be an interface"); 80 } 81 82 AbstractResource resource; 83 try { 84 resource = ResourceFactory.getBundle(targetClass, locale); 85 } catch (MissingResourceException e) { 86 throw error( 87 logger, 88 "Localization failed; there must be at least one properties file accessible through the classpath in package '" 89 + packageName 90 + "' whose base name is '" 91 + ResourceFactory.getResourceName(targetClass) + "'"); 92 } catch (IllegalArgumentException e) { 93 throw error(logger, e.getMessage()); 95 } 96 97 String realLocale = "_"; 100 if (resource.getLocale() != null) { 101 realLocale += resource.getLocale(); 102 } 103 String resourceName = targetClass.getName().replace('.', '_'); 105 String className = resourceName + realLocale; 106 PrintWriter pw = context.tryCreate(logger, packageName, className); 107 if (pw != null) { 108 ClassSourceFileComposerFactory factory = new ClassSourceFileComposerFactory( 109 packageName, className); 110 factory.addImplementedInterface(targetClass.getQualifiedSourceName()); 111 SourceWriter writer = factory.createSourceWriter(context, pw); 112 if (constantsWithLookupClass.isAssignableFrom(targetClass)) { 114 ConstantsWithLookupImplCreator c = new ConstantsWithLookupImplCreator( 115 logger, writer, targetClass, resource, context.getTypeOracle()); 116 c.emitClass(logger); 117 } else if (constantsClass.isAssignableFrom(targetClass)) { 118 ConstantsImplCreator c = new ConstantsImplCreator(logger, writer, 119 targetClass, resource, context.getTypeOracle()); 120 c.emitClass(logger); 121 } else { 122 MessagesImplCreator messages = new MessagesImplCreator(logger, writer, 123 targetClass, resource, context.getTypeOracle()); 124 messages.emitClass(logger); 125 } 126 context.commit(logger, pw); 127 } 128 return packageName + "." + className; 129 } 130 131 134 private AbstractResource messageBindings; 135 136 143 public AbstractLocalizableImplCreator(SourceWriter writer, 144 JClassType targetClass, AbstractResource messageBindings) { 145 super(writer, targetClass); 146 this.messageBindings = messageBindings; 147 } 148 149 154 public AbstractResource getResourceBundle() { 155 return messageBindings; 156 } 157 158 protected String branchMessage() { 159 return "Processing " + this.getTarget(); 160 } 161 162 170 protected void delegateToCreator(TreeLogger logger, JMethod method) 171 throws UnableToCompleteException { 172 AbstractMethodCreator methodCreator = getMethodCreator(logger, method); 173 String key = getKey(logger, method); 174 String value; 175 try { 176 value = messageBindings.getString(key); 177 } catch (MissingResourceException e) { 178 String s = "Could not find requested resource key '" + key + "'"; 179 TreeLogger child = logger.branch(TreeLogger.ERROR, s, null); 180 Set keys = messageBindings.keySet(); 181 if (keys.size() < AbstractResource.REPORT_KEYS_THRESHOLD) { 182 String keyString = "Keys found: " + keys; 183 throw error(child, keyString); 184 } else { 185 throw new UnableToCompleteException(); 186 } 187 } 188 String localeString; 189 if (messageBindings.getLocale() == null 190 || messageBindings.getLocale().toString().equals("")) { 191 localeString = "default"; 192 } else { 193 localeString = messageBindings.getLocale().toString(); 194 } 195 String info = "When locale is '" + localeString + "', property '" + key 196 + "' has the value '" + value + "'"; 197 TreeLogger branch = logger.branch(TreeLogger.TRACE, info, null); 198 methodCreator.createMethodFor(branch, method, value); 199 } 200 201 208 protected String getKey(TreeLogger logger, JMethod method) { 209 String [][] id = method.getMetaData(LocalizableGenerator.GWT_KEY); 210 if (id.length > 0) { 211 if (id[0].length == 0) { 212 logger.log(TreeLogger.WARN, method 213 + " had a mislabeled gwt.key, using method name as key", null); 214 } else { 215 String tag = id[0][0]; 216 return tag; 217 } 218 } 219 return method.getName(); 220 } 221 } 222 | Popular Tags |