199 lines
10 KiB
Java
199 lines
10 KiB
Java
package eu.eudat.logic.managers;
|
|
|
|
import com.jayway.jsonpath.DocumentContext;
|
|
import com.jayway.jsonpath.JsonPath;
|
|
import eu.eudat.commons.enums.DmpBlueprintStatus;
|
|
import eu.eudat.commons.enums.IsActive;
|
|
import eu.eudat.commons.types.dmpblueprint.ExternalAutoCompleteEntity;
|
|
import eu.eudat.commons.types.dmpblueprint.FieldEntity;
|
|
import eu.eudat.commons.types.dmpblueprint.SectionEntity;
|
|
import eu.eudat.commons.types.dmpblueprint.SystemFieldEntity;
|
|
import eu.eudat.data.dao.criteria.DataManagementPlanCriteria;
|
|
import eu.eudat.data.dao.criteria.RequestItem;
|
|
import eu.eudat.data.DmpBlueprintEntity;
|
|
import eu.eudat.data.query.items.dmpblueprint.DataManagementPlanBlueprintTableRequest;
|
|
import eu.eudat.exceptions.dmpblueprint.DmpBlueprintUsedException;
|
|
import eu.eudat.logic.services.operations.DatabaseRepository;
|
|
import eu.eudat.commons.types.xml.XmlBuilder;
|
|
import eu.eudat.logic.utilities.documents.helpers.FileEnvelope;
|
|
import eu.eudat.logic.utilities.documents.xml.dmpXml.ExportXmlBuilderDmpBlueprint;
|
|
import eu.eudat.logic.utilities.documents.xml.dmpXml.ImportXmlBuilderDmpBlueprint;
|
|
import eu.eudat.commons.enums.DmpBlueprintFieldCategory;
|
|
import eu.eudat.commons.enums.DmpBlueprintSystemFieldType;
|
|
import eu.eudat.models.data.helpermodels.Tuple;
|
|
import eu.eudat.models.data.helpers.common.AutoCompleteLookupItem;
|
|
import eu.eudat.models.data.helpers.common.DataTableData;
|
|
import eu.eudat.models.data.listingmodels.DataManagementPlanBlueprintListingModel;
|
|
//import eu.eudat.models.data.listingmodels.DataManagementPlanProfileListingModel;
|
|
import eu.eudat.queryable.QueryableList;
|
|
import eu.eudat.logic.services.ApiContext;
|
|
import org.slf4j.Logger;
|
|
import org.slf4j.LoggerFactory;
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
import org.springframework.core.env.Environment;
|
|
import org.springframework.http.ResponseEntity;
|
|
import org.springframework.stereotype.Component;
|
|
|
|
import jakarta.activation.MimetypesFileTypeMap;
|
|
|
|
import javax.management.InvalidApplicationException;
|
|
import javax.xml.xpath.*;
|
|
import java.io.*;
|
|
import java.nio.file.Files;
|
|
import java.util.*;
|
|
import java.util.concurrent.CompletableFuture;
|
|
|
|
import org.springframework.http.*;
|
|
import org.springframework.web.client.RestTemplate;
|
|
import org.springframework.web.multipart.MultipartFile;
|
|
import org.w3c.dom.Document;
|
|
import org.w3c.dom.Element;
|
|
|
|
/**
|
|
* Created by ikalyvas on 3/21/2018.
|
|
*/
|
|
@Component
|
|
public class DataManagementProfileManager {
|
|
private static final Logger logger = LoggerFactory.getLogger(DataManagementProfileManager.class);
|
|
|
|
private ApiContext apiContext;
|
|
private DatabaseRepository databaseRepository;
|
|
private Environment environment;
|
|
|
|
@Autowired
|
|
public DataManagementProfileManager(ApiContext apiContext, Environment environment) {
|
|
this.apiContext = apiContext;
|
|
this.databaseRepository = apiContext.getOperationsContext().getDatabaseRepository();
|
|
this.environment = environment;
|
|
}
|
|
|
|
|
|
|
|
public DataTableData<DataManagementPlanBlueprintListingModel> getPagedBlueprint(DataManagementPlanBlueprintTableRequest dataManagementPlanBlueprintTableRequest) throws Exception {
|
|
|
|
QueryableList<DmpBlueprintEntity> items = apiContext.getOperationsContext().getDatabaseRepository().getDmpProfileDao().getWithCriteriaBlueprint(dataManagementPlanBlueprintTableRequest.getCriteria());
|
|
QueryableList<DmpBlueprintEntity> pagedItems = PaginationManager.applyPaging(items, dataManagementPlanBlueprintTableRequest);
|
|
|
|
DataTableData<DataManagementPlanBlueprintListingModel> dataTable = new DataTableData<>();
|
|
|
|
CompletableFuture itemsFuture = pagedItems
|
|
.selectAsync(item -> new DataManagementPlanBlueprintListingModel().fromDataModel(item)).whenComplete((resultList, throwable) -> dataTable.setData(resultList));
|
|
CompletableFuture countFuture = items.countAsync().whenComplete((count, throwable) -> dataTable.setTotalCount(count));
|
|
CompletableFuture.allOf(itemsFuture, countFuture).join();
|
|
return dataTable;
|
|
}
|
|
|
|
|
|
|
|
public DataManagementPlanBlueprintListingModel getSingleBlueprint(String id) throws InvalidApplicationException {
|
|
DmpBlueprintEntity dmpBlueprint = databaseRepository.getDmpProfileDao().find(UUID.fromString(id));
|
|
DataManagementPlanBlueprintListingModel dataManagementPlanBlueprintListingModel = new DataManagementPlanBlueprintListingModel();
|
|
dataManagementPlanBlueprintListingModel.fromDataModel(dmpBlueprint);
|
|
return dataManagementPlanBlueprintListingModel;
|
|
}
|
|
|
|
public boolean fieldInBlueprint(String id, DmpBlueprintSystemFieldType type) throws InvalidApplicationException {
|
|
DmpBlueprintEntity dmpBlueprint = databaseRepository.getDmpProfileDao().find(UUID.fromString(id));
|
|
return this.fieldInBlueprint(dmpBlueprint, type);
|
|
}
|
|
|
|
public boolean fieldInBlueprint(DmpBlueprintEntity dmpProfile, DmpBlueprintSystemFieldType type) {
|
|
DataManagementPlanBlueprintListingModel dmpBlueprint = new DataManagementPlanBlueprintListingModel();
|
|
dmpBlueprint.fromDataModel(dmpProfile);
|
|
for(SectionEntity section: dmpBlueprint.getDefinition().getSections()){
|
|
for(FieldEntity field: section.getFields()){
|
|
if(field.getCategory().equals(DmpBlueprintFieldCategory.System)){
|
|
SystemFieldEntity systemField = (SystemFieldEntity)field;
|
|
if(systemField.getType().equals(type)){
|
|
return true;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|
|
public void createOrUpdateBlueprint(DataManagementPlanBlueprintListingModel dataManagementPlanBlueprintListingModel) throws Exception {
|
|
DmpBlueprintEntity dmpBlueprint = dataManagementPlanBlueprintListingModel.toDataModel();
|
|
apiContext.getOperationsContext().getDatabaseRepository().getDmpProfileDao().createOrUpdate(dmpBlueprint);
|
|
}
|
|
|
|
public void inactivate(String id) throws InvalidApplicationException {
|
|
DmpBlueprintEntity dmpBlueprint = databaseRepository.getDmpProfileDao().find(UUID.fromString(id));
|
|
DataManagementPlanCriteria dataManagementPlanCriteria = new DataManagementPlanCriteria();
|
|
dataManagementPlanCriteria.setProfile(dmpBlueprint);
|
|
if (DmpBlueprintStatus.Draft.equals(dmpBlueprint.getStatus()) || databaseRepository.getDmpDao().getWithCriteria(dataManagementPlanCriteria).count() == 0) {
|
|
dmpBlueprint.setIsActive(IsActive.Inactive);
|
|
databaseRepository.getDmpProfileDao().createOrUpdate(dmpBlueprint);
|
|
} else {
|
|
throw new DmpBlueprintUsedException("This blueprint can not deleted, because DMPs are associated with it");
|
|
}
|
|
}
|
|
|
|
public ResponseEntity<byte[]> getDocument(DataManagementPlanBlueprintListingModel dmpProfile) throws IOException {
|
|
FileEnvelope envelope = getXmlDocument(dmpProfile);
|
|
InputStream resource = new FileInputStream(envelope.getFile());
|
|
logger.info("Mime Type of " + envelope.getFilename() + " is " +
|
|
new MimetypesFileTypeMap().getContentType(envelope.getFile()));
|
|
HttpHeaders responseHeaders = new HttpHeaders();
|
|
responseHeaders.setContentLength(envelope.getFile().length());
|
|
responseHeaders.setContentType(MediaType.APPLICATION_OCTET_STREAM);
|
|
String fileName = envelope.getFilename().replace(" ", "_").replace(",", "_");
|
|
responseHeaders.set("Content-Disposition", "attachment;filename=" + fileName + ".xml");
|
|
responseHeaders.set("Access-Control-Expose-Headers", "Content-Disposition");
|
|
responseHeaders.get("Access-Control-Expose-Headers").add("Content-Type");
|
|
byte[] content = org.apache.poi.util.IOUtils.toByteArray(resource);
|
|
resource.close();
|
|
Files.deleteIfExists(envelope.getFile().toPath());
|
|
return new ResponseEntity<>(content,
|
|
responseHeaders,
|
|
HttpStatus.OK);
|
|
}
|
|
|
|
public FileEnvelope getXmlDocument(DataManagementPlanBlueprintListingModel dmpProfile) throws IOException {
|
|
ExportXmlBuilderDmpBlueprint xmlBuilder = new ExportXmlBuilderDmpBlueprint();
|
|
File file = xmlBuilder.build(dmpProfile, environment);
|
|
FileEnvelope fileEnvelope = new FileEnvelope();
|
|
fileEnvelope.setFile(file);
|
|
fileEnvelope.setFilename(dmpProfile.getLabel());
|
|
return fileEnvelope;
|
|
}
|
|
|
|
|
|
public eu.eudat.logic.utilities.documents.xml.dmpXml.dmpBlueprintModel.DmpBlueprint createDmpProfileFromXml(MultipartFile multiPartFile) {
|
|
ImportXmlBuilderDmpBlueprint xmlBuilder = new ImportXmlBuilderDmpBlueprint();
|
|
try {
|
|
return xmlBuilder.build(convert(multiPartFile));
|
|
} catch (IOException e) {
|
|
logger.error(e.getMessage(), e);
|
|
}
|
|
return null;
|
|
}
|
|
|
|
private File convert(MultipartFile file) throws IOException {
|
|
File convFile = new File(this.environment.getProperty("temp.temp") + file.getOriginalFilename());
|
|
convFile.createNewFile();
|
|
FileOutputStream fos = new FileOutputStream(convFile);
|
|
fos.write(file.getBytes());
|
|
fos.close();
|
|
return convFile;
|
|
}
|
|
|
|
public static List<Tuple<String, String>> externalAutocompleteRequest(String url, String optionsRoot, String label, String value, String like) {
|
|
List<Tuple<String, String>> result = new LinkedList<>();
|
|
RestTemplate restTemplate = new RestTemplate();
|
|
HttpHeaders headers = new HttpHeaders();
|
|
headers.setAccept(Collections.singletonList(MediaType.valueOf("application/vnd.api+json; charset=utf-8")));
|
|
headers.setContentType(MediaType.APPLICATION_JSON);
|
|
HttpEntity<String> entity = new HttpEntity<>("parameters", headers);
|
|
|
|
ResponseEntity<Object> response = restTemplate.exchange(url + "?search=" + like, HttpMethod.GET, entity, Object.class);
|
|
DocumentContext jsonContext = JsonPath.parse(response.getBody());
|
|
|
|
List<Map<String, String>> jsonItems = jsonContext.read(optionsRoot + "['" + label + "','" + value + "']");
|
|
jsonItems.forEach(item -> result.add(new Tuple<>(item.get(value), item.get(label))));
|
|
return result;
|
|
|
|
}
|
|
}
|