Search in sources :

Example 1 with BsonProperty

use of org.bson.codecs.pojo.annotations.BsonProperty in project mongo-java-driver by mongodb.

the class ConventionAnnotationImpl method processPropertyAnnotations.

private void processPropertyAnnotations(final ClassModelBuilder<?> classModelBuilder, final PropertyModelBuilder<?> propertyModelBuilder) {
    for (Annotation annotation : propertyModelBuilder.getReadAnnotations()) {
        if (annotation instanceof BsonProperty) {
            BsonProperty bsonProperty = (BsonProperty) annotation;
            if (!"".equals(bsonProperty.value())) {
                propertyModelBuilder.readName(bsonProperty.value());
            }
            propertyModelBuilder.discriminatorEnabled(bsonProperty.useDiscriminator());
            if (propertyModelBuilder.getName().equals(classModelBuilder.getIdPropertyName())) {
                classModelBuilder.idPropertyName(null);
            }
        } else if (annotation instanceof BsonId) {
            classModelBuilder.idPropertyName(propertyModelBuilder.getName());
        } else if (annotation instanceof BsonIgnore) {
            propertyModelBuilder.readName(null);
        } else if (annotation instanceof BsonRepresentation) {
            BsonRepresentation bsonRepresentation = (BsonRepresentation) annotation;
            BsonType bsonRep = bsonRepresentation.value();
            propertyModelBuilder.bsonRepresentation(bsonRep);
        }
    }
    for (Annotation annotation : propertyModelBuilder.getWriteAnnotations()) {
        if (annotation instanceof BsonProperty) {
            BsonProperty bsonProperty = (BsonProperty) annotation;
            if (!"".equals(bsonProperty.value())) {
                propertyModelBuilder.writeName(bsonProperty.value());
            }
        } else if (annotation instanceof BsonIgnore) {
            propertyModelBuilder.writeName(null);
        }
    }
}
Also used : BsonType(org.bson.BsonType) BsonId(org.bson.codecs.pojo.annotations.BsonId) BsonRepresentation(org.bson.codecs.pojo.annotations.BsonRepresentation) BsonProperty(org.bson.codecs.pojo.annotations.BsonProperty) Annotation(java.lang.annotation.Annotation) BsonIgnore(org.bson.codecs.pojo.annotations.BsonIgnore)

Example 2 with BsonProperty

use of org.bson.codecs.pojo.annotations.BsonProperty in project mongo-java-driver by mongodb.

the class ConventionAnnotationImpl method processCreatorAnnotation.

@SuppressWarnings("unchecked")
private <T> void processCreatorAnnotation(final ClassModelBuilder<T> classModelBuilder) {
    Class<T> clazz = classModelBuilder.getType();
    CreatorExecutable<T> creatorExecutable = null;
    for (Constructor<?> constructor : clazz.getDeclaredConstructors()) {
        if (isPublic(constructor.getModifiers()) && !constructor.isSynthetic()) {
            for (Annotation annotation : constructor.getDeclaredAnnotations()) {
                if (annotation.annotationType().equals(BsonCreator.class)) {
                    if (creatorExecutable != null) {
                        throw new CodecConfigurationException("Found multiple constructors annotated with @BsonCreator");
                    }
                    creatorExecutable = new CreatorExecutable<T>(clazz, (Constructor<T>) constructor);
                }
            }
        }
    }
    Class<?> bsonCreatorClass = clazz;
    boolean foundStaticBsonCreatorMethod = false;
    while (bsonCreatorClass != null && !foundStaticBsonCreatorMethod) {
        for (Method method : bsonCreatorClass.getDeclaredMethods()) {
            if (isStatic(method.getModifiers()) && !method.isSynthetic() && !method.isBridge()) {
                for (Annotation annotation : method.getDeclaredAnnotations()) {
                    if (annotation.annotationType().equals(BsonCreator.class)) {
                        if (creatorExecutable != null) {
                            throw new CodecConfigurationException("Found multiple constructors / methods annotated with @BsonCreator");
                        } else if (!bsonCreatorClass.isAssignableFrom(method.getReturnType())) {
                            throw new CodecConfigurationException(format("Invalid method annotated with @BsonCreator. Returns '%s', expected %s", method.getReturnType(), bsonCreatorClass));
                        }
                        creatorExecutable = new CreatorExecutable<T>(clazz, method);
                        foundStaticBsonCreatorMethod = true;
                    }
                }
            }
        }
        bsonCreatorClass = bsonCreatorClass.getSuperclass();
    }
    if (creatorExecutable != null) {
        List<BsonProperty> properties = creatorExecutable.getProperties();
        List<Class<?>> parameterTypes = creatorExecutable.getParameterTypes();
        List<Type> parameterGenericTypes = creatorExecutable.getParameterGenericTypes();
        if (properties.size() != parameterTypes.size()) {
            throw creatorExecutable.getError(clazz, "All parameters in the @BsonCreator method / constructor must be annotated " + "with a @BsonProperty.");
        }
        for (int i = 0; i < properties.size(); i++) {
            boolean isIdProperty = creatorExecutable.getIdPropertyIndex() != null && creatorExecutable.getIdPropertyIndex().equals(i);
            Class<?> parameterType = parameterTypes.get(i);
            Type genericType = parameterGenericTypes.get(i);
            PropertyModelBuilder<?> propertyModelBuilder = null;
            if (isIdProperty) {
                propertyModelBuilder = classModelBuilder.getProperty(classModelBuilder.getIdPropertyName());
            } else {
                BsonProperty bsonProperty = properties.get(i);
                // Find the property using write name and falls back to read name
                for (PropertyModelBuilder<?> builder : classModelBuilder.getPropertyModelBuilders()) {
                    if (bsonProperty.value().equals(builder.getWriteName())) {
                        propertyModelBuilder = builder;
                        break;
                    } else if (bsonProperty.value().equals(builder.getReadName())) {
                        // When there is a property that matches the read name of the parameter, save it but continue to look
                        // This is just in case there is another property that matches the write name.
                        propertyModelBuilder = builder;
                    }
                }
                // Support legacy options, when BsonProperty matches the actual POJO property name (e.g. method name or field name).
                if (propertyModelBuilder == null) {
                    propertyModelBuilder = classModelBuilder.getProperty(bsonProperty.value());
                }
                if (propertyModelBuilder == null) {
                    propertyModelBuilder = addCreatorPropertyToClassModelBuilder(classModelBuilder, bsonProperty.value(), parameterType);
                } else {
                    // If not using a legacy BsonProperty reference to the property set the write name to be the annotated name.
                    if (!bsonProperty.value().equals(propertyModelBuilder.getName())) {
                        propertyModelBuilder.writeName(bsonProperty.value());
                    }
                    tryToExpandToGenericType(parameterType, propertyModelBuilder, genericType);
                }
            }
            if (!propertyModelBuilder.getTypeData().isAssignableFrom(parameterType)) {
                throw creatorExecutable.getError(clazz, format("Invalid Property type for '%s'. Expected %s, found %s.", propertyModelBuilder.getWriteName(), propertyModelBuilder.getTypeData().getType(), parameterType));
            }
        }
        classModelBuilder.instanceCreatorFactory(new InstanceCreatorFactoryImpl<T>(creatorExecutable));
    }
}
Also used : Constructor(java.lang.reflect.Constructor) CodecConfigurationException(org.bson.codecs.configuration.CodecConfigurationException) Method(java.lang.reflect.Method) Annotation(java.lang.annotation.Annotation) BsonType(org.bson.BsonType) Type(java.lang.reflect.Type) BsonProperty(org.bson.codecs.pojo.annotations.BsonProperty)

Aggregations

Annotation (java.lang.annotation.Annotation)2 BsonType (org.bson.BsonType)2 BsonProperty (org.bson.codecs.pojo.annotations.BsonProperty)2 Constructor (java.lang.reflect.Constructor)1 Method (java.lang.reflect.Method)1 Type (java.lang.reflect.Type)1 CodecConfigurationException (org.bson.codecs.configuration.CodecConfigurationException)1 BsonId (org.bson.codecs.pojo.annotations.BsonId)1 BsonIgnore (org.bson.codecs.pojo.annotations.BsonIgnore)1 BsonRepresentation (org.bson.codecs.pojo.annotations.BsonRepresentation)1