/* * Copyright 2008 Google Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of * the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations under * the License. */ package com.google.gwt.i18n.rebind; import com.google.gwt.core.ext.TreeLogger; import com.google.gwt.core.ext.typeinfo.JMethod; import com.google.gwt.core.ext.typeinfo.JPrimitiveType; import com.google.gwt.core.ext.typeinfo.JType; import com.google.gwt.i18n.rebind.AbstractResource.ResourceList; import com.google.gwt.i18n.shared.GwtLocale; import com.google.gwt.user.rebind.AbstractGeneratorClassCreator; import com.google.gwt.user.rebind.AbstractMethodCreator; import com.google.gwt.user.rebind.AbstractSourceCreator; import java.text.MessageFormat; /** * Method creator to call the correct Map for the given Dictionary. */ class LookupMethodCreator extends AbstractMethodCreator { private JType returnType; /** * Constructor for <code>LookupMethodCreator</code>. * * @param classCreator parent class creator * @param returnType associated return type */ public LookupMethodCreator(AbstractGeneratorClassCreator classCreator, JType returnType) { super(classCreator); this.returnType = returnType; } @Override public void createMethodFor(TreeLogger logger, JMethod targetMethod, String key, ResourceList resourceList, GwtLocale locale) { createMethodFor(targetMethod); } /** * Returns a {@code String} containing the return type name. */ protected String getReturnTypeName() { String type; JPrimitiveType s = returnType.isPrimitive(); if (s != null) { type = AbstractSourceCreator.getJavaObjectTypeFor(s); } else { type = returnType.getParameterizedQualifiedSourceName(); } return type; } void createMethodFor(JMethod targetMethod) { String template = "{0} target = ({0}) cache.get(arg0);"; String returnTypeName = getReturnTypeName(); String lookup = MessageFormat.format(template, new Object[] {returnTypeName}); println(lookup); println("if (target != null) {"); indent(); printReturnTarget(); outdent(); println("}"); JMethod[] methods = ((ConstantsWithLookupImplCreator) currentCreator).allInterfaceMethods; JType erasedType = returnType.getErasedType(); for (int i = 0; i < methods.length; i++) { if (methods[i].getReturnType().getErasedType().equals(erasedType) && methods[i] != targetMethod) { String methodName = methods[i].getName(); String body = "if(arg0.equals(" + wrap(methodName) + ")) {"; println(body); indent(); printFound(methodName); outdent(); println("}"); } } String format = "throw new java.util.MissingResourceException(\"Cannot find constant ''\" +" + "{0} + \"''; expecting a method name\", \"{1}\", {0});"; String result = MessageFormat.format(format, "arg0", this.currentCreator.getTarget().getQualifiedSourceName()); println(result); } void printFound(String methodName) { println(MessageFormat.format(returnTemplate(), new Object[] {methodName})); } void printReturnTarget() { println("return target;"); } String returnTemplate() { return "return {0}();"; } }