| /* |
| * Copyright 2012 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.core.server; |
| |
| import com.google.gwt.core.server.ServerGwtBridge.ClassInstantiator; |
| import com.google.gwt.core.server.ServerGwtBridge.ClassInstantiatorBase; |
| import com.google.gwt.core.server.ServerGwtBridge.Properties; |
| import com.google.gwt.i18n.shared.GwtLocale; |
| |
| /** |
| * Instantiator that knows how to lookup locale-specific implementations. |
| * |
| * It tries pkg.class_locale (including nested classes), |
| * pkg.impl.class_locale, and pkg.classImpl_locale, following the inheritance |
| * chain for the requested locale. |
| */ |
| class LocalizableInstantiator extends ClassInstantiatorBase implements ClassInstantiator { |
| |
| @Override |
| public <T> T create(Class<?> clazz, Properties properties) { |
| String pkgName = clazz.getPackage().getName(); |
| Class<?> enclosingClass = clazz.getEnclosingClass(); |
| String className = clazz.getSimpleName(); |
| GwtLocale locale = ServerGwtBridge.getLocale(properties); |
| for (GwtLocale search : locale.getCompleteSearchList()) { |
| String suffix = "_" + search.getAsString(); |
| T obj = this.<T>tryCreate(pkgName + "." + className + suffix); |
| if (obj != null) { |
| return obj; |
| } |
| obj = this.<T>tryCreate(pkgName + ".impl." + className + suffix); |
| if (obj != null) { |
| return obj; |
| } |
| obj = this.<T>tryCreate(pkgName + "." + className + "Impl" + suffix); |
| if (obj != null) { |
| return obj; |
| } |
| if (enclosingClass != null) { |
| obj = this.<T>tryCreate(enclosingClass.getCanonicalName() + "$" + className + suffix); |
| if (obj != null) { |
| return obj; |
| } |
| } |
| } |
| return null; |
| } |
| } |