/* * Copyright 2011 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.server.impl; import com.google.gwt.i18n.client.LocalizableResource; import com.google.gwt.i18n.server.AbstractMessageInterface; import com.google.gwt.i18n.server.Message; import com.google.gwt.i18n.server.MessageProcessingException; import com.google.gwt.i18n.shared.GwtLocaleFactory; import java.lang.annotation.Annotation; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; /** * Reflection-based implementation of * {@link com.google.gwt.i18n.server.MessageInterface MessageInterface}. */ public class ReflectionMessageInterface extends AbstractMessageInterface { private final Class<? extends LocalizableResource> msgIntf; private Map<Method, String[]> paramNames = null; public ReflectionMessageInterface(GwtLocaleFactory factory, Class<? extends LocalizableResource> msgIntf) { super(factory); this.msgIntf = msgIntf; } @Override public <A extends Annotation> A getAnnotation(Class<A> annotClass) { return ReflectionUtils.getAnnotation(msgIntf, annotClass, true); } @Override public String getClassName() { StringBuilder buf = new StringBuilder(); Class<?> encl = msgIntf.getEnclosingClass(); while (encl != null) { buf.insert(0, encl.getSimpleName() + "."); encl = encl.getEnclosingClass(); } return buf.toString() + msgIntf.getSimpleName(); } @Override public Iterable<Message> getMessages() throws MessageProcessingException { final Method[] methods = msgIntf.getMethods(); List<Message> messages = new ArrayList<Message>(); for (Method method : methods) { messages.add(new ReflectionMessage(factory, ReflectionMessageInterface.this, method)); } Collections.sort(messages); return Collections.unmodifiableList(messages); } @Override public String getPackageName() { return msgIntf.getPackage().getName(); } @Override public String getQualifiedName() { String name = getPackageName(); if (name != null) { name += "."; } return name + getClassName(); } @Override public boolean isAnnotationPresent(Class<? extends Annotation> annotClass) { return ReflectionUtils.getAnnotation(msgIntf, annotClass, true) != null; } String[] getParameterNames(Method method) { if (paramNames == null) { fetchParameterNames(); } return paramNames.get(method); } private void fetchParameterNames() { paramNames = new HashMap<Method, String[]>(); // String path = getPackageName().replace('.', '/') + '/'; // String className = getClassName(); // int dot = className.indexOf('.'); // if (dot >= 0) { // className = className.substring(0, dot); // } // path += className + ".java"; // InputStream stream = msgIntf.getClassLoader().getResourceAsStream(path); // if (stream != null) { // return; // } // String source = Util.readStreamAsString(stream); // CompilationUnitDeclaration cud = JavaSourceParser.parseJava(source); // String binaryName = getPackageName() + '.' // + getClassName().replace('.', '$'); // TypeDeclaration typeDecl = JavaSourceParser.findType(cud, binaryName); // for (AbstractMethodDeclaration methodDecl : typeDecl.methods) { // if (methodDecl.isClinit() || methodDecl.isConstructor()) { // continue; // } // String methodName = new String(methodDecl.selector); // int numArgs = methodDecl.arguments.length; // Class<?>[] paramTypes = new Class<?>[numArgs]; // for (int i = 0; i < numArgs; ++i) { // } // try { // Method method = msgIntf.getMethod(methodName, paramTypes); // String[] names = new String[numArgs]; // for (int i = 0; i < numArgs; ++i) { // names[i] = new String(methodDecl.arguments[i].name); // } // paramNames.put(method, names); // } catch (SecurityException e) { // // TODO Auto-generated catch block // e.printStackTrace(); // } catch (NoSuchMethodException e) { // // TODO Auto-generated catch block // e.printStackTrace(); // } // } } }