Java tutorial
/* * Copyright (c) 2015-2017 LabKey Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.labkey.trialshare.data; import com.fasterxml.jackson.annotation.JsonIgnore; import org.apache.commons.lang3.StringUtils; import org.apache.commons.validator.routines.UrlValidator; import org.labkey.api.collections.CaseInsensitiveHashMap; import org.labkey.api.data.Container; import org.labkey.api.data.ContainerManager; import org.labkey.api.reports.Report; import org.labkey.api.reports.ReportService; import org.labkey.api.reports.model.ViewCategory; import org.labkey.api.reports.report.view.ReportUtil; import org.labkey.api.security.User; import org.labkey.api.security.permissions.InsertPermission; import org.labkey.api.security.permissions.ReadPermission; import org.labkey.api.util.URLHelper; import org.labkey.api.view.ActionURL; import org.labkey.api.view.ViewContext; import org.labkey.trialshare.TrialShareManager; import org.labkey.trialshare.query.TrialShareQuerySchema; import org.springframework.validation.Errors; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Map; import java.util.regex.Pattern; import static org.labkey.api.action.SpringActionController.ERROR_MSG; import static org.labkey.api.action.SpringActionController.ERROR_REQUIRED; public class StudyPublicationBean { private static final String KEY_FIELD = "Key"; private static final String STUDY_ID_FIELD = "StudyId"; private static final String TITLE_FIELD = "Title"; private static final String AUTHOR_FIELD = "Author"; private static final String DOI_FIELD = "DOI"; private static final String PMID_FIELD = "PMID"; private static final String PMCID_FIELD = "PMCID"; private static final String ISSUE_NUMBER_FIELD = "IssueNo"; private static final String PAGES_FIELD = "Pages"; private static final String PUBLICATION_TYPE_FIELD = "PublicationType"; private static final String YEAR_FIELD = "Year"; private static final String JOURNAL_FIELD = "Journal"; private static final String STATUS_FIELD = "Status"; private static final String SUBMISSION_STATUS_FIELD = "SubmissionStatus"; private static final String CITATION_FIELD = "Citation"; private static final String ABSTRACT_FIELD = "AbstractText"; private static final String DATA_URL_FIELD = "DataUrl"; private static final String IS_HIGHLIGHTED_FIELD = "IsHighlighted"; private static final String MANUSCRIPT_CONTAINER_FIELD = "ManuscriptContainer"; private static final String KEYWORDS_FIELD = "Keywords"; private static final String PERMISSIONS_CONTAINER_FIELD = "PermissionsContainer"; private static final String IS_SHOWN_FIELD = "Show"; private static final String LINK1_FIELD = "Link1"; private static final String DESCRIPTION1_FIELD = "Description1"; private static final String LINK2_FIELD = "Link2"; private static final String DESCRIPTION2_FIELD = "Description2"; private static final String LINK3_FIELD = "Link3"; private static final String DESCRIPTION3_FIELD = "Description3"; private static final Pattern PMCID_PATTERN = Pattern.compile("[Pp][Mm][Cc]\\d+"); private static final String FIGURES_CATEGORY_TEXT = "Manuscript Figures"; private static final int AUTHORS_PER_ABBREV = 3; private Map<String, Object> _primaryFields = new CaseInsensitiveHashMap<>(); private List<StudyBean> studies; private List<URLData> thumbnails; private List<URLData> urls = new ArrayList<>(); public Integer getId() { return (Integer) _primaryFields.get(KEY_FIELD); } public void setId(Integer id) { _primaryFields.put(KEY_FIELD, id); } public void setKey(Integer id) { _primaryFields.put(KEY_FIELD, id); } public void set_Key(Integer id) { _primaryFields.put(KEY_FIELD, id); } // this is required because for SQLServer we alias "Key" as "_Key" in our query public String getStudyId() { return (String) _primaryFields.get(STUDY_ID_FIELD); } public void setStudyId(String studyId) { _primaryFields.put(STUDY_ID_FIELD, studyId); } public String getPMID() { return (String) _primaryFields.get(PMID_FIELD); } public void setPMID(String pmid) { _primaryFields.put(PMID_FIELD, pmid); } public String getPMCID() { return (String) _primaryFields.get(PMCID_FIELD); } public void setPMCID(String pmcid) { _primaryFields.put(PMCID_FIELD, pmcid); } public String getDOI() { return (String) _primaryFields.get(DOI_FIELD); } public void setDOI(String doi) { _primaryFields.put(DOI_FIELD, doi); } public String getAuthor() { return (String) _primaryFields.get(AUTHOR_FIELD); } public String getAuthorAbbrev() { if (getAuthor() == null) return null; String[] authors = getAuthor().split(","); int endVal = AUTHORS_PER_ABBREV; String suffix = ", et al."; if (authors.length <= AUTHORS_PER_ABBREV) { endVal = authors.length; suffix = ""; } return String.join(", ", Arrays.copyOfRange(authors, 0, endVal)) + suffix; } public void setAuthor(String author) { _primaryFields.put(AUTHOR_FIELD, author); } public String getIssueNumber() { return (String) _primaryFields.get(ISSUE_NUMBER_FIELD); } public void setIssueNumber(String issue) { _primaryFields.put(ISSUE_NUMBER_FIELD, issue); } public String getJournal() { return (String) _primaryFields.get(JOURNAL_FIELD); } public void setJournal(String journal) { _primaryFields.put(JOURNAL_FIELD, journal); } public String getPages() { return (String) _primaryFields.get(PAGES_FIELD); } public void setPages(String pages) { _primaryFields.put(PAGES_FIELD, pages); } public String getTitle() { return (String) _primaryFields.get(TITLE_FIELD); } public void setTitle(String title) { _primaryFields.put(TITLE_FIELD, title); } public Integer getYear() { return (Integer) _primaryFields.get(YEAR_FIELD); } public void setYear(Integer year) { _primaryFields.put(YEAR_FIELD, year); } public String getCitation() { return (String) _primaryFields.get(CITATION_FIELD); } public void setCitation(String citation) { _primaryFields.put(CITATION_FIELD, citation); } public String getAbstractText() { return (String) _primaryFields.get(ABSTRACT_FIELD); } public void setAbstractText(String abstractText) { abstractText = TrialShareManager.trimNullFontFace(abstractText); _primaryFields.put(ABSTRACT_FIELD, abstractText); } public String getUrl() { for (URLData urlData : urls) { if (!StringUtils.isEmpty(urlData.getLink())) return urlData.getLink(); } return null; } public List<URLData> getUrls() { return urls; } public void setUrls(List<URLData> urls) { this.urls = urls; } private void setUrlText(int index, String description) { if (description == null || description.equals(" ")) description = ""; URLData urlData = getUrlData(index); if (urlData == null) { urlData = new URLData(); urlData.setIndex(index); urls.add(urlData); } urlData.setLinkText(description); } private void setUrlLink(int index, String link) { if (link == null) return; URLData urlData = getUrlData(index); if (urlData == null) { urlData = new URLData(); urlData.setIndex(index); urls.add(urlData); } urlData.setLink(link); } private URLData getUrlData(int index) { for (URLData url : urls) { if (url.getIndex() == index) return url; } return null; } public void setDescription1(String description1) { setUrlText(0, description1); } public String getDescription1() { URLData url = getUrlData(0); return url == null ? null : url.getLinkText(); } public void setDescription2(String description2) { setUrlText(1, description2); } public String getDescription2() { URLData url = getUrlData(1); return url == null ? null : url.getLinkText(); } public void setDescription3(String description3) { setUrlText(2, description3); } public String getDescription3() { URLData url = getUrlData(2); return url == null ? null : url.getLinkText(); } public void setLink1(String link1) { setUrlLink(0, link1); } public String getLink1() { URLData url = getUrlData(0); return url == null ? null : url.getLink(); } public void setLink2(String link2) { setUrlLink(1, link2); } public String getLink2() { URLData url = getUrlData(1); return url == null ? null : url.getLink(); } public void setLink3(String link3) { setUrlLink(2, link3); } public String getLink3() { URLData url = getUrlData(2); return url == null ? null : url.getLink(); } public String getStatus() { return (String) _primaryFields.get(STATUS_FIELD); } public void setStatus(String status) { _primaryFields.put(STATUS_FIELD, status); } public String getSubmissionStatus() { return (String) _primaryFields.get(SUBMISSION_STATUS_FIELD); } public void setSubmissionStatus(String status) { _primaryFields.put(SUBMISSION_STATUS_FIELD, status); } public List<StudyBean> getStudies() { return studies; } public void setStudies(List<StudyBean> studies) { this.studies = studies; } public String getDataUrl() { return (String) _primaryFields.get(DATA_URL_FIELD); } public void setDataUrl(String dataUrl) { _primaryFields.put(DATA_URL_FIELD, dataUrl); } public Boolean getIsHighlighted() { return (Boolean) _primaryFields.get(IS_HIGHLIGHTED_FIELD); } public void setIsHighlighted(Boolean highlighted) { _primaryFields.put(IS_HIGHLIGHTED_FIELD, highlighted); } public String getPublicationType() { return (String) _primaryFields.get(PUBLICATION_TYPE_FIELD); } public void setPublicationType(String publicationType) { _primaryFields.put(PUBLICATION_TYPE_FIELD, publicationType); } public String getManuscriptContainer() { return (String) _primaryFields.get(MANUSCRIPT_CONTAINER_FIELD); } public void setManuscriptContainer(String manuscriptContainer) { _primaryFields.put(MANUSCRIPT_CONTAINER_FIELD, manuscriptContainer); } public List<URLData> getThumbnails() { return thumbnails; } public void setThumbnails(User user, ActionURL actionURL) { if (getManuscriptContainer() == null) return; thumbnails = new ArrayList<>(); Container container = ContainerManager.getForId(getManuscriptContainer()); if (container == null) return; ViewContext context = new ViewContext(); context.setContainer(container); context.setUser(user); context.setActionURL(actionURL); List<ViewCategory> figureCategories = getFigureReportCategories(user, container); for (Report report : ReportService.get().getReports(user, container)) { ViewCategory category = report.getDescriptor().getCategory(container); if (figureCategories.contains(category)) { URLHelper urlHelper = ReportUtil.getThumbnailUrl(container, report); if (urlHelper != null) { URLData urlData = new URLData(); urlData.setLinkText(urlHelper.toString()); urlData.setLink(report.getRunReportURL(context).toString()); urlData.setTitle(report.getDescriptor().getReportName()); thumbnails.add(urlData); } } } } public List<ViewCategory> getFigureReportCategories(User user, Container container) { List<ViewCategory> categories = new ArrayList<>(); for (Report report : ReportService.get().getReports(user, container)) { ViewCategory category = report.getDescriptor().getCategory(container); if (category != null && category.getLabel().contains(FIGURES_CATEGORY_TEXT)) { addCategories(category, categories); break; } } return categories; } public void addCategories(ViewCategory category, List<ViewCategory> categories) { categories.add(category); for (ViewCategory subcategory : category.getSubcategories()) { addCategories(subcategory, categories); } } public String getKeywords() { return (String) _primaryFields.get(KEYWORDS_FIELD); } public void setKeywords(String keywords) { _primaryFields.put(KEYWORDS_FIELD, keywords); } public String getPermissionsContainer() { return (String) _primaryFields.get(PERMISSIONS_CONTAINER_FIELD); } public void setPermissionsContainer(String permissionsContainer) { _primaryFields.put(PERMISSIONS_CONTAINER_FIELD, permissionsContainer); } public Boolean getShow() { return (Boolean) _primaryFields.get(IS_SHOWN_FIELD); } public void setShow(Boolean show) { _primaryFields.put(IS_SHOWN_FIELD, show); } public Boolean inProgress() { return getStatus() != null && getStatus().equalsIgnoreCase(TrialShareQuerySchema.IN_PROGRESS_STATUS); } public String getCubeId() { return "[Publication].[" + getId() + "]"; } public boolean hasPermission(User user) { Boolean inProgress = inProgress(); if (getPermissionsContainer() == null) return !inProgress; else { Container permissionsContainer = ContainerManager.getForId(getPermissionsContainer()); if (permissionsContainer == null) return !inProgress; else if (inProgress) { if (permissionsContainer.hasPermission(user, InsertPermission.class)) return true; } else if (permissionsContainer.hasPermission(user, ReadPermission.class)) return true; } return false; } @JsonIgnore public Map<String, Object> getPrimaryFields() { return _primaryFields; } public Map<String, Object> getUrlFields() { Map<String, Object> urlFields = new CaseInsensitiveHashMap<>(); if (getLink1() != null) urlFields.put(LINK1_FIELD, getLink1()); if (getDescription1() != null) urlFields.put(DESCRIPTION1_FIELD, getDescription1()); if (getLink2() != null) urlFields.put(LINK2_FIELD, getLink2()); if (getDescription2() != null) urlFields.put(DESCRIPTION2_FIELD, getDescription2()); if (getLink3() != null) urlFields.put(LINK3_FIELD, getLink3()); if (getDescription3() != null) urlFields.put(DESCRIPTION3_FIELD, getDescription3()); return urlFields; } protected void setPrimaryFields(Map<String, Object> fields) { _primaryFields = fields; } public void validate(Errors errors) { if (StringUtils.isEmpty(getTitle())) errors.rejectValue("title", ERROR_REQUIRED, "Title is required"); if (StringUtils.isEmpty(getStatus())) errors.rejectValue("status", ERROR_REQUIRED, "Status is required"); if (StringUtils.isEmpty(getPublicationType())) errors.rejectValue("publicationType", ERROR_REQUIRED, "Publication type is required"); if (getPMID() != null && !StringUtils.isNumeric(getPMID())) { errors.rejectValue("pmid", ERROR_MSG, "PMID must be an integer"); } if (!StringUtils.isEmpty(getPMCID()) && !PMCID_PATTERN.matcher(getPMCID()).matches()) { errors.rejectValue("pmcid", ERROR_MSG, "Incorrect format for PMCID. Expected PMC#"); } } private boolean isValidUrl(String url) { return new UrlValidator(new String[] { "http", "https" }).isValid(url); } }