protected void buildAdornedTargetCollectionMetadata(
      Class<?> parentClass,
      Class<?> targetClass,
      Map<String, FieldMetadata> attributes,
      FieldInfo field,
      FieldMetadataOverride adornedTargetCollectionMetadata,
      DynamicEntityDao dynamicEntityDao) {
    AdornedTargetCollectionMetadata serverMetadata =
        (AdornedTargetCollectionMetadata) attributes.get(field.getName());

    Class<?> resolvedClass = parentClass == null ? targetClass : parentClass;
    AdornedTargetCollectionMetadata metadata;
    if (serverMetadata != null) {
      metadata = serverMetadata;
    } else {
      metadata = new AdornedTargetCollectionMetadata();
    }
    metadata.setTargetClass(targetClass.getName());
    metadata.setFieldName(field.getName());

    if (adornedTargetCollectionMetadata.getReadOnly() != null) {
      metadata.setMutable(!adornedTargetCollectionMetadata.getReadOnly());
    }
    if (adornedTargetCollectionMetadata.getShowIfProperty() != null) {
      metadata.setShowIfProperty(adornedTargetCollectionMetadata.getShowIfProperty());
    }

    org.broadleafcommerce.openadmin.dto.OperationTypes dtoOperationTypes =
        new org.broadleafcommerce.openadmin.dto.OperationTypes(
            OperationType.ADORNEDTARGETLIST,
            OperationType.ADORNEDTARGETLIST,
            OperationType.ADORNEDTARGETLIST,
            OperationType.ADORNEDTARGETLIST,
            OperationType.BASIC);
    if (adornedTargetCollectionMetadata.getAddType() != null) {
      dtoOperationTypes.setAddType(adornedTargetCollectionMetadata.getAddType());
    }
    if (adornedTargetCollectionMetadata.getRemoveType() != null) {
      dtoOperationTypes.setRemoveType(adornedTargetCollectionMetadata.getRemoveType());
    }
    if (adornedTargetCollectionMetadata.getFetchType() != null) {
      dtoOperationTypes.setFetchType(adornedTargetCollectionMetadata.getFetchType());
    }
    if (adornedTargetCollectionMetadata.getInspectType() != null) {
      dtoOperationTypes.setInspectType(adornedTargetCollectionMetadata.getInspectType());
    }
    if (adornedTargetCollectionMetadata.getUpdateType() != null) {
      dtoOperationTypes.setUpdateType(adornedTargetCollectionMetadata.getUpdateType());
    }

    // don't allow additional non-persistent properties or additional foreign keys for an advanced
    // collection datasource - they don't make sense in this context
    PersistencePerspective persistencePerspective;
    if (serverMetadata != null) {
      persistencePerspective = metadata.getPersistencePerspective();
      persistencePerspective.setOperationTypes(dtoOperationTypes);
    } else {
      persistencePerspective =
          new PersistencePerspective(dtoOperationTypes, new String[] {}, new ForeignKey[] {});
      metadata.setPersistencePerspective(persistencePerspective);
    }

    String parentObjectProperty = null;
    if (serverMetadata != null) {
      parentObjectProperty =
          ((AdornedTargetList)
                  serverMetadata
                      .getPersistencePerspective()
                      .getPersistencePerspectiveItems()
                      .get(PersistencePerspectiveItemType.ADORNEDTARGETLIST))
              .getLinkedObjectPath();
    }
    if (!StringUtils.isEmpty(adornedTargetCollectionMetadata.getParentObjectProperty())) {
      parentObjectProperty = adornedTargetCollectionMetadata.getParentObjectProperty();
    }
    if (parentObjectProperty == null && !StringUtils.isEmpty(field.getOneToManyMappedBy())) {
      parentObjectProperty = field.getOneToManyMappedBy();
    }
    if (parentObjectProperty == null && !StringUtils.isEmpty(field.getManyToManyMappedBy())) {
      parentObjectProperty = field.getManyToManyMappedBy();
    }
    if (StringUtils.isEmpty(parentObjectProperty)) {
      throw new IllegalArgumentException(
          "Unable to infer a parentObjectProperty for the @AdminPresentationAdornedTargetCollection annotated field("
              + field.getName()
              + "). If not using the mappedBy property of @OneToMany or @ManyToMany, please make sure to explicitly define the parentObjectProperty property");
    }

    String sortProperty = null;
    if (serverMetadata != null) {
      sortProperty =
          ((AdornedTargetList)
                  serverMetadata
                      .getPersistencePerspective()
                      .getPersistencePerspectiveItems()
                      .get(PersistencePerspectiveItemType.ADORNEDTARGETLIST))
              .getSortField();
    }
    if (!StringUtils.isEmpty(adornedTargetCollectionMetadata.getSortProperty())) {
      sortProperty = adornedTargetCollectionMetadata.getSortProperty();
    }

    metadata.setParentObjectClass(resolvedClass.getName());
    if (adornedTargetCollectionMetadata.getMaintainedAdornedTargetFields() != null) {
      metadata.setMaintainedAdornedTargetFields(
          adornedTargetCollectionMetadata.getMaintainedAdornedTargetFields());
    }
    if (adornedTargetCollectionMetadata.getGridVisibleFields() != null) {
      metadata.setGridVisibleFields(adornedTargetCollectionMetadata.getGridVisibleFields());
    }
    String parentObjectIdProperty = null;
    if (serverMetadata != null) {
      parentObjectIdProperty =
          ((AdornedTargetList)
                  serverMetadata
                      .getPersistencePerspective()
                      .getPersistencePerspectiveItems()
                      .get(PersistencePerspectiveItemType.ADORNEDTARGETLIST))
              .getLinkedIdProperty();
    }
    if (adornedTargetCollectionMetadata.getParentObjectIdProperty() != null) {
      parentObjectIdProperty = adornedTargetCollectionMetadata.getParentObjectIdProperty();
    }
    String targetObjectProperty = null;
    if (serverMetadata != null) {
      targetObjectProperty =
          ((AdornedTargetList)
                  serverMetadata
                      .getPersistencePerspective()
                      .getPersistencePerspectiveItems()
                      .get(PersistencePerspectiveItemType.ADORNEDTARGETLIST))
              .getTargetObjectPath();
    }
    if (adornedTargetCollectionMetadata.getTargetObjectProperty() != null) {
      targetObjectProperty = adornedTargetCollectionMetadata.getTargetObjectProperty();
    }

    String joinEntityClass = null;
    if (serverMetadata != null) {
      joinEntityClass =
          ((AdornedTargetList)
                  serverMetadata
                      .getPersistencePerspective()
                      .getPersistencePerspectiveItems()
                      .get(PersistencePerspectiveItemType.ADORNEDTARGETLIST))
              .getJoinEntityClass();
    }
    if (adornedTargetCollectionMetadata.getJoinEntityClass() != null) {
      joinEntityClass = adornedTargetCollectionMetadata.getJoinEntityClass();
    }

    Class<?> collectionTarget = null;
    try {
      checkCeiling:
      {
        try {
          ParameterizedType pt = (ParameterizedType) field.getGenericType();
          java.lang.reflect.Type collectionType = pt.getActualTypeArguments()[0];
          String ceilingEntityName = ((Class<?>) collectionType).getName();
          collectionTarget = entityConfiguration.lookupEntityClass(ceilingEntityName);
          break checkCeiling;
        } catch (NoSuchBeanDefinitionException e) {
          // We weren't successful at looking at entity configuration to find the type of this
          // collection.
          // We will continue and attempt to find it via the Hibernate annotations
        }
        if (!StringUtils.isEmpty(field.getOneToManyTargetEntity())
            && !void.class.getName().equals(field.getOneToManyTargetEntity())) {
          collectionTarget = Class.forName(field.getOneToManyTargetEntity());
          break checkCeiling;
        }
        if (!StringUtils.isEmpty(field.getManyToManyTargetEntity())
            && !void.class.getName().equals(field.getManyToManyTargetEntity())) {
          collectionTarget = Class.forName(field.getManyToManyTargetEntity());
          break checkCeiling;
        }
      }
      if (StringUtils.isNotBlank(joinEntityClass)) {
        collectionTarget = Class.forName(joinEntityClass);
      }
    } catch (ClassNotFoundException e) {
      throw new RuntimeException(e);
    }
    if (collectionTarget == null) {
      throw new IllegalArgumentException(
          "Unable to infer the type of the collection from the targetEntity property of a OneToMany or ManyToMany collection.");
    }
    Field collectionTargetField =
        dynamicEntityDao.getFieldManager().getField(collectionTarget, targetObjectProperty);
    ManyToOne manyToOne = collectionTargetField.getAnnotation(ManyToOne.class);
    String ceiling = null;
    checkCeiling:
    {
      if (manyToOne != null && manyToOne.targetEntity() != void.class) {
        ceiling = manyToOne.targetEntity().getName();
        break checkCeiling;
      }
      ceiling = collectionTargetField.getType().getName();
    }
    if (!StringUtils.isEmpty(ceiling)) {
      metadata.setCollectionCeilingEntity(ceiling);
    }

    String targetObjectIdProperty = null;
    if (serverMetadata != null) {
      targetObjectIdProperty =
          ((AdornedTargetList)
                  serverMetadata
                      .getPersistencePerspective()
                      .getPersistencePerspectiveItems()
                      .get(PersistencePerspectiveItemType.ADORNEDTARGETLIST))
              .getTargetIdProperty();
    }
    if (adornedTargetCollectionMetadata.getTargetObjectIdProperty() != null) {
      targetObjectIdProperty = adornedTargetCollectionMetadata.getTargetObjectIdProperty();
    }
    Boolean isAscending = true;
    if (serverMetadata != null) {
      isAscending =
          ((AdornedTargetList)
                  serverMetadata
                      .getPersistencePerspective()
                      .getPersistencePerspectiveItems()
                      .get(PersistencePerspectiveItemType.ADORNEDTARGETLIST))
              .getSortAscending();
    }
    if (adornedTargetCollectionMetadata.isSortAscending() != null) {
      isAscending = adornedTargetCollectionMetadata.isSortAscending();
    }

    if (serverMetadata != null) {
      AdornedTargetList adornedTargetList =
          (AdornedTargetList)
              serverMetadata
                  .getPersistencePerspective()
                  .getPersistencePerspectiveItems()
                  .get(PersistencePerspectiveItemType.ADORNEDTARGETLIST);
      adornedTargetList.setCollectionFieldName(field.getName());
      adornedTargetList.setLinkedObjectPath(parentObjectProperty);
      adornedTargetList.setLinkedIdProperty(parentObjectIdProperty);
      adornedTargetList.setTargetObjectPath(targetObjectProperty);
      adornedTargetList.setTargetIdProperty(targetObjectIdProperty);
      adornedTargetList.setJoinEntityClass(joinEntityClass);
      adornedTargetList.setAdornedTargetEntityClassname(collectionTarget.getName());
      adornedTargetList.setSortField(sortProperty);
      adornedTargetList.setSortAscending(isAscending);
      adornedTargetList.setMutable(metadata.isMutable());
    } else {
      AdornedTargetList adornedTargetList =
          new AdornedTargetList(
              field.getName(),
              parentObjectProperty,
              parentObjectIdProperty,
              targetObjectProperty,
              targetObjectIdProperty,
              collectionTarget.getName(),
              sortProperty,
              isAscending);
      adornedTargetList.setJoinEntityClass(joinEntityClass);
      adornedTargetList.setMutable(metadata.isMutable());
      persistencePerspective.addPersistencePerspectiveItem(
          PersistencePerspectiveItemType.ADORNEDTARGETLIST, adornedTargetList);
    }

    if (adornedTargetCollectionMetadata.getExcluded() != null) {
      if (LOG.isDebugEnabled()) {
        if (adornedTargetCollectionMetadata.getExcluded()) {
          LOG.debug(
              "buildAdornedTargetCollectionMetadata:Excluding "
                  + field.getName()
                  + " because it was explicitly declared in config");
        } else {
          LOG.debug(
              "buildAdornedTargetCollectionMetadata:Showing "
                  + field.getName()
                  + " because it was explicitly declared in config");
        }
      }
      metadata.setExcluded(adornedTargetCollectionMetadata.getExcluded());
    }
    if (adornedTargetCollectionMetadata.getFriendlyName() != null) {
      metadata.setFriendlyName(adornedTargetCollectionMetadata.getFriendlyName());
    }
    if (adornedTargetCollectionMetadata.getSecurityLevel() != null) {
      metadata.setSecurityLevel(adornedTargetCollectionMetadata.getSecurityLevel());
    }
    if (adornedTargetCollectionMetadata.getOrder() != null) {
      metadata.setOrder(adornedTargetCollectionMetadata.getOrder());
    }

    if (adornedTargetCollectionMetadata.getTab() != null) {
      metadata.setTab(adornedTargetCollectionMetadata.getTab());
    }
    if (adornedTargetCollectionMetadata.getTabOrder() != null) {
      metadata.setTabOrder(adornedTargetCollectionMetadata.getTabOrder());
    }

    if (adornedTargetCollectionMetadata.getCustomCriteria() != null) {
      metadata.setCustomCriteria(adornedTargetCollectionMetadata.getCustomCriteria());
    }

    if (adornedTargetCollectionMetadata.getUseServerSideInspectionCache() != null) {
      persistencePerspective.setUseServerSideInspectionCache(
          adornedTargetCollectionMetadata.getUseServerSideInspectionCache());
    }

    if (adornedTargetCollectionMetadata.isIgnoreAdornedProperties() != null) {
      metadata.setIgnoreAdornedProperties(
          adornedTargetCollectionMetadata.isIgnoreAdornedProperties());
    }
    if (adornedTargetCollectionMetadata.getCurrencyCodeField() != null) {
      metadata.setCurrencyCodeField(adornedTargetCollectionMetadata.getCurrencyCodeField());
    }

    attributes.put(field.getName(), metadata);
  }
  protected FieldMetadataOverride overrideAdornedTargetMergeMetadata(
      AdminPresentationMergeOverride merge) {
    FieldMetadataOverride fieldMetadataOverride = new FieldMetadataOverride();
    Map<String, AdminPresentationMergeEntry> overrideValues =
        getAdminPresentationEntries(merge.mergeEntries());
    for (Map.Entry<String, AdminPresentationMergeEntry> entry : overrideValues.entrySet()) {
      String stringValue = entry.getValue().overrideValue();
      if (entry
          .getKey()
          .equals(PropertyType.AdminPresentationAdornedTargetCollection.CURRENCYCODEFIELD)) {
        fieldMetadataOverride.setCurrencyCodeField(stringValue);
      } else if (entry
          .getKey()
          .equals(PropertyType.AdminPresentationAdornedTargetCollection.CUSTOMCRITERIA)) {
        fieldMetadataOverride.setCustomCriteria(entry.getValue().stringArrayOverrideValue());
      } else if (entry
          .getKey()
          .equals(PropertyType.AdminPresentationAdornedTargetCollection.EXCLUDED)) {
        fieldMetadataOverride.setExcluded(
            StringUtils.isEmpty(stringValue)
                ? entry.getValue().booleanOverrideValue()
                : Boolean.parseBoolean(stringValue));
      } else if (entry
          .getKey()
          .equals(PropertyType.AdminPresentationAdornedTargetCollection.FRIENDLYNAME)) {
        fieldMetadataOverride.setFriendlyName(stringValue);
      } else if (entry
          .getKey()
          .equals(PropertyType.AdminPresentationAdornedTargetCollection.GRIDVISIBLEFIELDS)) {
        fieldMetadataOverride.setGridVisibleFields(entry.getValue().stringArrayOverrideValue());
      } else if (entry
          .getKey()
          .equals(PropertyType.AdminPresentationAdornedTargetCollection.IGNOREADORNEDPROPERTIES)) {
        fieldMetadataOverride.setIgnoreAdornedProperties(
            StringUtils.isEmpty(stringValue)
                ? entry.getValue().booleanOverrideValue()
                : Boolean.parseBoolean(stringValue));
      } else if (entry
          .getKey()
          .equals(PropertyType.AdminPresentationAdornedTargetCollection.JOINENTITYCLASS)) {
        fieldMetadataOverride.setJoinEntityClass(stringValue);
      } else if (entry
          .getKey()
          .equals(
              PropertyType.AdminPresentationAdornedTargetCollection
                  .MAINTAINEDADORNEDTARGETFIELDS)) {
        fieldMetadataOverride.setMaintainedAdornedTargetFields(
            entry.getValue().stringArrayOverrideValue());
      } else if (entry
          .getKey()
          .equals(PropertyType.AdminPresentationAdornedTargetCollection.OPERATIONTYPES)) {
        AdminPresentationOperationTypes operationType = entry.getValue().operationTypes();
        fieldMetadataOverride.setAddType(operationType.addType());
        fieldMetadataOverride.setRemoveType(operationType.removeType());
        fieldMetadataOverride.setUpdateType(operationType.updateType());
        fieldMetadataOverride.setFetchType(operationType.fetchType());
        fieldMetadataOverride.setInspectType(operationType.inspectType());
      } else if (entry
          .getKey()
          .equals(PropertyType.AdminPresentationAdornedTargetCollection.ORDER)) {
        fieldMetadataOverride.setOrder(
            StringUtils.isEmpty(stringValue)
                ? entry.getValue().intOverrideValue()
                : Integer.parseInt(stringValue));
      } else if (entry
          .getKey()
          .equals(PropertyType.AdminPresentationAdornedTargetCollection.PARENTOBJECTIDPROPERTY)) {
        fieldMetadataOverride.setParentObjectIdProperty(stringValue);
      } else if (entry
          .getKey()
          .equals(PropertyType.AdminPresentationAdornedTargetCollection.PARENTOBJECTPROPERTY)) {
        fieldMetadataOverride.setParentObjectProperty(stringValue);
      } else if (entry
          .getKey()
          .equals(PropertyType.AdminPresentationAdornedTargetCollection.READONLY)) {
        fieldMetadataOverride.setReadOnly(
            StringUtils.isEmpty(stringValue)
                ? entry.getValue().booleanOverrideValue()
                : Boolean.parseBoolean(stringValue));
      } else if (entry
          .getKey()
          .equals(PropertyType.AdminPresentationAdornedTargetCollection.SECURITYLEVEL)) {
        fieldMetadataOverride.setSecurityLevel(stringValue);
      } else if (entry
          .getKey()
          .equals(PropertyType.AdminPresentationAdornedTargetCollection.SHOWIFPROPERTY)) {
        fieldMetadataOverride.setShowIfProperty(stringValue);
      } else if (entry
          .getKey()
          .equals(PropertyType.AdminPresentationAdornedTargetCollection.SORTASCENDING)) {
        fieldMetadataOverride.setSortAscending(
            StringUtils.isEmpty(stringValue)
                ? entry.getValue().booleanOverrideValue()
                : Boolean.parseBoolean(stringValue));
      } else if (entry
          .getKey()
          .equals(PropertyType.AdminPresentationAdornedTargetCollection.SORTPROPERTY)) {
        fieldMetadataOverride.setSortProperty(stringValue);
      } else if (entry.getKey().equals(PropertyType.AdminPresentationAdornedTargetCollection.TAB)) {
        fieldMetadataOverride.setTab(stringValue);
      } else if (entry
          .getKey()
          .equals(PropertyType.AdminPresentationAdornedTargetCollection.TABORDER)) {
        fieldMetadataOverride.setTabOrder(
            StringUtils.isEmpty(stringValue)
                ? entry.getValue().intOverrideValue()
                : Integer.parseInt(stringValue));
      } else if (entry
          .getKey()
          .equals(PropertyType.AdminPresentationAdornedTargetCollection.TARGETOBJECTIDPROPERTY)) {
        fieldMetadataOverride.setTargetObjectIdProperty(stringValue);
      } else if (entry
          .getKey()
          .equals(PropertyType.AdminPresentationAdornedTargetCollection.TARGETOBJECTPROPERTY)) {
        fieldMetadataOverride.setTargetObjectProperty(stringValue);
      } else if (entry
          .getKey()
          .equals(
              PropertyType.AdminPresentationAdornedTargetCollection.USESERVERSIDEINSPECTIONCACHE)) {
        fieldMetadataOverride.setUseServerSideInspectionCache(
            StringUtils.isEmpty(stringValue)
                ? entry.getValue().booleanOverrideValue()
                : Boolean.parseBoolean(stringValue));
      } else {
        if (LOG.isDebugEnabled()) {
          LOG.debug(
              "Unrecognized type: " + entry.getKey() + ". Not setting on adorned target field.");
        }
      }
    }

    return fieldMetadataOverride;
  }
 protected FieldMetadataOverride constructAdornedTargetCollectionMetadataOverride(
     AdminPresentationAdornedTargetCollection adornedTargetCollection) {
   if (adornedTargetCollection != null) {
     FieldMetadataOverride override = new FieldMetadataOverride();
     override.setGridVisibleFields(adornedTargetCollection.gridVisibleFields());
     override.setIgnoreAdornedProperties(adornedTargetCollection.ignoreAdornedProperties());
     override.setMaintainedAdornedTargetFields(
         adornedTargetCollection.maintainedAdornedTargetFields());
     override.setParentObjectIdProperty(adornedTargetCollection.parentObjectIdProperty());
     override.setParentObjectProperty(adornedTargetCollection.parentObjectProperty());
     override.setSortAscending(adornedTargetCollection.sortAscending());
     override.setSortProperty(adornedTargetCollection.sortProperty());
     override.setTargetObjectIdProperty(adornedTargetCollection.targetObjectIdProperty());
     override.setTargetObjectProperty(adornedTargetCollection.targetObjectProperty());
     override.setJoinEntityClass(adornedTargetCollection.joinEntityClass());
     override.setCustomCriteria(adornedTargetCollection.customCriteria());
     override.setUseServerSideInspectionCache(
         adornedTargetCollection.useServerSideInspectionCache());
     override.setExcluded(adornedTargetCollection.excluded());
     override.setFriendlyName(adornedTargetCollection.friendlyName());
     override.setReadOnly(adornedTargetCollection.readOnly());
     override.setOrder(adornedTargetCollection.order());
     override.setTab(adornedTargetCollection.tab());
     override.setTabOrder(adornedTargetCollection.tabOrder());
     override.setSecurityLevel(adornedTargetCollection.securityLevel());
     override.setAddType(adornedTargetCollection.operationTypes().addType());
     override.setFetchType(adornedTargetCollection.operationTypes().fetchType());
     override.setRemoveType(adornedTargetCollection.operationTypes().removeType());
     override.setUpdateType(adornedTargetCollection.operationTypes().updateType());
     override.setInspectType(adornedTargetCollection.operationTypes().inspectType());
     override.setShowIfProperty(adornedTargetCollection.showIfProperty());
     override.setCurrencyCodeField(adornedTargetCollection.currencyCodeField());
     return override;
   }
   throw new IllegalArgumentException(
       "AdminPresentationAdornedTargetCollection annotation not found on field.");
 }
  @Override
  public FieldProviderResponse overrideViaAnnotation(
      OverrideViaAnnotationRequest overrideViaAnnotationRequest,
      Map<String, FieldMetadata> metadata) {
    if (!canHandleAnnotationOverride(overrideViaAnnotationRequest, metadata)) {
      return FieldProviderResponse.NOT_HANDLED;
    }
    Map<String, AdminPresentationAdornedTargetCollectionOverride>
        presentationAdornedTargetCollectionOverrides =
            new HashMap<String, AdminPresentationAdornedTargetCollectionOverride>();

    AdminPresentationOverrides myOverrides =
        overrideViaAnnotationRequest
            .getRequestedEntity()
            .getAnnotation(AdminPresentationOverrides.class);
    if (myOverrides != null) {
      for (AdminPresentationAdornedTargetCollectionOverride myOverride :
          myOverrides.adornedTargetCollections()) {
        presentationAdornedTargetCollectionOverrides.put(myOverride.name(), myOverride);
      }
    }

    for (String propertyName : presentationAdornedTargetCollectionOverrides.keySet()) {
      for (String key : metadata.keySet()) {
        if (key.startsWith(propertyName)) {
          buildAdminPresentationAdornedTargetCollectionOverride(
              overrideViaAnnotationRequest.getPrefix(),
              overrideViaAnnotationRequest.getParentExcluded(),
              metadata,
              presentationAdornedTargetCollectionOverrides,
              propertyName,
              key,
              overrideViaAnnotationRequest.getDynamicEntityDao());
        }
      }
    }

    AdminPresentationMergeOverrides myMergeOverrides =
        overrideViaAnnotationRequest
            .getRequestedEntity()
            .getAnnotation(AdminPresentationMergeOverrides.class);
    if (myMergeOverrides != null) {
      for (AdminPresentationMergeOverride override : myMergeOverrides.value()) {
        String propertyName = override.name();
        Map<String, FieldMetadata> loopMap = new HashMap<String, FieldMetadata>();
        loopMap.putAll(metadata);
        for (Map.Entry<String, FieldMetadata> entry : loopMap.entrySet()) {
          if (entry.getKey().startsWith(propertyName) || StringUtils.isEmpty(propertyName)) {
            FieldMetadata targetMetadata = entry.getValue();
            if (targetMetadata instanceof AdornedTargetCollectionMetadata) {
              AdornedTargetCollectionMetadata serverMetadata =
                  (AdornedTargetCollectionMetadata) targetMetadata;
              if (serverMetadata.getTargetClass() != null) {
                try {
                  Class<?> targetClass = Class.forName(serverMetadata.getTargetClass());
                  Class<?> parentClass = null;
                  if (serverMetadata.getOwningClass() != null) {
                    parentClass = Class.forName(serverMetadata.getOwningClass());
                  }
                  String fieldName = serverMetadata.getFieldName();
                  Field field =
                      overrideViaAnnotationRequest
                          .getDynamicEntityDao()
                          .getFieldManager()
                          .getField(targetClass, fieldName);
                  Map<String, FieldMetadata> temp = new HashMap<String, FieldMetadata>(1);
                  temp.put(field.getName(), serverMetadata);
                  FieldInfo info = buildFieldInfo(field);
                  FieldMetadataOverride fieldMetadataOverride =
                      overrideAdornedTargetMergeMetadata(override);
                  if (serverMetadata.getExcluded() != null
                      && serverMetadata.getExcluded()
                      && (fieldMetadataOverride.getExcluded() == null
                          || fieldMetadataOverride.getExcluded())) {
                    continue;
                  }
                  buildAdornedTargetCollectionMetadata(
                      parentClass,
                      targetClass,
                      temp,
                      info,
                      fieldMetadataOverride,
                      overrideViaAnnotationRequest.getDynamicEntityDao());
                  serverMetadata = (AdornedTargetCollectionMetadata) temp.get(field.getName());
                  metadata.put(entry.getKey(), serverMetadata);
                } catch (Exception e) {
                  throw new RuntimeException(e);
                }
              }
            }
          }
        }
      }
    }

    return FieldProviderResponse.HANDLED;
  }