package org.xcolab.client.proposals; import org.xcolab.client.contest.pojo.ontology.FocusArea; import org.xcolab.client.proposals.exceptions.ProposalAttributeNotFoundException; import org.xcolab.client.proposals.pojo.Proposal; import org.xcolab.client.proposals.pojo.ProposalDto; import org.xcolab.client.proposals.pojo.attributes.ProposalAttribute; import org.xcolab.client.proposals.pojo.attributes.ProposalAttributeDto; import org.xcolab.client.proposals.pojo.attributes.ProposalUnversionedAttribute; import org.xcolab.client.proposals.pojo.attributes.ProposalUnversionedAttributeDto; import org.xcolab.util.http.ServiceRequestUtils; import org.xcolab.util.http.caching.CacheKeys; 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.client.queries.ListQuery; import org.xcolab.util.http.dto.DtoUtil; import org.xcolab.util.http.exceptions.EntityNotFoundException; import java.sql.Timestamp; import java.util.ArrayList; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; public final class ProposalAttributeClient { private static final Map<RestService, ProposalAttributeClient> instances = new HashMap<>(); private final RestService proposalService; private final RestResource1<ProposalAttributeDto, Long> proposalAttributeResource; private final RestResource1<ProposalUnversionedAttributeDto, Long> proposalUnversionedAttributeResource; private ProposalAttributeClient(RestService proposalService) { proposalAttributeResource = new RestResource1<>(proposalService, "proposalAttributes", ProposalAttributeDto.TYPES); proposalUnversionedAttributeResource = new RestResource1<>(proposalService, "proposalUnversionedAttributes", ProposalUnversionedAttributeDto.TYPES); this.proposalService = proposalService; } public static ProposalAttributeClient fromService(RestService proposalService) { ProposalAttributeClient instance = instances.get(proposalService); if (instance == null) { instance = new ProposalAttributeClient(proposalService); instances.put(proposalService, instance); } return instance; } public ProposalAttribute createProposalAttribute(ProposalAttribute proposalAttribute) { return proposalAttributeResource.create(new ProposalAttributeDto(proposalAttribute)) .execute().toPojo(proposalService); } public ProposalAttribute getImpactProposalAttributes(Long proposalId) { return null; } public ProposalAttribute getProposalAttribute(Long proposalId, String name, Long additionalId) { ListQuery<ProposalAttributeDto> listQ = proposalAttributeResource.list() .queryParam("proposalId", proposalId) .queryParam("name", name); if (additionalId != null && additionalId != 0) { listQ = listQ.queryParam("additionalId", additionalId); } final ProposalAttributeDto firstOrNull = listQ.executeWithResult().getFirstIfExists(); return firstOrNull != null ? firstOrNull.toPojo(proposalService) : null; } public ProposalAttribute getProposalAttribute(long proposalId, long version, String name, Long additionalId) { ListQuery<ProposalAttributeDto> listQ = proposalAttributeResource.list() .queryParam("proposalId", proposalId) .queryParam("name", name) .queryParam("version", version); if (additionalId != null && additionalId != 0) { listQ = listQ.queryParam("additionalId", additionalId); } final ProposalAttributeDto firstOrNull = listQ.executeWithResult().getFirstIfExists(); return firstOrNull != null ? firstOrNull.toPojo(proposalService) : null; } public ProposalAttribute getProposalAttribute(long id_) throws ProposalAttributeNotFoundException { return proposalAttributeResource.get(id_) .withCache(CacheKeys.of(ProposalAttributeDto.class, id_), CacheName.MISC_REQUEST) .execute().toPojo(proposalService); } public Boolean deleteProposalAttribute(Long id_) { return proposalAttributeResource.delete(id_).execute(); } public List<ProposalAttribute> getImpactProposalAttributes(Proposal proposal, FocusArea focusArea) { List<ProposalAttribute> filteredProposalAttributes = new ArrayList<>(); for (ProposalAttribute attribute : getImpactProposalAttributes(proposal)) { if (attribute.getAdditionalId() == focusArea.getId_().longValue()) { filteredProposalAttributes.add(attribute); } } return filteredProposalAttributes; } public List<ProposalAttribute> getImpactProposalAttributes(Proposal proposal) { return DtoUtil.toPojos(proposalAttributeResource .service("getImpactProposalAttributes", ProposalAttributeDto.TYPES.getTypeReference()) .queryParam("proposalId", proposal.getProposalId()) .queryParam("currentVersion", proposal.getCurrentVersion()) .getList(), proposalService); } public boolean updateProposalAttribute(ProposalAttribute proposalAttribute) { return proposalAttributeResource .update(new ProposalAttributeDto(proposalAttribute), proposalAttribute.getId_()) .cacheKey(CacheKeys.of(ProposalAttributeDto.class, proposalAttribute.getId_())) .execute(); } public List<ProposalAttribute> getAllProposalAttributes(Long proposalId) { return DtoUtil.toPojos(proposalAttributeResource.list() .optionalQueryParam("proposalId", proposalId) .withCache(CacheName.MISC_REQUEST) .execute(), proposalService); } public List<ProposalAttribute> getAllProposalAttributes(Long proposalId, Integer version) { return DtoUtil.toPojos(proposalAttributeResource.list() .optionalQueryParam("proposalId", proposalId) .optionalQueryParam("version", version) .withCache(CacheName.PROPOSAL_DETAILS) .execute(), proposalService); } public ProposalAttribute setProposalAttribute(Long userId, Long proposalId, String name, Long aditionalId, Long numericValue) { ProposalAttribute proposalAttribute = createProposalAttribute(userId, proposalId, name, aditionalId); proposalAttribute.setNumericValue(numericValue); return setProposalAttribute(proposalAttribute, userId); } private ProposalAttribute createProposalAttribute(Long userId, Long proposalId, String name, Long additionalId) { ProposalAttribute proposalAttribute = new ProposalAttribute(); proposalAttribute.setProposalId(proposalId); proposalAttribute.setName(name); proposalAttribute.setAdditionalId(additionalId); return proposalAttribute; } public ProposalAttribute setProposalAttribute(ProposalAttribute proposalAttribute, Long authorId) { //TODO: replace with better cache invalidation mechanism ServiceRequestUtils.invalidateCache(CacheKeys.withClass(ProposalDto.class) .withParameter("proposalId", proposalAttribute.getProposalId()) .withParameter("includeDeleted", false).build(), CacheName.MISC_REQUEST); return proposalAttributeResource.service("setProposalAttribute", ProposalAttributeDto.class) .queryParam("authorId", authorId) .post(proposalAttribute) .toPojo(proposalService); } public ProposalAttribute setProposalAttribute(Long userId, Long proposalId, String name, Long aditionalId, String stringValue, Long numericValue, Double doubleValue) { ProposalAttribute proposalAttribute = createProposalAttribute(userId, proposalId, name, aditionalId); proposalAttribute.setStringValue(stringValue); proposalAttribute.setNumericValue(numericValue); proposalAttribute.setRealValue(doubleValue); return setProposalAttribute(proposalAttribute, userId); } public ProposalAttribute setProposalAttribute(Long userId, Long proposalId, String name, Long aditionalId, String stringValue) { ProposalAttribute proposalAttribute = createProposalAttribute(userId, proposalId, name, aditionalId); proposalAttribute.setStringValue(stringValue); return setProposalAttribute(proposalAttribute, userId); } public Boolean deleteProposalUnversionedAttribute(Long id_) { return proposalUnversionedAttributeResource.delete(id_).execute(); } public List<ProposalUnversionedAttribute> getProposalUnversionedAttributesByProposalId( Long proposalId) { return DtoUtil.toPojos(proposalUnversionedAttributeResource.list() .withCache(CacheKeys.withClass(ProposalUnversionedAttributeDto.class) .withParameter("proposalId", proposalId) .asList(), CacheName.MISC_MEDIUM) .optionalQueryParam("proposalId", proposalId) .execute(), proposalService); } public void createOrUpdateProposalUnversionedAttribute(long authorId, String attributeValue, String attributeName, Long proposalId) { ProposalUnversionedAttribute pua; try { pua = getProposalUnversionedAttribute(proposalId, attributeName.toString()); pua.setCreateAuthorId(authorId); pua.setLastUpdateDate(new Timestamp(new Date().getTime())); pua.setStringValue(attributeValue); updateProposalUnversionedAttribute(pua); }catch (EntityNotFoundException ignored){ pua = new ProposalUnversionedAttribute(); pua.setCreateAuthorId(authorId); pua.setCreateDate(new Timestamp(new Date().getTime())); pua.setLastUpdateDate(new Timestamp(new Date().getTime())); pua.setName(attributeName); pua.setStringValue(attributeValue); pua.setProposalId(proposalId); createProposalUnversionedAttribute(pua); } } public ProposalUnversionedAttribute createProposalUnversionedAttribute( ProposalUnversionedAttribute proposalUnversionedAttribute) { return proposalUnversionedAttributeResource .create(new ProposalUnversionedAttributeDto(proposalUnversionedAttribute)) .execute().toPojo(proposalService); } public ProposalUnversionedAttribute getProposalUnversionedAttribute(Long proposalId, String name) throws EntityNotFoundException{ return proposalUnversionedAttributeResource .service("getByProposalIdName", ProposalUnversionedAttributeDto.class) .queryParam("proposalId", proposalId) .queryParam("name", name) .getChecked() .toPojo(proposalService); } public boolean updateProposalUnversionedAttribute( ProposalUnversionedAttribute proposalUnversionedAttribute) { return proposalUnversionedAttributeResource .update(new ProposalUnversionedAttributeDto(proposalUnversionedAttribute) , proposalUnversionedAttribute.getId_()) .execute(); } }