/** * This file is part of lavagna. * * lavagna is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * lavagna is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with lavagna. If not, see <http://www.gnu.org/licenses/>. */ package io.lavagna.web.helper; import io.lavagna.service.ProjectService; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import java.util.Collections; import java.util.HashSet; import java.util.Set; import java.util.regex.Matcher; import java.util.regex.Pattern; public abstract class AbstractPermissionUrlPath { private static final Logger LOG = LogManager.getLogger(); private final String path; private final Pattern pattern; AbstractPermissionUrlPath(String path, String paramName) { this.path = path; // we have an internal regex if (paramName.contains(":")) { this.pattern = Pattern.compile(path.replace("{" + paramName + "}", "(" + (paramName.split(":")[1]) + ")")); } else { this.pattern = Pattern.compile(path.replace("{" + paramName + "}", "([^/]+)")); } } Set<String> tryToFetchProjectShortNames(String requestUri, ProjectService projectService) { LOG.trace("tryToFetchProjectShortNames : uri : {}, pattern: {}", requestUri, pattern); Set<String> e = extractAll(requestUri); if (e.isEmpty()) { return Collections.emptySet(); } return tryToFetchProjectShortName(e, projectService); } /** * Most of the cases the url has a single id, should not be a performance issue * * @param ids * @param projectService * @return */ protected abstract Set<String> tryToFetchProjectShortName(Set<String> ids, ProjectService projectService); private Set<String> extractAll(String uri) { Matcher m = pattern.matcher(uri); Set<String> groups = new HashSet<>(); while (m.find()) { groups.add(m.group(1)); } LOG.trace("extract all : uri : {}, pattern: {}, groups: {}", uri, pattern, groups); return groups; } private static void addIfNotNull(Set<String> s, String i) { if (i != null) { s.add(i); } } private static Set<Integer> from(Set<String> ids) { Set<Integer> res = new HashSet<>(); for (String id : ids) { try { res.add(Integer.parseInt(id)); } catch (NumberFormatException e) { // nope } } return res; } static class ProjectShortNameUrlPath extends AbstractPermissionUrlPath { ProjectShortNameUrlPath(String path, String paramName) { super(path, paramName); } @Override public Set<String> tryToFetchProjectShortName(Set<String> shortName, ProjectService projectService) { return shortName; } } static class BoardShortNameUrlPath extends AbstractPermissionUrlPath { BoardShortNameUrlPath(String path, String paramName) { super(path, paramName); } @Override public Set<String> tryToFetchProjectShortName(Set<String> ids, ProjectService projectService) { Set<String> res = new HashSet<>(); for (String shortName : ids) { addIfNotNull(res, projectService.findRelatedProjectShortNameByBoardShortname(shortName)); } return res; } } static class CardIdUrlPath extends AbstractPermissionUrlPath { CardIdUrlPath(String path, String paramName) { super(path, paramName); } @Override public Set<String> tryToFetchProjectShortName(Set<String> ids, ProjectService projectService) { Set<String> res = new HashSet<>(); for (int cardId : from(ids)) { addIfNotNull(res, projectService.findRelatedProjectShortNameByCardId(cardId)); } return res; } } static class EventIdUrlPath extends AbstractPermissionUrlPath { public EventIdUrlPath(String path, String paramName) { super(path, paramName); } @Override protected Set<String> tryToFetchProjectShortName(Set<String> ids, ProjectService projectService) { Set<String> res = new HashSet<>(); for (int eventId : from(ids)) { addIfNotNull(res, projectService.findRelatedProjectShortNameByEventId(eventId)); } return res; } } static class CardDataIdUrlPath extends AbstractPermissionUrlPath { CardDataIdUrlPath(String path, String paramName) { super(path, paramName); } @Override public Set<String> tryToFetchProjectShortName(Set<String> ids, ProjectService projectService) { Set<String> res = new HashSet<>(); for (int cardDataId : from(ids)) { addIfNotNull(res, projectService.findRelatedProjectShortNameByCardDataId(cardDataId)); } return res; } } static class ColumnIdUrlPath extends AbstractPermissionUrlPath { ColumnIdUrlPath(String path, String paramName) { super(path, paramName); } @Override public Set<String> tryToFetchProjectShortName(Set<String> ids, ProjectService projectService) { Set<String> res = new HashSet<>(); for (Integer columnId : from(ids)) { addIfNotNull(res, projectService.findRelatedProjectShortNameByColumnId(columnId)); } return res; } } static class LabelIdUrlPath extends AbstractPermissionUrlPath { LabelIdUrlPath(String path, String paramName) { super(path, paramName); } @Override public Set<String> tryToFetchProjectShortName(Set<String> ids, ProjectService projectService) { Set<String> res = new HashSet<>(); for (Integer labelId : from(ids)) { addIfNotNull(res, projectService.findRelatedProjectShortNameByLabelId(labelId)); } return res; } } static class LabelValueIdUrlPath extends AbstractPermissionUrlPath { LabelValueIdUrlPath(String path, String paramName) { super(path, paramName); } @Override public Set<String> tryToFetchProjectShortName(Set<String> ids, ProjectService projectService) { Set<String> res = new HashSet<>(); for (Integer labelValueId : from(ids)) { addIfNotNull(res, projectService.findRelatedProjectShortNameByLabelValueId(labelValueId)); } return res; } } static class LabelListValuedIdPath extends AbstractPermissionUrlPath { LabelListValuedIdPath(String path, String paramName) { super(path, paramName); } @Override public Set<String> tryToFetchProjectShortName(Set<String> ids, ProjectService projectService) { Set<String> res = new HashSet<>(); for (Integer labelListValueIdPath : from(ids)) { addIfNotNull(res, projectService.findRelatedProjectShortNameByLabelListValudIdPath(labelListValueIdPath)); } return res; } } static class ColumnDefinitionIdUrlPath extends AbstractPermissionUrlPath { ColumnDefinitionIdUrlPath(String path, String paramName) { super(path, paramName); } @Override public Set<String> tryToFetchProjectShortName(Set<String> ids, ProjectService projectService) { Set<String> res = new HashSet<>(); for (Integer id : from(ids)) { addIfNotNull(res, projectService.findRelatedProjectShortNameByColumnDefinitionId(id)); } return res; } } public String getPath() { return path; } }