package eu.eudat.logic.managers; import com.jayway.jsonpath.DocumentContext; import com.jayway.jsonpath.JsonPath; import eu.eudat.logic.builders.model.models.DataTableDataBuilder; import eu.eudat.data.dao.entities.DatasetProfileDao; import eu.eudat.data.entities.DatasetProfile; import eu.eudat.data.query.items.item.datasetprofile.DatasetProfileAutocompleteRequest; import eu.eudat.data.query.items.table.datasetprofile.DatasetProfileTableRequestItem; import eu.eudat.models.data.components.commons.datafield.AutoCompleteData; import eu.eudat.models.data.datasetprofile.DatasetProfileAutocompleteItem; import eu.eudat.models.data.datasetprofile.DatasetProfileListingModel; import eu.eudat.models.data.entities.xmlmodels.datasetprofiledefinition.Field; import eu.eudat.models.data.helpermodels.Tuple; import eu.eudat.models.data.helpers.common.DataTableData; import eu.eudat.queryable.QueryableList; import eu.eudat.logic.services.ApiContext; import eu.eudat.logic.utilities.builders.XmlBuilder; import org.springframework.http.*; import org.springframework.web.client.RestTemplate; import org.w3c.dom.Document; import org.w3c.dom.Element; import javax.xml.xpath.*; import java.util.Collections; import java.util.LinkedList; import java.util.List; import java.util.Map; public class DatasetProfileManager { public static List getWithCriteria(DatasetProfileDao datasetProfileRepository, DatasetProfileAutocompleteRequest datasetProfileAutocompleteRequest) throws IllegalAccessException, InstantiationException { QueryableList items = datasetProfileRepository.getWithCriteria(datasetProfileAutocompleteRequest.getCriteria()); List datasetProfiles = items.select(item -> new DatasetProfileAutocompleteItem().fromDataModel(item)); return datasetProfiles; } public static DataTableData getPaged(ApiContext apiContext, DatasetProfileTableRequestItem datasetProfileTableRequestItem) throws Exception { QueryableList items = apiContext.getOperationsContext().getDatabaseRepository().getDatasetProfileDao().getWithCriteria(datasetProfileTableRequestItem.getCriteria()); QueryableList pagedItems = PaginationManager.applyPaging(items, datasetProfileTableRequestItem); List datasetProfiles = pagedItems.select(item -> new DatasetProfileListingModel().fromDataModel(item)); return apiContext.getOperationsContext().getBuilderFactory().getBuilder(DataTableDataBuilder.class).data(datasetProfiles).totalCount(items.count()).build(); } public static List getAll(DatasetProfileDao datasetProfileRepository) throws IllegalAccessException, InstantiationException { QueryableList items = datasetProfileRepository.getAll(); List datasetProfiles = items.select(item -> new DatasetProfileListingModel().fromDataModel(item)); return datasetProfiles; } public static eu.eudat.models.data.entities.xmlmodels.datasetprofiledefinition.Field queryForField(String xml, String fieldId) throws XPathExpressionException { eu.eudat.models.data.entities.xmlmodels.datasetprofiledefinition.Field field = new Field(); Document document = XmlBuilder.fromXml(xml); XPathFactory xpathFactory = XPathFactory.newInstance(); XPath xpath = xpathFactory.newXPath(); XPathExpression expr = xpath.compile("//field[@id='" + fieldId + "']"); Element name = (Element) expr.evaluate(document, XPathConstants.NODE); field.fromXml(name); return field; } public static List> getAutocomplete(AutoCompleteData data, String like) { List> 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 entity = new HttpEntity<>("parameters", headers); ResponseEntity response = restTemplate.exchange(data.getUrl() + "?search=" + like, HttpMethod.GET, entity, Object.class); DocumentContext jsonContext = JsonPath.parse(response.getBody()); List> jsonItems = jsonContext.read(data.getOptionsRoot() + "['" + data.getAutoCompleteOptions().getLabel() + "','" + data.getAutoCompleteOptions().getValue() + "']"); jsonItems.forEach(item -> result.add(new Tuple<>(item.get(data.getAutoCompleteOptions().getValue()), item.get(data.getAutoCompleteOptions().getLabel())))); return result; } }