From 324f3541699f12149e58c96634c750448c2b53ed Mon Sep 17 00:00:00 2001 From: Matija Obreza Date: Mon, 30 Nov 2015 19:35:29 +0100 Subject: [PATCH] /explore Display columns for release --- .../server/model/elastic/Collect.java | 89 ++++++++++-- .../genesys2/server/model/elastic/Geo.java | 6 + .../server/model/impl/FaoInstitute.java | 2 +- .../server/model/json/Api1Constants.java | 47 ++++++- .../persistence/domain/CropRepository.java | 4 + .../genesys2/server/service/CropService.java | 5 + .../server/service/GenesysFilterService.java | 6 + .../server/service/GenesysService.java | 12 +- .../server/service/impl/CropServiceImpl.java | 7 +- .../impl/ElasticsearchSearchServiceImpl.java | 2 +- .../impl/GenesysFilterServiceImpl.java | 47 ++++++- .../service/impl/GenesysServiceImpl.java | 56 +++++--- .../server/service/worker/ElasticUpdater.java | 2 +- .../service/worker/ElasticUpdaterAspect.java | 2 +- .../controller/ExplorerController.java | 127 ++++++++++++++---- .../server/servlet/controller/JspHelper.java | 5 +- .../resources/content/language.properties | 31 +++-- src/main/resources/log4j.properties | 1 + src/main/sourceapp/styles/genesys.scss | 4 + .../webapp/WEB-INF/jsp/accession/explore.jsp | 108 +++++++-------- 20 files changed, 419 insertions(+), 144 deletions(-) diff --git a/src/main/java/org/genesys2/server/model/elastic/Collect.java b/src/main/java/org/genesys2/server/model/elastic/Collect.java index 638f8c7a7..39e683bd5 100644 --- a/src/main/java/org/genesys2/server/model/elastic/Collect.java +++ b/src/main/java/org/genesys2/server/model/elastic/Collect.java @@ -13,17 +13,17 @@ import org.springframework.data.elasticsearch.annotations.FieldType; public class Collect { - public Set collCode; + private Set collCode; @Field(index = FieldIndex.not_analyzed, type = FieldType.String) - public String collDate; - public String collInstAddr; - public String collMissId; - public String collName; + private String collDate; + private String collInstAddr; + private String collMissId; + private String collName; @Field(index = FieldIndex.not_analyzed, type = FieldType.String) - public String collNumb; - public String collSite; - public Integer collSrc; - public Date collectingDate; + private String collNumb; + private String collSite; + private Integer collSrc; + private Date collectingDate; public static Collect from(AccessionCollect collect) { if (collect == null) @@ -42,4 +42,75 @@ public class Collect { return c; } + public Set getCollCode() { + return collCode; + } + + public void setCollCode(Set collCode) { + this.collCode = collCode; + } + + public String getCollDate() { + return collDate; + } + + public void setCollDate(String collDate) { + this.collDate = collDate; + } + + public String getCollInstAddr() { + return collInstAddr; + } + + public void setCollInstAddr(String collInstAddr) { + this.collInstAddr = collInstAddr; + } + + public String getCollMissId() { + return collMissId; + } + + public void setCollMissId(String collMissId) { + this.collMissId = collMissId; + } + + public String getCollName() { + return collName; + } + + public void setCollName(String collName) { + this.collName = collName; + } + + public String getCollNumb() { + return collNumb; + } + + public void setCollNumb(String collNumb) { + this.collNumb = collNumb; + } + + public String getCollSite() { + return collSite; + } + + public void setCollSite(String collSite) { + this.collSite = collSite; + } + + public Integer getCollSrc() { + return collSrc; + } + + public void setCollSrc(Integer collSrc) { + this.collSrc = collSrc; + } + + public Date getCollectingDate() { + return collectingDate; + } + + public void setCollectingDate(Date collectingDate) { + this.collectingDate = collectingDate; + } } \ No newline at end of file diff --git a/src/main/java/org/genesys2/server/model/elastic/Geo.java b/src/main/java/org/genesys2/server/model/elastic/Geo.java index 2a1c52bb6..45d74bb42 100644 --- a/src/main/java/org/genesys2/server/model/elastic/Geo.java +++ b/src/main/java/org/genesys2/server/model/elastic/Geo.java @@ -88,4 +88,10 @@ public class Geo { this.datum = datum; } + public String getLatitudeAndLongitude() { + if (this.latitude==null && this.longitude==null) { + return null; + } + return this.latitude + ", " + this.longitude; + } } \ No newline at end of file diff --git a/src/main/java/org/genesys2/server/model/impl/FaoInstitute.java b/src/main/java/org/genesys2/server/model/impl/FaoInstitute.java index b28aa65cf..805e6a104 100644 --- a/src/main/java/org/genesys2/server/model/impl/FaoInstitute.java +++ b/src/main/java/org/genesys2/server/model/impl/FaoInstitute.java @@ -59,7 +59,7 @@ public class FaoInstitute extends BusinessModel implements GeoReferencedEntity, @Column(length = 300) private String fullName; - @Column(length = 50) + @Column(length = 100) private String type; @Column(length = 300) diff --git a/src/main/java/org/genesys2/server/model/json/Api1Constants.java b/src/main/java/org/genesys2/server/model/json/Api1Constants.java index 06712e93b..070a0083c 100644 --- a/src/main/java/org/genesys2/server/model/json/Api1Constants.java +++ b/src/main/java/org/genesys2/server/model/json/Api1Constants.java @@ -22,7 +22,8 @@ package org.genesys2.server.model.json; public interface Api1Constants { public static interface Accession { - public static final String CROPE_NAME = "cropName"; + public static final String CROP_NAMES = "crops"; + /** * WIEWS code of accession holding institute. */ @@ -185,12 +186,52 @@ public interface Api1Constants { */ public static final String ACCEURL = "acceUrl"; - public static final String SCIENTIFIC_NAME = "scientificName"; + } + + public static interface Institute { + /** + * Corresponds to INSTCODE + */ + public static final String INSTCODE = "code"; + + public static final String INSTCODE_COUNTRY = "country.iso3"; + + } + + public static interface Taxonomy { + + public static final String SCIENTIFIC_NAME = "sciName"; + + /** + * Reported genus of accession. + */ + public static final String GENUS = "genus"; + + /** + * May be used to assign a different genus. + */ + public static final String GENUS_NEW = "newGenus"; + + /** + * Specific epithet portion of the scientific name, in latin, in + * lowercase letters. Following abbreviation is allowed: ‘sp.’ + */ + public static final String SPECIES = "species"; + + /** + * Corresponds to MCPD SPAUTHOR + */ + public static final String SPAUTHOR = "spauthor"; + + /** + * Corresponds to MCPD SUBTAXA + */ + public static final String SUBTAXA = "subtaxa"; + } public static interface Collecting { - public static final String MISSION_ID = "collectingMissionID"; /** * Corresponds to COLLDATE */ diff --git a/src/main/java/org/genesys2/server/persistence/domain/CropRepository.java b/src/main/java/org/genesys2/server/persistence/domain/CropRepository.java index 65a853368..26be3523c 100644 --- a/src/main/java/org/genesys2/server/persistence/domain/CropRepository.java +++ b/src/main/java/org/genesys2/server/persistence/domain/CropRepository.java @@ -16,10 +16,14 @@ package org.genesys2.server.persistence.domain; +import java.util.List; + import org.genesys2.server.model.impl.Crop; import org.springframework.data.jpa.repository.JpaRepository; public interface CropRepository extends JpaRepository { Crop findByShortName(String shortName); + + List findByShortName(List cropNames); } diff --git a/src/main/java/org/genesys2/server/service/CropService.java b/src/main/java/org/genesys2/server/service/CropService.java index 1268e5470..092ebe9a8 100644 --- a/src/main/java/org/genesys2/server/service/CropService.java +++ b/src/main/java/org/genesys2/server/service/CropService.java @@ -93,4 +93,9 @@ public interface CropService { */ void updateCropTaxonomyLists(Taxonomy2 taxonomy); + /** + * Get crops + */ + List getCrops(List cropNames); + } diff --git a/src/main/java/org/genesys2/server/service/GenesysFilterService.java b/src/main/java/org/genesys2/server/service/GenesysFilterService.java index cb432ca3a..a285eb924 100644 --- a/src/main/java/org/genesys2/server/service/GenesysFilterService.java +++ b/src/main/java/org/genesys2/server/service/GenesysFilterService.java @@ -18,6 +18,7 @@ package org.genesys2.server.service; import java.util.List; +import org.genesys2.server.model.elastic.AccessionDetails; import org.genesys2.server.model.genesys.Accession; import org.genesys2.server.service.impl.FilterHandler.AppliedFilters; import org.genesys2.server.service.impl.GenesysFilterServiceImpl.LabelValue; @@ -28,6 +29,11 @@ import org.springframework.jdbc.core.RowCallbackHandler; public interface GenesysFilterService { Page listAccessions(AppliedFilters filters, Pageable pageable); + + /** + * Get fully loaded accession data + */ + Page listAccessionDetails(AppliedFilters filters, Pageable pageable); List> autocomplete(String filter, String ac, AppliedFilters filters); diff --git a/src/main/java/org/genesys2/server/service/GenesysService.java b/src/main/java/org/genesys2/server/service/GenesysService.java index 5cae8554e..c481a8efe 100644 --- a/src/main/java/org/genesys2/server/service/GenesysService.java +++ b/src/main/java/org/genesys2/server/service/GenesysService.java @@ -213,9 +213,9 @@ public interface GenesysService { List listAccessionsIds(Taxonomy2 taxonomy); - List columnsForDisplay(); + List columnsAvailableForDisplay(); - List defaultViewColumns(); + List defaultDisplayColumns(); public static class AllStuff { public AllStuff(long id) { @@ -240,20 +240,20 @@ public interface GenesysService { List loadAllStuff(Collection accessionIds); - Set getAccessionDetails(Collection accessionIds); + List getAccessionDetails(Collection accessionIds); int assignMissingUuid(int count); AccessionHistoric getHistoricAccession(UUID uuid); - PDCI updatePDCI(Long accessionId); + void updatePDCI(Collection ads); PDCI loadPDCI(Long accessionId); + + PDCI updatePDCI(Long id); PDCIStatistics statisticsPDCI(FaoInstitute faoInstitute); - void updatePDCI(Set ads); - List loadPDCI(List batch); int generateMissingPDCI(int count); diff --git a/src/main/java/org/genesys2/server/service/impl/CropServiceImpl.java b/src/main/java/org/genesys2/server/service/impl/CropServiceImpl.java index 6cb9861e2..254244e7c 100644 --- a/src/main/java/org/genesys2/server/service/impl/CropServiceImpl.java +++ b/src/main/java/org/genesys2/server/service/impl/CropServiceImpl.java @@ -114,6 +114,11 @@ public class CropServiceImpl implements CropService { return cropTaxonomyRepository.findCropsByTaxonomy(taxonomy2); } + @Override + public List getCrops(List cropNames) { + return cropRepository.findByShortName(cropNames); + } + @Override @Transactional(readOnly = false, propagation = Propagation.REQUIRES_NEW) @PreAuthorize("hasRole('ADMINISTRATOR')") @@ -320,7 +325,7 @@ public class CropServiceImpl implements CropService { @Override @Transactional(readOnly = false) - @CacheEvict(value = CACHE_CROP_TAXONOMYCROPS, key="#taxonomy.id") + @CacheEvict(value = CACHE_CROP_TAXONOMYCROPS, key = "#taxonomy.id") public void updateCropTaxonomyLists(Taxonomy2 taxonomy) { // Load all rules List cropRules = cropRuleRepository.findAll(); diff --git a/src/main/java/org/genesys2/server/service/impl/ElasticsearchSearchServiceImpl.java b/src/main/java/org/genesys2/server/service/impl/ElasticsearchSearchServiceImpl.java index a89b2df3d..7306c8c0b 100644 --- a/src/main/java/org/genesys2/server/service/impl/ElasticsearchSearchServiceImpl.java +++ b/src/main/java/org/genesys2/server/service/impl/ElasticsearchSearchServiceImpl.java @@ -330,7 +330,7 @@ public class ElasticsearchSearchServiceImpl implements ElasticService, Initializ List queries = new ArrayList(); - Set ads = genesysService.getAccessionDetails(ids); + List ads = genesysService.getAccessionDetails(ids); // If Accession, update PDCI genesysService.updatePDCI(ads); diff --git a/src/main/java/org/genesys2/server/service/impl/GenesysFilterServiceImpl.java b/src/main/java/org/genesys2/server/service/impl/GenesysFilterServiceImpl.java index b9f8f97c7..0c2119e73 100644 --- a/src/main/java/org/genesys2/server/service/impl/GenesysFilterServiceImpl.java +++ b/src/main/java/org/genesys2/server/service/impl/GenesysFilterServiceImpl.java @@ -27,6 +27,7 @@ import javax.sql.DataSource; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.genesys2.server.model.elastic.AccessionDetails; import org.genesys2.server.model.genesys.Accession; import org.genesys2.server.model.genesys.Method; import org.genesys2.server.model.impl.Country; @@ -67,7 +68,7 @@ public class GenesysFilterServiceImpl implements GenesysFilterService { // using this loop to make @Cacheable work @Autowired private GenesysService genesysService; - + @Autowired private MethodRepository methodRepository; @@ -115,11 +116,11 @@ public class GenesysFilterServiceImpl implements GenesysFilterService { // Does this go through the cache? final long totalCount = genesysService.countAccessions(filters); - LOG.info("Total count: " + totalCount); + LOG.debug("Total count: " + totalCount); if (totalCount > 0 && pageable.getPageNumber() * pageable.getPageSize() <= totalCount) { final List results = this.jdbcTemplate.queryForList(directQuery.getQuery("distinct a.id"), directQuery.getParameters(), Long.class); - LOG.info("Getting accessions " + results.size()); + LOG.debug("Getting accessions " + results.size()); return new PageImpl(results.size() == 0 ? new ArrayList() : accessionRepository.listById(results, // TODO Consider processing the pageable.getSort @@ -131,6 +132,46 @@ public class GenesysFilterServiceImpl implements GenesysFilterService { } } + /** + * Copy of + * {@link GenesysFilterServiceImpl#listAccessions(AppliedFilters, Pageable) + + */ + @Override + public Page listAccessionDetails(AppliedFilters filters, Pageable pageable) { + if (LOG.isDebugEnabled()) { + for (AppliedFilter filter : filters) { + LOG.debug("Looking at " + filter.toString()); + } + } + + final DirectMysqlQuery directQuery = new DirectMysqlQuery("accession", "a"); + directQuery.jsonFilter(filters, new MethodResolver() { + @Override + public Method getMethod(long methodId) { + return methodRepository.findOne(methodId); + } + }); + directQuery.pageable(pageable); + + // Does this go through the cache? + final long totalCount = genesysService.countAccessions(filters); + LOG.debug("Total count: " + totalCount); + + if (totalCount > 0 && pageable.getPageNumber() * pageable.getPageSize() <= totalCount) { + final List results = this.jdbcTemplate.queryForList(directQuery.getQuery("distinct a.id"), directQuery.getParameters(), Long.class); + LOG.debug("Getting accessions " + results.size()); + + if (results.size() == 0) { + return new PageImpl(new ArrayList(), pageable, totalCount); + } else { + return new PageImpl(genesysService.getAccessionDetails(results), pageable, totalCount); + } + } else { + return new PageImpl(new ArrayList(), pageable, totalCount); + } + } + /** * Filtering autocompleter */ diff --git a/src/main/java/org/genesys2/server/service/impl/GenesysServiceImpl.java b/src/main/java/org/genesys2/server/service/impl/GenesysServiceImpl.java index b5c3a1cf2..7ffe1124a 100644 --- a/src/main/java/org/genesys2/server/service/impl/GenesysServiceImpl.java +++ b/src/main/java/org/genesys2/server/service/impl/GenesysServiceImpl.java @@ -193,6 +193,32 @@ public class GenesysServiceImpl implements GenesysService, DatasetService { @Autowired private PDCIRepository repoPdci; + private List availableDisplayColumns; + + private List defaultDisplayColumns; + + public GenesysServiceImpl() { + List columnList = new ArrayList(); + columnList.add("taxonomy." + Api1Constants.Taxonomy.SCIENTIFIC_NAME); + columnList.add("taxonomy." + Api1Constants.Taxonomy.GENUS); + columnList.add("taxonomy." + Api1Constants.Taxonomy.SPECIES); + columnList.add("taxonomy." + Api1Constants.Taxonomy.SUBTAXA); + columnList.add(Api1Constants.Accession.CROP_NAMES); + columnList.add(Api1Constants.Accession.ORIGCTY); + columnList.add(Api1Constants.Accession.SAMPSTAT); + columnList.add("institute." + Api1Constants.Institute.INSTCODE); + columnList.add("geo." + Api1Constants.Geo.LATITUDE_LONGITUDE); + columnList.add("coll." + Api1Constants.Collecting.COLLMISSID); + availableDisplayColumns = Collections.unmodifiableList(columnList); + + List displayList = new ArrayList(); + displayList.add("taxonomy." + Api1Constants.Taxonomy.SCIENTIFIC_NAME); + displayList.add(Api1Constants.Accession.ORIGCTY); + displayList.add(Api1Constants.Accession.SAMPSTAT); + displayList.add("institute." + Api1Constants.Institute.INSTCODE); + defaultDisplayColumns = Collections.unmodifiableList(displayList); + } + @Override public long countAll() { return accessionRepository.count(); @@ -363,8 +389,8 @@ public class GenesysServiceImpl implements GenesysService, DatasetService { } @Override - public Set getAccessionDetails(Collection accessionIds) { - Set set = new HashSet(accessionIds.size()); + public List getAccessionDetails(Collection accessionIds) { + List set = new ArrayList(accessionIds.size()); List alls = loadAllStuff(accessionIds); for (AllStuff all : alls) { if (all == null) @@ -1530,26 +1556,13 @@ public class GenesysServiceImpl implements GenesysService, DatasetService { } @Override - public List columnsForDisplay() { - List columnList = new ArrayList<>(); - columnList.add(Api1Constants.Accession.GENUS); - columnList.add(Api1Constants.Accession.SPECIES); - columnList.add(Api1Constants.Accession.SUBTAXA); - columnList.add(Api1Constants.Accession.CROPE_NAME); - columnList.add(Api1Constants.Geo.LATITUDE_LONGITUDE); - columnList.add(Api1Constants.Collecting.MISSION_ID); - return columnList; + public List columnsAvailableForDisplay() { + return availableDisplayColumns; } @Override - public List defaultViewColumns() { - List columnList = new ArrayList<>(); - columnList.add(Api1Constants.Accession.ACCENUMB); - columnList.add(Api1Constants.Accession.SCIENTIFIC_NAME); - columnList.add(Api1Constants.Accession.ORIGCTY); - columnList.add(Api1Constants.Accession.SAMPSTAT); - columnList.add(Api1Constants.Accession.INSTCODE); - return columnList; + public List defaultDisplayColumns() { + return defaultDisplayColumns; } @Override @@ -1601,7 +1614,7 @@ public class GenesysServiceImpl implements GenesysService, DatasetService { ids.add(id.getId()); } } - Set ads = getAccessionDetails(ids); + Collection ads = getAccessionDetails(ids); List pdcis = new ArrayList(); for (AccessionDetails ad : ads) { PDCI pdci = new PDCI(); @@ -1633,13 +1646,14 @@ public class GenesysServiceImpl implements GenesysService, DatasetService { pdci = new PDCI(); pdci.setAccession(accessionIdRepository.findOne(accessionId)); } + return repoPdci.save(pdciCalculator.updatePdci(pdci, accessionId)); } @Override @Transactional @CacheEvict(value = "statistics", allEntries = true) - public void updatePDCI(Set ads) { + public void updatePDCI(Collection ads) { if (pdciCalculator == null) { return; } diff --git a/src/main/java/org/genesys2/server/service/worker/ElasticUpdater.java b/src/main/java/org/genesys2/server/service/worker/ElasticUpdater.java index d1f268bdc..5ea1a8462 100644 --- a/src/main/java/org/genesys2/server/service/worker/ElasticUpdater.java +++ b/src/main/java/org/genesys2/server/service/worker/ElasticUpdater.java @@ -253,7 +253,7 @@ public class ElasticUpdater { } } - public void archive(final Set deletedAccessions) { + public void archive(final List deletedAccessions) { final List queries = new ArrayList<>(deletedAccessions.size()); for (AccessionDetails ad : deletedAccessions) { IndexQuery iq = new IndexQuery(); diff --git a/src/main/java/org/genesys2/server/service/worker/ElasticUpdaterAspect.java b/src/main/java/org/genesys2/server/service/worker/ElasticUpdaterAspect.java index eb1169016..90ff0e0b2 100644 --- a/src/main/java/org/genesys2/server/service/worker/ElasticUpdaterAspect.java +++ b/src/main/java/org/genesys2/server/service/worker/ElasticUpdaterAspect.java @@ -158,7 +158,7 @@ public class ElasticUpdaterAspect { accessionIds.add(a.getId()); } // Need to load AccessionDetails before deleting - Set deletedAccessions = genesysService.getAccessionDetails(accessionIds); + List deletedAccessions = genesysService.getAccessionDetails(accessionIds); try { Object res = joinPoint.proceed(); diff --git a/src/main/java/org/genesys2/server/servlet/controller/ExplorerController.java b/src/main/java/org/genesys2/server/servlet/controller/ExplorerController.java index 97e6a10ed..ac29dd15d 100644 --- a/src/main/java/org/genesys2/server/servlet/controller/ExplorerController.java +++ b/src/main/java/org/genesys2/server/servlet/controller/ExplorerController.java @@ -25,8 +25,8 @@ import java.io.IOException; import java.io.OutputStream; import java.net.URI; import java.net.URISyntaxException; +import java.util.ArrayList; import java.util.Arrays; -import java.util.Collections; import java.util.List; import java.util.Map; @@ -39,7 +39,6 @@ import org.apache.commons.lang.StringUtils; import org.apache.http.client.utils.URIBuilder; import org.genesys2.server.model.elastic.AccessionDetails; import org.genesys2.server.model.filters.GenesysFilter; -import org.genesys2.server.model.genesys.Accession; import org.genesys2.server.model.genesys.Method; import org.genesys2.server.model.genesys.Parameter; import org.genesys2.server.model.genesys.ParameterCategory; @@ -59,6 +58,7 @@ import org.genesys2.server.service.impl.FilterHandler.AppliedFilters; import org.genesys2.server.service.impl.GenesysFilterServiceImpl.LabelValue; import org.genesys2.server.service.impl.SearchException; import org.genesys2.spring.ResourceNotFoundException; +import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.data.domain.Page; @@ -79,7 +79,7 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.jhlabs.image.MapColorsFilter; @Controller -public class ExplorerController extends BaseController { +public class ExplorerController extends BaseController implements InitializingBean { private static final int DOWNLOAD_LIMIT = 200000; @@ -115,6 +115,16 @@ public class ExplorerController extends BaseController { @Value("${base.url}") private String baseUrl; + private List validDisplayColumns; + + private List defaultDisplayColumns; + + @Override + public void afterPropertiesSet() throws Exception { + validDisplayColumns = genesysService.columnsAvailableForDisplay(); + defaultDisplayColumns = genesysService.defaultDisplayColumns(); + } + /** * Redirect to /explore/c/{shortName} if parameter 'crop' is provided */ @@ -155,22 +165,8 @@ public class ExplorerController extends BaseController { @RequestMapping("/explore") public String viewFiltered(HttpServletResponse response, ModelMap model, @RequestParam(value = "page", required = false, defaultValue = "1") int page, @RequestParam(value = "filter", required = true, defaultValue = "{}") String jsonFilter, - @RequestParam(value = "columns", required = true, defaultValue = "") String columns, - @CookieValue(value = "columns", defaultValue = "") String cookieColumns) throws IOException { - - if (columns != null && !columns.isEmpty()) { - String columnsForCookie = ""; - for (String clmn : Arrays.asList(columns.split(","))) { - columnsForCookie += clmn + ","; - } - columnsForCookie = !columnsForCookie.isEmpty() && columnsForCookie.substring(columnsForCookie.length() - 1).equals(",") ? columnsForCookie - .substring(0, columnsForCookie.length() - 1) : columnsForCookie; - Cookie cookie = new Cookie("columns", columnsForCookie); - response.addCookie(cookie); - model.addAttribute("selectedColumns", columnsForCookie.isEmpty() ? Collections.emptyList() : Arrays.asList(columnsForCookie.split(","))); - } else if (!cookieColumns.isEmpty()) { - model.addAttribute("selectedColumns", Arrays.asList(cookieColumns.split(","))); - } + @RequestParam(value = "columns", required = true, defaultValue = "") String[] columns, + @CookieValue(value = "columns", defaultValue = "") String[] cookieColumns) throws IOException { String[] selectedFilters = null; @@ -200,15 +196,20 @@ public class ExplorerController extends BaseController { final List currentFilters = filterHandler.selectFilters(selectedFilters); final List availableFilters = filterHandler.listAvailableFilters(); - _logger.info(appliedFilters.toString()); + if (_logger.isDebugEnabled()) { + _logger.debug(appliedFilters.toString()); + } model.addAttribute("jsonFilter", appliedFilters.toString()); - final Page accessions = filterService.listAccessions(appliedFilters, new PageRequest(page - 1, 50, new Sort("acceNumb"))); + final Page accessions = filterService.listAccessionDetails(appliedFilters, new PageRequest(page - 1, 50, new Sort("acceNumb"))); - _logger.info("Got: " + accessions); + if (_logger.isDebugEnabled()) { + _logger.debug("Got: " + accessions); + } + + model.addAttribute("availableColumns", validDisplayColumns); + model.addAttribute("selectedColumns", cleanupDisplayColumns(columns, cookieColumns, response)); - model.addAttribute("defaultColumns", genesysService.defaultViewColumns()); - model.addAttribute("availableColumns", genesysService.columnsForDisplay()); model.addAttribute("crops", cropService.list(getLocale())); model.addAttribute("pagedData", accessions); model.addAttribute("appliedFilters", appliedFilters); @@ -218,6 +219,84 @@ public class ExplorerController extends BaseController { return "/accession/explore"; } + /** + * @param columns + * list of explicitly selected columns + * @param cookieColumns + * list of columns currently in the cookie + * @param response + * HttpResponse to set valid cookieColumn value + * @return String[] of valid columns to display + */ + private List cleanupDisplayColumns(String[] columns, String[] cookieColumns, HttpServletResponse response) { + if (columns != null && columns.length > 0) { + // Cleanup user input + columns = keepValidColumns(columns, validDisplayColumns); + // Update cookie accordingly + return updateCookieColumns(columns, response); + } + + if (cookieColumns != null && cookieColumns.length > 0) { + String[] validCookieColumns = keepValidColumns(cookieColumns, validDisplayColumns); + if (!Arrays.equals(cookieColumns, validCookieColumns)) { + // Change detected, update cookie! + return updateCookieColumns(cookieColumns, response); + } else { + return Arrays.asList(cookieColumns); + } + } + + // Return default columns + return defaultDisplayColumns; + } + + /** + * + * @param cookieColumns + * validated selected columns + * @param response + * @return + */ + private List updateCookieColumns(String[] cookieColumns, HttpServletResponse response) { + Cookie cookie = new Cookie("columns", ""); + + // If cookieColumns match defaults, then delete the cookie + if (Arrays.equals(cookieColumns, defaultDisplayColumns.toArray(ArrayUtils.EMPTY_STRING_ARRAY))) { + _logger.debug("Selected view columns match defaults, removing cookie"); + // 0 = Delete, -1 = Keep Forever + cookie.setMaxAge(0); + response.addCookie(cookie); + + return defaultDisplayColumns; + + } else { + StringBuffer cookieColumnsString = new StringBuffer(); + for (String cc : cookieColumns) { + if (cookieColumnsString.length() > 0) + cookieColumnsString.append(","); + cookieColumnsString.append(cc); + } + + cookie.setValue(cookieColumnsString.toString()); + cookie.setMaxAge(Integer.MAX_VALUE); + response.addCookie(cookie); + _logger.debug("Sending updated cookie: " + cookie.getValue()); + + return Arrays.asList(cookieColumns); + } + } + + private String[] keepValidColumns(String[] columns, List validColumns) { + if (columns == null || columns.length == 0) + return ArrayUtils.EMPTY_STRING_ARRAY; + + // Remove columns not listed in "available" + List list = new ArrayList(Arrays.asList(columns)); + list.removeIf(a -> !validColumns.contains(a)); + + return list.toArray(ArrayUtils.EMPTY_STRING_ARRAY); + } + /** * Browse all using Elasticsearch * diff --git a/src/main/java/org/genesys2/server/servlet/controller/JspHelper.java b/src/main/java/org/genesys2/server/servlet/controller/JspHelper.java index a3cb548e6..ecd5983e6 100644 --- a/src/main/java/org/genesys2/server/servlet/controller/JspHelper.java +++ b/src/main/java/org/genesys2/server/servlet/controller/JspHelper.java @@ -23,7 +23,6 @@ import java.util.Locale; import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.math.RandomUtils; import org.genesys2.server.exception.UserException; -import org.genesys2.server.model.genesys.Accession; import org.genesys2.server.model.impl.Country; import org.genesys2.server.model.impl.Crop; import org.genesys2.server.model.impl.User; @@ -86,8 +85,8 @@ public class JspHelper { return cropService.getCrop(shortName); } - public List getCropsByAccession(Accession accession) { - return cropService.getCrops(accession.getTaxonomy()); + public List getCrops(List cropNames) { + return cropService.getCrops(cropNames); } public String toJson(Object object) throws JsonProcessingException { diff --git a/src/main/resources/content/language.properties b/src/main/resources/content/language.properties index f67f1fe55..4a6712fab 100644 --- a/src/main/resources/content/language.properties +++ b/src/main/resources/content/language.properties @@ -218,11 +218,23 @@ method.fieldName=DB Field accession.uuid=UUID accession.accessionName=Accession number +accession.acceNumb=Accession number accession.origin=Country of origin +accession.orgCty=Country of origin accession.holdingInstitute=Holding institute +accession.institute.code=Holding institute accession.holdingCountry=Location +accession.institute.country.iso3=Location accession.taxonomy=Scientific name +accession.taxonomy.sciName=Scientific name +accession.genus=Genus +accession.taxonomy.genus=Genus +accession.species=Species +accession.taxonomy.species=Species +accession.subtaxa=Subtaxa +accession.taxonomy.subtaxa=Subtaxa accession.crop=Crop name +accession.crops=Crop name accession.otherNames=Also known as accession.inTrust=In Trust accession.mlsStatus=MLS Status @@ -259,6 +271,7 @@ accession.collecting.institute=Collecting institute accession.collecting.number=Collecting number accession.collecting.date=Collecting date of sample accession.collecting.mission=Collecting mission ID +accession.coll.collMissId=Collecting mission ID accession.collecting.source=Collecting/Acquisition source accession.collectingSource.= @@ -291,8 +304,10 @@ accession.geo=Geographic information accession.geo.datum=Coordinate datum accession.geo.method=Georeferencing method accession.geo.uncertainty=Coordinate uncertainty -accession.sampleStatus=Biological status of accession +accession.geo.latitudeAndLongitude=Geolocation +accession.sampStat=Biological status of accession +accession.sampleStatus=Biological status of accession accession.sampleStatus.= accession.sampleStatus.100=Wild accession.sampleStatus.110=Natural @@ -353,6 +368,7 @@ taxonomy.species=Species taxonomy.taxonName=Scientific name taxonomy-list=Taxonomy list +selection.checkbox=Click to add or remove the accession from your list selection.page.title=Selected accessions selection.page.intro=As you explore the millions of accessions held in Genesys, you can create your own list to keep track of the results of your search. Your selections are stored here so you can return to them at any time. selection.add=Add {0} to list @@ -406,8 +422,8 @@ filter.donorCode=Donor institute filter.duplSite=Site of safety duplication filter.download-dwca=Download ZIP filter.download-mcpd=Download MCPD -filter.add=Add filter -filter.additional=Additional filters +filter.add=Refine search by category +filter.additional=Refine search by trait filter.apply=Apply filter.close=Close filter.remove=Remove filter @@ -425,12 +441,9 @@ filter.internal.message.more=More than {0} filter.internal.message.less=Less than {0} filter.lists=Listed on accession list -columns.add=View -columns.applay=Applay -columns.genus=Genus -columns.species=Species -columns.subtaxa=Subtaxa -columns.cropName=Crop name +columns.add=Change displayed columns +columns.apply=Apply +columns.availableColumns=Select columns to display and click Apply columns.latitudeAndLongitude=Latitude & Longitude columns.collectingMissionID=Collecting mission ID diff --git a/src/main/resources/log4j.properties b/src/main/resources/log4j.properties index 6eef3b0f7..d9b0c6958 100644 --- a/src/main/resources/log4j.properties +++ b/src/main/resources/log4j.properties @@ -26,6 +26,7 @@ log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %t %5p %c{1}:%L - %m log4j.rootLogger=warn, stdout log4j.category.org.genesys2=info +log4j.category.org.genesys2.server.servlet.controller=debug log4j.category.org.hibernate.cfg.Configuration=debug #log4j.category.org.hibernate.search=debug #log4j.category.org.apache.tomcat.jdbc.pool=debug diff --git a/src/main/sourceapp/styles/genesys.scss b/src/main/sourceapp/styles/genesys.scss index 3930b7ca1..115f97d33 100644 --- a/src/main/sourceapp/styles/genesys.scss +++ b/src/main/sourceapp/styles/genesys.scss @@ -2471,3 +2471,7 @@ div[x-href] { text-align: center; padding: 10px; } + +.dropdown-menu.view-columns li { + padding: 0 10px; +} diff --git a/src/main/webapp/WEB-INF/jsp/accession/explore.jsp b/src/main/webapp/WEB-INF/jsp/accession/explore.jsp index 88c706909..275ea3379 100644 --- a/src/main/webapp/WEB-INF/jsp/accession/explore.jsp +++ b/src/main/webapp/WEB-INF/jsp/accession/explore.jsp @@ -133,45 +133,28 @@