Skip to content

Commit 0a1be42

Browse files
netomiautumnfound
andauthored
fix: Add lower casing to namespace + extension name in cache keys (#1924)
Co-authored-by: Martin Lowe <martin.lowe@eclipse-foundation.org>
1 parent 9cffafb commit 0a1be42

4 files changed

Lines changed: 142 additions & 7 deletions

File tree

server/src/main/java/org/eclipse/openvsx/cache/ExtensionJsonCacheKeyGenerator.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
* ****************************************************************************** */
1010
package org.eclipse.openvsx.cache;
1111

12+
import org.apache.commons.lang3.StringUtils;
1213
import org.eclipse.openvsx.entities.Extension;
1314
import org.eclipse.openvsx.util.NamingUtil;
1415
import org.eclipse.openvsx.util.VersionAlias;
@@ -27,12 +28,12 @@ public Object generate(Object target, Method method, Object... params) {
2728
}
2829

2930
public String generate(String namespaceName, String extensionName, String targetPlatform, String version) {
30-
return NamingUtil.toFileFormat(namespaceName, extensionName, targetPlatform, version);
31+
return NamingUtil.toFileFormat(StringUtils.lowerCase(namespaceName), StringUtils.lowerCase(extensionName), targetPlatform, version);
3132
}
3233

3334
public String generateWildcard(Extension extension) {
34-
var extensionName = extension.getName();
35-
var namespaceName = extension.getNamespace().getName();
35+
var extensionName = StringUtils.lowerCase(extension.getName());
36+
var namespaceName = StringUtils.lowerCase(extension.getNamespace().getName());
3637
return NamingUtil.toExtensionId(namespaceName, extensionName) + "*";
3738
}
3839
}

server/src/main/java/org/eclipse/openvsx/cache/LatestExtensionVersionCacheKeyGenerator.java

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
* ****************************************************************************** */
1010
package org.eclipse.openvsx.cache;
1111

12+
import org.apache.commons.lang3.StringUtils;
1213
import org.eclipse.openvsx.entities.Extension;
1314
import org.eclipse.openvsx.entities.ExtensionVersion;
1415
import org.eclipse.openvsx.util.NamingUtil;
@@ -51,15 +52,15 @@ public Object generate(Object target, Method method, Object... params) {
5152
}
5253

5354
public String generate(Extension extension, String targetPlatform, boolean preRelease, boolean onlyActive, ExtensionVersion.Type type) {
54-
var extensionName = extension.getName();
55-
var namespaceName = extension.getNamespace().getName();
55+
var extensionName = StringUtils.lowerCase(extension.getName());
56+
var namespaceName = StringUtils.lowerCase(extension.getNamespace().getName());
5657
return NamingUtil.toFileFormat(namespaceName, extensionName, targetPlatform, VersionAlias.LATEST) +
5758
",pre-release=" + preRelease + ",only-active=" + onlyActive + ",type=" + type;
5859
}
5960

6061
public String generateWildcard(Extension extension) {
61-
var extensionName = extension.getName();
62-
var namespaceName = extension.getNamespace().getName();
62+
var extensionName = StringUtils.lowerCase(extension.getName());
63+
var namespaceName = StringUtils.lowerCase(extension.getNamespace().getName());
6364
return NamingUtil.toExtensionId(namespaceName, extensionName) + "*";
6465
}
6566
}
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
/** ******************************************************************************
2+
* Copyright (c) 2026 Eclipse Foundation AISBL
3+
*
4+
* This program and the accompanying materials are made available under the
5+
* terms of the Eclipse Public License v. 2.0 which is available at
6+
* http://www.eclipse.org/legal/epl-2.0.
7+
*
8+
* SPDX-License-Identifier: EPL-2.0
9+
* ****************************************************************************** */
10+
package org.eclipse.openvsx.cache;
11+
12+
import org.eclipse.openvsx.entities.Extension;
13+
import org.eclipse.openvsx.entities.Namespace;
14+
import org.junit.jupiter.api.Test;
15+
16+
import static org.assertj.core.api.Assertions.assertThat;
17+
18+
class ExtensionJsonCacheKeyGeneratorTest {
19+
20+
private final ExtensionJsonCacheKeyGenerator generator = new ExtensionJsonCacheKeyGenerator();
21+
22+
@Test
23+
void shouldLowerCaseExtensionNameForCacheKey() {
24+
var results = generator.generate("foobar", "BAZ", "linux", "1.0.0");
25+
26+
assertThat(results).startsWith("foobar.baz");
27+
}
28+
29+
@Test
30+
void shouldLowerCaseNamespaceNameForCacheKey() {
31+
var results = generator.generate("FOoBAr", "baz", "linux", "1.0.0");
32+
33+
assertThat(results).startsWith("foobar.baz");
34+
}
35+
36+
@Test
37+
void shouldLowerCaseExtensionNameForWildcard() {
38+
var extension = mockExtension();
39+
extension.setName("BAZ");
40+
var results = generator.generateWildcard(extension);
41+
42+
assertThat(results).startsWith("foobar.baz");
43+
}
44+
45+
@Test
46+
void shouldLowerCaseNamespaceNameForWildcard() {
47+
var extension = mockExtension();
48+
extension.getNamespace().setName("FOoBAr");
49+
var results = generator.generateWildcard(extension);
50+
51+
assertThat(results).startsWith("foobar.baz");
52+
}
53+
54+
private Extension mockExtension() {
55+
var namespace = new Namespace();
56+
namespace.setName("foobar");
57+
var extension = new Extension();
58+
extension.setNamespace(namespace);
59+
extension.setName("baz");
60+
extension.setActive(true);
61+
62+
return extension;
63+
}
64+
}
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
/** ******************************************************************************
2+
* Copyright (c) 2026 Eclipse Foundation AISBL
3+
*
4+
* This program and the accompanying materials are made available under the
5+
* terms of the Eclipse Public License v. 2.0 which is available at
6+
* http://www.eclipse.org/legal/epl-2.0.
7+
*
8+
* SPDX-License-Identifier: EPL-2.0
9+
* ****************************************************************************** */
10+
package org.eclipse.openvsx.cache;
11+
12+
import org.eclipse.openvsx.entities.Extension;
13+
import org.eclipse.openvsx.entities.ExtensionVersion.Type;
14+
import org.eclipse.openvsx.entities.Namespace;
15+
import org.junit.jupiter.api.Test;
16+
17+
import static org.assertj.core.api.Assertions.assertThat;
18+
19+
class LatestExtensionVersionCacheKeyGeneratorTest {
20+
21+
private final LatestExtensionVersionCacheKeyGenerator generator = new LatestExtensionVersionCacheKeyGenerator();
22+
23+
@Test
24+
void shouldLowerCaseExtensionNameForCacheKey() {
25+
var extension = mockExtension();
26+
extension.setName("BAZ");
27+
var results = generator.generate(extension, "linux", false, false, Type.REGULAR);
28+
29+
assertThat(results).startsWith("foobar.baz");
30+
}
31+
32+
@Test
33+
void shouldLowerCaseNamespaceNameForCacheKey() {
34+
var extension = mockExtension();
35+
extension.getNamespace().setName("FOoBAr");
36+
var results = generator.generate(extension, "linux", false, false, Type.REGULAR);
37+
38+
assertThat(results).startsWith("foobar.baz");
39+
}
40+
41+
@Test
42+
void shouldLowerCaseExtensionNameForWildcard() {
43+
var extension = mockExtension();
44+
extension.setName("BAZ");
45+
var results = generator.generate(extension, "linux", false, false, Type.REGULAR);
46+
47+
assertThat(results).startsWith("foobar.baz");
48+
}
49+
50+
@Test
51+
void shouldLowerCaseNamespaceNameForExtension() {
52+
var extension = mockExtension();
53+
extension.getNamespace().setName("FOoBAr");
54+
var results = generator.generate(extension, "linux", false, false, Type.REGULAR);
55+
56+
assertThat(results).startsWith("foobar.baz");
57+
}
58+
59+
private Extension mockExtension() {
60+
var namespace = new Namespace();
61+
namespace.setName("foobar");
62+
var extension = new Extension();
63+
extension.setNamespace(namespace);
64+
extension.setName("baz");
65+
extension.setActive(true);
66+
67+
return extension;
68+
}
69+
}

0 commit comments

Comments
 (0)