Skip to content

Commit

Permalink
Merge pull request #592 from dlsc-software-consulting-gmbh/develop
Browse files Browse the repository at this point in the history
Misc.
  • Loading branch information
dlemmermann authored Dec 31, 2023
2 parents 3bf8462 + cb4d39b commit 3871514
Show file tree
Hide file tree
Showing 7 changed files with 108 additions and 55 deletions.
10 changes: 10 additions & 0 deletions app/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -93,6 +93,12 @@
<version>${jpro.platform.version}</version>
</dependency>

<dependency>
<groupId>one.jpro.platform</groupId>
<artifactId>freeze-detector</artifactId>
<version>${jpro.platform.version}</version>
</dependency>

<dependency>
<groupId>com.dlsc.jfxcentral2</groupId>
<artifactId>components</artifactId>
Expand Down Expand Up @@ -446,6 +452,9 @@
<version>${javafx.plugin.version}</version>
<configuration>
<mainClass>${mainClassName}</mainClass>
<options>
<!--<option>-Ddevelop=true</option>-->
</options>
</configuration>
</plugin>

Expand Down Expand Up @@ -498,6 +507,7 @@
<releaseName>jfxcentral</releaseName>
<localJVMArgs>-Ddevelop=false</localJVMArgs>
<port>8088</port>
<javafxVersion>20</javafxVersion>
</configuration>
</plugin>

Expand Down
80 changes: 43 additions & 37 deletions app/src/main/java/com/dlsc/jfxcentral2/app/JFXCentral2App.java
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
import com.dlsc.jfxcentral.data.model.Tool;
import com.dlsc.jfxcentral.data.model.Tutorial;
import com.dlsc.jfxcentral.data.model.Video;
import com.dlsc.jfxcentral2.app.filters.FooterFilter;
import com.dlsc.jfxcentral2.app.pages.CreditsPage;
import com.dlsc.jfxcentral2.app.pages.ErrorPage;
import com.dlsc.jfxcentral2.app.pages.LegalPage;
Expand Down Expand Up @@ -82,11 +83,7 @@
import javafx.stage.Stage;
import javafx.stage.StageStyle;
import javafx.util.Callback;
import one.jpro.platform.routing.Request;
import one.jpro.platform.routing.Response;
import one.jpro.platform.routing.Route;
import one.jpro.platform.routing.RouteNode;
import one.jpro.platform.routing.RouteUtils;
import one.jpro.platform.routing.*;
import one.jpro.platform.routing.dev.DevFilter;
import one.jpro.platform.routing.dev.StatisticsFilter;
import one.jpro.platform.routing.sessionmanager.SessionManager;
Expand All @@ -95,9 +92,11 @@
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.time.Duration;
import java.util.Locale;
import java.util.Objects;
import java.util.function.Supplier;
import one.jpro.platform.freezedetector.FreezeDetector;

public class JFXCentral2App extends Application {

Expand All @@ -111,6 +110,8 @@ public class JFXCentral2App extends Application {
}
}

private static boolean freezeDetectorStarted = false;

@Override
public void start(Stage stage) {
if (!OSUtil.isNative()) {
Expand Down Expand Up @@ -232,14 +233,15 @@ public void setOnCloseVideoPane(Runnable onClose) {

public Route createRoute() {
Route route = Route.empty()
.and(RouteUtils.get("/", r -> {
.and(Route.get("/", r -> {
if (RepositoryManager.isRepositoryUpdated()) {
return new StartPage(size);
return Response.view(new StartPage(size));
} else {
return Response.redirect("/refresh");
}
return new RefreshPage(size);
}))
.and(RouteUtils.redirect("/home", "/"))
.and(RouteUtils.redirect("/index", "/"))
.and(Route.redirect("/home", "/"))
.and(Route.redirect("/index", "/"))
.and(createCategoryOrDetailRoute("/blogs", Blog.class, () -> new BlogsCategoryPage(size), id -> new BlogDetailsPage(size, id))) // new routing for showcases
.and(createCategoryOrDetailRoute("/books", Book.class, () -> new BooksCategoryPage(size), id -> new BookDetailsPage(size, id)))
.and(createCategoryOrDetailRoute("/companies", Company.class, () -> new CompaniesCategoryPage(size), id -> new CompanyDetailsPage(size, id))) // new routing for showcases
Expand All @@ -257,61 +259,65 @@ public Route createRoute() {
.and(createCategoryOrDetailRoute("/learn-javafx", LearnJavaFX.class, () -> new LearnJavaFXCategoryPage(size), id -> new LearnDetailsPage(size, LearnJavaFX.class, id)))
.and(createCategoryOrDetailRoute("/learn-mobile", LearnMobile.class, () -> new LearnMobileCategoryPage(size), id -> new LearnDetailsPage(size, LearnMobile.class, id)))
.and(createCategoryOrDetailRoute("/learn-raspberrypi", LearnRaspberryPi.class, () -> new LearnRaspberryPiCategoryPage(size), id -> new LearnDetailsPage(size, LearnRaspberryPi.class, id)))
.and(RouteUtils.get("/credits", r -> new CreditsPage(size)))
.and(RouteUtils.get("/legal", r -> new LegalPage(size, LegalPage.Section.TERMS)))
.and(RouteUtils.get("/legal/terms", r -> new LegalPage(size, LegalPage.Section.TERMS)))
.and(RouteUtils.get("/legal/cookies", r -> new LegalPage(size, LegalPage.Section.COOKIES)))
.and(RouteUtils.get("/legal/privacy", r -> new LegalPage(size, LegalPage.Section.PRIVACY)))
.and(RouteUtils.get("/links", r -> new LinksOfTheWeekPage(size)))
.and(RouteUtils.get("/links/rss", r -> new LinksOfTheWeekPage(size))) // TODO: how to return raw data?
.and(RouteUtils.get("/team", r -> new TeamPage(size)))
.and(RouteUtils.get("/openjfx", r -> new OpenJFXPage(size)))
.and(RouteUtils.get("/documentation", r -> new DocumentationCategoryPage(size)))
.and(RouteUtils.get("/refresh", r -> {
.and(Route.get("/credits", r -> Response.view(new CreditsPage(size))))
.and(Route.get("/legal", r -> Response.view(new LegalPage(size, LegalPage.Section.TERMS))))
.and(Route.get("/legal/terms", r -> Response.view(new LegalPage(size, LegalPage.Section.TERMS))))
.and(Route.get("/legal/cookies", r -> Response.view(new LegalPage(size, LegalPage.Section.COOKIES))))
.and(Route.get("/legal/privacy", r -> Response.view(new LegalPage(size, LegalPage.Section.PRIVACY))))
.and(Route.get("/links", r -> Response.view(new LinksOfTheWeekPage(size))))
.and(Route.get("/links/rss", r -> Response.view(new LinksOfTheWeekPage(size)))) // TODO: how to return raw data?
.and(Route.get("/team", r -> Response.view(new TeamPage(size))))
.and(Route.get("/openjfx", r -> Response.view(new OpenJFXPage(size))))
.and(Route.get("/documentation", r -> Response.view(new DocumentationCategoryPage(size))))
.filter(FooterFilter.create(size))
.and(Route.get("/refresh", r -> {
RepositoryManager.prepareForRefresh();
return new RefreshPage(size);
return Response.view(new RefreshPage(size));
}));

// the following routes are only needed when we support user login

if (SocialUtil.isSocialFeaturesEnabled()) {
route = route.and(RouteUtils.get("/login", r -> new LoginPage(size)))
.and(RouteUtils.get("/top", r -> new TopContentPage(size)))
.and(RouteUtils.get("/profile", r -> new UserProfilePage(size)));
route = route.and(Route.get("/login", r -> Response.view(new LoginPage(size))))
.and(Route.get("/top", r -> Response.view(new TopContentPage(size))))
.and(Route.get("/profile", r -> Response.view(new UserProfilePage(size))));
}

route = route.and(r -> FXFuture.unit(new ErrorPage(size, r)));
route = route.and(r -> Response.view(new ErrorPage(size, r)));

if (Boolean.getBoolean("develop")) {
route = route.filter(DevFilter.create());
route = route.filter(StatisticsFilter.create());
}
//if (!freezeDetectorStarted) {
// new FreezeDetector(Duration.ofMillis(100));
// freezeDetectorStarted = true;
//}

return route;
}

private Route createCategoryOrDetailRoute(String path, Class<? extends ModelObject> clazz, Supplier<Response> masterResponse, Callback<String, Response> detailedResponse) {
private Route createCategoryOrDetailRoute(String path, Class<? extends ModelObject> clazz, Supplier<View> masterResponse, Callback<String, View> detailedResponse) {
return r -> {
if (r.path().startsWith(path)) {
return FXFuture.apply(() -> createResponse(r, clazz, masterResponse, detailedResponse));
if (r.getPath().startsWith(path)) {
return createResponse(r, clazz, masterResponse, detailedResponse);
}

return null;
return Response.empty();
};
}

private Response createResponse(Request request, Class<? extends ModelObject> clazz, Supplier<Response> categoryResponse, Callback<String, Response> detailedResponse) {
int index = request.path().lastIndexOf("/");
private Response createResponse(Request request, Class<? extends ModelObject> clazz, Supplier<View> categoryResponse, Callback<String, View> detailedResponse) {
int index = request.getPath().lastIndexOf("/");
if (index > 0) {
String id = request.path().substring(index + 1).trim();
String id = request.getPath().substring(index + 1).trim();
if (!DataRepository2.getInstance().isValidId(clazz, id)) {
return new ErrorPage(size, request);
return Response.view(new ErrorPage(size, request));
}

return detailedResponse.call(id);
return Response.view(detailedResponse.call(id));
}

return categoryResponse.get();
return Response.view(categoryResponse.get());
}

private void updateSizeProperty(Scene scene) {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
package com.dlsc.jfxcentral2.app.filters;

import com.dlsc.jfxcentral2.components.CopyrightView;
import com.dlsc.jfxcentral2.components.FooterView;
import com.dlsc.jfxcentral2.components.SponsorsView;
import com.dlsc.jfxcentral2.model.Size;
import javafx.beans.property.ObjectProperty;
import javafx.beans.property.SimpleObjectProperty;
import javafx.scene.Node;
import javafx.scene.layout.VBox;
import one.jpro.platform.routing.Filter;
import one.jpro.platform.routing.Request;
import one.jpro.platform.routing.filter.container.ContainerVBox;
import one.jpro.platform.routing.filter.container.ContainerFilter;

public class FooterFilter {

public static Filter create(ObjectProperty<Size> sizeProperty) {
return ContainerFilter.create(() -> new FooterFilterContainer(sizeProperty));
}

static class FooterFilterContainer extends ContainerVBox {
public FooterFilterContainer(ObjectProperty<Size> sizeProperty) {
// footer
FooterView footerView = new FooterView();
footerView.sizeProperty().bind(sizeProperty);

// sponsors
SponsorsView sponsorsView = new SponsorsView();
sponsorsView.sizeProperty().bind(sizeProperty);

// copyright
CopyrightView copyrightView = new CopyrightView();
copyrightView.sizeProperty().bind(sizeProperty);

contentProperty().addListener((p,o,it) -> {
getChildren().setAll(it, sponsorsView, footerView, copyrightView);
});
}
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ public String description() {
public Node content() {
// error view
ErrorView errorView = new ErrorView();
errorView.setMessage("Page not found: " + request.path());
errorView.setMessage("Page not found: " + request.getPath());
errorView.sizeProperty().bind(sizeProperty());

// strip view for pull requests and features
Expand Down
19 changes: 6 additions & 13 deletions app/src/main/java/com/dlsc/jfxcentral2/app/pages/PageBase.java
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
import one.jpro.platform.routing.View;
import org.kordamp.ikonli.javafx.FontIcon;
import org.kordamp.ikonli.materialdesign.MaterialDesign;
import one.jpro.platform.routing.performance.IncrementalLoading;

import java.util.ArrayList;
import java.util.Collections;
Expand Down Expand Up @@ -68,18 +69,6 @@ public Node wrapContent(Region... content) {
topMenuBar.getStyleClass().add("start-page");
}

// footer
FooterView footerView = new FooterView();
footerView.sizeProperty().bind(sizeProperty());

// sponsors
SponsorsView sponsorsView = new SponsorsView();
sponsorsView.sizeProperty().bind(sizeProperty());

// copyright
CopyrightView copyrightView = new CopyrightView();
copyrightView.sizeProperty().bind(sizeProperty());

// hamburger menu
HamburgerMenuView hamburgerMenuView = new HamburgerMenuView(isMobile());
hamburgerMenuView.sizeProperty().bind(sizeProperty());
Expand All @@ -89,6 +78,10 @@ public Node wrapContent(Region... content) {

StackPane.setAlignment(hamburgerMenuView, Pos.TOP_CENTER);

for(Node node : content) {
IncrementalLoading.loadNode(node);
}

VBox uiBox = new VBox(content);
VBox.setVgrow(uiBox, Priority.ALWAYS);
uiBox.setAlignment(Pos.BOTTOM_CENTER);
Expand All @@ -102,7 +95,7 @@ public Node wrapContent(Region... content) {

StackPane.setAlignment(vbox, Pos.TOP_CENTER);

vbox.getChildren().addAll(topStackPane, sponsorsView, footerView, copyrightView);
vbox.getChildren().addAll(topStackPane);

StackPane glassPane = new StackPane();
glassPane.getStyleClass().add("page-glass-pane");
Expand Down
1 change: 1 addition & 0 deletions app/src/main/java/module-info.java
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@

requires one.jpro.platform.routing.core;
requires one.jpro.platform.routing.dev;
requires one.jpro.platform.freezedetector;

requires org.eclipse.jgit;

Expand Down
9 changes: 5 additions & 4 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -26,11 +26,12 @@

<properties>
<java.version>17</java.version>
<javafx.version>21</javafx.version>
<!-- Version 20 because of performance -->
<javafx.version>20.0.2</javafx.version>
<junit.version>5.10.0</junit.version>
<ikonli.version>12.3.1</ikonli.version>
<jpro.version>2023.3.2</jpro.version>
<jpro.platform.version>0.2.7</jpro.platform.version>
<jpro.version>2023.3.3</jpro.version>
<jpro.platform.version>0.2.10</jpro.platform.version>
<batik.version>1.16</batik.version>
<attach.version>4.0.19</attach.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
Expand Down Expand Up @@ -195,7 +196,7 @@
<dependency>
<groupId>SANDEC</groupId>
<artifactId>simplefx_2.12</artifactId>
<version>3.2.27</version>
<version>3.2.28</version>
<exclusions>
<exclusion>
<groupId>org.openjfx</groupId>
Expand Down

0 comments on commit 3871514

Please sign in to comment.