Skip to content

Commit ba15b5b

Browse files
tulinkryVladimir Kotal
authored andcommitted
clear the groups before populating them (#2567)
fixes #2566
1 parent a951cff commit ba15b5b

File tree

3 files changed

+113
-46
lines changed

3 files changed

+113
-46
lines changed

opengrok-indexer/src/main/java/org/opengrok/indexer/configuration/RuntimeEnvironment.java

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1454,15 +1454,30 @@ private void generateProjectRepositoriesMap() throws IOException {
14541454

14551455
/**
14561456
* Classifies projects and puts them in their groups.
1457-
* @param groups groups to update
1457+
* <p>
1458+
* If any of the groups contain some projects or repositories already,
1459+
* these get discarded.
1460+
*
1461+
* @param groups set of groups to be filled with matching projects
14581462
* @param projects projects to classify
14591463
*/
14601464
public void populateGroups(Set<Group> groups, Set<Project> projects) {
14611465
if (projects == null || groups == null) {
14621466
return;
14631467
}
1468+
1469+
// clear the groups first if they had something in them
1470+
for (Group group : groups) {
1471+
group.getRepositories().clear();
1472+
group.getProjects().clear();
1473+
}
1474+
1475+
// now fill the groups with appropriate projects
14641476
for (Project project : projects) {
1465-
// filterProjects only groups which match project's description
1477+
// clear the project's groups
1478+
project.getGroups().clear();
1479+
1480+
// filter projects only to groups which match project's name
14661481
Set<Group> copy = Group.matching(project, groups);
14671482

14681483
// add project to the groups

opengrok-indexer/src/test/java/org/opengrok/indexer/configuration/RuntimeEnvironmentTest.java

Lines changed: 69 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,16 @@
2323
*/
2424
package org.opengrok.indexer.configuration;
2525

26+
import static org.junit.Assert.assertEquals;
27+
import static org.junit.Assert.assertFalse;
28+
import static org.junit.Assert.assertNotNull;
29+
import static org.junit.Assert.assertNull;
30+
import static org.junit.Assert.assertSame;
31+
import static org.junit.Assert.assertTrue;
32+
import static org.junit.Assert.fail;
33+
import static org.opengrok.indexer.util.StatisticsUtils.loadStatistics;
34+
import static org.opengrok.indexer.util.StatisticsUtils.saveStatistics;
35+
2636
import java.io.ByteArrayOutputStream;
2737
import java.io.File;
2838
import java.io.IOException;
@@ -37,7 +47,7 @@
3747
import java.util.List;
3848
import java.util.Map;
3949
import java.util.TreeMap;
40-
50+
import java.util.TreeSet;
4151
import org.apache.tools.ant.filters.StringInputStream;
4252
import org.json.simple.parser.ParseException;
4353
import org.junit.AfterClass;
@@ -50,20 +60,9 @@
5060
import org.opengrok.indexer.authorization.AuthorizationPlugin;
5161
import org.opengrok.indexer.authorization.AuthorizationStack;
5262
import org.opengrok.indexer.history.RepositoryInfo;
53-
import org.opengrok.indexer.web.Statistics;
54-
55-
import static org.junit.Assert.assertEquals;
56-
import static org.junit.Assert.assertFalse;
57-
import static org.junit.Assert.assertNotNull;
58-
import static org.junit.Assert.assertNull;
59-
import static org.junit.Assert.assertSame;
60-
import static org.junit.Assert.assertTrue;
61-
import static org.junit.Assert.fail;
62-
import static org.opengrok.indexer.util.StatisticsUtils.loadStatistics;
63-
import static org.opengrok.indexer.util.StatisticsUtils.saveStatistics;
64-
6563
import org.opengrok.indexer.util.ForbiddenSymlinkException;
6664
import org.opengrok.indexer.util.IOUtils;
65+
import org.opengrok.indexer.web.Statistics;
6766

6867
/**
6968
* Test the RuntimeEnvironment class
@@ -1057,4 +1056,61 @@ public void testGetPathRelativeToSourceRoot() throws IOException,
10571056
IOUtils.removeRecursive(sourceRoot.toPath());
10581057
IOUtils.removeRecursive(realDir);
10591058
}
1059+
1060+
@Test
1061+
public void testPopulateGroupsMultipleTimes() {
1062+
// create a structure with two repositories
1063+
final RuntimeEnvironment env = RuntimeEnvironment.getInstance();
1064+
Project project1 = new Project("bar", "/bar");
1065+
env.getProjects().put(project1.getName(), project1);
1066+
Project project2 = new Project("barfoo", "/barfoo");
1067+
env.getProjects().put(project2.getName(), project2);
1068+
final Group group1 = new Group("group1", "bar");
1069+
env.getGroups().add(group1);
1070+
final Group group2 = new Group("group2", "bar.*");
1071+
env.getGroups().add(group2);
1072+
1073+
final RepositoryInfo repository1 = new RepositoryInfo();
1074+
repository1.setDirectoryNameRelative("/bar");
1075+
env.getRepositories().add(repository1);
1076+
final RepositoryInfo repo2 = new RepositoryInfo();
1077+
repository1.setDirectoryNameRelative("/barfoo");
1078+
env.getRepositories().add(repo2);
1079+
env.getProjectRepositoriesMap().put(project1, Arrays.asList(repository1));
1080+
env.getProjectRepositoriesMap().put(project2, Arrays.asList(repo2));
1081+
1082+
Assert.assertEquals(2, env.getProjects().size());
1083+
Assert.assertEquals(2, env.getRepositories().size());
1084+
Assert.assertEquals(2, env.getProjectRepositoriesMap().size());
1085+
Assert.assertEquals(2, env.getGroups().size());
1086+
1087+
// populate groups for the first time
1088+
env.populateGroups(env.getGroups(), new TreeSet<>(env.getProjects().values()));
1089+
1090+
Assert.assertEquals(2, env.getProjects().size());
1091+
Assert.assertEquals(2, env.getRepositories().size());
1092+
Assert.assertEquals(2, env.getProjectRepositoriesMap().size());
1093+
Assert.assertEquals(2, env.getGroups().size());
1094+
1095+
Assert.assertEquals(0, group1.getProjects().size());
1096+
Assert.assertEquals(1, group1.getRepositories().size());
1097+
Assert.assertEquals(0, group2.getProjects().size());
1098+
Assert.assertEquals(2, group2.getRepositories().size());
1099+
1100+
// remove a single repository object => project1 will become a simple project
1101+
env.getProjectRepositoriesMap().remove(project1);
1102+
env.getRepositories().remove(repository1);
1103+
1104+
// populate groups for the second time
1105+
env.populateGroups(env.getGroups(), new TreeSet<>(env.getProjects().values()));
1106+
1107+
Assert.assertEquals(2, env.getProjects().size());
1108+
Assert.assertEquals(1, env.getRepositories().size());
1109+
Assert.assertEquals(1, env.getProjectRepositoriesMap().size());
1110+
Assert.assertEquals(2, env.getGroups().size());
1111+
Assert.assertEquals(1, group1.getProjects().size());
1112+
Assert.assertEquals(0, group1.getRepositories().size());
1113+
Assert.assertEquals(1, group2.getProjects().size());
1114+
Assert.assertEquals(1, group2.getRepositories().size());
1115+
}
10601116
}

opengrok-web/src/main/java/org/opengrok/web/api/v1/controller/ProjectsController.java

Lines changed: 27 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -22,32 +22,8 @@
2222
*/
2323
package org.opengrok.web.api.v1.controller;
2424

25-
import org.opengrok.indexer.configuration.Group;
26-
import org.opengrok.indexer.configuration.Project;
27-
import org.opengrok.indexer.configuration.RuntimeEnvironment;
28-
import org.opengrok.indexer.history.HistoryException;
29-
import org.opengrok.indexer.history.HistoryGuru;
30-
import org.opengrok.indexer.history.Repository;
31-
import org.opengrok.indexer.history.RepositoryInfo;
32-
import org.opengrok.indexer.index.IndexDatabase;
33-
import org.opengrok.indexer.logger.LoggerFactory;
34-
import org.opengrok.indexer.util.ClassUtil;
35-
import org.opengrok.indexer.util.ForbiddenSymlinkException;
36-
import org.opengrok.indexer.util.IOUtils;
37-
import org.opengrok.web.api.v1.suggester.provider.service.SuggesterService;
25+
import static org.opengrok.indexer.history.RepositoryFactory.getRepository;
3826

39-
import javax.inject.Inject;
40-
import javax.ws.rs.Consumes;
41-
import javax.ws.rs.DELETE;
42-
import javax.ws.rs.GET;
43-
import javax.ws.rs.POST;
44-
import javax.ws.rs.PUT;
45-
import javax.ws.rs.Path;
46-
import javax.ws.rs.PathParam;
47-
import javax.ws.rs.Produces;
48-
import javax.ws.rs.WebApplicationException;
49-
import javax.ws.rs.core.MediaType;
50-
import javax.ws.rs.core.Response;
5127
import java.io.File;
5228
import java.io.IOException;
5329
import java.nio.file.Paths;
@@ -60,8 +36,31 @@
6036
import java.util.logging.Level;
6137
import java.util.logging.Logger;
6238
import java.util.stream.Collectors;
63-
64-
import static org.opengrok.indexer.history.RepositoryFactory.getRepository;
39+
import javax.inject.Inject;
40+
import javax.ws.rs.Consumes;
41+
import javax.ws.rs.DELETE;
42+
import javax.ws.rs.GET;
43+
import javax.ws.rs.POST;
44+
import javax.ws.rs.PUT;
45+
import javax.ws.rs.Path;
46+
import javax.ws.rs.PathParam;
47+
import javax.ws.rs.Produces;
48+
import javax.ws.rs.WebApplicationException;
49+
import javax.ws.rs.core.MediaType;
50+
import javax.ws.rs.core.Response;
51+
import org.opengrok.indexer.configuration.Group;
52+
import org.opengrok.indexer.configuration.Project;
53+
import org.opengrok.indexer.configuration.RuntimeEnvironment;
54+
import org.opengrok.indexer.history.HistoryException;
55+
import org.opengrok.indexer.history.HistoryGuru;
56+
import org.opengrok.indexer.history.Repository;
57+
import org.opengrok.indexer.history.RepositoryInfo;
58+
import org.opengrok.indexer.index.IndexDatabase;
59+
import org.opengrok.indexer.logger.LoggerFactory;
60+
import org.opengrok.indexer.util.ClassUtil;
61+
import org.opengrok.indexer.util.ForbiddenSymlinkException;
62+
import org.opengrok.indexer.util.IOUtils;
63+
import org.opengrok.web.api.v1.suggester.provider.service.SuggesterService;
6564

6665
@Path("/projects")
6766
public class ProjectsController {
@@ -92,10 +91,7 @@ public Response addProject(final String projectName) {
9291
// Note that the project is inactive in the UI until it is indexed.
9392
// See {@code isIndexed()}
9493
env.getProjects().put(projectName, project);
95-
96-
Set<Project> projectSet = new TreeSet<>();
97-
projectSet.add(project);
98-
env.populateGroups(env.getGroups(), projectSet);
94+
env.populateGroups(env.getGroups(), new TreeSet<>(env.getProjectList()));
9995
} else {
10096
Project project = env.getProjects().get(projectName);
10197
Map<Project, List<RepositoryInfo>> map = env.getProjectRepositoriesMap();

0 commit comments

Comments
 (0)