This is an automated email from the ASF dual-hosted git repository.
cziegeler pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/sling-whiteboard.git
The following commit(s) were added to refs/heads/master by this push:
new 7852e6a6 Process directory in offline mode
7852e6a6 is described below
commit 7852e6a6ecdb9e2df7c869d67395a7c8f88f0ed7
Author: Carsten Ziegeler <[email protected]>
AuthorDate: Thu Dec 7 15:56:10 2023 +0100
Process directory in offline mode
---
.../org/apache/sling/offline/impl/Starter.java | 98 +++++++++++++++-------
1 file changed, 70 insertions(+), 28 deletions(-)
diff --git
a/org.apache.sling.offline/src/main/java/org/apache/sling/offline/impl/Starter.java
b/org.apache.sling.offline/src/main/java/org/apache/sling/offline/impl/Starter.java
index 07c9544e..3b59781d 100644
---
a/org.apache.sling.offline/src/main/java/org/apache/sling/offline/impl/Starter.java
+++
b/org.apache.sling.offline/src/main/java/org/apache/sling/offline/impl/Starter.java
@@ -18,8 +18,9 @@
*/
package org.apache.sling.offline.impl;
-import java.io.FileNotFoundException;
+import java.io.File;
import java.io.IOException;
+import java.nio.file.Files;
import javax.servlet.ServletException;
@@ -31,17 +32,22 @@ import org.apache.sling.api.resource.ResourceResolver;
import org.apache.sling.api.resource.ResourceResolverFactory;
import org.apache.sling.engine.SlingRequestProcessor;
import org.osgi.framework.BundleContext;
-import org.osgi.framework.FrameworkEvent;
-import org.osgi.framework.FrameworkListener;
import org.osgi.service.component.annotations.Activate;
import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.ConfigurationPolicy;
import org.osgi.service.component.annotations.Reference;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-@Component(service = {})
+@Component(service = {}, configurationPolicy = ConfigurationPolicy.REQUIRE)
public class Starter {
+ public @interface Config {
+ String input_path();
+
+ String output_path();
+ }
+
private final Logger logger = LoggerFactory.getLogger(getClass());
@Reference
@@ -50,39 +56,75 @@ public class Starter {
@Reference
private SlingRequestProcessor processor;
+ private volatile Config config;
+
@Activate
- public void activate(final BundleContext ctx) {
+ public void activate(final BundleContext ctx, final Config config) {
logger.info("Activating offliner...");
- ctx.addFrameworkListener(new FrameworkListener() {
- @Override
- public void frameworkEvent(final FrameworkEvent event) {
- if (event.getType() == FrameworkEvent.STARTED) {
- logger.info("Framework started, starting...");
- new Thread(Starter.this::run).start();
- }
- }
- });
+ this.config = config;
+ final Thread t = new Thread(Starter.this::run);
+ t.setDaemon(true);
+ t.start();
+ }
+
+ private boolean ignore(final Resource r) {
+ return r.getName().startsWith(".");
+ }
+
+ private boolean isWebPage(final Resource r) {
+ return r.getName().endsWith(".md");
}
- private void process(final ResourceResolver resolver, final String path)
throws IOException, ServletException {
- logger.info("Getting {}", path);
- final Resource resource = resolver.getResource(path);
- if ( resource != null ) {
- final SlingHttpServletRequest req =
Builders.newRequestBuilder(resource)
- .withExtension("html")
- .build();
- final SlingHttpServletResponseResult resp =
Builders.newResponseBuilder().build();
- processor.processRequest(req, resp, resolver);
-
- logger.info("Result for {} = {}", path, resp.getOutputAsString());
- } else {
- throw new FileNotFoundException(path);
+ private void process(final ResourceResolver resolver, final Resource
resource) throws IOException, ServletException {
+ if ( this.ignore(resource) ) {
+ return;
}
+ if ( !this.isWebPage(resource) ) {
+ return;
+ }
+ logger.info("Processing {}", resource.getPath());
+ final SlingHttpServletRequest req =
Builders.newRequestBuilder(resource)
+ .withExtension("html")
+ .build();
+ final SlingHttpServletResponseResult resp =
Builders.newResponseBuilder().build();
+ processor.processRequest(req, resp, resolver);
+
+ final File output = new File(config.output_path(),
resource.getPath().substring(this.config.input_path().length()).concat(".html"));
+ logger.info("Writing output to {}", output.getAbsolutePath());
+ output.getParentFile().mkdirs();
+ Files.writeString(output.toPath(), resp.getOutputAsString());
+ }
+
+ private Resource getResource(final ResourceResolver resolver, final String
path) {
+ logger.info("Trying to get resource {}", path);
+ // 5 seconds to get the resource
+ final long endAt = System.currentTimeMillis() + 5000;
+ while ( System.currentTimeMillis() < endAt ) {
+ final Resource resource = resolver.getResource(path);
+ if ( resource != null ) {
+ return resource;
+ }
+ try {
+ Thread.sleep(100);
+ } catch ( final InterruptedException ie) {
+ // ignore
+ }
+ }
+ return null;
}
+
public void run() {
+ new File(this.config.output_path()).mkdirs();
try ( final ResourceResolver resolver =
factory.getAdministrativeResourceResolver(null) ) {
- process(resolver, "/content/docs/README.md");
+ final Resource root = this.getResource(resolver,
config.input_path());
+ if ( root == null ) {
+ logger.error("Unable to find root resource at {}",
config.input_path());
+ } else {
+ for(final Resource c : root.getChildren()) {
+ process(resolver, c);
+ }
+ }
} catch ( final Exception e ) {
throw new RuntimeException(e);
}