blob: 998b0c3ecf39004f3d8ce2c3a0d52e3db1476af4 [file] [log] [blame]
/*
* 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;
}
}