All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.google.gwt.i18n.rebind.ConstantsWithLookupImplCreator Maven / Gradle / Ivy

/*
 * 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.UnableToCompleteException;
import com.google.gwt.core.ext.typeinfo.JClassType;
import com.google.gwt.core.ext.typeinfo.JMethod;
import com.google.gwt.core.ext.typeinfo.JParameter;
import com.google.gwt.core.ext.typeinfo.JType;
import com.google.gwt.core.ext.typeinfo.TypeOracle;
import com.google.gwt.core.ext.typeinfo.TypeOracleException;
import com.google.gwt.i18n.rebind.AbstractResource.ResourceList;
import com.google.gwt.i18n.shared.GwtLocale;
import com.google.gwt.user.rebind.AbstractMethodCreator;
import com.google.gwt.user.rebind.SourceWriter;

import java.util.HashMap;
import java.util.Map;

class ConstantsWithLookupImplCreator extends ConstantsImplCreator {
  final JMethod[] allInterfaceMethods;

  private final Map namesToMethodCreators = new HashMap();

  /**
   * Constructor for ConstantsWithLookupImplCreator.
   * 
   * @param logger logger to print errors
   * @param writer Writer to print to
   * @param localizableClass class/interface to conform to
   * @param resourceList resource bundle used to generate the class
   * @param oracle types
   * @throws UnableToCompleteException
   */
  ConstantsWithLookupImplCreator(TreeLogger logger, SourceWriter writer,
      JClassType localizableClass, ResourceList resourceList, TypeOracle oracle)
      throws UnableToCompleteException {
    super(logger, writer, localizableClass, resourceList, oracle);
    try {

      // Boolean
      JType booleanType = oracle.parse(boolean.class.getName());
      LookupMethodCreator booleanMethod = new LookupMethodCreator(this,
          booleanType) {
        @Override
        public void printReturnTarget() {
          println("return target.booleanValue();");
        }

        @Override
        public String returnTemplate() {
          return "boolean answer = {0}();\ncache.put(\"{0}\",new Boolean(answer));\nreturn answer;";
        }
      };
      namesToMethodCreators.put("getBoolean", booleanMethod);

      // Double
      JType doubleType = oracle.parse(double.class.getName());
      LookupMethodCreator doubleMethod = new LookupMethodCreator(this,
          doubleType) {
        @Override
        public void printReturnTarget() {
          println("return target.doubleValue();");
        }

        @Override
        public String returnTemplate() {
          return "double answer = {0}();\ncache.put(\"{0}\",new Double(answer));\nreturn answer;";
        }
      };
      namesToMethodCreators.put("getDouble", doubleMethod);

      // Int
      JType intType = oracle.parse(int.class.getName());
      LookupMethodCreator intMethod = new LookupMethodCreator(this, intType) {
        @Override
        public void printReturnTarget() {
          println("return target.intValue();");
        }

        @Override
        public String returnTemplate() {
          return "int answer = {0}();\ncache.put(\"{0}\",new Integer(answer));\nreturn answer;";
        }
      };

      namesToMethodCreators.put("getInt", intMethod);

      // Float
      JType floatType = oracle.parse(float.class.getName());
      LookupMethodCreator floatMethod = new LookupMethodCreator(this, floatType) {
        @Override
        public String returnTemplate() {
          String val = "float answer = {0}();\ncache.put(\"{0}\", new Float(answer));\nreturn answer;";
          return val;
        }

        @Override
        protected void printReturnTarget() {
          println("return target.floatValue();");
        }
      };
      namesToMethodCreators.put("getFloat", floatMethod);

      // Map - use erased type for matching
      JType mapType = oracle.parse(Map.class.getName()).getErasedType();
      namesToMethodCreators.put("getMap",
          new LookupMethodCreator(this, mapType) {
            @Override
            public String getReturnTypeName() {
              return ConstantsMapMethodCreator.GENERIC_STRING_MAP_TYPE;
            }
          });

      // String
      JType stringType = oracle.parse(String.class.getName());
      LookupMethodCreator stringMethod = new LookupMethodCreator(this,
          stringType) {
        @Override
        public String returnTemplate() {
          return "String answer = {0}();\ncache.put(\"{0}\",answer);\nreturn answer;";
        }
      };
      namesToMethodCreators.put("getString", stringMethod);

      // String Array
      JType stringArray = oracle.getArrayType(stringType);
      namesToMethodCreators.put("getStringArray", new LookupMethodCreator(this,
          stringArray));

      setNeedCache(true);
      allInterfaceMethods = getAllInterfaceMethods(localizableClass);
    } catch (TypeOracleException e) {
      throw error(logger, e);
    }
  }

  /**
   * Create the method body associated with the given method. Arguments are
   * arg0...argN.
   */
  @Override
  protected void emitMethodBody(TreeLogger logger, JMethod method,
      GwtLocale locale) throws UnableToCompleteException {
    checkMethod(logger, method);
    if (method.getParameters().length == 1) {
      String name = method.getName();
      AbstractMethodCreator c = namesToMethodCreators.get(name);
      if (c != null) {
        c.createMethodFor(logger, method, name, null, locale);
        return;
      }
    }
    // fall through
    super.emitMethodBody(logger, method, locale);
  }

  /**
   * Checks that the method has the right structure to implement
   * Constant.
   * 
   * @param method method to check
   */
  private void checkMethod(TreeLogger logger, JMethod method)
      throws UnableToCompleteException {
    if (namesToMethodCreators.get(method.getName()) != null) {
      JParameter[] params = method.getParameters();
      // user may have specified a method named getInt/etc with no parameters
      // this isn't a conflict, so treat them like any other Constant methods
      if (params.length == 0) {
        checkConstantMethod(logger, method);
      } else {
        if (params.length != 1
            || !params[0].getType().getQualifiedSourceName().equals(
                "java.lang.String")) {
          throw error(logger, method + " must have a single String argument.");
        }
        checkReturnType(logger, method);
      }
    } else {
      checkConstantMethod(logger, method);
    }
  }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy