/**
  * Get nested features from a feature chaining attribute mapping
  *
  * @param root Root feature being evaluated
  * @param nestedMapping Attribute mapping for nested features
  * @param fMapping The root feature type mapping
  * @return list of nested features
  * @throws IOException
  */
 private List<Feature> getNestedFeatures(
     Feature root, NestedAttributeMapping nestedMapping, FeatureTypeMapping fMapping)
     throws IOException {
   Object fTypeName = nestedMapping.getNestedFeatureType(root);
   if (fTypeName == null || !(fTypeName instanceof Name)) {
     return null;
   }
   boolean hasSimpleFeatures = AppSchemaDataAccessRegistry.hasName((Name) fTypeName);
   // get foreign key
   Object val = getValue(nestedMapping.getSourceExpression(), root);
   if (val == null) {
     return null;
   }
   if (hasSimpleFeatures) {
     // normal app-schema mapping
     return nestedMapping.getInputFeatures(val, fMapping);
   } else {
     // app-schema with a complex feature source
     return nestedMapping.getFeatures(val, null, root);
   }
 }
 @Override
 protected void setUpTestData(SystemTestData testData) throws Exception {
   AppSchemaDataAccessRegistry.getAppSchemaProperties().setProperty("app-schema.joining", "false");
   super.setUpTestData(testData);
 }