package org.xcolab.client.contest; import org.xcolab.client.contest.pojo.impact.ImpactDefaultSeries; import org.xcolab.client.contest.pojo.impact.ImpactDefaultSeriesData; import org.xcolab.client.contest.pojo.impact.ImpactDefaultSeriesDataDto; import org.xcolab.client.contest.pojo.impact.ImpactDefaultSeriesDto; import org.xcolab.client.contest.pojo.ontology.FocusArea; import org.xcolab.client.contest.pojo.ontology.FocusAreaDto; import org.xcolab.client.contest.pojo.ontology.FocusAreaOntologyTerm; import org.xcolab.client.contest.pojo.ontology.FocusAreaOntologyTermDto; import org.xcolab.client.contest.pojo.ontology.OntologySpace; import org.xcolab.client.contest.pojo.ontology.OntologySpaceDto; import org.xcolab.client.contest.pojo.ontology.OntologyTerm; import org.xcolab.client.contest.pojo.ontology.OntologyTermDto; import org.xcolab.util.http.ServiceRequestUtils; import org.xcolab.util.http.caching.CacheName; import org.xcolab.util.http.client.RestResource1; import org.xcolab.util.http.client.RestService; import org.xcolab.util.http.dto.DtoUtil; import org.xcolab.util.http.exceptions.EntityNotFoundException; import java.util.ArrayList; import java.util.Date; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; public class OntologyClient { private static final Map<RestService, OntologyClient> instances = new HashMap<>(); private final RestService contestService; private final RestResource1<OntologySpaceDto, Long> ontologySpaceResource; private final RestResource1<OntologyTermDto, Long> ontologyTermResource; private final RestResource1<FocusAreaDto, Long> focusAreaResource; private final RestResource1<FocusAreaOntologyTermDto, Long> focusAreaOntologyTermResource; private final RestResource1<ImpactDefaultSeriesDto, Long> impactDefaultSeriesResource; private final RestResource1<ImpactDefaultSeriesDataDto, Long> impactDefaultSeriesDataResource; private OntologyClient(RestService contestService) { this.contestService = contestService; ontologySpaceResource = new RestResource1<>(this.contestService, "ontologySpaces", OntologySpaceDto.TYPES); ontologyTermResource = new RestResource1<>(this.contestService, "ontologyTerms", OntologyTermDto.TYPES); focusAreaResource = new RestResource1<>(this.contestService, "focusAreas", FocusAreaDto.TYPES); focusAreaOntologyTermResource = new RestResource1<>(this.contestService, "focusAreaOntologyTerms", FocusAreaOntologyTermDto.TYPES); impactDefaultSeriesResource = new RestResource1<>(this.contestService, "impactDefaultSeries", ImpactDefaultSeriesDto.TYPES); impactDefaultSeriesDataResource = new RestResource1<>(this.contestService, "impactDefaultSeriesDatas", ImpactDefaultSeriesDataDto.TYPES); } public static OntologyClient fromService(RestService contestService) { return instances.computeIfAbsent(contestService, k -> new OntologyClient(contestService)); } public List<OntologySpace> getAllOntologySpaces() { return DtoUtil.toPojos(ontologySpaceResource.list() .withCache(CacheName.CONTEST_ONTOLOGY) .execute(), contestService); } public List<OntologyTerm> getAllOntologyTerms() { return DtoUtil.toPojos(ontologyTermResource.list() .withCache(CacheName.CONTEST_ONTOLOGY) .execute(), contestService); } public List<OntologyTerm> getOntologyTerms(Long parentId, Long ontologySpaceId) { return DtoUtil.toPojos(ontologyTermResource.list() .queryParam("parentId", parentId) .queryParam("ontologySpaceId",ontologySpaceId) .withCache(CacheName.CONTEST_ONTOLOGY) .execute(), contestService); } public List<FocusArea> getAllFocusAreas() { return DtoUtil.toPojos(focusAreaResource.list() .withCache(CacheName.CONTEST_ONTOLOGY) .execute(), contestService); } public FocusArea createFocusArea(FocusArea focusArea) { final FocusArea result = focusAreaResource.create(new FocusAreaDto(focusArea)) .execute().toPojo(contestService); //TODO: fine-grained cache removal ServiceRequestUtils.clearCache(CacheName.CONTEST_ONTOLOGY); return result; } public void addOntologyTermsToFocusAreaByOntologyTermId(Long focusAreaId, Long ontologyTermId) { FocusAreaOntologyTermDto faot = new FocusAreaOntologyTermDto(); faot.setFocusAreaId(focusAreaId); faot.setOntologyTermId(ontologyTermId); faot.setOrder_((int) new Date().getTime()); focusAreaOntologyTermResource.create(faot).execute(); } public List<FocusAreaOntologyTerm> getAllFocusAreaOntologyTerms() { return DtoUtil.toPojos(focusAreaOntologyTermResource.list() .withCache(CacheName.CONTEST_ONTOLOGY) .execute(), contestService); } public OntologyTerm getOntologyTermParent(OntologyTerm ontologyTerm) { if (ontologyTerm.getParentId() > 0) { return getOntologyTerm(ontologyTerm.getParentId()); } return null; } public OntologyTerm getOntologyTerm(long Id_) { try { return ontologyTermResource.get(Id_) .withCache(CacheName.CONTEST_ONTOLOGY) .executeChecked().toPojo(contestService); } catch (EntityNotFoundException ignored) { return null; } } public OntologyTerm createOntologyTerm(OntologyTerm ontologyTerm) { final OntologyTerm result = ontologyTermResource.create(new OntologyTermDto(ontologyTerm)) .execute().toPojo(contestService); //TODO: fine-grained cache removal ServiceRequestUtils.clearCache(CacheName.CONTEST_ONTOLOGY); return result; } public boolean updateOntologyTerm(OntologyTerm ontologyTerm) { final Boolean result = ontologyTermResource .update(new OntologyTermDto(ontologyTerm), ontologyTerm.getId_()) .cacheName(CacheName.CONTEST_ONTOLOGY) .execute(); //TODO: fine-grained cache removal ServiceRequestUtils.clearCache(CacheName.CONTEST_ONTOLOGY); return result; } public boolean deleteOntologyTerm(Long id_) { final Boolean result = ontologyTermResource.delete(id_) .cacheName(CacheName.CONTEST_ONTOLOGY) .execute(); //TODO: fine-grained cache removal ServiceRequestUtils.clearCache(CacheName.CONTEST_ONTOLOGY); return result; } public Boolean isAnyOntologyTermOfFocusAreaIdADescendantOfOntologyTermId( Long focusAreaId, Long ontologyTermId) { OntologyTerm ontologyParentTerm = getOntologyTerm(ontologyTermId); List<OntologyTerm> ontologyTermList = getAllOntologyTermDescendant(ontologyParentTerm.getId_()); ontologyTermList.add(ontologyParentTerm); List<FocusAreaOntologyTerm> focusAreaOntologyTerms = getFocusAreaOntologyTermsByFocusArea(focusAreaId); Set<Long> ontologyTermIds = new HashSet<>(); for (OntologyTerm ontologyTerm : ontologyTermList) { ontologyTermIds.add(ontologyTerm.getId_()); } for (FocusAreaOntologyTerm focusAreaOntologyTerm : focusAreaOntologyTerms) { if (ontologyTermIds.contains(focusAreaOntologyTerm.getOntologyTermId())) { return true; } } return false; } public List<FocusAreaOntologyTerm> getFocusAreaOntologyTermsByFocusArea(Long focusAreaId) { return DtoUtil.toPojos(focusAreaOntologyTermResource.list() .queryParam("focusAreaId", focusAreaId) .execute(), contestService); } public List<OntologyTerm> getAllOntologyTermDescendant(Long ontologyTermId) { return DtoUtil.toPojos(ontologyTermResource .service("getAllOntologyTermDescendant", OntologyTermDto.TYPES.getTypeReference()) .queryParam("ontologyTermId", ontologyTermId) .getList(), contestService); } public List<OntologyTerm> getOntologyTermsByName(String name) { return DtoUtil.toPojos(ontologyTermResource.list() .optionalQueryParam("name", name) .execute(), contestService); } public List<OntologyTerm> getChildOntologyTerms(Long ontologyTermId) { return DtoUtil.toPojos(ontologyTermResource.list() .optionalQueryParam("parentId", ontologyTermId) .execute(), contestService); } public boolean updateFocusArea(FocusArea focusArea) { return focusAreaResource.update(new FocusAreaDto(focusArea), focusArea.getId_()) .execute(); } public boolean deleteFocusArea(Long id_) { return focusAreaResource.delete(id_).execute(); } public boolean deleteFocusAreaOntologyTerm(Long focusAreaId,Long ontologyTermId) { return focusAreaOntologyTermResource.service("deleteFocusAreaOntologyTerm",Boolean.class) .queryParam("focusAreaId",focusAreaId) .queryParam("ontologyTermId", ontologyTermId).delete(); } public FocusArea getFocusArea(long Id_) { return focusAreaResource.get(Id_) .execute().toPojo(contestService); } public OntologySpace getOntologySpace(long id_) { return ontologySpaceResource.get(id_) .execute().toPojo(contestService); } public List<OntologyTerm> getAllOntologyTermsFromFocusAreaWithOntologySpace( FocusArea focusArea, OntologySpace ontologySpace) { List<OntologyTerm> list = new ArrayList<>(); for (OntologyTerm term : getOntologyTermsForFocusArea(focusArea)) { if (term.getOntologySpaceId() == ontologySpace.getId_().longValue()) { list.add(term); } } return list; } public List<OntologyTerm> getOntologyTermsForFocusArea(FocusArea focusArea) { List<OntologyTerm> ret = new ArrayList<>(); for (FocusAreaOntologyTerm faot : getFocusAreaOntologyTermsByFocusArea( focusArea.getId_())) { ret.add(getOntologyTerm(faot.getOntologyTermId())); } return ret; } public OntologyTerm getOntologyTermFromFocusAreaWithOntologySpace(FocusArea focusArea, OntologySpace ontologySpace) { for (OntologyTerm term : getOntologyTermsForFocusArea(focusArea)) { if (term.getOntologySpaceId() == ontologySpace.getId_().longValue()) { return term; } } return null; } public ImpactDefaultSeries getImpactDefaultSeriesByFocusAreaName(Long focusAreaId, String name) { List<ImpactDefaultSeries> allImpactDefaultSeriesWithFocusAreaName = DtoUtil.toPojos( impactDefaultSeriesResource.list() .optionalQueryParam("focusAreaId", focusAreaId) .optionalQueryParam("name", name) .execute(), contestService); if (allImpactDefaultSeriesWithFocusAreaName != null && !allImpactDefaultSeriesWithFocusAreaName .isEmpty()) { return allImpactDefaultSeriesWithFocusAreaName.get(0); } else { return null; } } public List<ImpactDefaultSeries> getAllmpactDefaultSeriesByFocusArea(Long focusAreaId) { return DtoUtil.toPojos(impactDefaultSeriesResource.list() .optionalQueryParam("focusAreaId", focusAreaId) .execute(), contestService); } public List<ImpactDefaultSeriesData> getImpactDefaultSeriesDataBySeries(Long seriesId) { return DtoUtil.toPojos(impactDefaultSeriesDataResource.list() .optionalQueryParam("seriesId", seriesId) .execute(), contestService); } public ImpactDefaultSeriesData getImpactDefaultSeriesDataBySeriesIdAndYear(Long seriesId, Integer year) { List<ImpactDefaultSeriesData> ret = DtoUtil.toPojos( impactDefaultSeriesDataResource.list() .optionalQueryParam("seriesId", seriesId) .optionalQueryParam("year", year) .execute(), contestService); if (ret != null && !ret.isEmpty()) { return ret.get(0); } else { return null; } } }