Merge branch 'main' into feature/notifications

This commit is contained in:
2026-01-25 12:50:27 +01:00
5 changed files with 32 additions and 13 deletions

View File

@@ -22,8 +22,9 @@ RUN adduser -D umbrella
COPY --from=java_build /Umbrella/backend/build/libs/backend.jar /home/umbrella/jar/ COPY --from=java_build /Umbrella/backend/build/libs/backend.jar /home/umbrella/jar/
RUN chown -R umbrella /home/umbrella RUN chown -R umbrella /home/umbrella
ADD https://github.com/plantuml/plantuml/releases/download/v1.2025.10/plantuml-1.2025.10.jar /home/umbrella/plantuml.jar ADD https://github.com/plantuml/plantuml/releases/download/v1.2025.10/plantuml-1.2025.10.jar /home/umbrella/plantuml.jar
USER umbrella
WORKDIR /home/umbrella WORKDIR /home/umbrella
RUN chmod a+rx plantuml.jar
USER umbrella
RUN mkdir .config && ln -s /host/config.json .config/Umbrella.json RUN mkdir .config && ln -s /host/config.json .config/Umbrella.json
EXPOSE 80 EXPOSE 80
CMD java -jar jar/backend.jar CMD java -jar jar/backend.jar

View File

@@ -35,11 +35,12 @@ import org.json.JSONObject;
public class Util { public class Util {
public static final System.Logger LOG = System.getLogger("Util"); public static final System.Logger LOG = System.getLogger("Util");
private static final Pattern UML_PATTERN = Pattern.compile("@start(\\w+)(.*)@end(\\1)",Pattern.DOTALL); private static final Pattern UML_PATTERN = Pattern.compile("@start(\\w+)(.*?)@end(\\1)",Pattern.DOTALL);
private static File plantumlJar = null; private static File plantumlJar = null;
private static final JParsedown MARKDOWN = new JParsedown(); private static final JParsedown MARKDOWN = new JParsedown();
public static final String SHA1 = "SHA-1"; public static final String SHA1 = "SHA-1";
private static final MessageDigest SHA1_DIGEST; private static final MessageDigest SHA1_DIGEST;
private static final Map<Integer,String> umlCache = new HashMap<>();
static { static {
try { try {
@@ -79,11 +80,22 @@ public class Util {
try { try {
if (plantumlJar != null && plantumlJar.exists()) { if (plantumlJar != null && plantumlJar.exists()) {
var matcher = UML_PATTERN.matcher(source); var matcher = UML_PATTERN.matcher(source);
if (matcher.find()) { while (matcher.find()) {
var uml = matcher.group(0).trim(); var uml = matcher.group(0).trim();
var start = matcher.start(0); var start = matcher.start(0);
var end = matcher.end(0); var end = matcher.end(0);
var umlHash = uml.hashCode();
LOG.log(DEBUG,"Hash of Plantuml code: {0}",umlHash);
var svg = umlCache.get(umlHash);
if (svg != null){
LOG.log(DEBUG,"Serving Plantuml generated SVG from cache…");
source = source.substring(0, start) + svg + source.substring(end);
matcher = UML_PATTERN.matcher(source);
continue;
}
LOG.log(DEBUG,"Cache miss. Generating SVG from plantuml code…");
ProcessBuilder processBuilder = new ProcessBuilder("java", "-jar", plantumlJar.getAbsolutePath(), "-tsvg", "-pipe"); ProcessBuilder processBuilder = new ProcessBuilder("java", "-jar", plantumlJar.getAbsolutePath(), "-tsvg", "-pipe");
var ignored = processBuilder.redirectErrorStream(); var ignored = processBuilder.redirectErrorStream();
var process = processBuilder.start(); var process = processBuilder.start();
@@ -94,8 +106,11 @@ public class Util {
try (InputStream is = process.getInputStream()) { try (InputStream is = process.getInputStream()) {
byte[] out = is.readAllBytes(); byte[] out = is.readAllBytes();
var svg = new String(out, UTF_8); LOG.log(DEBUG,"Generated SVG. Pushing to cache…");
svg = new String(out, UTF_8);
umlCache.put(umlHash,svg);
source = source.substring(0, start) + svg + source.substring(end); source = source.substring(0, start) + svg + source.substring(end);
matcher = UML_PATTERN.matcher(source);
} }
} }
} }

View File

@@ -57,8 +57,9 @@ footer {
margin: 5px; margin: 5px;
} }
img { img, svg {
max-width: 100%; max-width: 100%;
height: auto !important;
} }
nav { nav {

View File

@@ -57,8 +57,9 @@ footer {
margin: 5px; margin: 5px;
} }
img { img, svg {
max-width: 100%; max-width: 100%;
height: auto !important;
} }
nav { nav {

View File

@@ -57,17 +57,18 @@ footer {
margin: 5px; margin: 5px;
} }
img { img, svg {
max-width: 100%; max-width: 100%;
height: auto !important;
} }
nav { nav {
position: sticky; position: sticky;
z-index: 100; z-index: 100;
top: 0; top: 0;
padding: 5px; padding: 5px;
margin: 0 0 10px 0; margin: 0 0 10px 0;
border-bottom: 1px solid; border-bottom: 1px solid;
} }
td, tr{ td, tr{