Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
36 commits
Select commit Hold shift + click to select a range
91200f9
Bump org.apache.tomcat.embed:tomcat-embed-core
dependabot[bot] Oct 28, 2025
dd4b446
Bump project version to 0.2.5-SNAPSHOT
mercyblitz Nov 4, 2025
27a8f53
Merge pull request #139 from microsphere-projects/dependabot/maven/mi…
mercyblitz Nov 4, 2025
f40b3de
Mark Tomcat and Zookeeper dependencies as optional #141
mercyblitz Nov 5, 2025
3ba6979
Default HTTP methods when none specified in WebEndpointMapping #140
mercyblitz Nov 5, 2025
3737981
Update latest version numbers in README
mercyblitz Nov 5, 2025
eaa58ac
Remove distribution and repository config from pom.xml
mercyblitz Nov 5, 2025
27dcf5a
Add Spring milestone repo and 7.0 profile to POM
mercyblitz Nov 5, 2025
9de7c8b
Update maven-build.yml
mercyblitz Nov 5, 2025
2d2484f
Add stub for getBeanProvider with ParameterizedTypeReference
mercyblitz Nov 6, 2025
575afbc
Add support for Spring 6.2.12 and 7.0.0 versions
mercyblitz Nov 6, 2025
863c98e
Bump microsphere-java version to 0.1.7
mercyblitz Nov 6, 2025
e7c95df
Add SPRING_7_0 to SpringVersion enum
mercyblitz Nov 6, 2025
234a796
Add test for Spring 7.0 version range
mercyblitz Nov 6, 2025
56b1c5d
Replace HttpHeaders with LinkedMultiValueMap in tests
mercyblitz Nov 6, 2025
ee139c4
Add version method to RequestPredicateVisitorAdapter
mercyblitz Nov 6, 2025
bfc67d7
Add version method to RequestPredicateVisitorAdapter
mercyblitz Nov 6, 2025
941230c
Add SpecificityComparator for MimeType sorting
mercyblitz Nov 6, 2025
38de23b
Add tests for MimeTypeUtils SpecificityComparator
mercyblitz Nov 6, 2025
7b4f2c6
Add MediaTypeUtils with specificity comparator
mercyblitz Nov 6, 2025
11e3aa0
Fix header names iterator in ServerWebRequest
mercyblitz Nov 6, 2025
7daf06c
Update SPECIFICITY_COMPARATOR import to local utility
mercyblitz Nov 6, 2025
3286bd2
Replace dynamic header value with static in test
mercyblitz Nov 6, 2025
0bb05a0
Replace dynamic header value with static in test
mercyblitz Nov 6, 2025
12cc432
Refactor content negotiation strategy assertions in test
mercyblitz Nov 6, 2025
32d7ec9
Comment out pathContainer mocking in test cases
mercyblitz Nov 6, 2025
b2e3645
Refactor getSubtypeSuffix to use StringUtils methods
mercyblitz Nov 6, 2025
7badc2d
Add more assertions to MimeTypeUtilsTest
mercyblitz Nov 6, 2025
2e7b69c
Add unit test for MediaTypeUtils specificity comparator
mercyblitz Nov 6, 2025
c92c230
Update MimeTypeUtils.java
mercyblitz Nov 6, 2025
6feac1d
Make test method package-private in WebEndpointMappingTest
mercyblitz Nov 6, 2025
bba1c6d
Refactor variable names in MediaTypeUtilsTest
mercyblitz Nov 6, 2025
4570157
Remove commented-out code from RequestPredicateKindTest
mercyblitz Nov 6, 2025
57d6ff6
Merge pull request #142 from microsphere-projects/dev
mercyblitz Nov 6, 2025
0ca872f
Fix typo in JavaDoc example usage comment
mercyblitz Nov 7, 2025
8d30536
Merge pull request #145 from microsphere-projects/dev
mercyblitz Nov 7, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion .github/workflows/maven-build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,8 @@ jobs:
matrix:
java: [ '17' , '21' , '25' ]
maven-profile-spring-framework: [
'spring-framework-6.0' , 'spring-framework-6.1', 'spring-framework-6.2'
'spring-framework-6.0' , 'spring-framework-6.1', 'spring-framework-6.2',
'spring-framework-7.0'
]
steps:
- name: Checkout Source
Expand Down
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -65,8 +65,8 @@ The easiest way to get started is by adding the Microsphere Spring BOM (Bill of

| **Branches** | **Purpose** | **Latest Version** |
|--------------|------------------------------------------------|--------------------|
| **0.2.x** | Compatible with Spring Framework 6.0.x - 6.2.x | 0.2.4 |
| **0.1.x** | Compatible with Spring Framework 4.3.x - 5.3.x | 0.1.4 |
| **0.2.x** | Compatible with Spring Framework 6.0.x - 6.2.x | 0.2.5 |
| **0.1.x** | Compatible with Spring Framework 4.3.x - 5.3.x | 0.1.5 |

Then add the specific modules you need:

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -156,6 +156,12 @@ public enum SpringVersion {

SPRING_6_2_11,

SPRING_6_2_12,

SPRING_7_0,

SPRING_7_0_0,

CURRENT(of(org.springframework.core.SpringVersion.getVersion()));

private final Version version;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,8 +21,11 @@
import org.springframework.util.MimeType;

import java.util.Collection;
import java.util.Comparator;

import static io.microsphere.collection.CollectionUtils.isEmpty;
import static io.microsphere.util.StringUtils.EMPTY_STRING;
import static io.microsphere.util.StringUtils.substringAfter;

/**
* The utility class for MIME Type
Expand Down Expand Up @@ -101,14 +104,43 @@ public static String getSubtypeSuffix(MimeType one) {
return null;
}
String subtype = one.getSubtype();
int suffixIndex = subtype.lastIndexOf('+');
if (suffixIndex != -1 && subtype.length() > suffixIndex) {
return subtype.substring(suffixIndex + 1);
String suffix = substringAfter(subtype, "+");
return EMPTY_STRING.equals(suffix) ? null : suffix;
}

/**
* A {@link Comparator} for {@link MimeType} that orders by specificity.
*/
public static class SpecificityComparator<T extends MimeType> implements Comparator<T> {

@Override
public int compare(T mimeType1, T mimeType2) {
if (mimeType1.isWildcardType() && !mimeType2.isWildcardType()) { // */* < audio/*
return 1;
} else if (mimeType2.isWildcardType() && !mimeType1.isWildcardType()) { // audio/* > */*
return -1;
} else if (!mimeType1.getType().equals(mimeType2.getType())) { // audio/basic == text/html
return 0;
} else { // mediaType1.getType().equals(mediaType2.getType())
if (mimeType1.isWildcardSubtype() && !mimeType2.isWildcardSubtype()) { // audio/* < audio/basic
return 1;
} else if (mimeType2.isWildcardSubtype() && !mimeType1.isWildcardSubtype()) { // audio/basic > audio/*
return -1;
} else if (!mimeType1.getSubtype().equals(mimeType2.getSubtype())) { // audio/basic == audio/wave
return 0;
} else { // mediaType2.getSubtype().equals(mediaType2.getSubtype())
return compareParameters(mimeType1, mimeType2);
}
}
}

protected int compareParameters(T mimeType1, T mimeType2) {
int paramsSize1 = mimeType1.getParameters().size();
int paramsSize2 = mimeType2.getParameters().size();
return Integer.compare(paramsSize2, paramsSize1); // audio/basic;level=1 < audio/basic
}
return null;
}

private MimeTypeUtils() {
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.core.ParameterizedTypeReference;
import org.springframework.core.ResolvableType;
import org.springframework.core.io.ResourceLoader;
import org.springframework.stereotype.Component;
Expand Down Expand Up @@ -215,6 +216,10 @@ public <T> ObjectProvider<T> getBeanProvider(ResolvableType requiredType) {
return null;
}

public <T> ObjectProvider<T> getBeanProvider(ParameterizedTypeReference<T> requiredType) {
return null;
}

public boolean containsBean(String name) {
return false;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,8 @@ void testVersionRange() {
testVersionRange(SpringVersion.SPRING_6_1, 0, 21);
// Spring Framework 6.2 -> [6.2.0, 6.2.1]
testVersionRange(SpringVersion.SPRING_6_2, 0, 10);
// Spring Framework 7.0 -> [7.0.0, 7.0.0]
testVersionRange(SpringVersion.SPRING_7_0, 0, 0);
}

private void testVersionRange(SpringVersion baseVersion, int start, int end) {
Expand All @@ -64,4 +66,4 @@ void testGetVersion() {
assertTrue(springVersion.getVersion().eq(version));
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
*/
package io.microsphere.spring.util;

import io.microsphere.spring.util.MimeTypeUtils.SpecificityComparator;
import org.junit.jupiter.api.Test;
import org.springframework.util.MimeType;

Expand All @@ -31,6 +32,7 @@
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertNull;
import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.springframework.util.MimeType.valueOf;

/**
* {@link MimeTypeUtils} Test
Expand Down Expand Up @@ -78,4 +80,38 @@ void testIsPresentIn() {
assertTrue(isPresentIn(APPLICATION_GRAPHQL, asList(APPLICATION_TEXT, APPLICATION_GRAPHQL)));
assertTrue(isPresentIn(APPLICATION_GRAPHQL, ofList(APPLICATION_GRAPHQL)));
}

@Test
void testSpecificityComparator() {
SpecificityComparator<MimeType> comparator = new SpecificityComparator<>();

MimeType allTypes = valueOf("*/*");
MimeType audioType = valueOf("audio/*");
assertEquals(1, comparator.compare(allTypes, audioType));
assertEquals(0, comparator.compare(allTypes, allTypes));
assertEquals(-1, comparator.compare(audioType, allTypes));
assertEquals(0, comparator.compare(audioType, audioType));

MimeType audioWildcard = valueOf("audio/*");
MimeType audioBasic = valueOf("audio/basic");
MimeType audioWave = valueOf("audio/wave");
assertEquals(1, comparator.compare(audioWildcard, audioBasic));
assertEquals(-1, comparator.compare(audioBasic, audioWildcard));
assertEquals(0, comparator.compare(audioBasic, audioWave));

MimeType withParams = valueOf("audio/basic;level=1;charset=utf-8");
MimeType withoutParams = valueOf("audio/basic");
assertEquals(-1, comparator.compare(withParams, withoutParams));
assertEquals(1, comparator.compare(withoutParams, withParams));

audioType = valueOf("audio/basic");
MimeType textType = valueOf("text/html");
assertEquals(0, comparator.compare(audioType, textType));
assertEquals(0, comparator.compare(textType, audioType));

MimeType withOneParam = MimeType.valueOf("application/json;version=1");
MimeType withTwoParams = MimeType.valueOf("application/json;version=1;charset=utf-8");
assertEquals(1, comparator.compare(withOneParam, withTwoParams));
assertEquals(-1, comparator.compare(withTwoParams, withOneParam));
}
}
21 changes: 19 additions & 2 deletions microsphere-spring-parent/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@
<description>Microsphere Spring Parent</description>

<properties>
<microsphere-java.version>0.1.6</microsphere-java.version>
<microsphere-java.version>0.1.7</microsphere-java.version>
<servlet-api.version>6.1.0</servlet-api.version>
<websocket-api.version>2.2.0</websocket-api.version>
<jackson.version>2.18.2</jackson.version>
Expand All @@ -32,11 +32,19 @@
<jsonassert.version>1.5.3</jsonassert.version>
<sqlite-jdbc.version>3.41.2.2</sqlite-jdbc.version>
<hamcrest.version>3.0</hamcrest.version>
<tomcat.version>10.1.46</tomcat.version>
<tomcat.version>10.1.47</tomcat.version>
<zookeeper.version>3.9.4</zookeeper.version>
<curator.version>5.9.0</curator.version>
</properties>

<repositories>
<repository>
<id>spring-milestone</id>
<name>Spring Portfolio Milestone Repository</name>
<url>https://repo.spring.io/milestone</url>
</repository>
</repositories>

<dependencyManagement>
<dependencies>

Expand Down Expand Up @@ -256,6 +264,15 @@
<reactor.version>2024.0.11</reactor.version>
</properties>
</profile>

<profile>
<id>spring-framework-7.0</id>
<properties>
<spring.version>7.0.0-RC3</spring.version>
<reactor.version>2025.0.0-RC1</reactor.version>
<junit.version>6.0.1</junit.version>
</properties>
</profile>
</profiles>

</project>
7 changes: 7 additions & 0 deletions microsphere-spring-test/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -129,38 +129,45 @@
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-core</artifactId>
<optional>true</optional>
</dependency>

<dependency>
<groupId>org.apache.tomcat</groupId>
<artifactId>tomcat-jasper</artifactId>
<optional>true</optional>
</dependency>

<dependency>
<groupId>org.apache.tomcat</groupId>
<artifactId>tomcat-tribes</artifactId>
<optional>true</optional>
</dependency>

<dependency>
<groupId>org.apache.tomcat</groupId>
<artifactId>tomcat-catalina-ha</artifactId>
<optional>true</optional>
</dependency>

<!-- Apache Zookeeper -->
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<optional>true</optional>
</dependency>

<!-- Apache Curator -->
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
<optional>true</optional>
</dependency>

<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-test</artifactId>
<optional>true</optional>
</dependency>

</dependencies>
Expand Down
Loading