/*
* Copyright 2011 Instituto Superior Tecnico
*
* https://fenix-ashes.ist.utl.pt/
*
* This file is part of the vaadin-framework.
*
* The vaadin-framework Infrastructure is free software: you can
* redistribute it and/or modify it under the terms of the GNU Lesser General
* Public License as published by the Free Software Foundation, either version
* 3 of the License, or (at your option) any later version.*
*
* vaadin-framework is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with vaadin-framework. If not, see <http://www.gnu.org/licenses/>.
*
*/
package pt.ist.vaadinframework.ui;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.ResourceBundle;
import org.apache.commons.io.FileUtils;
import org.apache.commons.lang.StringUtils;
import pt.ist.fenixframework.FenixFramework;
import pt.ist.fenixframework.dml.DomainClass;
import pt.ist.vaadinframework.VaadinFrameworkLogger;
import pt.ist.vaadinframework.data.AbstractBufferedContainer;
import com.vaadin.data.Container;
import com.vaadin.data.Item;
import com.vaadin.data.Property;
import com.vaadin.ui.Component;
import com.vaadin.ui.DefaultFieldFactory;
/**
* @author Sérgio Silva (sergio.silva@ist.utl.pt)
*
*/
public class CaptionUtils {
static class CaptionUtilsWriter {
private static List<String> keys;
private static File file;
static {
file = new File("/tmp/CaptionResources.properties");
keys = new ArrayList<String>();
try {
keys.addAll(FileUtils.readLines(file));
} catch (IOException e) {
VaadinFrameworkLogger.getLogger().error("Can't read from auto vaadin resources");
}
}
public static void addKey(String key) {
if (!keys.contains(key)) {
keys.add(key);
Collections.sort(keys);
try {
FileUtils.writeLines(file, keys);
} catch (IOException e) {
VaadinFrameworkLogger.getLogger().error("Can't write to auto vaadin resources");
}
}
}
}
public static String makeCaption(ResourceBundle bundle, Container container, Object propertyId, Component uiContext) {
if (container instanceof AbstractBufferedContainer) {
return makeCaption(bundle, ((AbstractBufferedContainer<?, ?, ?>) container).getElementType(), propertyId, uiContext);
}
return DefaultFieldFactory.createCaptionByPropertyId(propertyId);
}
public static String makeCaption(ResourceBundle bundle, Item item, Object propertyId, Component uiContext) {
if (item instanceof Property) {
return makeCaption(bundle, ((Property) item).getType(), propertyId, uiContext);
}
return DefaultFieldFactory.createCaptionByPropertyId(propertyId);
}
private static String makeCaption(ResourceBundle bundle, Class<?> type, Object propertyId, Component uiContext) {
String key = getBundleKey(bundle, type, propertyId, StringUtils.EMPTY);
if (bundle.containsKey(key)) {
return bundle.getString(key);
}
VaadinFrameworkLogger.getLogger().warn("i18n opportunity missed: " + key);
return DefaultFieldFactory.createCaptionByPropertyId(propertyId);
}
public static String makeDescription(ResourceBundle bundle, Container container, Object propertyId, Component uiContext) {
if (container instanceof AbstractBufferedContainer) {
return makeDescription(bundle, ((AbstractBufferedContainer<?, ?, ?>) container).getElementType(), propertyId,
uiContext);
}
return makeCaption(bundle, container, propertyId, uiContext);
}
public static String makeDescription(ResourceBundle bundle, Item item, Object propertyId, Component uiContext) {
if (item instanceof Property) {
return makeDescription(bundle, ((Property) item).getType(), propertyId, uiContext);
}
return makeCaption(bundle, item, propertyId, uiContext);
}
public static String makeDescription(ResourceBundle bundle, Class<?> type, Object propertyId, Component uiContext) {
String key = getBundleKey(bundle, type, propertyId, ".description");
if (bundle.containsKey(key)) {
return bundle.getString(key);
}
VaadinFrameworkLogger.getLogger().warn("i18n opportunity missed: " + key);
return makeCaption(bundle, type, propertyId, uiContext);
}
private static String getBundleKey(ResourceBundle bundle, Class<?> clazz, Object propertyId, String suffix) {
return getBundleKey(bundle, new ArrayList<String>(), clazz, propertyId, suffix);
}
private static String getBundleKey(ResourceBundle bundle, List<String> missed, Class<?> clazz, Object propertyId,
String suffix) {
String key = clazz.getName() + "." + propertyId + suffix;
if (bundle.containsKey(key)) {
return key;
}
missed.add(key);
CaptionUtilsWriter.addKey(key);
if (!hasMoreClassesInHierarchy(clazz)) {
return StringUtils.join(missed, " or ");
}
return getBundleKey(bundle, missed, clazz.getSuperclass(), propertyId, suffix);
}
private static boolean hasMoreClassesInHierarchy(Class<?> clazz) {
if (clazz == null) {
return false;
}
final DomainClass findClass = FenixFramework.getDomainModel().findClass(clazz.getName());
return findClass == null ? false : findClass.hasSuperclass();
}
}