@@ -132,38 +132,58 @@ private List<RepositoryInfo> getRepositoriesInDir(final File projDir) {
132132 return new ArrayList <>(histGuru .addRepositories (new File []{projDir }, env .getIgnoredNames ()));
133133 }
134134
135+ private Project disableProject (String projectName ) {
136+ Project project = env .getProjects ().get (projectName );
137+ if (project == null ) {
138+ throw new IllegalStateException ("cannot get project \" " + projectName + "\" " );
139+ }
140+
141+ // Remove the project from searches so no one can trip over incomplete index data.
142+ project .setIndexed (false );
143+
144+ return project ;
145+ }
146+
135147 @ DELETE
136148 @ Path ("/{project}" )
137149 public void deleteProject (@ PathParam ("project" ) final String projectName )
138- throws IOException , HistoryException {
139-
140- Project proj = env .getProjects ().get (projectName );
141- if (proj == null ) {
142- throw new IllegalStateException ("cannot get project \" " + projectName + "\" " );
143- }
150+ throws HistoryException {
144151
152+ Project project = disableProject (projectName );
145153 logger .log (Level .INFO , "deleting configuration for project {0}" , projectName );
146154
155+ // Delete index data associated with the project.
156+ deleteProjectData (projectName );
157+
147158 // Remove the project from its groups.
148- for (Group group : proj .getGroups ()) {
149- group .getRepositories ().remove (proj );
150- group .getProjects ().remove (proj );
159+ for (Group group : project .getGroups ()) {
160+ group .getRepositories ().remove (project );
161+ group .getProjects ().remove (project );
151162 }
152163
153164 // Now remove the repositories associated with this project.
154- List <RepositoryInfo > repos = env .getProjectRepositoriesMap ().get (proj );
165+ List <RepositoryInfo > repos = env .getProjectRepositoriesMap ().get (project );
155166 if (repos != null ) {
156167 env .getRepositories ().removeAll (repos );
157168 }
158- env .getProjectRepositoriesMap ().remove (proj );
169+ env .getProjectRepositoriesMap ().remove (project );
159170
160- env .getProjects ().remove (projectName , proj );
171+ env .getProjects ().remove (projectName , project );
161172
162173 // Prevent the project to be included in new searches.
163174 env .refreshSearcherManagerMap ();
175+ }
164176
165- // Lastly, remove data associated with the project.
177+ @ DELETE
178+ @ Path ("/{project}/data" )
179+ public void deleteProjectData (@ PathParam ("project" ) String projectName ) throws HistoryException {
180+
181+ Project project = disableProject (projectName );
166182 logger .log (Level .INFO , "deleting data for project {0}" , projectName );
183+
184+ List <RepositoryInfo > repos = env .getProjectRepositoriesMap ().get (project );
185+
186+ // Delete index and xrefs.
167187 for (String dirName : new String []{IndexDatabase .INDEX_DIR , IndexDatabase .XREF_DIR }) {
168188 java .nio .file .Path path = Paths .get (env .getDataRootPath (), dirName , projectName );
169189 try {
@@ -172,6 +192,8 @@ public void deleteProject(@PathParam("project") final String projectName)
172192 logger .log (Level .WARNING , "Could not delete {0}" , path .toString ());
173193 }
174194 }
195+
196+ // Delete history index.
175197 HistoryGuru guru = HistoryGuru .getInstance ();
176198 guru .removeCache (repos .stream ().
177199 map (x -> {
@@ -187,8 +209,9 @@ public void deleteProject(@PathParam("project") final String projectName)
187209 // {@code removeCache()} will return nothing.
188210 return "" ;
189211 }
190- }).collect (Collectors .toSet ()));
212+ }).filter ( x -> ! x . isEmpty ()). collect (Collectors .toSet ()));
191213
214+ // Delete suggester data.
192215 suggester .delete (projectName );
193216 }
194217
0 commit comments