Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

bug/MET-4860 remove sonar notification for NullPointerException #608

Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
import dev.morphia.Morphia;
import dev.morphia.mapping.Mapper;
import dev.morphia.mapping.MappingException;
import dev.morphia.query.experimental.filters.Filters;
import dev.morphia.query.filters.Filters;
import eu.europeana.corelib.definitions.edm.beans.FullBean;
import eu.europeana.corelib.edm.exceptions.MongoDBException;
import eu.europeana.corelib.edm.exceptions.MongoRuntimeException;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
import dev.morphia.mapping.DiscriminatorFunction;
import dev.morphia.mapping.MapperOptions;
import dev.morphia.mapping.NamingStrategy;
import dev.morphia.query.experimental.filters.Filters;
import dev.morphia.query.filters.Filters;
import eu.europeana.metis.mongo.model.RecordRedirect;
import eu.europeana.metis.network.ExternalRequestUtil;
import java.util.List;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package eu.europeana.metis.mongo.utils;

import dev.morphia.aggregation.experimental.Aggregation;
import dev.morphia.aggregation.experimental.AggregationOptions;
import dev.morphia.aggregation.Aggregation;
import dev.morphia.aggregation.AggregationOptions;
import dev.morphia.query.FindOptions;
import dev.morphia.query.MorphiaCursor;
import dev.morphia.query.Query;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package eu.europeana.metis.mongo.utils;

import static dev.morphia.query.experimental.filters.Filters.eq;
import static dev.morphia.query.experimental.filters.Filters.or;
import static dev.morphia.query.filters.Filters.eq;
import static dev.morphia.query.filters.Filters.or;
import static org.junit.jupiter.api.Assertions.assertEquals;

import com.fasterxml.jackson.databind.annotation.JsonSerialize;
Expand All @@ -10,8 +10,8 @@
import com.mongodb.client.model.Collation;
import dev.morphia.Datastore;
import dev.morphia.Morphia;
import dev.morphia.aggregation.experimental.Aggregation;
import dev.morphia.aggregation.experimental.AggregationOptions;
import dev.morphia.aggregation.Aggregation;
import dev.morphia.aggregation.AggregationOptions;
import dev.morphia.annotations.Entity;
import dev.morphia.annotations.Id;
import dev.morphia.query.FindOptions;
Expand Down Expand Up @@ -199,4 +199,4 @@ public int hashCode() {
return result;
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,13 +9,14 @@
import static eu.europeana.metis.network.ExternalRequestUtil.retryableExternalRequestForNetworkExceptions;
import static eu.europeana.metis.utils.CommonStringValues.CRLF_PATTERN;

import dev.morphia.UpdateOptions;
import dev.morphia.query.FindOptions;
import dev.morphia.query.Query;
import dev.morphia.query.Sort;
import dev.morphia.query.experimental.filters.Filter;
import dev.morphia.query.experimental.filters.Filters;
import dev.morphia.query.experimental.updates.UpdateOperator;
import dev.morphia.query.experimental.updates.UpdateOperators;
import dev.morphia.query.filters.Filter;
import dev.morphia.query.filters.Filters;
import dev.morphia.query.updates.UpdateOperator;
import dev.morphia.query.updates.UpdateOperators;
import eu.europeana.cloud.mcs.driver.DataSetServiceClient;
import eu.europeana.cloud.service.mcs.exception.DataSetAlreadyExistsException;
import eu.europeana.cloud.service.mcs.exception.MCSException;
Expand Down Expand Up @@ -302,7 +303,7 @@ public int findNextInSequenceDatasetId() {
.set("sequence", datasetIdSequence.getSequence());

retryableExternalRequestForNetworkExceptions(
() -> updateQuery.update(updateOperator).execute());
() -> updateQuery.update(new UpdateOptions(), updateOperator));
return datasetIdSequence.getSequence();
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
import dev.morphia.query.FindOptions;
import dev.morphia.query.Query;
import dev.morphia.query.Sort;
import dev.morphia.query.experimental.filters.Filters;
import dev.morphia.query.filters.Filters;
import eu.europeana.metis.core.dataset.DatasetXslt;
import eu.europeana.metis.core.mongo.MorphiaDatastoreProvider;
import java.util.Optional;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,9 @@
import dev.morphia.UpdateOptions;
import dev.morphia.query.FindOptions;
import dev.morphia.query.Query;
import dev.morphia.query.experimental.filters.Filters;
import dev.morphia.query.experimental.updates.UpdateOperator;
import dev.morphia.query.experimental.updates.UpdateOperators;
import dev.morphia.query.filters.Filters;
import dev.morphia.query.updates.UpdateOperator;
import dev.morphia.query.updates.UpdateOperators;
import eu.europeana.metis.core.dataset.DepublishRecordId;
import eu.europeana.metis.core.dataset.DepublishRecordId.DepublicationStatus;
import eu.europeana.metis.core.mongo.MorphiaDatastoreProvider;
Expand Down Expand Up @@ -76,7 +76,7 @@ private Set<String> getNonExistingRecordIds(String datasetId, Set<String> record

// Create query for existing records in list. Only return record IDs.
final Query<DepublishRecordId> query = morphiaDatastoreProvider.getDatastore()
.find(DepublishRecordId.class);
.find(DepublishRecordId.class);
query.filter(Filters.eq(DepublishRecordId.DATASET_ID_FIELD, datasetId));
query.filter(Filters.in(DepublishRecordId.RECORD_ID_FIELD, recordIds));

Expand All @@ -86,27 +86,25 @@ private Set<String> getNonExistingRecordIds(String datasetId, Set<String> record
findOptions.projection().exclude(DepublishRecordId.ID_FIELD);
final Set<String> existing;
existing = getListOfQueryRetryable(query, findOptions).stream()
.map(DepublishRecordId::getRecordId).collect(Collectors.toSet());
.map(DepublishRecordId::getRecordId).collect(Collectors.toSet());

// Return the other ones: the record IDs not found in the database.
return recordIds.stream().filter(recordId -> !existing.contains(recordId))
.collect(Collectors.toSet());
.collect(Collectors.toSet());
});
}

/**
* Add depublished records to persistence. This method checks whether the depublished record
* already exists, and if so, doesn't add it again. All new records (but not the existing ones)
* will have the default depublication status ({@link DepublicationStatus#PENDING_DEPUBLICATION})
* and no depublication date.
* Add depublished records to persistence. This method checks whether the depublished record already exists, and if so, doesn't
* add it again. All new records (but not the existing ones) will have the default depublication status
* ({@link DepublicationStatus#PENDING_DEPUBLICATION}) and no depublication date.
*
* @param datasetId The dataset to which the records belong.
* @param candidateRecordIds The IDs of the depublish record ids to add.
* @return How many of the passed records were in fact added. This counter is not thread-safe: if
* multiple threads try to add the same records, their combined counters may overrepresent the
* number of records that were actually added.
* @throws BadContentException In case adding the records would violate the maximum number of
* depublished records that each dataset can have.
* @return How many of the passed records were in fact added. This counter is not thread-safe: if multiple threads try to add
* the same records, their combined counters may overrepresent the number of records that were actually added.
* @throws BadContentException In case adding the records would violate the maximum number of depublished records that each
* dataset can have.
*/
public int createRecordIdsToBeDepublished(String datasetId, Set<String> candidateRecordIds)
throws BadContentException {
Expand Down Expand Up @@ -150,14 +148,14 @@ void addRecords(Set<String> recordIdsToAdd, String datasetId,
}

/**
* Deletes a list of record ids from the database. Only record ids that are in a {@link
* DepublicationStatus#PENDING_DEPUBLICATION} state will be removed.
* Deletes a list of record ids from the database. Only record ids that are in a
* {@link DepublicationStatus#PENDING_DEPUBLICATION} state will be removed.
*
* @param datasetId The dataset to which the depublish record ids belong.
* @param recordIds The depublish record ids to be removed
* @return The number or record ids that were removed.
* @throws BadContentException In case adding the records would violate the maximum number of
* depublished records that each dataset can have.
* @throws BadContentException In case adding the records would violate the maximum number of depublished records that each
* dataset can have.
*/
public Long deletePendingRecordIds(String datasetId, Set<String> recordIds)
throws BadContentException {
Expand All @@ -169,7 +167,7 @@ public Long deletePendingRecordIds(String datasetId, Set<String> recordIds)
}

final Query<DepublishRecordId> query = morphiaDatastoreProvider.getDatastore()
.find(DepublishRecordId.class);
.find(DepublishRecordId.class);
query.filter(Filters.eq(DepublishRecordId.DATASET_ID_FIELD, datasetId));
query.filter(Filters.in(DepublishRecordId.RECORD_ID_FIELD, recordIds));
query.filter(Filters.eq(DepublishRecordId.DEPUBLICATION_STATUS_FIELD,
Expand All @@ -187,22 +185,21 @@ public Long deletePendingRecordIds(String datasetId, Set<String> recordIds)
long countDepublishRecordIdsForDataset(String datasetId) {
return retryableExternalRequestForNetworkExceptions(
() -> morphiaDatastoreProvider.getDatastore().find(DepublishRecordId.class)
.filter(Filters.eq(DepublishRecordId.DATASET_ID_FIELD, datasetId)).count());
.filter(Filters.eq(DepublishRecordId.DATASET_ID_FIELD, datasetId)).count());
}

/**
* Counts how many records we have for a given dataset that have the status {@link
* DepublicationStatus#DEPUBLISHED}.
* Counts how many records we have for a given dataset that have the status {@link DepublicationStatus#DEPUBLISHED}.
*
* @param datasetId The ID of the dataset to count for.
* @return The number of records.
*/
public long countSuccessfullyDepublishedRecordIdsForDataset(String datasetId) {
return retryableExternalRequestForNetworkExceptions(
() -> morphiaDatastoreProvider.getDatastore().find(DepublishRecordId.class)
.filter(Filters.eq(DepublishRecordId.DATASET_ID_FIELD, datasetId)).filter(Filters
.filter(Filters.eq(DepublishRecordId.DATASET_ID_FIELD, datasetId)).filter(Filters
.eq(DepublishRecordId.DEPUBLICATION_STATUS_FIELD, DepublicationStatus.DEPUBLISHED))
.count());
.count());
}

/**
Expand Down Expand Up @@ -236,16 +233,16 @@ public List<DepublishRecordIdView> getDepublishRecordIds(String datasetId, int p
/**
* Get all depublished records for a given dataset.
* <p>This method is to be used with caution since it doesn't have a limit on the returned items.
* It is mainly used to minimize, internal to the application, database requests. Ids are returned
* based on the provided status filter parameter</p>
* It is mainly used to minimize, internal to the application, database requests. Ids are returned based on the provided status
* filter parameter</p>
*
* @param datasetId The dataset for which to retrieve the records. Cannot be null.
* @param sortField The sorting field. Cannot be null.
* @param sortDirection The sorting direction. Cannot be null.
* @param depublicationStatus The depublication status of the records. Can be null.
* @return A (possibly empty) list of depublish record ids.
* @throws BadContentException In case the records would violate the maximum number of depublished
* records that each dataset can have.
* @throws BadContentException In case the records would violate the maximum number of depublished records that each dataset can
* have.
*/
public Set<String> getAllDepublishRecordIdsWithStatus(String datasetId,
DepublishRecordIdSortField sortField, SortDirection sortDirection,
Expand All @@ -258,17 +255,17 @@ public Set<String> getAllDepublishRecordIdsWithStatus(String datasetId,
/**
* Get all depublished records for a given dataset.
* <p>This method is to be used with caution since it doesn't have a limit on the returned items.
* It is mainly used to minimize, internal to the application, database requests. Ids are returned
* based on the provided status filter parameter</p>
* It is mainly used to minimize, internal to the application, database requests. Ids are returned based on the provided status
* filter parameter</p>
*
* @param datasetId The dataset for which to retrieve the records. Cannot be null.
* @param sortField The sorting field. Cannot be null.
* @param sortDirection The sorting direction. Cannot be null.
* @param depublicationStatus The depublication status of the records. Can be null.
* @param recordIds The record ids provided, that are to be checked upon. Can be null/empty
* @return A (possibly empty) list of depublish record ids.
* @throws BadContentException In case the records would violate the maximum number of depublished
* records that each dataset can have.
* @throws BadContentException In case the records would violate the maximum number of depublished records that each dataset can
* have.
*/
public Set<String> getAllDepublishRecordIdsWithStatus(String datasetId,
DepublishRecordIdSortField sortField, SortDirection sortDirection,
Expand Down Expand Up @@ -302,7 +299,7 @@ private Query<DepublishRecordId> prepareQueryForDepublishRecordIds(String datase
DepublicationStatus depublicationStatus, String searchQuery) {
// Create query.
final Query<DepublishRecordId> query = morphiaDatastoreProvider.getDatastore()
.find(DepublishRecordId.class);
.find(DepublishRecordId.class);
query.filter(Filters.eq(DepublishRecordId.DATASET_ID_FIELD, datasetId));
if (Objects.nonNull(depublicationStatus)) {
query.filter(Filters.eq(DepublishRecordId.DEPUBLICATION_STATUS_FIELD, depublicationStatus));
Expand All @@ -316,16 +313,14 @@ private Query<DepublishRecordId> prepareQueryForDepublishRecordIds(String datase
}

/**
* This method marks record ids with the provided {@link DepublicationStatus} and {@link Date}
* where appropriate.
* This method marks record ids with the provided {@link DepublicationStatus} and {@link Date} where appropriate.
* <p>A {@link DepublicationStatus#PENDING_DEPUBLICATION} unsets the depublication date</p>
* <p>A {@link DepublicationStatus#DEPUBLISHED} sets the depublication date with the one
* provided</p>
*
* @param datasetId the dataset for which to do this. Cannot be null
* @param recordIds the records for which to set this. Can be null or empty, in which case the
* operation will be performed on all records. If it is not empty, a new record will be created if
* a record with the given record ID is not already present.
* @param recordIds the records for which to set this. Can be null or empty, in which case the operation will be performed on
* all records. If it is not empty, a new record will be created if a record with the given record ID is not already present.
* @param depublicationStatus the depublication status. Cannot be null
* @param depublicationDate the depublication date. Can be null only if depublicationStatus is
* {@link DepublicationStatus#PENDING_DEPUBLICATION}
Expand Down Expand Up @@ -353,8 +348,9 @@ public void markRecordIdsWithDepublicationStatus(String datasetId, Set<String> r
// Add the records that are missing.
final Set<String> recordIdsToAdd = getNonExistingRecordIds(datasetId, recordIds);
final Instant depublicationInstant = Optional.ofNullable(depublicationDate)
.filter(date -> depublicationStatus != DepublicationStatus.PENDING_DEPUBLICATION)
.map(Date::toInstant).orElse(null);
.filter(
date -> depublicationStatus != DepublicationStatus.PENDING_DEPUBLICATION)
.map(Date::toInstant).orElse(null);
addRecords(recordIdsToAdd, datasetId, depublicationStatus, depublicationInstant);

// Compute the records to update - if there are none, we're done.
Expand All @@ -367,27 +363,29 @@ public void markRecordIdsWithDepublicationStatus(String datasetId, Set<String> r

// Create query.
final Query<DepublishRecordId> query = morphiaDatastoreProvider.getDatastore()
.find(DepublishRecordId.class);
.find(DepublishRecordId.class);
query.filter(Filters.eq(DepublishRecordId.DATASET_ID_FIELD, datasetId));
if (recordIdsToUpdate != null) {
query.filter(Filters.in(DepublishRecordId.RECORD_ID_FIELD, recordIdsToUpdate));
}

// Define the update operations.
final UpdateOperator firstUpdateOperator = UpdateOperators
.set(DepublishRecordId.DEPUBLICATION_STATUS_FIELD, depublicationStatus);
final ArrayList<UpdateOperator> extraUpdateOperators = new ArrayList<>();
final ArrayList<UpdateOperator> updateOperators = new ArrayList<>();
updateOperators.add(UpdateOperators
.set(DepublishRecordId.DEPUBLICATION_STATUS_FIELD,
depublicationStatus));
if (depublicationStatus == DepublicationStatus.PENDING_DEPUBLICATION) {
extraUpdateOperators.add(UpdateOperators.unset(DepublishRecordId.DEPUBLICATION_DATE_FIELD));
updateOperators.add(UpdateOperators.unset(DepublishRecordId.DEPUBLICATION_DATE_FIELD));
} else {
extraUpdateOperators
.add(UpdateOperators.set(DepublishRecordId.DEPUBLICATION_DATE_FIELD, depublicationDate));
updateOperators.add(
UpdateOperators.set(DepublishRecordId.DEPUBLICATION_DATE_FIELD,
depublicationDate == null? Date.from(Instant.now()): depublicationDate)
);
}

// Apply the operations.
retryableExternalRequestForNetworkExceptions(
() -> query.update(firstUpdateOperator, extraUpdateOperators.toArray(UpdateOperator[]::new))
.execute(new UpdateOptions().multi(true)));
() -> query.update(new UpdateOptions().multi(true), updateOperators.toArray(UpdateOperator[]::new)));
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,8 @@
import dev.morphia.DeleteOptions;
import dev.morphia.query.FindOptions;
import dev.morphia.query.Query;
import dev.morphia.query.experimental.filters.Filter;
import dev.morphia.query.experimental.filters.Filters;
import dev.morphia.query.filters.Filter;
import dev.morphia.query.filters.Filters;
import eu.europeana.metis.core.mongo.MorphiaDatastoreProvider;
import eu.europeana.metis.core.rest.RequestLimits;
import eu.europeana.metis.core.workflow.ScheduleFrequence;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
import com.mongodb.client.result.DeleteResult;
import dev.morphia.query.FindOptions;
import dev.morphia.query.Query;
import dev.morphia.query.experimental.filters.Filters;
import dev.morphia.query.filters.Filters;
import eu.europeana.metis.core.mongo.MorphiaDatastoreProvider;
import eu.europeana.metis.core.workflow.Workflow;
import eu.europeana.metis.network.ExternalRequestUtil;
Expand Down
Loading