package com.googlecode.tawus.pages; import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; import java.util.Collection; import org.apache.tapestry5.FieldValidator; import org.apache.tapestry5.annotations.Component; import org.apache.tapestry5.annotations.Environmental; import org.apache.tapestry5.annotations.Property; import org.apache.tapestry5.corelib.components.Palette; import org.apache.tapestry5.corelib.components.Select; import org.apache.tapestry5.corelib.pages.PropertyEditBlocks; import org.apache.tapestry5.ioc.annotations.Inject; import org.apache.tapestry5.services.BeanEditContext; import org.apache.tapestry5.services.PropertyEditContext; import com.googlecode.tawus.EntitySelectModel; import com.googlecode.tawus.EntityValueEncoder; import com.googlecode.tawus.SearchCriteria; import com.googlecode.tawus.components.SimpleDateField; import com.googlecode.tawus.internal.table.TdEditorContext; import com.googlecode.tawus.services.CriteriaSource; import com.googlecode.tawus.services.EntityDAOLocator; public class PropertyEditBlocksWithoutLabel extends PropertyEditBlocks { @Component(id = "entitySelect", parameters = { "encoder=prop:entityValueEncoder", "value=prop:context.propertyValue", "label=prop:context.label", "model=prop:entitySelectModel", "clientId=prop:context.propertyId", "validate=prop:entityValidator" }) private Select entitySelect; @Component(id = "entityPalette", parameters = { "encoder=prop:entityListValueEncoder", "label=prop:context.label", "selected=prop:context.propertyValue", "model=prop:entityListSelectModel", "clientId=prop:context.propertyId", "validate=prop:entityPaletteValidator" }) private Palette entityPalette; @Component(id = "timeField", parameters = { "format=HH:MM:SS", "clientId=prop:context.propertyId", "value=context.propertyValue", "label=prop:context.label", "validate=prop:timeFieldValidator" }) private SimpleDateField timeField; @Environmental private PropertyEditContext context; @SuppressWarnings("unused") @Environmental @Property private TdEditorContext editorContext; @Environmental private BeanEditContext beanEditContext; @Inject private EntityDAOLocator locator; @Inject private CriteriaSource criteriaSource; @Override public PropertyEditContext getContext() { return context; } @SuppressWarnings({ "rawtypes", "unchecked" }) public EntityValueEncoder getEntityValueEncoder() { return new EntityValueEncoder(locator.get(getPropertyType())); } @SuppressWarnings({ "rawtypes" }) public Class getPropertyType() { if(Collection.class.isAssignableFrom(context.getPropertyType())) { return getListEntityType(); } else { return context.getPropertyType(); } } @SuppressWarnings({ "unchecked", "rawtypes" }) public EntitySelectModel getEntitySelectModel() { return new EntitySelectModel(locator.get(getPropertyType()).list(criteriaSource.get(context.getPropertyType()))); } @SuppressWarnings({ "unchecked", "rawtypes" }) public EntitySelectModel getEntityListSelectModel() { Class<?> type = getListEntityType(); return new EntitySelectModel(locator.get(getPropertyType()).list((SearchCriteria) criteriaSource.get(type))); } @SuppressWarnings({ "unchecked", "rawtypes" }) public EntityValueEncoder getEntityListValueEncoder() { return new EntityValueEncoder(locator.get(getPropertyType())); } private Class<?> getListEntityType() { Class<?> clazz = context.getPropertyType(); if(Collection.class.isAssignableFrom(clazz)) { try { Type[] type = ((ParameterizedType) beanEditContext.getBeanClass().getDeclaredField(context.getPropertyId()).getGenericType()).getActualTypeArguments(); if(type.length == 1) { return (Class<?>) type[0]; } } catch(NoSuchFieldException nsfe) { throw new RuntimeException(nsfe); } } throw new RuntimeException("Could not create SelectModel for " + getPropertyType()); } public FieldValidator<?> getEntityValidator() { return context.getValidator(entitySelect); } public FieldValidator<?> getEntityPaletteValidator() { return context.getValidator(entityPalette); } public FieldValidator<?> getTimeFieldValidator() { return context.getValidator(timeField); } }