-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #5 from funkyFangs/SC-4-add-icon-customization
SC-4: add swagger UI customization
- Loading branch information
Showing
40 changed files
with
463 additions
and
39 deletions.
There are no files selected for viewing
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,3 +1,5 @@ | ||
rootProject.name = 'springdoc-customizer' | ||
include 'springdoc-customizer' | ||
include 'springdoc-customizer-webmvc-demo' | ||
include 'springdoc-customizer-common' | ||
include 'springdoc-customizer-webmvc-demo' | ||
include 'springdoc-customizer-webmvc' | ||
include 'springdoc-customizer-webflux' |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
23 changes: 23 additions & 0 deletions
23
...ringdoc/customizer/configuration/SpringDocCustomizerSwaggerUiConfigurationProperties.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,23 @@ | ||
package io.funky.fangs.springdoc.customizer.configuration; | ||
|
||
import lombok.Getter; | ||
import lombok.Setter; | ||
import org.springframework.boot.context.properties.ConfigurationProperties; | ||
|
||
/** | ||
* Configuration properties related to the Swagger UI. | ||
* | ||
* @author Harper Price | ||
* @since 2.1.0 | ||
*/ | ||
@Getter | ||
@Setter | ||
@ConfigurationProperties(prefix = "springdoc.swagger-ui") | ||
public class SpringDocCustomizerSwaggerUiConfigurationProperties { | ||
/** | ||
* Sets the title of the Swagger UI webpage to this value. | ||
*/ | ||
private String title; | ||
private String largeIconPath; | ||
private String smallIconPath; | ||
} |
2 changes: 1 addition & 1 deletion
2
...figuration/ExamplesOpenApiCustomizer.java → ...customizer/ExamplesOpenApiCustomizer.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
2 changes: 1 addition & 1 deletion
2
...ustomizer/configuration/NamedExample.java → ...c/customizer/customizer/NamedExample.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
11 changes: 4 additions & 7 deletions
11
...ustomizer/model/ExampleDetailsRecord.java → ...ustomizer/model/ExampleDetailsRecord.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
12 changes: 9 additions & 3 deletions
12
...customizer/model/ExampleMethodRecord.java → ...customizer/model/ExampleMethodRecord.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
10 changes: 5 additions & 5 deletions
10
...customizer/model/ExampleTargetRecord.java → ...customizer/model/ExampleTargetRecord.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
22 changes: 13 additions & 9 deletions
22
...c/customizer/model/ExampleTypeRecord.java → ...c/customizer/model/ExampleTypeRecord.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,29 +1,33 @@ | ||
package io.funky.fangs.springdoc.customizer.model; | ||
|
||
import com.fasterxml.jackson.annotation.JsonInclude; | ||
import io.funky.fangs.springdoc.customizer.annotation.ExampleType; | ||
import io.funky.fangs.springdoc.customizer.annotation.ExampleType.Type; | ||
import org.springframework.http.HttpStatus; | ||
|
||
import java.util.Collection; | ||
import java.util.EnumSet; | ||
import java.util.Optional; | ||
import java.util.Set; | ||
import java.util.*; | ||
|
||
import static com.fasterxml.jackson.annotation.JsonInclude.Include.NON_EMPTY; | ||
import static java.util.Collections.emptySet; | ||
import static java.util.Collections.unmodifiableSet; | ||
import static java.util.function.Predicate.not; | ||
|
||
public record ExampleTypeRecord(Type type, @JsonInclude(NON_EMPTY) Collection<String> mediaTypes, | ||
@JsonInclude(NON_EMPTY) Collection<HttpStatus> responses) { | ||
/** | ||
* A record used for storing {@link ExampleType} data at run-time. | ||
* | ||
* @author Harper Price | ||
* @see ExampleType | ||
* @since 2.1.0 | ||
*/ | ||
public record ExampleTypeRecord(Type type, Collection<String> mediaTypes, Collection<HttpStatus> responses) { | ||
public ExampleTypeRecord(Type type, Collection<String> mediaTypes, Collection<HttpStatus> responses) { | ||
this.type = type; | ||
this.mediaTypes = Optional.ofNullable(mediaTypes) | ||
.map(Set::copyOf) | ||
.orElse(emptySet()); | ||
this.responses = Optional.ofNullable(responses) | ||
.filter(not(Collection::isEmpty)) | ||
.map(collection -> unmodifiableSet(EnumSet.copyOf(collection))) | ||
// Creates an unmodifiable view of an EnumSet for data integrity and performance | ||
.map(EnumSet::copyOf) | ||
.map(Collections::unmodifiableSet) | ||
.orElse(unmodifiableSet(EnumSet.noneOf(HttpStatus.class))); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
File renamed without changes.
File renamed without changes.
75 changes: 75 additions & 0 deletions
75
...r-common/src/main/java/io/funky/fangs/springdoc/customizer/utility/ResourceUtilities.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,75 @@ | ||
package io.funky.fangs.springdoc.customizer.utility; | ||
|
||
import lombok.experimental.UtilityClass; | ||
import org.springframework.core.io.ClassPathResource; | ||
|
||
import java.io.IOException; | ||
import java.nio.file.Path; | ||
import java.nio.file.Paths; | ||
import java.util.regex.Pattern; | ||
|
||
@UtilityClass | ||
public class ResourceUtilities { | ||
public final int LARGE_ICON_SIZE = 32; | ||
public final int SMALL_ICON_SIZE = 16; | ||
private final String ICON_FORMAT = "(<link rel=\"icon\" type=\"image/png\" href=\")" | ||
+ "./favicon-%dx%d.png" | ||
+ "(\" sizes=\"%dx%d\" />)"; | ||
public final Pattern SMALL_ICON_PATTERN = getIconPattern(SMALL_ICON_SIZE); | ||
public final Pattern LARGE_ICON_PATTERN = getIconPattern(LARGE_ICON_SIZE); | ||
public final Pattern TITLE_PATTERN = Pattern.compile("(<title>)Swagger UI(</title>)"); | ||
public final String INDEX_FILE = "index.html"; | ||
public final String ROOT_PATH = "/"; | ||
|
||
private final Path BASE_PATH; | ||
|
||
static { | ||
Path path; | ||
try { | ||
path = Paths.get(new ClassPathResource("static").getURI()).normalize(); | ||
} catch (IOException e) { | ||
path = null; | ||
} | ||
BASE_PATH = path; | ||
} | ||
|
||
private Pattern getIconPattern(int size) { | ||
return Pattern.compile(ICON_FORMAT.formatted(size, size, size, size)); | ||
} | ||
|
||
public String replaceLargeIcon(String document, String largeIconPath) { | ||
return replaceIcon(document, largeIconPath, LARGE_ICON_PATTERN); | ||
} | ||
|
||
public String replaceSmallIcon(String document, String smallIconPath) { | ||
return replaceIcon(document, smallIconPath, SMALL_ICON_PATTERN); | ||
} | ||
|
||
private String replaceIcon(String document, String iconPath, Pattern pattern) { | ||
return replaceEnclosedToken(document, iconPath, pattern); | ||
} | ||
|
||
public String replaceTitle(String document, String title) { | ||
return replaceEnclosedToken(document, title, TITLE_PATTERN); | ||
} | ||
|
||
private String replaceEnclosedToken(String document, String replacement, Pattern pattern) { | ||
return pattern.matcher(document) | ||
.replaceFirst(matchResult -> matchResult.group(1) + replacement + matchResult.group(2)); | ||
} | ||
|
||
public String resolvePath(String pathName) { | ||
// Resolve and normalize path from base path | ||
var resolvedPath = BASE_PATH.resolve(pathName).normalize(); | ||
|
||
// Ensure that normalized path is still within scope, and that the path points to an existing file | ||
if (resolvedPath.startsWith(BASE_PATH) && resolvedPath.toFile().exists()) { | ||
// Make path relative to base path; this simplifies redundant traversals within the given path | ||
// For example: "../static/icon.png" -> "icon.png" | ||
return BASE_PATH.relativize(resolvedPath).toString(); | ||
} | ||
else { | ||
return null; | ||
} | ||
} | ||
} |
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,13 @@ | ||
plugins { | ||
alias(libs.plugins.lombok) | ||
id 'java-library' | ||
} | ||
|
||
dependencies { | ||
// SpringDoc | ||
implementation libs.springdoc.openapi.starter.webflux.ui | ||
|
||
// SpringDoc Customizer | ||
api project(':springdoc-customizer-common') | ||
annotationProcessor project(':springdoc-customizer-common') | ||
} |
Oops, something went wrong.