package com.googlecode.tawus.internal.dataanalyzers; import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; import java.util.Collection; import javax.persistence.Entity; import org.apache.tapestry5.ioc.services.PropertyAdapter; import org.apache.tapestry5.services.DataTypeAnalyzer; /** * Entity list analyzer This analyzer is inserted into DataTypeAnalyzer Service * to select a block based on the entity type * * @author taha */ public class EntityListAnalyzer implements DataTypeAnalyzer { private final String dataType; /** * Constructor * * @param dataType * data type */ public EntityListAnalyzer(String dataType) { this.dataType = dataType; } /** * Get type for which this data analyzer is to be used * * @return data type */ public String getType() { return dataType; } /** * {@inheritDoc} This selects any collection type which has parameter of type * entity */ public String identifyDataType(PropertyAdapter propertyAdapter) { Class<?> propertyType = propertyAdapter.getType(); if(Collection.class.isAssignableFrom(propertyType)) { try { Type[] type = ((ParameterizedType) propertyAdapter.getDeclaringClass().getDeclaredField(propertyAdapter.getName()).getGenericType()).getActualTypeArguments(); if(type.length == 1 && ((Class<?>) type[0]).getAnnotation(Entity.class) != null) { return dataType; } } catch(NoSuchFieldException nsme) { throw new RuntimeException(nsme); } } return null; } }