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);
}
}
}
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));
}
}
Aggregations