Skip to content

Commit cdf9e01

Browse files
authored
Merge pull request #717 from amvanbaren/bugfix/issue-716
Need to deal with collisions when renaming and merging namespaces
2 parents a4ab85e + 2279f0b commit cdf9e01

File tree

2 files changed

+40
-5
lines changed

2 files changed

+40
-5
lines changed

server/src/main/java/org/eclipse/openvsx/AdminService.java

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
import java.time.DateTimeException;
3232
import java.time.LocalDateTime;
3333
import java.time.temporal.ChronoUnit;
34+
import java.util.ArrayList;
3435
import java.util.Comparator;
3536
import java.util.LinkedHashSet;
3637
import java.util.stream.Collectors;
@@ -218,6 +219,31 @@ public void changeNamespace(ChangeNamespaceJson json) {
218219
if (newNamespace != null && !json.mergeIfNewNamespaceAlreadyExists) {
219220
throw new ErrorResultException("New namespace already exists: " + json.newNamespace);
220221
}
222+
if (newNamespace != null) {
223+
var newExtensions = repositories.findExtensions(newNamespace).stream()
224+
.collect(Collectors.toMap(Extension::getName, e -> e));
225+
var oldExtensions = repositories.findExtensions(oldNamespace).stream()
226+
.collect(Collectors.toMap(Extension::getName, e -> e));
227+
228+
var duplicateExtensions = oldExtensions.keySet().stream()
229+
.filter(newExtensions::containsKey)
230+
.collect(Collectors.joining("','"));
231+
if(!duplicateExtensions.isEmpty()) {
232+
var message = "Can't merge namespaces, because new namespace '" +
233+
json.newNamespace +
234+
"' and old namespace '" +
235+
json.oldNamespace +
236+
"' have " +
237+
(duplicateExtensions.indexOf(',') == -1 ? "a " : "") +
238+
"duplicate extension" +
239+
(duplicateExtensions.indexOf(',') == -1 ? "" : "s") +
240+
": '" +
241+
duplicateExtensions +
242+
"'.";
243+
244+
throw new ErrorResultException(message);
245+
}
246+
}
221247

222248
scheduler.enqueue(new ChangeNamespaceJobRequest(json));
223249
}

server/src/main/java/org/eclipse/openvsx/ChangeNamespaceService.java

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import javax.persistence.EntityManager;
2323
import javax.transaction.Transactional;
2424
import java.util.List;
25+
import java.util.stream.Collectors;
2526

2627
@Component
2728
public class ChangeNamespaceService {
@@ -59,7 +60,7 @@ public void changeNamespaceInDatabase(
5960
}
6061

6162
changeExtensionNamespace(extensions, newNamespace);
62-
changeMembershipNamespace(oldNamespace, newNamespace);
63+
changeMembershipNamespace(oldNamespace, newNamespace, removeOldNamespace);
6364
updatedResources.forEach(entityManager::merge);
6465

6566
if(removeOldNamespace) {
@@ -77,10 +78,18 @@ private void changeExtensionNamespace(Streamable<Extension> extensions, Namespac
7778
}
7879
}
7980

80-
private void changeMembershipNamespace(Namespace oldNamespace, Namespace newNamespace) {
81-
var memberships = repositories.findMemberships(oldNamespace);
82-
for(var membership : memberships) {
83-
membership.setNamespace(newNamespace);
81+
private void changeMembershipNamespace(Namespace oldNamespace, Namespace newNamespace, boolean removeOldNamespace) {
82+
var oldMemberships = repositories.findMemberships(oldNamespace).stream()
83+
.collect(Collectors.toMap(m -> m.getUser().getId(), m -> m));
84+
var newMemberships = repositories.findMemberships(newNamespace).stream()
85+
.collect(Collectors.toMap(m -> m.getUser().getId(), m -> m));
86+
87+
for(var entry : oldMemberships.entrySet()) {
88+
if(!newMemberships.containsKey(entry.getKey())) {
89+
entry.getValue().setNamespace(newNamespace);
90+
} else if (removeOldNamespace) {
91+
entityManager.remove(entry.getValue());
92+
}
8493
}
8594
}
8695
}

0 commit comments

Comments
 (0)