diff --git a/src/main/java/org/hibernate/boot/models/categorize/xml/internal/XmlAnnotationHelper.java b/src/main/java/org/hibernate/boot/models/categorize/xml/internal/XmlAnnotationHelper.java index a300c27..4139b1e 100644 --- a/src/main/java/org/hibernate/boot/models/categorize/xml/internal/XmlAnnotationHelper.java +++ b/src/main/java/org/hibernate/boot/models/categorize/xml/internal/XmlAnnotationHelper.java @@ -18,6 +18,7 @@ import org.hibernate.AnnotationException; import org.hibernate.annotations.AttributeAccessor; +import org.hibernate.annotations.CollectionId; import org.hibernate.annotations.CollectionType; import org.hibernate.annotations.Filter; import org.hibernate.annotations.FilterJoinTable; @@ -42,6 +43,7 @@ import org.hibernate.boot.jaxb.mapping.spi.JaxbBasicMapping; import org.hibernate.boot.jaxb.mapping.spi.JaxbCachingImpl; import org.hibernate.boot.jaxb.mapping.spi.JaxbCheckConstraintImpl; +import org.hibernate.boot.jaxb.mapping.spi.JaxbCollectionIdImpl; import org.hibernate.boot.jaxb.mapping.spi.JaxbCollectionUserTypeImpl; import org.hibernate.boot.jaxb.mapping.spi.JaxbColumnImpl; import org.hibernate.boot.jaxb.mapping.spi.JaxbConfigurationParameterImpl; @@ -122,7 +124,6 @@ import static java.util.Collections.emptyList; import static org.hibernate.internal.util.NullnessHelper.coalesce; -import static org.hibernate.boot.models.categorize.xml.internal.XmlProcessingHelper.getOrMakeNamedAnnotation; /** * Helper for creating annotation from equivalent JAXB @@ -335,6 +336,33 @@ public static void applyCollectionUserType( typeAnn.setAttributeValue( "parameters", collectParameters( jaxbType.getParameters(), memberDetails, xmlDocumentContext ) ); } + public static void applyCollectionId( + JaxbCollectionIdImpl jaxbCollectionId, + MutableMemberDetails memberDetails, + XmlDocumentContext xmlDocumentContext) { + if ( jaxbCollectionId == null ) { + return; + } + + final MutableAnnotationUsage collectionIdAnn = XmlProcessingHelper.getOrMakeAnnotation( CollectionId.class, memberDetails, xmlDocumentContext ); + final AnnotationDescriptor collectionIdDescriptor = xmlDocumentContext + .getModelBuildingContext() + .getAnnotationDescriptorRegistry() + .getDescriptor( CollectionId.class ); + + final JaxbColumnImpl jaxbColumn = jaxbCollectionId.getColumn(); + if ( jaxbColumn != null ) { + collectionIdAnn.setAttributeValue( "column", createColumnAnnotation( + jaxbColumn, + memberDetails, + xmlDocumentContext + ) ); + } + + applyOr( jaxbCollectionId, JaxbCollectionIdImpl::getGenerator, "generator", collectionIdAnn, collectionIdDescriptor ); + } + + public static void applyTargetClass( String name, MutableMemberDetails memberDetails, @@ -468,6 +496,14 @@ public static void applyAttributeOverrides( List jaxbOverrides, MutableMemberDetails memberDetails, XmlDocumentContext xmlDocumentContext) { + applyAttributeOverrides( jaxbOverrides, memberDetails, null, xmlDocumentContext ); + } + + public static void applyAttributeOverrides( + List jaxbOverrides, + MutableMemberDetails memberDetails, + String namePrefix, + XmlDocumentContext xmlDocumentContext) { if ( CollectionHelper.isEmpty( jaxbOverrides ) ) { return; } @@ -479,7 +515,7 @@ public static void applyAttributeOverrides( xmlDocumentContext ); memberDetails.addAnnotationUsage( annotationUsage ); - annotationUsage.setAttributeValue( "name", jaxbOverride.getName() ); + annotationUsage.setAttributeValue( "name", prefixIfNotAlready( jaxbOverride.getName(), namePrefix ) ); annotationUsage.setAttributeValue( "column", createColumnAnnotation( jaxbOverride.getColumn(), memberDetails, xmlDocumentContext ) ); } ); } @@ -488,6 +524,14 @@ public static void applyAssociationOverrides( List jaxbOverrides, MutableMemberDetails memberDetails, XmlDocumentContext xmlDocumentContext) { + applyAssociationOverrides( jaxbOverrides, memberDetails, null, xmlDocumentContext ); + } + + public static void applyAssociationOverrides( + List jaxbOverrides, + MutableMemberDetails memberDetails, + String namePrefix, + XmlDocumentContext xmlDocumentContext) { if ( CollectionHelper.isEmpty( jaxbOverrides ) ) { return; } @@ -499,7 +543,7 @@ public static void applyAssociationOverrides( xmlDocumentContext ); memberDetails.addAnnotationUsage( annotationUsage ); - annotationUsage.setAttributeValue( "name", jaxbOverride.getName() ); + annotationUsage.setAttributeValue( "name", prefixIfNotAlready( jaxbOverride.getName(), namePrefix ) ); // todo : join columns // todo : join table // todo : foreign key @@ -523,6 +567,14 @@ public static void applyConvert( JaxbConvertImpl jaxbConvert, MutableMemberDetails memberDetails, XmlDocumentContext xmlDocumentContext) { + applyConvert( jaxbConvert, memberDetails, null, xmlDocumentContext ); + } + + public static void applyConvert( + JaxbConvertImpl jaxbConvert, + MutableMemberDetails memberDetails, + String namePrefix, + XmlDocumentContext xmlDocumentContext) { if ( jaxbConvert == null ) { return; } @@ -537,7 +589,7 @@ public static void applyConvert( final ClassDetailsRegistry classDetailsRegistry = xmlDocumentContext.getModelBuildingContext().getClassDetailsRegistry(); final ClassDetails converter = classDetailsRegistry.resolveClassDetails( jaxbConvert.getConverter() ); annotationUsage.setAttributeValue( "converter", converter ); - annotationUsage.setAttributeValue( "attributeName", jaxbConvert.getAttributeName() ); + annotationUsage.setAttributeValue( "attributeName", prefixIfNotAlready( jaxbConvert.getAttributeName(), namePrefix ) ); annotationUsage.setAttributeValue( "disableConversion", jaxbConvert.isDisableConversion() ); } @@ -1037,4 +1089,14 @@ static void applyRowId( applyAttributeIfSpecified( rowIdAnn, "value", rowId ); } } + + private static String prefixIfNotAlready(String value, String prefix) { + if ( StringHelper.isNotEmpty( prefix ) ) { + final String previous = StringHelper.unqualify( value ); + if ( !previous.equalsIgnoreCase( prefix ) ) { + return StringHelper.qualify( prefix, value ); + } + } + return value; + } } diff --git a/src/main/java/org/hibernate/boot/models/categorize/xml/internal/attr/CommonPluralAttributeProcessing.java b/src/main/java/org/hibernate/boot/models/categorize/xml/internal/attr/CommonPluralAttributeProcessing.java new file mode 100644 index 0000000..8819d32 --- /dev/null +++ b/src/main/java/org/hibernate/boot/models/categorize/xml/internal/attr/CommonPluralAttributeProcessing.java @@ -0,0 +1,174 @@ +/* + * Hibernate, Relational Persistence for Idiomatic Java + * + * SPDX-License-Identifier: Apache-2.0 + * Copyright: Red Hat Inc. and Hibernate Authors + */ +package org.hibernate.boot.models.categorize.xml.internal.attr; + +import org.hibernate.annotations.Bag; +import org.hibernate.annotations.Fetch; +import org.hibernate.annotations.SQLDelete; +import org.hibernate.annotations.SQLDeleteAll; +import org.hibernate.annotations.SQLInsert; +import org.hibernate.annotations.SQLUpdate; +import org.hibernate.annotations.SortComparator; +import org.hibernate.annotations.SortNatural; +import org.hibernate.boot.internal.CollectionClassification; +import org.hibernate.boot.internal.LimitedCollectionClassification; +import org.hibernate.boot.jaxb.mapping.spi.JaxbOrderColumnImpl; +import org.hibernate.boot.jaxb.mapping.spi.JaxbPluralAttribute; +import org.hibernate.boot.models.categorize.xml.internal.XmlAnnotationHelper; +import org.hibernate.boot.models.categorize.xml.spi.XmlDocumentContext; +import org.hibernate.internal.util.StringHelper; +import org.hibernate.models.internal.MutableAnnotationUsage; +import org.hibernate.models.internal.MutableMemberDetails; +import org.hibernate.models.spi.ClassDetails; +import org.hibernate.models.spi.ClassDetailsRegistry; +import org.hibernate.models.spi.SourceModelBuildingContext; + +import jakarta.persistence.MapKey; +import jakarta.persistence.MapKeyClass; +import jakarta.persistence.MapKeyEnumerated; +import jakarta.persistence.MapKeyTemporal; +import jakarta.persistence.OrderBy; +import jakarta.persistence.OrderColumn; + +import static org.hibernate.boot.models.categorize.xml.internal.XmlProcessingHelper.getOrMakeAnnotation; +import static org.hibernate.boot.models.categorize.xml.internal.XmlProcessingHelper.setIf; + +/** + * @author Marco Belladelli + */ +public class CommonPluralAttributeProcessing { + public static void applyPluralAttributeStructure( + JaxbPluralAttribute jaxbPluralAttribute, + MutableMemberDetails memberDetails, + XmlDocumentContext documentContext) { + final SourceModelBuildingContext buildingContext = documentContext.getModelBuildingContext(); + final ClassDetailsRegistry classDetailsRegistry = buildingContext.getClassDetailsRegistry(); + + if ( jaxbPluralAttribute.getFetchMode() != null ) { + final MutableAnnotationUsage fetchAnn = getOrMakeAnnotation( Fetch.class, memberDetails, documentContext ); + fetchAnn.setAttributeValue( "value", jaxbPluralAttribute.getFetchMode() ); + } + + if ( jaxbPluralAttribute.getClassification() != null ) { + final MutableAnnotationUsage collectionClassificationAnn = getOrMakeAnnotation( + CollectionClassification.class, + memberDetails, + documentContext + ); + setIf( jaxbPluralAttribute.getClassification(), "value", collectionClassificationAnn ); + if ( jaxbPluralAttribute.getClassification() == LimitedCollectionClassification.BAG ) { + getOrMakeAnnotation( Bag.class, memberDetails, documentContext ); + } + } + + // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + // collection-structure + + XmlAnnotationHelper.applyCollectionUserType( jaxbPluralAttribute.getCollectionType(), memberDetails, documentContext ); + + XmlAnnotationHelper.applyCollectionId( jaxbPluralAttribute.getCollectionId(), memberDetails, documentContext ); + + if ( StringHelper.isNotEmpty( jaxbPluralAttribute.getOrderBy() ) ) { + final MutableAnnotationUsage orderByAnn = getOrMakeAnnotation( + OrderBy.class, + memberDetails, + documentContext + ); + orderByAnn.setAttributeValue( "value", jaxbPluralAttribute.getOrderBy() ); + } + + final JaxbOrderColumnImpl orderColumn = jaxbPluralAttribute.getOrderColumn(); + if ( orderColumn != null ) { + final MutableAnnotationUsage orderByAnn = getOrMakeAnnotation( + OrderColumn.class, + memberDetails, + documentContext + ); + setIf( orderColumn.getName(), "name", orderByAnn ); + setIf( orderColumn.isNullable(), "nullable", orderByAnn ); + setIf( orderColumn.isInsertable(), "insertable", orderByAnn ); + setIf( orderColumn.isUpdatable(), "updatable", orderByAnn ); + setIf( orderColumn.getColumnDefinition(), "columnDefinition", orderByAnn ); + } + + if ( StringHelper.isNotEmpty( jaxbPluralAttribute.getSort() ) ) { + final MutableAnnotationUsage sortAnn = getOrMakeAnnotation( + SortComparator.class, + memberDetails, + documentContext + ); + final ClassDetails comparatorClassDetails = classDetailsRegistry.resolveClassDetails( jaxbPluralAttribute.getSort() ); + sortAnn.setAttributeValue( "value", comparatorClassDetails ); + } + + if ( jaxbPluralAttribute.getSortNatural() != null ) { + getOrMakeAnnotation( SortNatural.class, memberDetails, documentContext ); + } + + // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + // map-key + + if ( jaxbPluralAttribute.getMapKey() != null ) { + final MutableAnnotationUsage mapKeyAnn = getOrMakeAnnotation( MapKey.class, memberDetails, documentContext ); + setIf( jaxbPluralAttribute.getMapKey().getName(), "name", mapKeyAnn ); + } + + if ( jaxbPluralAttribute.getMapKeyClass() != null ) { + final ClassDetails mapKeyClass = classDetailsRegistry.resolveClassDetails( jaxbPluralAttribute.getMapKeyClass().getClazz() ); + getOrMakeAnnotation( MapKeyClass.class, memberDetails, documentContext ).setAttributeValue( "value", mapKeyClass ); + } + + if ( jaxbPluralAttribute.getMapKeyTemporal() != null ) { + getOrMakeAnnotation( MapKeyTemporal.class, memberDetails, documentContext ).setAttributeValue( + "value", + jaxbPluralAttribute.getMapKeyTemporal() + ); + } + + if ( jaxbPluralAttribute.getMapKeyEnumerated() != null ) { + getOrMakeAnnotation( MapKeyEnumerated.class, memberDetails, documentContext ).setAttributeValue( + "value", + jaxbPluralAttribute.getMapKeyEnumerated() + ); + } + + XmlAnnotationHelper.applyAttributeOverrides( + jaxbPluralAttribute.getMapKeyAttributeOverrides(), + memberDetails, + "key", + documentContext + ); + + jaxbPluralAttribute.getMapKeyConverts().forEach( (jaxbConvert) -> { + XmlAnnotationHelper.applyConvert( jaxbConvert, memberDetails, "key", documentContext ); + } ); + + + // todo : map-key-column, map-key-join-column, map-key-foreign-key +// XmlAnnotationHelper.applyMapKeyColumn( jaxbPluralAttribute.getMapKeyColumn(), memberDetails, buildingContext ); +// +// jaxbPluralAttribute.getMapKeyJoinColumns().forEach( jaxbMapKeyJoinColumn -> { +// XmlAnnotationHelper.applyMapKeyJoinColumn( jaxbMapKeyJoinColumn, memberDetails, buildingContext ); +// } ); +// +// XmlAnnotationHelper.applyForeignKey( jaxbPluralAttribute.getMapKeyForeignKey(), memberDetails, buildingContext ); + + // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + // filters and custom sql + + jaxbPluralAttribute.getFilters().forEach( (jaxbFilter) -> { + XmlAnnotationHelper.applyFilter( jaxbFilter, memberDetails, documentContext ); + } ); + + XmlAnnotationHelper.applySqlRestriction( jaxbPluralAttribute.getSqlRestriction(), memberDetails, documentContext ); + + XmlAnnotationHelper.applyCustomSql( jaxbPluralAttribute.getSqlInsert(), memberDetails, SQLInsert.class, documentContext ); + XmlAnnotationHelper.applyCustomSql( jaxbPluralAttribute.getSqlUpdate(), memberDetails, SQLUpdate.class, documentContext ); + XmlAnnotationHelper.applyCustomSql( jaxbPluralAttribute.getSqlDelete(), memberDetails, SQLDelete.class, documentContext ); + XmlAnnotationHelper.applyCustomSql( jaxbPluralAttribute.getSqlDeleteAll(), memberDetails, SQLDeleteAll.class, documentContext ); + } +} diff --git a/src/main/java/org/hibernate/boot/models/categorize/xml/internal/attr/ElementCollectionAttributeProcessing.java b/src/main/java/org/hibernate/boot/models/categorize/xml/internal/attr/ElementCollectionAttributeProcessing.java index 654e2a9..5d2c774 100644 --- a/src/main/java/org/hibernate/boot/models/categorize/xml/internal/attr/ElementCollectionAttributeProcessing.java +++ b/src/main/java/org/hibernate/boot/models/categorize/xml/internal/attr/ElementCollectionAttributeProcessing.java @@ -55,8 +55,6 @@ public static MutableMemberDetails processElementCollectionAttribute( MutableClassDetails declarer, AccessType classAccessType, XmlDocumentContext xmlDocumentContext) { - final ClassDetailsRegistry classDetailsRegistry = xmlDocumentContext.getModelBuildingContext().getClassDetailsRegistry(); - final AccessType accessType = coalesce( jaxbElementCollection.getAccess(), classAccessType ); final MutableMemberDetails memberDetails = XmlProcessingHelper.getAttributeMember( jaxbElementCollection.getName(), @@ -69,96 +67,20 @@ public static MutableMemberDetails processElementCollectionAttribute( memberDetails, xmlDocumentContext ); - XmlProcessingHelper.setIf( jaxbElementCollection.getTargetClass(), "targetClass", elementCollectionAnn ); XmlProcessingHelper.setIf( jaxbElementCollection.getFetch(), "fetch", elementCollectionAnn ); - - CommonAttributeProcessing.applyAttributeBasics( jaxbElementCollection, memberDetails, elementCollectionAnn, accessType, xmlDocumentContext ); - - if ( jaxbElementCollection.getFetchMode() != null ) { - final MutableAnnotationUsage fetchAnn = XmlProcessingHelper.getOrMakeAnnotation( Fetch.class, memberDetails, xmlDocumentContext ); - fetchAnn.setAttributeValue( "value", jaxbElementCollection.getFetchMode() ); - } - - final JaxbCollectionIdImpl jaxbCollectionId = jaxbElementCollection.getCollectionId(); - if ( jaxbCollectionId != null ) { - final MutableAnnotationUsage collectionIdAnn = XmlProcessingHelper.getOrMakeAnnotation( - CollectionId.class, - memberDetails, - xmlDocumentContext - ); - - final JaxbColumnImpl jaxbColumn = jaxbCollectionId.getColumn(); - final MutableAnnotationUsage columnAnn = XmlProcessingHelper.getOrMakeAnnotation( - Column.class, - memberDetails, - xmlDocumentContext - ); - collectionIdAnn.setAttributeValue( "column", columnAnn ); - XmlProcessingHelper.setIf( jaxbColumn.getName(), "name", columnAnn ); - columnAnn.setAttributeValue( "nullable", false ); - columnAnn.setAttributeValue( "unique", false ); - columnAnn.setAttributeValue( "updatable", false ); - XmlProcessingHelper.setIf( jaxbColumn.getLength(), "length", columnAnn ); - XmlProcessingHelper.setIf( jaxbColumn.getPrecision(), "precision", columnAnn ); - XmlProcessingHelper.setIf( jaxbColumn.getScale(), "scale", columnAnn ); - XmlProcessingHelper.setIf( jaxbColumn.getTable(), "table", columnAnn ); - XmlProcessingHelper.setIf( jaxbColumn.getColumnDefinition(), "columnDefinition", columnAnn ); - - final JaxbGeneratedValueImpl generator = jaxbCollectionId.getGenerator(); - if ( generator != null ) { - XmlProcessingHelper.setIf( generator.getGenerator(), "generator", collectionIdAnn ); - } - } - - if ( jaxbElementCollection.getClassification() != null ) { - final MutableAnnotationUsage collectionClassificationAnn = XmlProcessingHelper.getOrMakeAnnotation( - CollectionClassification.class, - memberDetails, - xmlDocumentContext - ); - XmlProcessingHelper.setIf( jaxbElementCollection.getClassification(), "value", collectionClassificationAnn ); - if ( jaxbElementCollection.getClassification() == LimitedCollectionClassification.BAG ) { - XmlProcessingHelper.getOrMakeAnnotation( Bag.class, memberDetails, xmlDocumentContext ); - } - } - - XmlAnnotationHelper.applyCollectionUserType( jaxbElementCollection.getCollectionType(), memberDetails, xmlDocumentContext ); - - if ( StringHelper.isNotEmpty( jaxbElementCollection.getSort() ) ) { - final MutableAnnotationUsage sortAnn = XmlProcessingHelper.getOrMakeAnnotation( - SortComparator.class, - memberDetails, - xmlDocumentContext + if ( StringHelper.isNotEmpty( jaxbElementCollection.getTargetClass() ) ) { + elementCollectionAnn.setAttributeValue( + "targetClass", + XmlAnnotationHelper.resolveJavaType( + jaxbElementCollection.getTargetClass(), + xmlDocumentContext.getModelBuildingContext() + ) ); - final ClassDetails comparatorClassDetails = classDetailsRegistry.resolveClassDetails( jaxbElementCollection.getSort() ); - sortAnn.setAttributeValue( "value", comparatorClassDetails ); - } - - if ( jaxbElementCollection.getSortNatural() != null ) { - XmlProcessingHelper.getOrMakeAnnotation( SortNatural.class, memberDetails, xmlDocumentContext ); } - if ( StringHelper.isNotEmpty( jaxbElementCollection.getOrderBy() ) ) { - final MutableAnnotationUsage orderByAnn = XmlProcessingHelper.getOrMakeAnnotation( - OrderBy.class, - memberDetails, - xmlDocumentContext - ); - orderByAnn.setAttributeValue( "value", jaxbElementCollection.getOrderBy() ); - } + CommonAttributeProcessing.applyAttributeBasics( jaxbElementCollection, memberDetails, elementCollectionAnn, accessType, xmlDocumentContext ); - if ( jaxbElementCollection.getOrderColumn() != null ) { - final MutableAnnotationUsage orderByAnn = XmlProcessingHelper.getOrMakeAnnotation( - OrderColumn.class, - memberDetails, - xmlDocumentContext - ); - XmlProcessingHelper.setIf( jaxbElementCollection.getOrderColumn().getName(), "name", orderByAnn ); - XmlProcessingHelper.setIf( jaxbElementCollection.getOrderColumn().isNullable(), "nullable", orderByAnn ); - XmlProcessingHelper.setIf( jaxbElementCollection.getOrderColumn().isInsertable(), "insertable", orderByAnn ); - XmlProcessingHelper.setIf( jaxbElementCollection.getOrderColumn().isUpdatable(), "updatable", orderByAnn ); - XmlProcessingHelper.setIf( jaxbElementCollection.getOrderColumn().getColumnDefinition(), "columnDefinition", orderByAnn ); - } + CommonPluralAttributeProcessing.applyPluralAttributeStructure( jaxbElementCollection, memberDetails, xmlDocumentContext ); // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // elements @@ -199,25 +121,19 @@ public static MutableMemberDetails processElementCollectionAttribute( XmlAnnotationHelper.applyConvert( jaxbConvert, memberDetails, xmlDocumentContext ); } ); - jaxbElementCollection.getFilters().forEach( (jaxbFilter) -> XmlAnnotationHelper.applyFilter( - jaxbFilter, + XmlAnnotationHelper.applyAttributeOverrides( + jaxbElementCollection.getAttributeOverrides(), memberDetails, + "value", xmlDocumentContext - ) ); - - XmlAnnotationHelper.applySqlRestriction( jaxbElementCollection.getSqlRestriction(), memberDetails, xmlDocumentContext ); - - XmlAnnotationHelper.applyCustomSql( jaxbElementCollection.getSqlInsert(), memberDetails, SQLInsert.class, xmlDocumentContext ); - XmlAnnotationHelper.applyCustomSql( jaxbElementCollection.getSqlUpdate(), memberDetails, SQLUpdate.class, xmlDocumentContext ); - XmlAnnotationHelper.applyCustomSql( jaxbElementCollection.getSqlDelete(), memberDetails, SQLDelete.class, xmlDocumentContext ); - XmlAnnotationHelper.applyCustomSql( jaxbElementCollection.getSqlDeleteAll(), memberDetails, SQLDeleteAll.class, xmlDocumentContext ); - - // todo : attribute-override - // todo : association-override - - // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - // map-key + ); + XmlAnnotationHelper.applyAssociationOverrides( + jaxbElementCollection.getAssociationOverrides(), + memberDetails, + "value", + xmlDocumentContext + ); return memberDetails; }