/* * #%L * BroadleafCommerce Open Admin Platform * %% * Copyright (C) 2009 - 2013 Broadleaf Commerce * %% * 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. * #L% */ package org.broadleafcommerce.openadmin.server.dao.provider.metadata; import java.math.BigDecimal; import java.sql.Timestamp; import java.util.Calendar; import java.util.Date; import java.util.List; import java.util.Map; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.broadleafcommerce.common.admin.domain.AdminMainEntity; import org.broadleafcommerce.common.money.Money; import org.broadleafcommerce.common.presentation.client.SupportedFieldType; import org.broadleafcommerce.openadmin.dto.BasicFieldMetadata; import org.broadleafcommerce.openadmin.dto.FieldMetadata; import org.broadleafcommerce.openadmin.dto.override.FieldMetadataOverride; import org.broadleafcommerce.openadmin.server.dao.FieldInfo; import org.broadleafcommerce.openadmin.server.dao.provider.metadata.request.AddMetadataFromFieldTypeRequest; import org.broadleafcommerce.openadmin.server.dao.provider.metadata.request.AddMetadataFromMappingDataRequest; import org.broadleafcommerce.openadmin.server.dao.provider.metadata.request.AddMetadataRequest; import org.broadleafcommerce.openadmin.server.dao.provider.metadata.request.OverrideViaXmlRequest; import org.broadleafcommerce.openadmin.server.service.type.FieldProviderResponse; import org.hibernate.mapping.Column; import org.hibernate.mapping.Property; import org.hibernate.metadata.ClassMetadata; import org.hibernate.type.Type; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; /** * @author Jeff Fischer */ @Component("blDefaultFieldMetadataProvider") @Scope("prototype") public class DefaultFieldMetadataProvider extends BasicFieldMetadataProvider { private static final Log LOG = LogFactory.getLog(DefaultFieldMetadataProvider.class); @Override public FieldProviderResponse addMetadata(AddMetadataRequest addMetadataRequest, Map<String, FieldMetadata> metadata) { Map<String, Object> idMetadata = addMetadataRequest.getDynamicEntityDao().getIdMetadata(addMetadataRequest.getTargetClass()); if (idMetadata != null) { String idField = (String) idMetadata.get("name"); boolean processField; //allow id fields without AdminPresentation annotation to pass through processField = idField.equals(addMetadataRequest.getRequestedField().getName()); if (!processField) { List<String> propertyNames = addMetadataRequest.getDynamicEntityDao().getPropertyNames( addMetadataRequest.getTargetClass()); if (!CollectionUtils.isEmpty(propertyNames)) { List<org.hibernate.type.Type> propertyTypes = addMetadataRequest.getDynamicEntityDao().getPropertyTypes( addMetadataRequest.getTargetClass()); int index = propertyNames.indexOf(addMetadataRequest.getRequestedField().getName()); if (index >= 0) { Type myType = propertyTypes.get(index); //allow OneToOne, ManyToOne and Embeddable fields to pass through processField = myType.isCollectionType() || myType.isAssociationType() || myType.isComponentType() || myType.isEntityType(); } } } if (processField) { FieldInfo info = buildFieldInfo(addMetadataRequest.getRequestedField()); BasicFieldMetadata basicMetadata = new BasicFieldMetadata(); basicMetadata.setName(addMetadataRequest.getRequestedField().getName()); basicMetadata.setExcluded(false); metadata.put(addMetadataRequest.getRequestedField().getName(), basicMetadata); setClassOwnership(addMetadataRequest.getParentClass(), addMetadataRequest.getTargetClass(), metadata, info); return FieldProviderResponse.HANDLED; } } return FieldProviderResponse.NOT_HANDLED; } public void overrideExclusionsFromXml(OverrideViaXmlRequest overrideViaXmlRequest, Map<String, FieldMetadata> metadata) { //override any and all exclusions derived from xml Map<String, FieldMetadataOverride> overrides = getTargetedOverride(overrideViaXmlRequest.getDynamicEntityDao(), overrideViaXmlRequest.getRequestedConfigKey(), overrideViaXmlRequest.getRequestedCeilingEntity()); if (overrides != null) { for (String propertyName : overrides.keySet()) { final FieldMetadataOverride localMetadata = overrides.get(propertyName); Boolean excluded = localMetadata.getExcluded(); for (String key : metadata.keySet()) { String testKey = overrideViaXmlRequest.getPrefix() + key; if ((testKey.startsWith(propertyName + ".") || testKey.equals(propertyName)) && excluded != null && excluded) { FieldMetadata fieldMetadata = metadata.get(key); if (LOG.isDebugEnabled()) { LOG.debug("setExclusionsBasedOnParents:Excluding " + key + "because an override annotation declared "+ testKey + " to be excluded"); } fieldMetadata.setExcluded(true); continue; } if ((testKey.startsWith(propertyName + ".") || testKey.equals(propertyName)) && excluded != null && !excluded) { FieldMetadata fieldMetadata = metadata.get(key); if (!overrideViaXmlRequest.getParentExcluded()) { if (LOG.isDebugEnabled()) { LOG.debug("setExclusionsBasedOnParents:Showing " + key + "because an override annotation declared " + testKey + " to not be excluded"); } fieldMetadata.setExcluded(false); } } } } } } @Override public FieldProviderResponse addMetadataFromMappingData(AddMetadataFromMappingDataRequest addMetadataFromMappingDataRequest, FieldMetadata metadata) { BasicFieldMetadata fieldMetadata = (BasicFieldMetadata) metadata; fieldMetadata.setFieldType(addMetadataFromMappingDataRequest.getType()); fieldMetadata.setSecondaryType(addMetadataFromMappingDataRequest.getSecondaryType()); if (addMetadataFromMappingDataRequest.getRequestedEntityType() != null && !addMetadataFromMappingDataRequest.getRequestedEntityType().isCollectionType()) { Column column = null; for (Property property : addMetadataFromMappingDataRequest.getComponentProperties()) { if (property.getName().equals(addMetadataFromMappingDataRequest.getPropertyName())) { Object columnObject = property.getColumnIterator().next(); if (columnObject instanceof Column) { column = (Column) columnObject; } break; } } if (column != null) { fieldMetadata.setLength(column.getLength()); fieldMetadata.setScale(column.getScale()); fieldMetadata.setPrecision(column.getPrecision()); fieldMetadata.setRequired(!column.isNullable()); fieldMetadata.setUnique(column.isUnique()); } fieldMetadata.setForeignKeyCollection(false); } else { fieldMetadata.setForeignKeyCollection(true); } fieldMetadata.setMutable(true); fieldMetadata.setMergedPropertyType(addMetadataFromMappingDataRequest.getMergedPropertyType()); if (SupportedFieldType.BROADLEAF_ENUMERATION.equals(addMetadataFromMappingDataRequest.getType())) { try { setupBroadleafEnumeration(fieldMetadata.getBroadleafEnumeration(), fieldMetadata, addMetadataFromMappingDataRequest.getDynamicEntityDao()); } catch (Exception e) { throw new RuntimeException(e); } } return FieldProviderResponse.HANDLED; } @Override public FieldProviderResponse addMetadataFromFieldType(AddMetadataFromFieldTypeRequest addMetadataFromFieldTypeRequest, Map<String, FieldMetadata> metadata) { if (addMetadataFromFieldTypeRequest.getPresentationAttribute() != null) { if ( addMetadataFromFieldTypeRequest.getExplicitType() != null && addMetadataFromFieldTypeRequest.getExplicitType() != SupportedFieldType.UNKNOWN && addMetadataFromFieldTypeRequest.getExplicitType() != SupportedFieldType.BOOLEAN && addMetadataFromFieldTypeRequest.getExplicitType() != SupportedFieldType.INTEGER && addMetadataFromFieldTypeRequest.getExplicitType() != SupportedFieldType.DATE && addMetadataFromFieldTypeRequest.getExplicitType() != SupportedFieldType.STRING && addMetadataFromFieldTypeRequest.getExplicitType() != SupportedFieldType.MONEY && addMetadataFromFieldTypeRequest.getExplicitType() != SupportedFieldType.DECIMAL && addMetadataFromFieldTypeRequest.getExplicitType() != SupportedFieldType.FOREIGN_KEY && addMetadataFromFieldTypeRequest.getExplicitType() != SupportedFieldType.ADDITIONAL_FOREIGN_KEY ) { metadata.put(addMetadataFromFieldTypeRequest.getRequestedPropertyName(), addMetadataFromFieldTypeRequest.getDynamicEntityDao() .getMetadata().getFieldMetadata(addMetadataFromFieldTypeRequest.getPrefix(), addMetadataFromFieldTypeRequest.getRequestedPropertyName(), addMetadataFromFieldTypeRequest.getComponentProperties(), addMetadataFromFieldTypeRequest.getExplicitType(), addMetadataFromFieldTypeRequest.getType(), addMetadataFromFieldTypeRequest.getTargetClass(), addMetadataFromFieldTypeRequest.getPresentationAttribute(), addMetadataFromFieldTypeRequest. getMergedPropertyType(), addMetadataFromFieldTypeRequest.getDynamicEntityDao())); } else if ( addMetadataFromFieldTypeRequest.getExplicitType() != null && addMetadataFromFieldTypeRequest.getExplicitType() == SupportedFieldType.BOOLEAN || addMetadataFromFieldTypeRequest.getReturnedClass().equals(Boolean.class) || addMetadataFromFieldTypeRequest.getReturnedClass().equals(Character.class) ) { metadata.put(addMetadataFromFieldTypeRequest.getRequestedPropertyName(), addMetadataFromFieldTypeRequest.getDynamicEntityDao() .getMetadata().getFieldMetadata(addMetadataFromFieldTypeRequest.getPrefix(), addMetadataFromFieldTypeRequest.getRequestedPropertyName(), addMetadataFromFieldTypeRequest.getComponentProperties(), SupportedFieldType.BOOLEAN, addMetadataFromFieldTypeRequest.getType(), addMetadataFromFieldTypeRequest.getTargetClass(), addMetadataFromFieldTypeRequest.getPresentationAttribute(), addMetadataFromFieldTypeRequest.getMergedPropertyType(), addMetadataFromFieldTypeRequest.getDynamicEntityDao())); } else if ( addMetadataFromFieldTypeRequest.getExplicitType() != null && addMetadataFromFieldTypeRequest.getExplicitType() == SupportedFieldType.INTEGER || addMetadataFromFieldTypeRequest.getReturnedClass().equals(Byte.class) || addMetadataFromFieldTypeRequest.getReturnedClass().equals(Short.class) || addMetadataFromFieldTypeRequest.getReturnedClass().equals(Integer.class) || addMetadataFromFieldTypeRequest.getReturnedClass().equals(Long.class) ) { if (addMetadataFromFieldTypeRequest.getRequestedPropertyName().equals(addMetadataFromFieldTypeRequest.getIdProperty())) { metadata.put(addMetadataFromFieldTypeRequest.getRequestedPropertyName(), addMetadataFromFieldTypeRequest.getDynamicEntityDao().getMetadata().getFieldMetadata( addMetadataFromFieldTypeRequest.getPrefix(), addMetadataFromFieldTypeRequest.getRequestedPropertyName(), addMetadataFromFieldTypeRequest.getComponentProperties(), SupportedFieldType.ID, SupportedFieldType.INTEGER, addMetadataFromFieldTypeRequest.getType(), addMetadataFromFieldTypeRequest.getTargetClass(), addMetadataFromFieldTypeRequest.getPresentationAttribute(), addMetadataFromFieldTypeRequest.getMergedPropertyType(), addMetadataFromFieldTypeRequest.getDynamicEntityDao())); } else { metadata.put(addMetadataFromFieldTypeRequest.getRequestedPropertyName(), addMetadataFromFieldTypeRequest.getDynamicEntityDao().getMetadata().getFieldMetadata(addMetadataFromFieldTypeRequest .getPrefix(), addMetadataFromFieldTypeRequest.getRequestedPropertyName(), addMetadataFromFieldTypeRequest.getComponentProperties(), SupportedFieldType.INTEGER, addMetadataFromFieldTypeRequest.getType(), addMetadataFromFieldTypeRequest.getTargetClass(), addMetadataFromFieldTypeRequest. getPresentationAttribute(), addMetadataFromFieldTypeRequest.getMergedPropertyType(), addMetadataFromFieldTypeRequest.getDynamicEntityDao())); } } else if ( addMetadataFromFieldTypeRequest.getExplicitType() != null && addMetadataFromFieldTypeRequest.getExplicitType() == SupportedFieldType.DATE || addMetadataFromFieldTypeRequest.getReturnedClass().equals(Calendar.class) || addMetadataFromFieldTypeRequest.getReturnedClass().equals(Date.class) || addMetadataFromFieldTypeRequest.getReturnedClass().equals(Timestamp.class) ) { metadata.put(addMetadataFromFieldTypeRequest.getRequestedPropertyName(), addMetadataFromFieldTypeRequest.getDynamicEntityDao() .getMetadata().getFieldMetadata(addMetadataFromFieldTypeRequest.getPrefix(), addMetadataFromFieldTypeRequest.getRequestedPropertyName(), addMetadataFromFieldTypeRequest.getComponentProperties(), SupportedFieldType.DATE, addMetadataFromFieldTypeRequest.getType(), addMetadataFromFieldTypeRequest.getTargetClass(), addMetadataFromFieldTypeRequest.getPresentationAttribute(), addMetadataFromFieldTypeRequest.getMergedPropertyType(), addMetadataFromFieldTypeRequest.getDynamicEntityDao() ) ); } else if ( addMetadataFromFieldTypeRequest.getExplicitType() != null && addMetadataFromFieldTypeRequest.getExplicitType() == SupportedFieldType.STRING || addMetadataFromFieldTypeRequest.getReturnedClass().equals(String.class) ) { if (addMetadataFromFieldTypeRequest.getRequestedPropertyName().equals(addMetadataFromFieldTypeRequest.getIdProperty())) { metadata.put(addMetadataFromFieldTypeRequest.getRequestedPropertyName(), addMetadataFromFieldTypeRequest.getDynamicEntityDao().getMetadata().getFieldMetadata( addMetadataFromFieldTypeRequest.getPrefix(), addMetadataFromFieldTypeRequest.getRequestedPropertyName(), addMetadataFromFieldTypeRequest.getComponentProperties(), SupportedFieldType.ID, SupportedFieldType.STRING, addMetadataFromFieldTypeRequest.getType(), addMetadataFromFieldTypeRequest.getTargetClass(), addMetadataFromFieldTypeRequest.getPresentationAttribute(), addMetadataFromFieldTypeRequest.getMergedPropertyType(), addMetadataFromFieldTypeRequest.getDynamicEntityDao())); } else { metadata.put(addMetadataFromFieldTypeRequest.getRequestedPropertyName(), addMetadataFromFieldTypeRequest.getDynamicEntityDao().getMetadata().getFieldMetadata( addMetadataFromFieldTypeRequest.getPrefix(), addMetadataFromFieldTypeRequest.getRequestedPropertyName(), addMetadataFromFieldTypeRequest.getComponentProperties(), SupportedFieldType.STRING, addMetadataFromFieldTypeRequest.getType(), addMetadataFromFieldTypeRequest.getTargetClass(), addMetadataFromFieldTypeRequest.getPresentationAttribute(), addMetadataFromFieldTypeRequest.getMergedPropertyType(), addMetadataFromFieldTypeRequest.getDynamicEntityDao())); } } else if ( addMetadataFromFieldTypeRequest.getExplicitType() != null && addMetadataFromFieldTypeRequest.getExplicitType() == SupportedFieldType.MONEY || addMetadataFromFieldTypeRequest.getReturnedClass().equals(Money.class) ) { metadata.put(addMetadataFromFieldTypeRequest.getRequestedPropertyName(), addMetadataFromFieldTypeRequest.getDynamicEntityDao().getMetadata().getFieldMetadata( addMetadataFromFieldTypeRequest.getPrefix(), addMetadataFromFieldTypeRequest.getRequestedPropertyName(), addMetadataFromFieldTypeRequest.getComponentProperties(), SupportedFieldType.MONEY, addMetadataFromFieldTypeRequest.getType(), addMetadataFromFieldTypeRequest.getTargetClass(), addMetadataFromFieldTypeRequest.getPresentationAttribute(), addMetadataFromFieldTypeRequest.getMergedPropertyType(), addMetadataFromFieldTypeRequest.getDynamicEntityDao() ) ); } else if ( addMetadataFromFieldTypeRequest.getExplicitType() != null && addMetadataFromFieldTypeRequest.getExplicitType() == SupportedFieldType.DECIMAL || addMetadataFromFieldTypeRequest.getReturnedClass().equals(Double.class) || addMetadataFromFieldTypeRequest.getReturnedClass().equals(BigDecimal.class) ) { metadata.put(addMetadataFromFieldTypeRequest.getRequestedPropertyName(), addMetadataFromFieldTypeRequest.getDynamicEntityDao().getMetadata().getFieldMetadata( addMetadataFromFieldTypeRequest.getPrefix(), addMetadataFromFieldTypeRequest.getRequestedPropertyName(), addMetadataFromFieldTypeRequest.getComponentProperties(), SupportedFieldType.DECIMAL, addMetadataFromFieldTypeRequest.getType(), addMetadataFromFieldTypeRequest.getTargetClass(), addMetadataFromFieldTypeRequest.getPresentationAttribute(), addMetadataFromFieldTypeRequest.getMergedPropertyType(), addMetadataFromFieldTypeRequest.getDynamicEntityDao() ) ); } else if ( addMetadataFromFieldTypeRequest.getExplicitType() != null && addMetadataFromFieldTypeRequest.getExplicitType() == SupportedFieldType.FOREIGN_KEY || addMetadataFromFieldTypeRequest.getForeignField() != null && addMetadataFromFieldTypeRequest.isPropertyForeignKey() ) { ClassMetadata foreignMetadata; String foreignKeyClass; String lookupDisplayProperty; if (addMetadataFromFieldTypeRequest.getForeignField() == null) { Class<?>[] entities = addMetadataFromFieldTypeRequest.getDynamicEntityDao(). getAllPolymorphicEntitiesFromCeiling(addMetadataFromFieldTypeRequest.getType().getReturnedClass()); foreignMetadata = addMetadataFromFieldTypeRequest.getDynamicEntityDao().getSessionFactory().getClassMetadata(entities [entities.length - 1]); foreignKeyClass = entities[entities.length - 1].getName(); lookupDisplayProperty = ((BasicFieldMetadata) addMetadataFromFieldTypeRequest. getPresentationAttribute()).getLookupDisplayProperty(); if (StringUtils.isEmpty(lookupDisplayProperty) && AdminMainEntity.class.isAssignableFrom(entities[entities.length - 1])) { lookupDisplayProperty = AdminMainEntity.MAIN_ENTITY_NAME_PROPERTY; } if (StringUtils.isEmpty(lookupDisplayProperty)) { lookupDisplayProperty = "name"; } } else { try { foreignMetadata = addMetadataFromFieldTypeRequest.getDynamicEntityDao().getSessionFactory(). getClassMetadata(Class.forName(addMetadataFromFieldTypeRequest.getForeignField() .getForeignKeyClass())); foreignKeyClass = addMetadataFromFieldTypeRequest.getForeignField().getForeignKeyClass(); lookupDisplayProperty = addMetadataFromFieldTypeRequest.getForeignField().getDisplayValueProperty(); if (StringUtils.isEmpty(lookupDisplayProperty) && AdminMainEntity.class.isAssignableFrom(Class.forName(foreignKeyClass))) { lookupDisplayProperty = AdminMainEntity.MAIN_ENTITY_NAME_PROPERTY; } if (StringUtils.isEmpty(lookupDisplayProperty)) { lookupDisplayProperty = "name"; } } catch (ClassNotFoundException e) { throw new RuntimeException(e); } } Class<?> foreignResponseType = foreignMetadata.getIdentifierType().getReturnedClass(); if (foreignResponseType.equals(String.class)) { metadata.put(addMetadataFromFieldTypeRequest.getRequestedPropertyName(), addMetadataFromFieldTypeRequest.getDynamicEntityDao().getMetadata(). getFieldMetadata(addMetadataFromFieldTypeRequest.getPrefix(), addMetadataFromFieldTypeRequest.getRequestedPropertyName(), addMetadataFromFieldTypeRequest.getComponentProperties(), SupportedFieldType.FOREIGN_KEY, SupportedFieldType.STRING, addMetadataFromFieldTypeRequest.getType(), addMetadataFromFieldTypeRequest.getTargetClass(), addMetadataFromFieldTypeRequest.getPresentationAttribute(), addMetadataFromFieldTypeRequest.getMergedPropertyType(), addMetadataFromFieldTypeRequest.getDynamicEntityDao() ) ); } else { metadata.put(addMetadataFromFieldTypeRequest.getRequestedPropertyName(), addMetadataFromFieldTypeRequest .getDynamicEntityDao().getMetadata().getFieldMetadata(addMetadataFromFieldTypeRequest.getPrefix(), addMetadataFromFieldTypeRequest.getRequestedPropertyName(), addMetadataFromFieldTypeRequest.getComponentProperties(), SupportedFieldType.FOREIGN_KEY, SupportedFieldType.INTEGER, addMetadataFromFieldTypeRequest.getType(), addMetadataFromFieldTypeRequest.getTargetClass(), addMetadataFromFieldTypeRequest.getPresentationAttribute(), addMetadataFromFieldTypeRequest.getMergedPropertyType(), addMetadataFromFieldTypeRequest.getDynamicEntityDao() ) ); } ((BasicFieldMetadata) metadata.get(addMetadataFromFieldTypeRequest.getRequestedPropertyName())). setForeignKeyProperty(foreignMetadata.getIdentifierPropertyName()); ((BasicFieldMetadata) metadata.get(addMetadataFromFieldTypeRequest.getRequestedPropertyName())) .setForeignKeyClass(foreignKeyClass); ((BasicFieldMetadata) metadata.get(addMetadataFromFieldTypeRequest.getRequestedPropertyName())). setForeignKeyDisplayValueProperty(lookupDisplayProperty); } else if ( addMetadataFromFieldTypeRequest.getExplicitType() != null && addMetadataFromFieldTypeRequest.getExplicitType() == SupportedFieldType.ADDITIONAL_FOREIGN_KEY || addMetadataFromFieldTypeRequest.getAdditionalForeignFields() != null && addMetadataFromFieldTypeRequest.getAdditionalForeignKeyIndexPosition() >= 0 ) { if (!addMetadataFromFieldTypeRequest.getType().isEntityType()) { throw new IllegalArgumentException("Only ManyToOne and OneToOne fields can be marked as a " + "SupportedFieldType of ADDITIONAL_FOREIGN_KEY"); } ClassMetadata foreignMetadata; String foreignKeyClass; String lookupDisplayProperty; if (addMetadataFromFieldTypeRequest.getAdditionalForeignKeyIndexPosition() < 0) { Class<?>[] entities = addMetadataFromFieldTypeRequest.getDynamicEntityDao().getAllPolymorphicEntitiesFromCeiling (addMetadataFromFieldTypeRequest.getType().getReturnedClass()); foreignMetadata = addMetadataFromFieldTypeRequest.getDynamicEntityDao().getSessionFactory(). getClassMetadata(entities[entities.length - 1]); foreignKeyClass = entities[entities.length - 1].getName(); lookupDisplayProperty = ((BasicFieldMetadata) addMetadataFromFieldTypeRequest.getPresentationAttribute()). getLookupDisplayProperty(); if (StringUtils.isEmpty(lookupDisplayProperty) && AdminMainEntity.class.isAssignableFrom(entities[entities.length - 1])) { lookupDisplayProperty = AdminMainEntity.MAIN_ENTITY_NAME_PROPERTY; } if (StringUtils.isEmpty(lookupDisplayProperty)) { lookupDisplayProperty = "name"; } } else { try { foreignMetadata = addMetadataFromFieldTypeRequest.getDynamicEntityDao().getSessionFactory(). getClassMetadata(Class.forName(addMetadataFromFieldTypeRequest.getAdditionalForeignFields() [addMetadataFromFieldTypeRequest.getAdditionalForeignKeyIndexPosition()].getForeignKeyClass())); foreignKeyClass = addMetadataFromFieldTypeRequest.getAdditionalForeignFields()[ addMetadataFromFieldTypeRequest.getAdditionalForeignKeyIndexPosition()].getForeignKeyClass(); lookupDisplayProperty = addMetadataFromFieldTypeRequest.getAdditionalForeignFields()[ addMetadataFromFieldTypeRequest.getAdditionalForeignKeyIndexPosition()].getDisplayValueProperty(); if (StringUtils.isEmpty(lookupDisplayProperty) && AdminMainEntity.class.isAssignableFrom(Class.forName(foreignKeyClass))) { lookupDisplayProperty = AdminMainEntity.MAIN_ENTITY_NAME_PROPERTY; } if (StringUtils.isEmpty(lookupDisplayProperty)) { lookupDisplayProperty = "name"; } } catch (ClassNotFoundException e) { throw new RuntimeException(e); } } Class<?> foreignResponseType = foreignMetadata.getIdentifierType().getReturnedClass(); if (foreignResponseType.equals(String.class)) { metadata.put(addMetadataFromFieldTypeRequest.getRequestedPropertyName(), addMetadataFromFieldTypeRequest.getDynamicEntityDao().getMetadata().getFieldMetadata( addMetadataFromFieldTypeRequest.getPrefix(), addMetadataFromFieldTypeRequest.getRequestedPropertyName(), addMetadataFromFieldTypeRequest.getComponentProperties(), SupportedFieldType.ADDITIONAL_FOREIGN_KEY, SupportedFieldType.STRING, addMetadataFromFieldTypeRequest.getType(), addMetadataFromFieldTypeRequest.getTargetClass(), addMetadataFromFieldTypeRequest.getPresentationAttribute(), addMetadataFromFieldTypeRequest.getMergedPropertyType(), addMetadataFromFieldTypeRequest.getDynamicEntityDao() ) ); } else { metadata.put(addMetadataFromFieldTypeRequest.getRequestedPropertyName(), addMetadataFromFieldTypeRequest.getDynamicEntityDao().getMetadata(). getFieldMetadata(addMetadataFromFieldTypeRequest.getPrefix(), addMetadataFromFieldTypeRequest.getRequestedPropertyName(), addMetadataFromFieldTypeRequest.getComponentProperties(), SupportedFieldType.ADDITIONAL_FOREIGN_KEY, SupportedFieldType.INTEGER, addMetadataFromFieldTypeRequest.getType(), addMetadataFromFieldTypeRequest.getTargetClass(), addMetadataFromFieldTypeRequest.getPresentationAttribute(), addMetadataFromFieldTypeRequest.getMergedPropertyType(), addMetadataFromFieldTypeRequest.getDynamicEntityDao() ) ); } ((BasicFieldMetadata) metadata.get(addMetadataFromFieldTypeRequest.getRequestedPropertyName())). setForeignKeyProperty(foreignMetadata.getIdentifierPropertyName()); ((BasicFieldMetadata) metadata.get(addMetadataFromFieldTypeRequest.getRequestedPropertyName())). setForeignKeyClass(foreignKeyClass); ((BasicFieldMetadata) metadata.get(addMetadataFromFieldTypeRequest.getRequestedPropertyName())). setForeignKeyDisplayValueProperty(lookupDisplayProperty); } //return type not supported - just skip this property return FieldProviderResponse.HANDLED; } return FieldProviderResponse.NOT_HANDLED; } }