gcube-cms-suite/geoportal-service/src/main/java/org/gcube/application/geoportal/service/engine/mongo/UCDMongoManager.java

119 lines
4.7 KiB
Java
Raw Normal View History

2022-03-04 18:28:45 +01:00
package org.gcube.application.geoportal.service.engine.mongo;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.mongodb.client.FindIterable;
import com.mongodb.client.model.FindOneAndReplaceOptions;
import com.mongodb.client.model.ReturnDocument;
import lombok.extern.slf4j.Slf4j;
import org.bson.Document;
import org.bson.types.ObjectId;
import org.gcube.application.cms.serialization.Serialization;
import org.gcube.application.geoportal.common.model.useCaseDescriptor.UseCaseDescriptor;
import org.gcube.application.geoportal.common.model.rest.ConfigurationException;
import org.gcube.application.geoportal.common.model.rest.QueryRequest;
import org.gcube.application.geoportal.common.utils.ContextUtils;
import org.gcube.application.geoportal.service.model.internal.faults.RegistrationException;
import javax.ws.rs.WebApplicationException;
import java.util.NoSuchElementException;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.function.Consumer;
@Slf4j
public class UCDMongoManager extends MongoManager implements UCDManagerI{
public UCDMongoManager() throws ConfigurationException {
2022-03-11 16:42:33 +01:00
init("UCD_"+ContextUtils.getCurrentScope().replaceAll("/","_"));
2022-03-04 18:28:45 +01:00
}
2022-04-01 19:11:11 +02:00
public long deleteAll(){
return getCollection().deleteMany(new Document()).getDeletedCount();
}
2022-03-07 17:59:06 +01:00
@Override
protected String mongoIDFieldName() {
return UseCaseDescriptor.MONGO_ID;
}
2022-03-04 18:28:45 +01:00
public UseCaseDescriptor insert(UseCaseDescriptor desc) throws RegistrationException {
try {
if (desc.getMongoId() != null)
throw new RegistrationException("UCD has already a mongo ID");
//TODO validate
2022-03-11 16:42:33 +01:00
ObjectId id = insertDoc(Serialization.asDocument(desc));
2022-03-04 18:28:45 +01:00
desc.setMongoId(id);
2022-03-11 16:42:33 +01:00
return Serialization.convert(getDocById(id), UseCaseDescriptor.class);
2022-03-04 18:28:45 +01:00
}catch(JsonProcessingException e){
log.error("Unexpected serialization exception ",e);
throw new WebApplicationException("Unexpected exception ",e);
}
}
@Override
public UseCaseDescriptor put(UseCaseDescriptor desc) throws RegistrationException, ConfigurationException {
2022-05-11 18:45:56 +02:00
log.debug("PUT UCD ID {} MONGO ID {}",desc.getId(),desc.getMongoId());
2022-03-04 18:28:45 +01:00
Document filter = new Document(UseCaseDescriptor.ID,desc.getId());
if(desc.getMongoId()!=null)
// MONGO ID SHOULD MATCH IF PROVIDED
filter.put(UseCaseDescriptor.MONGO_ID,desc.getMongoId());
try {
2022-03-11 16:42:33 +01:00
UseCaseDescriptor toReturn = Serialization.convert(getCollection().findOneAndReplace(
2022-03-04 18:28:45 +01:00
filter, Serialization.asDocument(desc),
2022-05-11 18:45:56 +02:00
new FindOneAndReplaceOptions().returnDocument(ReturnDocument.AFTER)), UseCaseDescriptor.class);
if(toReturn == null) {
if (desc.getMongoId() != null)
throw new RegistrationException("Illegal attempt to write to " + desc.getId() + " with unmatching mongo ID ");
else {
log.debug("Unable to update UCD {}. Inserting it..",desc.getId());
toReturn = insert(desc);
2022-03-04 18:28:45 +01:00
}
}
2022-05-11 18:45:56 +02:00
log.info("Updated UCD in DB cache. ID {}, MONGO ID {}",toReturn.getId(),toReturn.getMongoId());
log.trace("Updated UCD is {} ", toReturn);
2022-03-04 18:28:45 +01:00
return toReturn;
2022-05-11 18:45:56 +02:00
}catch (RegistrationException e){
2022-03-04 18:28:45 +01:00
throw e;
}catch(Throwable e){
log.error("Unable to update ",e);
throw new RegistrationException("Invalid UCD provided "+e.getMessage());
}
}
@Override
public Iterable<UseCaseDescriptor> query(QueryRequest queryRequest) {
log.info("Searching UCD for {} ",queryRequest);
LinkedBlockingQueue queue=new LinkedBlockingQueue<UseCaseDescriptor>();
2022-03-11 16:42:33 +01:00
FindIterable<Document> it=queryDoc(queryRequest);
it.forEach(
2022-03-04 18:28:45 +01:00
(Consumer<? super Document>) d ->{try{
queue.put(Serialization.convert(d,UseCaseDescriptor.class));
2022-03-11 16:42:33 +01:00
}catch(Throwable t){log.warn("Unable to translate "+d,t);}});
2022-03-04 18:28:45 +01:00
log.info("Returned {} elements ",queue.size());
return queue;
}
@Override
public void deleteById(String id, boolean force) throws ConfigurationException {
2022-03-11 16:42:33 +01:00
deleteDoc(getById(id).getMongoId());
2022-03-04 18:28:45 +01:00
}
@Override
public UseCaseDescriptor getById(String id) throws ConfigurationException {
log.info("Getting UC by ID {} ",id);
QueryRequest request=new QueryRequest();
request.setFilter(new Document(UseCaseDescriptor.ID,id));
try {
return this.query(request).iterator().next();
}catch (NoSuchElementException e){return null;}
}
}