You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@causeway.apache.org by da...@apache.org on 2023/10/18 22:52:09 UTC
[causeway] branch CAUSEWAY-3636 updated: CAUSEWAY-3636: updates docs
This is an automated email from the ASF dual-hosted git repository.
danhaywood pushed a commit to branch CAUSEWAY-3636
in repository https://gitbox.apache.org/repos/asf/causeway.git
The following commit(s) were added to refs/heads/CAUSEWAY-3636 by this push:
new 7860965cb6 CAUSEWAY-3636: updates docs
7860965cb6 is described below
commit 7860965cb68f8d801a29bcb078a41a25f97965de
Author: danhaywood <da...@haywood-associates.co.uk>
AuthorDate: Wed Oct 18 23:52:05 2023 +0100
CAUSEWAY-3636: updates docs
---
.../core/config/CausewayConfiguration.java | 3 +-
.../services/grid/GridLoaderServiceDefault.java | 3 ++
.../adoc/modules/layoutgithub/pages/about.adoc | 14 +++++----
.../CausewayModuleExtLayoutGithubLoader.java | 6 ++--
.../layoutgithub/loader/menu/LayoutLoaderMenu.java | 17 +++++++++++
.../loader/spi/LayoutResourceLoaderFromGithub.java | 35 ++++++++++++++++------
...oaderFromGithub_tryLoadLayoutResource_Test.java | 11 ++++---
...ewayExtSecmanRegularUserRoleAndPermissions.java | 2 +-
8 files changed, 67 insertions(+), 24 deletions(-)
diff --git a/core/config/src/main/java/org/apache/causeway/core/config/CausewayConfiguration.java b/core/config/src/main/java/org/apache/causeway/core/config/CausewayConfiguration.java
index e93c09df57..f625fc63b9 100644
--- a/core/config/src/main/java/org/apache/causeway/core/config/CausewayConfiguration.java
+++ b/core/config/src/main/java/org/apache/causeway/core/config/CausewayConfiguration.java
@@ -3475,7 +3475,8 @@ public class CausewayConfiguration {
CausewayModuleApplib.NAMESPACE_FEAT,
"causeway.security",
"causeway.ext.h2Console",
- "causeway.ext.secman"
+ "causeway.ext.secman",
+ "causeway.ext.layoutGithub"
));
public static final List<String> ADMIN_ADDITIONAL_NAMESPACE_PERMISSIONS =
Collections.unmodifiableList(listOf());
diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/services/grid/GridLoaderServiceDefault.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/services/grid/GridLoaderServiceDefault.java
index 6ec3e5a79f..5980bd34e1 100644
--- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/services/grid/GridLoaderServiceDefault.java
+++ b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/services/grid/GridLoaderServiceDefault.java
@@ -58,6 +58,9 @@ import lombok.val;
import lombok.experimental.Accessors;
import lombok.extern.log4j.Log4j2;
+/**
+ * @since 2.0 {@index}
+ */
@Service
@Named(CausewayModuleCoreMetamodel.NAMESPACE + ".GridLoaderServiceDefault")
@Priority(PriorityPrecedence.MIDPOINT)
diff --git a/extensions/core/layoutgithub/adoc/modules/layoutgithub/pages/about.adoc b/extensions/core/layoutgithub/adoc/modules/layoutgithub/pages/about.adoc
index d34ba993c2..cdadee54e6 100644
--- a/extensions/core/layoutgithub/adoc/modules/layoutgithub/pages/about.adoc
+++ b/extensions/core/layoutgithub/adoc/modules/layoutgithub/pages/about.adoc
@@ -2,7 +2,7 @@
:Notice: Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to you under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at. http://www.apache.org/licenses/LICENSE-2.0 . Unless required by applicable law or ag [...]
-The _LayoutGitHub_ module allows layouts to be read dynamically from a github source repository, by providing an implementation of xref:refguide:applib:index/services/grid/GridLoaderService.adoc[].
+The _LayoutGitHub_ module allows layouts to be read dynamically from a github source repository.
It is intended as a development tool to allow layouts to be updated dynamically in an application running on an app server or in a container.
@@ -48,7 +48,7 @@ In the webapp module of your application, add the following dependency:
[#appmanifest]
=== AppManifest
-In your application's `AppManifest` (top-level Spring `@Configuration` used to bootstrap the app), import the `CausewayModuleExtLayoutGitHubGridLoader` module.
+In your application's `AppManifest` (top-level Spring `@Configuration` used to bootstrap the app), import the `CausewayModuleExtLayoutGitHubLoader` module.
[source,java]
.AppManifest.java
@@ -56,7 +56,7 @@ In your application's `AppManifest` (top-level Spring `@Configuration` used to b
@Configuration
@Import({
...
- CausewayModuleExtLayoutGitHubGridLoader.class,
+ CausewayModuleExtLayoutGitHubLoader.class,
...
})
public class AppManifest {
@@ -77,7 +77,8 @@ You can use `menubars.layout.xml` to arrange as you see fit, for example in the
<mb:named/>
<mb:section>
<mb:named>Layouts</mb:named>
- <mb:serviceAction objectType="causeway.ext.layoutgithub.gridloader.Menu" id="dynamicLayoutLoading"/>
+ <mb:serviceAction objectType="causeway.ext.layoutGithub.LayoutLoaderMenu" id="enableDynamicLayoutLoading"/>
+ <mb:serviceAction objectType="causeway.ext.layoutGithub.LayoutLoaderMenu" id="disableDynamicLayoutLoading"/>
</mb:section>
</mb:menu>
...
@@ -92,7 +93,8 @@ This returns a view model that allows the end-user to toggle dynamic loading on
-== See also
+// == See also
+//
+// * xref:refguide:applib:index/services/grid/GridLoaderService.adoc[]
-* xref:refguide:applib:index/services/grid/GridLoaderService.adoc[]
diff --git a/extensions/core/layoutgithub/loader/src/main/java/org/apache/causeway/extensions/layoutgithub/loader/CausewayModuleExtLayoutGithubLoader.java b/extensions/core/layoutgithub/loader/src/main/java/org/apache/causeway/extensions/layoutgithub/loader/CausewayModuleExtLayoutGithubLoader.java
index 19912bbd84..cb959b1715 100644
--- a/extensions/core/layoutgithub/loader/src/main/java/org/apache/causeway/extensions/layoutgithub/loader/CausewayModuleExtLayoutGithubLoader.java
+++ b/extensions/core/layoutgithub/loader/src/main/java/org/apache/causeway/extensions/layoutgithub/loader/CausewayModuleExtLayoutGithubLoader.java
@@ -102,12 +102,12 @@ public class CausewayModuleExtLayoutGithubLoader {
/**
* Returns a template configured to obtain the content of a file in a repo (from the default branch).
*
+ * <p>
* Append for example:
*
- * <pre>/contents/module-simple/src/main/java/domainapp/modules/simple/dom/so/SimpleObject.layout.xml?branch=branchName</pre>
+ * <pre>/contents/module-simple/src/main/java/domainapp/modules/simple/dom/so/SimpleObject.layout.xml</pre>
*
- * The <i>branchName</i> can be obtained from {@link LayoutLoaderMenu#getBranch()}.
- * @param causewayConfiguration
+ * @param causewayConfiguration
* @return
*/
@Bean(name = "GithubContent")
diff --git a/extensions/core/layoutgithub/loader/src/main/java/org/apache/causeway/extensions/layoutgithub/loader/menu/LayoutLoaderMenu.java b/extensions/core/layoutgithub/loader/src/main/java/org/apache/causeway/extensions/layoutgithub/loader/menu/LayoutLoaderMenu.java
index c016f0fb88..940cb838c9 100644
--- a/extensions/core/layoutgithub/loader/src/main/java/org/apache/causeway/extensions/layoutgithub/loader/menu/LayoutLoaderMenu.java
+++ b/extensions/core/layoutgithub/loader/src/main/java/org/apache/causeway/extensions/layoutgithub/loader/menu/LayoutLoaderMenu.java
@@ -31,10 +31,12 @@ import org.apache.causeway.applib.annotation.NatureOfService;
import org.apache.causeway.applib.annotation.PriorityPrecedence;
import org.apache.causeway.applib.annotation.Publishing;
import org.apache.causeway.applib.annotation.SemanticsOf;
+import org.apache.causeway.core.config.CausewayConfiguration;
import org.apache.causeway.extensions.layoutgithub.loader.CausewayModuleExtLayoutGithubLoader;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
+import lombok.val;
/**
* Provides actions to managed the dynamic loading of layouts from a github source code repository.
@@ -53,6 +55,8 @@ public class LayoutLoaderMenu {
public static abstract class ActionDomainEvent<T> extends CausewayModuleApplib.ActionDomainEvent<T> {}
+ final CausewayConfiguration causewayConfiguration;
+
@Getter
private boolean enabled;
@@ -74,9 +78,13 @@ public class LayoutLoaderMenu {
@MemberSupport public void act() {
LayoutLoaderMenu.this.enabled = true;
}
+ @MemberSupport public boolean hideAct() {
+ return !isConfigured();
+ }
@MemberSupport public String disableAct() {
return LayoutLoaderMenu.this.enabled ? "Already enabled" : null;
}
+
}
@@ -97,9 +105,18 @@ public class LayoutLoaderMenu {
@MemberSupport public void act() {
LayoutLoaderMenu.this.enabled = false;
}
+ @MemberSupport public boolean hideAct() {
+ return !isConfigured();
+ }
@MemberSupport public String disableAct() {
return LayoutLoaderMenu.this.enabled ? null : "Already disabled";
}
}
+ boolean isConfigured() {
+ val layoutGithub = causewayConfiguration.getExtensions().getLayoutGithub();
+ return layoutGithub.getRepository() != null &&
+ layoutGithub.getApiKey() != null;
+ }
+
}
diff --git a/extensions/core/layoutgithub/loader/src/main/java/org/apache/causeway/extensions/layoutgithub/loader/spi/LayoutResourceLoaderFromGithub.java b/extensions/core/layoutgithub/loader/src/main/java/org/apache/causeway/extensions/layoutgithub/loader/spi/LayoutResourceLoaderFromGithub.java
index 8cbc13a17e..7376ecf420 100644
--- a/extensions/core/layoutgithub/loader/src/main/java/org/apache/causeway/extensions/layoutgithub/loader/spi/LayoutResourceLoaderFromGithub.java
+++ b/extensions/core/layoutgithub/loader/src/main/java/org/apache/causeway/extensions/layoutgithub/loader/spi/LayoutResourceLoaderFromGithub.java
@@ -30,6 +30,7 @@ import javax.inject.Inject;
import javax.inject.Named;
import org.apache.causeway.applib.annotation.PriorityPrecedence;
+import org.apache.causeway.applib.services.queryresultscache.QueryResultsCache;
import org.apache.causeway.applib.value.NamedWithMimeType;
import org.apache.causeway.core.config.CausewayConfiguration;
import org.apache.causeway.core.metamodel.services.grid.spi.LayoutResource;
@@ -55,33 +56,48 @@ public class LayoutResourceLoaderFromGithub implements LayoutResourceLoader {
final RestTemplate restTemplateForContent;
final CausewayConfiguration causewayConfiguration;
final LayoutLoaderMenu layoutLoaderMenu;
+ final QueryResultsCache queryResultsCache;
@Inject
public LayoutResourceLoaderFromGithub(
- @Qualifier("GithubSearch") final RestTemplate restTemplateForSearch,
- @Qualifier("GithubContent") final RestTemplate restTemplateForContent,
+ final @Qualifier("GithubSearch") RestTemplate restTemplateForSearch,
+ final @Qualifier("GithubContent") RestTemplate restTemplateForContent,
final CausewayConfiguration causewayConfiguration,
- final LayoutLoaderMenu layoutLoaderMenu) {
+ final LayoutLoaderMenu layoutLoaderMenu,
+ final QueryResultsCache queryResultsCache) {
this.restTemplateForSearch = restTemplateForSearch;
this.restTemplateForContent = restTemplateForContent;
this.causewayConfiguration = causewayConfiguration;
this.layoutLoaderMenu = layoutLoaderMenu;
+ this.queryResultsCache = queryResultsCache;
}
@Override
public Optional<LayoutResource> tryLoadLayoutResource(
final @NonNull Class<?> type,
final @NonNull String candidateResourceName) {
+ if (!layoutLoaderMenu.isEnabled()) {
+ return Optional.empty();
+ }
+ return queryResultsCache.execute(() -> tryLoadLayoutResource(candidateResourceName),
+ getClass(), "tryLoadLayoutResource", candidateResourceName);
+ }
+
+ private Optional<LayoutResource> tryLoadLayoutResource(String candidateResourceName) {
return search(candidateResourceName)
- .flatMap(x -> content(candidateResourceName, x));
+ .flatMap(x -> content(candidateResourceName, x));
}
+ /**
+ * eg:
+ * <code>/search/code?q=SimpleObject.layout.xml+in:path+repo:apache/causeway-app-simpleapp</code>
+ */
private Optional<String> search(final @NonNull String candidateResourceName) {
- // /search/code?q=SimpleObject.layout.xml+in:path+repo:apache/causeway-app-simpleapp
try {
val searchParams = new HashMap<String,String>() {{
- put("q", String.format("%s+in:path+repo:%s", candidateResourceName, causewayConfiguration.getExtensions().getLayoutGithub().getRepository()));
+ val repo = causewayConfiguration.getExtensions().getLayoutGithub().getRepository();
+ put("q", String.format("%s+in:path+repo:%s", candidateResourceName, repo));
}};
val responseEntity = restTemplateForSearch.exchange("/search/code?q={q}", HttpMethod.GET, null, new ParameterizedTypeReference<GitHubResponse>() {}, searchParams);
@@ -93,16 +109,17 @@ public class LayoutResourceLoaderFromGithub implements LayoutResourceLoader {
} catch (Exception ex) {
return Optional.empty();
}
-
}
+ /**
+ * eg:
+ * <code>/contents/module-simple/src/main/java/domainapp/modules/simple/dom/so/SimpleObject.layout.xml</code>
+ */
private Optional<LayoutResource> content(
final @NonNull String candidateResourceName,
final @NonNull String path) {
- // /contents/module-simple/src/main/java/domainapp/modules/simple/dom/so/SimpleObject.layout.xml
try {
-
val contentResponse = restTemplateForContent.exchange("/contents/" + path, HttpMethod.GET, null, String.class);
val content = contentResponse.getBody();
diff --git a/extensions/core/layoutgithub/loader/src/test/java/org/apache/causeway/extensions/layoutgithub/loader/spi/LayoutResourceLoaderFromGithub_tryLoadLayoutResource_Test.java b/extensions/core/layoutgithub/loader/src/test/java/org/apache/causeway/extensions/layoutgithub/loader/spi/LayoutResourceLoaderFromGithub_tryLoadLayoutResource_Test.java
index 669c49e48e..ccb7591467 100644
--- a/extensions/core/layoutgithub/loader/src/test/java/org/apache/causeway/extensions/layoutgithub/loader/spi/LayoutResourceLoaderFromGithub_tryLoadLayoutResource_Test.java
+++ b/extensions/core/layoutgithub/loader/src/test/java/org/apache/causeway/extensions/layoutgithub/loader/spi/LayoutResourceLoaderFromGithub_tryLoadLayoutResource_Test.java
@@ -2,12 +2,12 @@ package org.apache.causeway.extensions.layoutgithub.loader.spi;
import java.nio.charset.StandardCharsets;
+import org.apache.causeway.applib.services.queryresultscache.QueryResultsCache;
import org.apache.causeway.commons.internal.resources._Resources;
import org.apache.causeway.extensions.layoutgithub.loader.menu.LayoutLoaderMenu;
-import org.apache.causeway.extensions.layoutgithub.loader.spi.LayoutResourceLoaderFromGithub;
-
+import org.assertj.core.api.Assertions;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
@@ -42,10 +42,13 @@ class LayoutResourceLoaderFromGithub_tryLoadLayoutResource_Test {
val module = new CausewayModuleExtLayoutGithubLoader();
val restTemplateForSearch = module.restTemplateForGithubSearch(causewayConfiguration);
val restTemplateForContent = module.restTemplateForGithubContent(causewayConfiguration);
+ val layoutLoaderMenu = new LayoutLoaderMenu(causewayConfiguration);
+ val queryResultsCache = new QueryResultsCache();
- val layoutLoaderMenu = new LayoutLoaderMenu();
+ layoutLoaderMenu.new enableDynamicLayoutLoading().act();
+ Assertions.assertThat(layoutLoaderMenu.isEnabled()).isTrue();
- loader = new LayoutResourceLoaderFromGithub(restTemplateForSearch, restTemplateForContent, causewayConfiguration, layoutLoaderMenu);
+ loader = new LayoutResourceLoaderFromGithub(restTemplateForSearch, restTemplateForContent, causewayConfiguration, layoutLoaderMenu, queryResultsCache);
}
@Test
diff --git a/extensions/security/secman/applib/src/main/java/org/apache/causeway/extensions/secman/applib/role/seed/CausewayExtSecmanRegularUserRoleAndPermissions.java b/extensions/security/secman/applib/src/main/java/org/apache/causeway/extensions/secman/applib/role/seed/CausewayExtSecmanRegularUserRoleAndPermissions.java
index 34817cd4f7..25b5e69b81 100644
--- a/extensions/security/secman/applib/src/main/java/org/apache/causeway/extensions/secman/applib/role/seed/CausewayExtSecmanRegularUserRoleAndPermissions.java
+++ b/extensions/security/secman/applib/src/main/java/org/apache/causeway/extensions/secman/applib/role/seed/CausewayExtSecmanRegularUserRoleAndPermissions.java
@@ -106,7 +106,7 @@ public class CausewayExtSecmanRegularUserRoleAndPermissions extends AbstractRole
: null,
// optionally allow access to layout menu and pages, based on module presence
- env.getIocContainer().containsBean("org.apache.causeway.extensions.layoutgithub.gridloader.CausewayModuleExtLayoutGithubGridLoader")
+ env.getIocContainer().containsBean("org.apache.causeway.extensions.layoutgithub.loader.CausewayModuleExtLayoutGithubLoader")
? ApplicationFeatureId.newNamespace(CausewayExtLayoutGithubRoleAndPermissions.NAMESPACE)
: null
);