RDoing some horrible things with reflection to get around backwards compatibility issues an updating compatibility information
diff --git a/org.apache.sling.repoinit.webconsole/bnd.bnd b/org.apache.sling.repoinit.webconsole/bnd.bnd
index b6f5040..e69de29 100644
--- a/org.apache.sling.repoinit.webconsole/bnd.bnd
+++ b/org.apache.sling.repoinit.webconsole/bnd.bnd
@@ -1 +0,0 @@
-Import-Package: !java.*,org.apache.sling.repoinit.parser.operations;version="[1.0,10.0)",org.apache.sling.repoinit.parser;version="[1.0,2.0)",org.apache.sling.jcr.repoinit;version="[1.0,2.0)",*
\ No newline at end of file
diff --git a/org.apache.sling.repoinit.webconsole/pom.xml b/org.apache.sling.repoinit.webconsole/pom.xml
index 3a6e72a..571d87c 100644
--- a/org.apache.sling.repoinit.webconsole/pom.xml
+++ b/org.apache.sling.repoinit.webconsole/pom.xml
@@ -17,7 +17,7 @@
<version>1.0.0-SNAPSHOT</version>
<properties>
- <sling.java.version>11</sling.java.version>
+ <sling.java.version>8</sling.java.version>
</properties>
<build>
@@ -153,29 +153,10 @@
<artifactId>slf4j-api</artifactId>
</dependency>
- <!-- Repoinit Deps -->
- <dependency>
- <groupId>org.apache.sling</groupId>
- <artifactId>org.apache.sling.repoinit.parser</artifactId>
- <version>1.1.0</version>
- <scope>provided</scope>
- </dependency>
- <dependency>
- <groupId>org.apache.sling</groupId>
- <artifactId>org.apache.sling.jcr.repoinit</artifactId>
- <version>1.1.0</version>
- <scope>provided</scope>
- </dependency>
- <dependency>
- <groupId>org.apache.sling</groupId>
- <artifactId>org.apache.sling.testing.sling-mock.junit4</artifactId>
- <version>3.0.2</version>
- <scope>test</scope>
- </dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
- <version>2.9.0</version>
+ <version>2.8.4</version>
<scope>provided</scope>
</dependency>
<dependency>
@@ -219,6 +200,24 @@
<groupId>commons-fileupload</groupId>
<scope>test</scope>
</dependency>
+ <dependency>
+ <groupId>org.apache.sling</groupId>
+ <artifactId>org.apache.sling.repoinit.parser</artifactId>
+ <version>1.2.2</version>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.sling</groupId>
+ <artifactId>org.apache.sling.jcr.repoinit</artifactId>
+ <version>1.1.0</version>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.sling</groupId>
+ <artifactId>org.apache.sling.testing.sling-mock.junit4</artifactId>
+ <version>3.0.2</version>
+ <scope>test</scope>
+ </dependency>
</dependencies>
</project>
\ No newline at end of file
diff --git a/org.apache.sling.repoinit.webconsole/src/main/java/org/apache/sling/repoinit/webconsole/RepoInitWebConsole.java b/org.apache.sling.repoinit.webconsole/src/main/java/org/apache/sling/repoinit/webconsole/RepoInitWebConsole.java
index a54d511..89c3bdc 100644
--- a/org.apache.sling.repoinit.webconsole/src/main/java/org/apache/sling/repoinit/webconsole/RepoInitWebConsole.java
+++ b/org.apache.sling.repoinit.webconsole/src/main/java/org/apache/sling/repoinit/webconsole/RepoInitWebConsole.java
@@ -17,9 +17,13 @@
package org.apache.sling.repoinit.webconsole;
import java.io.IOException;
+import java.io.Reader;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
import java.nio.charset.StandardCharsets;
import java.util.List;
+import javax.jcr.Session;
import javax.servlet.Servlet;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
@@ -35,11 +39,10 @@
import org.apache.felix.webconsole.AbstractWebConsolePlugin;
import org.apache.felix.webconsole.WebConsoleConstants;
import org.apache.sling.jcr.api.SlingRepository;
-import org.apache.sling.jcr.repoinit.JcrRepoInitOpsProcessor;
-import org.apache.sling.repoinit.parser.RepoInitParser;
-import org.apache.sling.repoinit.parser.RepoInitParsingException;
-import org.apache.sling.repoinit.parser.operations.Operation;
+import org.osgi.framework.BundleContext;
import org.osgi.framework.Constants;
+import org.osgi.framework.ServiceReference;
+import org.osgi.service.component.ComponentContext;
import org.osgi.service.component.annotations.Activate;
import org.osgi.service.component.annotations.Component;
import org.osgi.service.component.annotations.Reference;
@@ -53,20 +56,43 @@
public class RepoInitWebConsole extends AbstractWebConsolePlugin {
public static final String CONSOLE_LABEL = "repoinit";
- public static final String CONSOLE_TITLE = "RepoInit";
- private final RepoInitParser parser;
+ public static final String CONSOLE_TITLE = "Repository Initialization";
private final SlingRepository slingRepository;
- private final JcrRepoInitOpsProcessor processor;
+ private final BundleContext context;
static final String RES_LOC = CONSOLE_LABEL + "/res/ui";
@Activate
- public RepoInitWebConsole(@Reference RepoInitParser parser, @Reference SlingRepository slingRepository,
- @Reference JcrRepoInitOpsProcessor processor) throws IOException {
- this.parser = parser;
- this.processor = processor;
+ public RepoInitWebConsole(ComponentContext context, @Reference SlingRepository slingRepository) throws IOException {
+ this.context = context.getBundleContext();
this.slingRepository = slingRepository;
}
+ @SuppressWarnings("unchecked")
+ private List<?> parse(Reader reader) throws NoSuchMethodException, SecurityException, IllegalAccessException,
+ IllegalArgumentException, InvocationTargetException {
+ ServiceReference<?> reference = context.getServiceReference("org.apache.sling.repoinit.parser.RepoInitParser");
+ try {
+ Object parser = context.getService(reference);
+ Method method = parser.getClass().getDeclaredMethod("parse", Reader.class);
+ return (List<Object>) method.invoke(parser, reader);
+ } finally {
+ context.ungetService(reference);
+ }
+ }
+
+ private void process(Session session, List<?> operations) throws IllegalAccessException, IllegalArgumentException,
+ InvocationTargetException, NoSuchMethodException, SecurityException {
+ ServiceReference<?> reference = context
+ .getServiceReference("org.apache.sling.jcr.repoinit.JcrRepoInitOpsProcessor");
+ try {
+ Object processor = context.getService(reference);
+ Method method = processor.getClass().getDeclaredMethod("apply", Session.class, List.class);
+ method.invoke(processor, session, operations);
+ } finally {
+ context.ungetService(reference);
+ }
+ }
+
@Override
public String getLabel() {
return CONSOLE_LABEL;
@@ -97,13 +123,17 @@
}
}
+ @SuppressWarnings("deprecated")
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
- List<Operation> operations;
+ List<?> operations;
try {
- operations = parser.parse(request.getReader());
- } catch (RepoInitParsingException e) {
+ operations = parse(request.getReader());
+ } catch (InvocationTargetException e) {
+ handleException(response, "Failed to parse RepoInit Statement: ", (Exception) e.getCause());
+ return;
+ } catch (Exception e) {
handleException(response, "Failed to parse RepoInit Statement: ", e);
return;
}
@@ -111,12 +141,17 @@
if ("true".equals(request.getParameter("execute"))) {
try {
- processor.apply(slingRepository.loginAdministrative(null), operations);
+
+ process(slingRepository.loginAdministrative(null), operations);
+ } catch (InvocationTargetException e) {
+ response.setStatus(400);
+ apiResponse.setErrorMessage("Failed to apply statements", (Exception) e.getCause());
} catch (Exception e) {
response.setStatus(400);
apiResponse.setErrorMessage("Failed to apply statements", e);
}
}
+
writeResponse(response, apiResponse);
}
@@ -145,11 +180,11 @@
protected boolean succeeded;
@JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME)
- protected final List<Operation> operations;
+ protected final List<?> operations;
protected String errorMessage;
- public ApiResponse(List<Operation> operations) {
+ public ApiResponse(List<?> operations) {
this.succeeded = true;
this.operations = operations;
errorMessage = null;
@@ -168,11 +203,11 @@
return errorMessage;
}
- public List<Operation> getOperations() {
+ public List<?> getOperations() {
return operations;
}
- public void setErrorMessage(String message, Exception e){
+ public void setErrorMessage(String message, Exception e) {
this.succeeded = false;
this.errorMessage = message + " [" + e.getClass().getSimpleName() + "]: " + e.getMessage();
}
diff --git a/org.apache.sling.repoinit.webconsole/src/main/resources/tpl/main.html b/org.apache.sling.repoinit.webconsole/src/main/resources/tpl/main.html
index 4daa5ca..f6b1ebe 100644
--- a/org.apache.sling.repoinit.webconsole/src/main/resources/tpl/main.html
+++ b/org.apache.sling.repoinit.webconsole/src/main/resources/tpl/main.html
@@ -21,7 +21,7 @@
}
</style>
<p class="statline ui-state-highlight">Source</p>
-<p>Use this console to test and verify RepoInit Statements on your Apache Sling instance</p>
+<p>Test and verify Repository Initialization (repoint) scripts</p>
<div class="wrapper">
<textarea id="source"></textarea>
</div>
diff --git a/org.apache.sling.repoinit.webconsole/src/test/java/org/apache/sling/repoinit/webconsole/RepoInitWebConsoleTest.java b/org.apache.sling.repoinit.webconsole/src/test/java/org/apache/sling/repoinit/webconsole/RepoInitWebConsoleTest.java
index 6aaeeb3..1b3a6e2 100644
--- a/org.apache.sling.repoinit.webconsole/src/test/java/org/apache/sling/repoinit/webconsole/RepoInitWebConsoleTest.java
+++ b/org.apache.sling.repoinit.webconsole/src/test/java/org/apache/sling/repoinit/webconsole/RepoInitWebConsoleTest.java
@@ -50,19 +50,24 @@
private RepoInitParser parser;
private SlingRepository slingRepository;
private JcrRepoInitOpsProcessor processor;
+ private RepoInitWebConsole webConsole;
@Before
- public void setup() throws RepoInitParsingException, LoginException, RepositoryException {
+ public void setup() throws RepoInitParsingException, LoginException, RepositoryException, IOException {
context.request().setServletPath("/system/console/");
this.parser = mock(RepoInitParser.class);
+ context.registerService(RepoInitParser.class, parser);
this.slingRepository = mock(SlingRepository.class);
when(slingRepository.loginAdministrative(null)).thenReturn(mock(Session.class));
this.processor = mock(JcrRepoInitOpsProcessor.class);
when(parser.parse(any())).thenReturn(Collections.emptyList());
+ context.registerService(JcrRepoInitOpsProcessor.class, processor);
+
+ webConsole = new RepoInitWebConsole(context.componentContext(), slingRepository);
+
}
public void testDoGetRequest(String resource, String type) throws ServletException, IOException {
- RepoInitWebConsole webConsole = new RepoInitWebConsole(parser, slingRepository, processor);
context.request().setPathInfo("repoinit/" + resource);
webConsole.doGet(context.request(), context.response());
assertEquals(200, context.response().getStatus());
@@ -88,7 +93,6 @@
@Test
public void testGetHtml() throws ServletException, IOException {
- RepoInitWebConsole webConsole = new RepoInitWebConsole(parser, slingRepository, processor);
context.request().setPathInfo("repoinit");
webConsole.doGet(context.request(), context.response());
assertEquals(200, context.response().getStatus());
@@ -99,14 +103,12 @@
@Test
public void testConsoleInfo() throws IOException {
- RepoInitWebConsole webConsole = new RepoInitWebConsole(parser, slingRepository, processor);
assertEquals(RepoInitWebConsole.CONSOLE_LABEL, webConsole.getLabel());
assertEquals(RepoInitWebConsole.CONSOLE_TITLE, webConsole.getTitle());
}
@Test
public void testPostValid() throws ServletException, IOException {
- RepoInitWebConsole webConsole = new RepoInitWebConsole(parser, slingRepository, processor);
context.request().setContent("create user".getBytes());
webConsole.doPost(context.request(), context.response());
@@ -119,7 +121,6 @@
@Test
public void testPostFailure() throws ServletException, IOException, RepoInitParsingException {
when(parser.parse(any())).thenThrow(new RepoInitParsingException("Failed because bad", null));
- RepoInitWebConsole webConsole = new RepoInitWebConsole(parser, slingRepository, processor);
context.request().setContent("create user".getBytes());
webConsole.doPost(context.request(), context.response());
@@ -133,7 +134,6 @@
@Test
public void testPostExecute() throws ServletException, IOException, RepoInitParsingException {
- RepoInitWebConsole webConsole = new RepoInitWebConsole(parser, slingRepository, processor);
context.request().setContent("create user".getBytes());
context.request().addRequestParameter("execute", "true");
@@ -148,7 +148,6 @@
@Test
public void testPostExecuteFailure() throws ServletException, IOException, RepoInitParsingException {
doThrow(new RuntimeException("ERROR")).when(processor).apply(any(), any());
- RepoInitWebConsole webConsole = new RepoInitWebConsole(parser, slingRepository, processor);
context.request().setContent("create user".getBytes());
context.request().addRequestParameter("execute", "true");