/** * Populates the id property of the saved object, if it's not set already. * * @param savedObject * @param id */ protected <T> T populateIdIfNecessary(T savedObject, Object id) { return operations.forEntity(savedObject, mongoConverter.getConversionService()) // .populateIdIfNecessary(id); }
/** * Get the {@link ChangeStreamDocument#getClusterTime() cluster time} as {@link Instant} the event was emitted at. * * @return can be {@literal null}. */ @Nullable public Instant getTimestamp() { return getBsonTimestamp() != null ? converter.getConversionService().convert(raw.getClusterTime(), Instant.class) : null; }
@Override public T getBody() { if (delegate.getBody() == null || targetType.equals(delegate.getBody().getClass())) { return targetType.cast(delegate.getBody()); } Object messageBody = delegate.getBody(); if (ClassUtils.isAssignable(Document.class, messageBody.getClass())) { return converter.read(targetType, (Document) messageBody); } if (converter.getConversionService().canConvert(messageBody.getClass(), targetType)) { return converter.getConversionService().convert(messageBody, targetType); } throw new IllegalArgumentException( String.format("No converter found capable of converting %s to %s", messageBody.getClass(), targetType)); }
private Object doGetConverted(Document fullDocument) { Object result = CONVERTED_UPDATER.get(this); if (result != null) { return result; } if (ClassUtils.isAssignable(Document.class, fullDocument.getClass())) { result = converter.read(targetType, fullDocument); return CONVERTED_UPDATER.compareAndSet(this, null, result) ? result : CONVERTED_UPDATER.get(this); } if (converter.getConversionService().canConvert(fullDocument.getClass(), targetType)) { result = converter.getConversionService().convert(fullDocument, targetType); return CONVERTED_UPDATER.compareAndSet(this, null, result) ? result : CONVERTED_UPDATER.get(this); } throw new IllegalArgumentException(String.format("No converter found capable of converting %s to %s", fullDocument.getClass(), targetType)); }
@Override @SuppressWarnings("unchecked") public <T> T save(T objectToSave, String collectionName) { Assert.notNull(objectToSave, "Object to save must not be null!"); Assert.hasText(collectionName, "Collection name must not be null or empty!"); AdaptibleEntity<T> source = operations.forEntity(objectToSave, mongoConverter.getConversionService()); return source.isVersionedEntity() // ? doSaveVersioned(source, collectionName) // : (T) doSave(collectionName, objectToSave, this.mongoConverter); }
/** * Creates a new {@link QueryMapper} with the given {@link MongoConverter}. * * @param converter must not be {@literal null}. */ public QueryMapper(MongoConverter converter) { Assert.notNull(converter, "MongoConverter must not be null!"); this.conversionService = converter.getConversionService(); this.converter = converter; this.mappingContext = converter.getMappingContext(); this.exampleMapper = new MongoExampleMapper(converter); this.schemaMapper = new MongoJsonSchemaMapper(converter); }
public <T> Mono<T> save(T objectToSave, String collectionName) { Assert.notNull(objectToSave, "Object to save must not be null!"); Assert.hasText(collectionName, "Collection name must not be null or empty!"); AdaptibleEntity<T> source = operations.forEntity(objectToSave, mongoConverter.getConversionService()); return source.isVersionedEntity() ? doSaveVersioned(source, collectionName) : doSave(collectionName, objectToSave, this.mongoConverter); }
return getConversionService().canConvert(id.getClass(), targetType) ? getConversionService().convert(id, targetType) : convertToMongoType(id, null); } catch (ConversionException o_O) {
T toConvert = maybeEmitEvent(event).getSource(); AdaptibleEntity<T> entity = operations.forEntity(toConvert, mongoConverter.getConversionService()); entity.assertUpdateableIdIfNotSet();
} else { if (!ClassUtils.isAssignable(targetType, value.getClass())) { if (getConversionService().canConvert(value.getClass(), targetType)) { return getConversionService().convert(value, targetType); return getConversionService().convert(source, targetType);
protected <T> Mono<T> doSave(String collectionName, T objectToSave, MongoWriter<Object> writer) { assertUpdateableIdIfNotSet(objectToSave); return createMono(collectionName, collection -> { T toSave = maybeEmitEvent(new BeforeConvertEvent<T>(objectToSave, collectionName)).getSource(); AdaptibleEntity<T> entity = operations.forEntity(toSave, mongoConverter.getConversionService()); Document dbDoc = entity.toMappedDocument(writer).getDocument(); maybeEmitEvent(new BeforeSaveEvent<T>(toSave, dbDoc, collectionName)); return saveDocument(collectionName, dbDoc, toSave.getClass()).map(id -> { T saved = entity.populateIdIfNecessary(id); return maybeEmitEvent(new AfterSaveEvent<>(saved, dbDoc, collectionName)).getSource(); }); }); }
protected <T> Flux<T> doInsertBatch(String collectionName, Collection<? extends T> batchToSave, MongoWriter<Object> writer) { Assert.notNull(writer, "MongoWriter must not be null!"); Mono<List<Tuple2<AdaptibleEntity<T>, Document>>> prepareDocuments = Flux.fromIterable(batchToSave) .map(uninitialized -> { BeforeConvertEvent<T> event = new BeforeConvertEvent<>(uninitialized, collectionName); T toConvert = maybeEmitEvent(event).getSource(); AdaptibleEntity<T> entity = operations.forEntity(toConvert, mongoConverter.getConversionService()); entity.assertUpdateableIdIfNotSet(); T initialized = entity.initializeVersionProperty(); Document dbDoc = entity.toMappedDocument(writer).getDocument(); maybeEmitEvent(new BeforeSaveEvent<>(initialized, dbDoc, collectionName)); return Tuples.of(entity, dbDoc); }).collectList(); Flux<Tuple2<AdaptibleEntity<T>, Document>> insertDocuments = prepareDocuments.flatMapMany(tuples -> { List<Document> documents = tuples.stream().map(Tuple2::getT2).collect(Collectors.toList()); return insertDocumentList(collectionName, documents).thenMany(Flux.fromIterable(tuples)); }); return insertDocuments.map(tuple -> { Object id = MappedDocument.of(tuple.getT2()).getId(); T saved = tuple.getT1().populateIdIfNecessary(id); maybeEmitEvent(new AfterSaveEvent<>(saved, tuple.getT2(), collectionName)); return saved; }); }
protected <T> Mono<T> doInsert(String collectionName, T objectToSave, MongoWriter<Object> writer) { return Mono.defer(() -> { BeforeConvertEvent<T> event = new BeforeConvertEvent<>(objectToSave, collectionName); T toConvert = maybeEmitEvent(event).getSource(); AdaptibleEntity<T> entity = operations.forEntity(toConvert, mongoConverter.getConversionService()); entity.assertUpdateableIdIfNotSet(); T initialized = entity.initializeVersionProperty(); Document dbDoc = entity.toMappedDocument(writer).getDocument(); maybeEmitEvent(new BeforeSaveEvent<>(initialized, dbDoc, collectionName)); Mono<T> afterInsert = insertDocument(collectionName, dbDoc, initialized.getClass()).map(id -> { T saved = entity.populateIdIfNecessary(id); maybeEmitEvent(new AfterSaveEvent<>(saved, dbDoc, collectionName)); return saved; }); return afterInsert; }); }
protected <T> T doSave(String collectionName, T objectToSave, MongoWriter<T> writer) { objectToSave = maybeEmitEvent(new BeforeConvertEvent<>(objectToSave, collectionName)).getSource(); AdaptibleEntity<T> entity = operations.forEntity(objectToSave, mongoConverter.getConversionService()); entity.assertUpdateableIdIfNotSet(); MappedDocument mapped = entity.toMappedDocument(writer); Document dbDoc = mapped.getDocument(); maybeEmitEvent(new BeforeSaveEvent<>(objectToSave, dbDoc, collectionName)); Object id = saveDocument(collectionName, dbDoc, objectToSave.getClass()); T saved = populateIdIfNecessary(entity.getBean(), id); maybeEmitEvent(new AfterSaveEvent<>(saved, dbDoc, collectionName)); return saved; }
protected <T> T doInsert(String collectionName, T objectToSave, MongoWriter<T> writer) { BeforeConvertEvent<T> event = new BeforeConvertEvent<>(objectToSave, collectionName); T toConvert = maybeEmitEvent(event).getSource(); AdaptibleEntity<T> entity = operations.forEntity(toConvert, mongoConverter.getConversionService()); entity.assertUpdateableIdIfNotSet(); T initialized = entity.initializeVersionProperty(); Document dbDoc = entity.toMappedDocument(writer).getDocument(); maybeEmitEvent(new BeforeSaveEvent<>(initialized, dbDoc, collectionName)); Object id = insertDocument(collectionName, dbDoc, initialized.getClass()); T saved = populateIdIfNecessary(initialized, id); maybeEmitEvent(new AfterSaveEvent<>(saved, dbDoc, collectionName)); return saved; }
/** * Populates the id property of the saved object, if it's not set already. * * @param savedObject * @param id */ protected <T> T populateIdIfNecessary(T savedObject, Object id) { return operations.forEntity(savedObject, mongoConverter.getConversionService()) // .populateIdIfNecessary(id); }
/** * Get the {@link ChangeStreamDocument#getClusterTime() cluster time} as {@link Instant} the event was emitted at. * * @return can be {@literal null}. */ @Nullable public Instant getTimestamp() { return raw != null && raw.getClusterTime() != null ? converter.getConversionService().convert(raw.getClusterTime(), Instant.class) : null; }
public <T> Mono<T> save(T objectToSave, String collectionName) { Assert.notNull(objectToSave, "Object to save must not be null!"); Assert.hasText(collectionName, "Collection name must not be null or empty!"); AdaptibleEntity<T> source = operations.forEntity(objectToSave, mongoConverter.getConversionService()); return source.isVersionedEntity() ? doSaveVersioned(source, collectionName) : doSave(collectionName, objectToSave, this.mongoConverter); }
@Override @SuppressWarnings("unchecked") public <T> T save(T objectToSave, String collectionName) { Assert.notNull(objectToSave, "Object to save must not be null!"); Assert.hasText(collectionName, "Collection name must not be null or empty!"); AdaptibleEntity<T> source = operations.forEntity(objectToSave, mongoConverter.getConversionService()); return source.isVersionedEntity() // ? doSaveVersioned(source, collectionName) // : (T) doSave(collectionName, objectToSave, this.mongoConverter); }
protected <T> T doSave(String collectionName, T objectToSave, MongoWriter<T> writer) { objectToSave = maybeEmitEvent(new BeforeConvertEvent<>(objectToSave, collectionName)).getSource(); AdaptibleEntity<T> entity = operations.forEntity(objectToSave, mongoConverter.getConversionService()); entity.assertUpdateableIdIfNotSet(); MappedDocument mapped = entity.toMappedDocument(writer); Document dbDoc = mapped.getDocument(); maybeEmitEvent(new BeforeSaveEvent<>(objectToSave, dbDoc, collectionName)); Object id = saveDocument(collectionName, dbDoc, objectToSave.getClass()); T saved = populateIdIfNecessary(entity.getBean(), id); maybeEmitEvent(new AfterSaveEvent<>(saved, dbDoc, collectionName)); return saved; }