/**
* Copyright (C) 2014 Premium Minds.
*
* This file is part of wicket-crudifier.
*
* wicket-crudifier 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.
*
* wicket-crudifier 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 wicket-crudifier. If not, see <http://www.gnu.org/licenses/>.
*/
package com.premiumminds.wicket.crudifier;
import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.List;
import java.util.Map;
import org.apache.commons.lang3.StringUtils;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.model.IModel;
public abstract class LabelProperty extends Label {
private static final long serialVersionUID = 4465124169249526543L;
private IModel<?> model;
private Map<Class<?>, IObjectRenderer<?>> renderers;
public LabelProperty(String id, final IModel<?> model, Map<Class<?>, IObjectRenderer<?>> renderers) {
super(id);
this.model = model;
this.renderers = renderers;
}
@Override
protected void onInitialize() {
super.onInitialize();
setDefaultModel(new IModel<Object>(){
private static final long serialVersionUID = -4951888022432211076L;
public void detach() {
model.detach();
}
public Object getObject() {
Object obj = model.getObject();
if(obj==null) return null;
return convertObject(obj);
}
@SuppressWarnings("unchecked")
private String convertObject(Object obj){
if(obj.getClass().isEnum()) return getResourceString(obj.toString(), obj.toString());
if(obj instanceof Boolean) return getResourceString(obj.toString(), obj.toString());
if(obj instanceof Number) return MessageFormat.format(getResourceString("format", "{0,number,#.##}"), obj);
if(obj instanceof Date) return MessageFormat.format(getResourceString("format", "{0,date,dd/MM/yyyy}"), obj);
if(renderers.containsKey(obj.getClass())){
return ((IObjectRenderer<Object>) renderers.get(obj.getClass())).render(obj);
}
if(obj instanceof Collection<?>){
Collection<Object> collection = (Collection<Object>) obj;
List<String> values = new ArrayList<String>();
for(Object objCol : collection){ values.add(convertObject(objCol)); }
return StringUtils.join(values, ", ");
}
return obj.toString();
}
public void setObject(Object object) {
throw new RuntimeException("illegal operation");
}
});
}
protected abstract String getResourceString(String key, String defaultValue);
}