Script
metaclass.
diff --git a/bundle/src/main/groovy/org/cid15/aem/groovy/console/api/StarImport.groovy b/bundle/src/main/groovy/be/orbinson/aem/groovy/console/api/StarImport.groovy
similarity index 95%
rename from bundle/src/main/groovy/org/cid15/aem/groovy/console/api/StarImport.groovy
rename to bundle/src/main/groovy/be/orbinson/aem/groovy/console/api/StarImport.groovy
index 421cf630..8c8505d5 100644
--- a/bundle/src/main/groovy/org/cid15/aem/groovy/console/api/StarImport.groovy
+++ b/bundle/src/main/groovy/be/orbinson/aem/groovy/console/api/StarImport.groovy
@@ -1,4 +1,4 @@
-package org.cid15.aem.groovy.console.api
+package be.orbinson.aem.groovy.console.api
import groovy.transform.Sortable
import groovy.transform.ToString
diff --git a/bundle/src/main/groovy/org/cid15/aem/groovy/console/api/StarImportExtensionProvider.groovy b/bundle/src/main/groovy/be/orbinson/aem/groovy/console/api/StarImportExtensionProvider.groovy
similarity index 91%
rename from bundle/src/main/groovy/org/cid15/aem/groovy/console/api/StarImportExtensionProvider.groovy
rename to bundle/src/main/groovy/be/orbinson/aem/groovy/console/api/StarImportExtensionProvider.groovy
index 02697201..e8f345a7 100644
--- a/bundle/src/main/groovy/org/cid15/aem/groovy/console/api/StarImportExtensionProvider.groovy
+++ b/bundle/src/main/groovy/be/orbinson/aem/groovy/console/api/StarImportExtensionProvider.groovy
@@ -1,4 +1,4 @@
-package org.cid15.aem.groovy.console.api
+package be.orbinson.aem.groovy.console.api
/**
* Services may implement this interface to supply additional star imports to the compiler configuration for Groovy
diff --git a/bundle/src/main/groovy/org/cid15/aem/groovy/console/api/context/JobScriptContext.groovy b/bundle/src/main/groovy/be/orbinson/aem/groovy/console/api/context/JobScriptContext.groovy
similarity index 68%
rename from bundle/src/main/groovy/org/cid15/aem/groovy/console/api/context/JobScriptContext.groovy
rename to bundle/src/main/groovy/be/orbinson/aem/groovy/console/api/context/JobScriptContext.groovy
index 23608928..c3b1a50c 100644
--- a/bundle/src/main/groovy/org/cid15/aem/groovy/console/api/context/JobScriptContext.groovy
+++ b/bundle/src/main/groovy/be/orbinson/aem/groovy/console/api/context/JobScriptContext.groovy
@@ -1,6 +1,6 @@
-package org.cid15.aem.groovy.console.api.context
+package be.orbinson.aem.groovy.console.api.context
-import org.cid15.aem.groovy.console.api.JobProperties
+import be.orbinson.aem.groovy.console.api.JobProperties
/**
* Script context for scheduled jobs.
diff --git a/bundle/src/main/groovy/org/cid15/aem/groovy/console/api/context/ScriptContext.groovy b/bundle/src/main/groovy/be/orbinson/aem/groovy/console/api/context/ScriptContext.groovy
similarity index 94%
rename from bundle/src/main/groovy/org/cid15/aem/groovy/console/api/context/ScriptContext.groovy
rename to bundle/src/main/groovy/be/orbinson/aem/groovy/console/api/context/ScriptContext.groovy
index a5d5c1c5..6e22af8f 100644
--- a/bundle/src/main/groovy/org/cid15/aem/groovy/console/api/context/ScriptContext.groovy
+++ b/bundle/src/main/groovy/be/orbinson/aem/groovy/console/api/context/ScriptContext.groovy
@@ -1,4 +1,4 @@
-package org.cid15.aem.groovy.console.api.context
+package be.orbinson.aem.groovy.console.api.context
import org.apache.sling.api.resource.ResourceResolver
diff --git a/bundle/src/main/groovy/org/cid15/aem/groovy/console/api/context/ScriptData.groovy b/bundle/src/main/groovy/be/orbinson/aem/groovy/console/api/context/ScriptData.groovy
similarity index 90%
rename from bundle/src/main/groovy/org/cid15/aem/groovy/console/api/context/ScriptData.groovy
rename to bundle/src/main/groovy/be/orbinson/aem/groovy/console/api/context/ScriptData.groovy
index 3c67893d..5708548d 100644
--- a/bundle/src/main/groovy/org/cid15/aem/groovy/console/api/context/ScriptData.groovy
+++ b/bundle/src/main/groovy/be/orbinson/aem/groovy/console/api/context/ScriptData.groovy
@@ -1,4 +1,4 @@
-package org.cid15.aem.groovy.console.api.context
+package be.orbinson.aem.groovy.console.api.context
import org.apache.sling.api.resource.ResourceResolver
diff --git a/bundle/src/main/groovy/org/cid15/aem/groovy/console/api/context/ServletScriptContext.groovy b/bundle/src/main/groovy/be/orbinson/aem/groovy/console/api/context/ServletScriptContext.groovy
similarity index 90%
rename from bundle/src/main/groovy/org/cid15/aem/groovy/console/api/context/ServletScriptContext.groovy
rename to bundle/src/main/groovy/be/orbinson/aem/groovy/console/api/context/ServletScriptContext.groovy
index 4bbfc512..3d644ab3 100644
--- a/bundle/src/main/groovy/org/cid15/aem/groovy/console/api/context/ServletScriptContext.groovy
+++ b/bundle/src/main/groovy/be/orbinson/aem/groovy/console/api/context/ServletScriptContext.groovy
@@ -1,4 +1,4 @@
-package org.cid15.aem.groovy.console.api.context
+package be.orbinson.aem.groovy.console.api.context
import org.apache.sling.api.SlingHttpServletRequest
import org.apache.sling.api.SlingHttpServletResponse
diff --git a/bundle/src/main/groovy/org/cid15/aem/groovy/console/api/impl/RequestScriptContext.groovy b/bundle/src/main/groovy/be/orbinson/aem/groovy/console/api/impl/RequestScriptContext.groovy
similarity index 79%
rename from bundle/src/main/groovy/org/cid15/aem/groovy/console/api/impl/RequestScriptContext.groovy
rename to bundle/src/main/groovy/be/orbinson/aem/groovy/console/api/impl/RequestScriptContext.groovy
index 2eafc844..a67cb792 100644
--- a/bundle/src/main/groovy/org/cid15/aem/groovy/console/api/impl/RequestScriptContext.groovy
+++ b/bundle/src/main/groovy/be/orbinson/aem/groovy/console/api/impl/RequestScriptContext.groovy
@@ -1,12 +1,12 @@
-package org.cid15.aem.groovy.console.api.impl
+package be.orbinson.aem.groovy.console.api.impl
+import be.orbinson.aem.groovy.console.api.context.ServletScriptContext
import groovy.transform.TupleConstructor
import org.apache.sling.api.SlingHttpServletRequest
import org.apache.sling.api.SlingHttpServletResponse
import org.apache.sling.api.resource.ResourceResolver
-import org.cid15.aem.groovy.console.api.context.ServletScriptContext
-import static org.cid15.aem.groovy.console.constants.GroovyConsoleConstants.DATA
+import static be.orbinson.aem.groovy.console.constants.GroovyConsoleConstants.DATA
/**
* Script context for request-based (i.e. via the console) script executions.
diff --git a/bundle/src/main/groovy/org/cid15/aem/groovy/console/api/impl/RequestScriptData.groovy b/bundle/src/main/groovy/be/orbinson/aem/groovy/console/api/impl/RequestScriptData.groovy
similarity index 61%
rename from bundle/src/main/groovy/org/cid15/aem/groovy/console/api/impl/RequestScriptData.groovy
rename to bundle/src/main/groovy/be/orbinson/aem/groovy/console/api/impl/RequestScriptData.groovy
index 15163cad..94bddf52 100644
--- a/bundle/src/main/groovy/org/cid15/aem/groovy/console/api/impl/RequestScriptData.groovy
+++ b/bundle/src/main/groovy/be/orbinson/aem/groovy/console/api/impl/RequestScriptData.groovy
@@ -1,13 +1,13 @@
-package org.cid15.aem.groovy.console.api.impl
+package be.orbinson.aem.groovy.console.api.impl
+import be.orbinson.aem.groovy.console.api.context.ScriptData
import groovy.transform.TupleConstructor
import org.apache.sling.api.SlingHttpServletRequest
import org.apache.sling.api.resource.ResourceResolver
-import org.cid15.aem.groovy.console.api.context.ScriptData
-import static org.cid15.aem.groovy.console.constants.GroovyConsoleConstants.EXTENSION_GROOVY
-import static org.cid15.aem.groovy.console.constants.GroovyConsoleConstants.FILE_NAME
-import static org.cid15.aem.groovy.console.constants.GroovyConsoleConstants.SCRIPT
+import static be.orbinson.aem.groovy.console.constants.GroovyConsoleConstants.EXTENSION_GROOVY
+import static be.orbinson.aem.groovy.console.constants.GroovyConsoleConstants.FILE_NAME
+import static be.orbinson.aem.groovy.console.constants.GroovyConsoleConstants.SCRIPT
@TupleConstructor
class RequestScriptData implements ScriptData {
diff --git a/bundle/src/main/groovy/be/orbinson/aem/groovy/console/api/impl/ResourceScriptContext.groovy b/bundle/src/main/groovy/be/orbinson/aem/groovy/console/api/impl/ResourceScriptContext.groovy
new file mode 100644
index 00000000..7eb75775
--- /dev/null
+++ b/bundle/src/main/groovy/be/orbinson/aem/groovy/console/api/impl/ResourceScriptContext.groovy
@@ -0,0 +1,23 @@
+package be.orbinson.aem.groovy.console.api.impl
+
+import be.orbinson.aem.groovy.console.api.context.ScriptContext
+import groovy.transform.TupleConstructor
+import org.apache.sling.api.resource.ResourceResolver
+
+@TupleConstructor
+class ResourceScriptContext implements ScriptContext {
+ ResourceResolver resourceResolver
+
+ ByteArrayOutputStream outputStream
+
+ PrintStream printStream
+
+ String script
+
+ String data
+
+ @Override
+ public String getUserId() {
+ return resourceResolver.userID
+ }
+}
diff --git a/bundle/src/main/groovy/org/cid15/aem/groovy/console/api/impl/ScheduledJobScriptContext.groovy b/bundle/src/main/groovy/be/orbinson/aem/groovy/console/api/impl/ScheduledJobScriptContext.groovy
similarity index 76%
rename from bundle/src/main/groovy/org/cid15/aem/groovy/console/api/impl/ScheduledJobScriptContext.groovy
rename to bundle/src/main/groovy/be/orbinson/aem/groovy/console/api/impl/ScheduledJobScriptContext.groovy
index 227854e8..8e1a8259 100644
--- a/bundle/src/main/groovy/org/cid15/aem/groovy/console/api/impl/ScheduledJobScriptContext.groovy
+++ b/bundle/src/main/groovy/be/orbinson/aem/groovy/console/api/impl/ScheduledJobScriptContext.groovy
@@ -1,9 +1,9 @@
-package org.cid15.aem.groovy.console.api.impl
+package be.orbinson.aem.groovy.console.api.impl
+import be.orbinson.aem.groovy.console.api.JobProperties
+import be.orbinson.aem.groovy.console.api.context.JobScriptContext
import groovy.transform.TupleConstructor
import org.apache.sling.api.resource.ResourceResolver
-import org.cid15.aem.groovy.console.api.JobProperties
-import org.cid15.aem.groovy.console.api.context.JobScriptContext
@TupleConstructor
class ScheduledJobScriptContext implements JobScriptContext {
diff --git a/bundle/src/main/groovy/org/cid15/aem/groovy/console/audit/AuditRecord.groovy b/bundle/src/main/groovy/be/orbinson/aem/groovy/console/audit/AuditRecord.groovy
similarity index 86%
rename from bundle/src/main/groovy/org/cid15/aem/groovy/console/audit/AuditRecord.groovy
rename to bundle/src/main/groovy/be/orbinson/aem/groovy/console/audit/AuditRecord.groovy
index c92b249d..4472868f 100644
--- a/bundle/src/main/groovy/org/cid15/aem/groovy/console/audit/AuditRecord.groovy
+++ b/bundle/src/main/groovy/be/orbinson/aem/groovy/console/audit/AuditRecord.groovy
@@ -1,10 +1,10 @@
-package org.cid15.aem.groovy.console.audit
+package be.orbinson.aem.groovy.console.audit
+import be.orbinson.aem.groovy.console.response.RunScriptResponse
+import be.orbinson.aem.groovy.console.response.impl.DefaultRunScriptResponse
import com.day.text.Text
import groovy.transform.ToString
import org.apache.sling.api.resource.Resource
-import org.cid15.aem.groovy.console.response.RunScriptResponse
-import org.cid15.aem.groovy.console.response.impl.DefaultRunScriptResponse
@ToString(includePackage = false, includes = ["path"])
class AuditRecord implements RunScriptResponse {
diff --git a/bundle/src/main/groovy/org/cid15/aem/groovy/console/audit/AuditService.groovy b/bundle/src/main/groovy/be/orbinson/aem/groovy/console/audit/AuditService.groovy
similarity index 95%
rename from bundle/src/main/groovy/org/cid15/aem/groovy/console/audit/AuditService.groovy
rename to bundle/src/main/groovy/be/orbinson/aem/groovy/console/audit/AuditService.groovy
index d1b7088e..85455fe5 100644
--- a/bundle/src/main/groovy/org/cid15/aem/groovy/console/audit/AuditService.groovy
+++ b/bundle/src/main/groovy/be/orbinson/aem/groovy/console/audit/AuditService.groovy
@@ -1,6 +1,6 @@
-package org.cid15.aem.groovy.console.audit
+package be.orbinson.aem.groovy.console.audit
-import org.cid15.aem.groovy.console.response.RunScriptResponse
+import be.orbinson.aem.groovy.console.response.RunScriptResponse
interface AuditService {
diff --git a/bundle/src/main/groovy/org/cid15/aem/groovy/console/audit/impl/DefaultAuditService.groovy b/bundle/src/main/groovy/be/orbinson/aem/groovy/console/audit/impl/DefaultAuditService.groovy
similarity index 76%
rename from bundle/src/main/groovy/org/cid15/aem/groovy/console/audit/impl/DefaultAuditService.groovy
rename to bundle/src/main/groovy/be/orbinson/aem/groovy/console/audit/impl/DefaultAuditService.groovy
index 025803b0..a56adbe7 100644
--- a/bundle/src/main/groovy/org/cid15/aem/groovy/console/audit/impl/DefaultAuditService.groovy
+++ b/bundle/src/main/groovy/be/orbinson/aem/groovy/console/audit/impl/DefaultAuditService.groovy
@@ -1,16 +1,17 @@
-package org.cid15.aem.groovy.console.audit.impl
-
+package be.orbinson.aem.groovy.console.audit.impl
+
+import be.orbinson.aem.groovy.console.audit.AuditRecord
+import be.orbinson.aem.groovy.console.audit.AuditService
+import be.orbinson.aem.groovy.console.configuration.ConfigurationService
+import be.orbinson.aem.groovy.console.constants.GroovyConsoleConstants
+import be.orbinson.aem.groovy.console.response.RunScriptResponse
+import com.day.cq.commons.jcr.JcrConstants
import com.day.cq.commons.jcr.JcrUtil
-import org.cid15.aem.groovy.console.audit.AuditService
-import org.cid15.aem.groovy.console.configuration.ConfigurationService
import groovy.transform.Synchronized
import groovy.util.logging.Slf4j
import org.apache.sling.api.resource.PersistenceException
import org.apache.sling.api.resource.ResourceResolver
import org.apache.sling.api.resource.ResourceResolverFactory
-import org.cid15.aem.groovy.console.audit.AuditRecord
-import org.cid15.aem.groovy.console.constants.GroovyConsoleConstants
-import org.cid15.aem.groovy.console.response.RunScriptResponse
import org.osgi.service.component.annotations.Activate
import org.osgi.service.component.annotations.Component
import org.osgi.service.component.annotations.Reference
@@ -19,20 +20,9 @@ import javax.jcr.Node
import javax.jcr.RepositoryException
import javax.jcr.Session
+import static be.orbinson.aem.groovy.console.constants.GroovyConsoleConstants.*
import static com.day.cq.commons.jcr.JcrConstants.MIX_CREATED
import static com.day.cq.commons.jcr.JcrConstants.NT_UNSTRUCTURED
-import static org.cid15.aem.groovy.console.constants.GroovyConsoleConstants.AUDIT_JOB_PROPERTIES
-import static org.cid15.aem.groovy.console.constants.GroovyConsoleConstants.AUDIT_NODE_NAME
-import static org.cid15.aem.groovy.console.constants.GroovyConsoleConstants.AUDIT_PATH
-import static org.cid15.aem.groovy.console.constants.GroovyConsoleConstants.AUDIT_RECORD_NODE_PREFIX
-import static org.cid15.aem.groovy.console.constants.GroovyConsoleConstants.DATA
-import static org.cid15.aem.groovy.console.constants.GroovyConsoleConstants.EXCEPTION_STACK_TRACE
-import static org.cid15.aem.groovy.console.constants.GroovyConsoleConstants.JOB_ID
-import static org.cid15.aem.groovy.console.constants.GroovyConsoleConstants.OUTPUT
-import static org.cid15.aem.groovy.console.constants.GroovyConsoleConstants.PATH_CONSOLE_ROOT
-import static org.cid15.aem.groovy.console.constants.GroovyConsoleConstants.RESULT
-import static org.cid15.aem.groovy.console.constants.GroovyConsoleConstants.RUNNING_TIME
-import static org.cid15.aem.groovy.console.constants.GroovyConsoleConstants.SCRIPT
@Component(service = AuditService, immediate = true)
@Slf4j("LOG")
@@ -172,11 +162,6 @@ class DefaultAuditService implements AuditService {
getAuditRecordsForDateRange(allScheduledJobAuditRecords, startDate, endDate)
}
- @Activate
- void activate() {
- checkAuditNode()
- }
-
@Synchronized
private Node addAuditRecordNode(ResourceResolver resourceResolver, String userId) {
def date = Calendar.instance
@@ -187,31 +172,21 @@ class DefaultAuditService implements AuditService {
def adminSession = resourceResolver.adaptTo(Session)
def auditRecordParentNode = JcrUtil.createPath("$AUDIT_PATH/$userId/$year/$month/$day", NT_UNSTRUCTURED,
- adminSession)
+ adminSession)
def auditRecordNode = JcrUtil.createUniqueNode(auditRecordParentNode, AUDIT_RECORD_NODE_PREFIX, NT_UNSTRUCTURED,
- adminSession)
+ adminSession)
- auditRecordNode.addMixin(MIX_CREATED)
+ try {
+ auditRecordNode.addMixin(MIX_CREATED)
+ } catch (e) {
+ // unsupported for jcr mocks
+ auditRecordNode.setProperty(JcrConstants.JCR_CREATED, Calendar.getInstance())
+ }
auditRecordNode
}
- private void checkAuditNode() {
- withResourceResolver { ResourceResolver resourceResolver ->
- def session = resourceResolver.adaptTo(Session)
- def consoleRootNode = session.getNode(PATH_CONSOLE_ROOT)
-
- if (!consoleRootNode.hasNode(AUDIT_NODE_NAME)) {
- LOG.info("audit node does not exist, adding")
-
- consoleRootNode.addNode(AUDIT_NODE_NAME, NT_UNSTRUCTURED)
-
- session.save()
- }
- }
- }
-
private void setAuditRecordNodeProperties(Node auditRecordNode, RunScriptResponse response) {
auditRecordNode.setProperty(SCRIPT, response.script)
@@ -225,14 +200,14 @@ class DefaultAuditService implements AuditService {
if (response.jobProperties) {
response.jobProperties.toMap()
- .findAll { entry -> AUDIT_JOB_PROPERTIES.contains(entry.key) }
- .each { entry ->
- if (entry.value instanceof String) {
- auditRecordNode.setProperty(entry.key, entry.value as String)
- } else if (entry.value instanceof Calendar) {
- auditRecordNode.setProperty(entry.key, entry.value as Calendar)
+ .findAll { entry -> AUDIT_JOB_PROPERTIES.contains(entry.key) }
+ .each { entry ->
+ if (entry.value instanceof String) {
+ auditRecordNode.setProperty(entry.key, entry.value as String)
+ } else if (entry.value instanceof Calendar) {
+ auditRecordNode.setProperty(entry.key, entry.value as Calendar)
+ }
}
- }
}
if (response.exceptionStackTrace) {
diff --git a/bundle/src/main/groovy/be/orbinson/aem/groovy/console/builders/AbstractContentBuilder.groovy b/bundle/src/main/groovy/be/orbinson/aem/groovy/console/builders/AbstractContentBuilder.groovy
new file mode 100644
index 00000000..799d5379
--- /dev/null
+++ b/bundle/src/main/groovy/be/orbinson/aem/groovy/console/builders/AbstractContentBuilder.groovy
@@ -0,0 +1,37 @@
+package be.orbinson.aem.groovy.console.builders
+
+import javax.jcr.Node
+import javax.jcr.Session
+
+/**
+ * Base class for Page
and Node
builders.
+ */
+abstract class AbstractContentBuilder extends BuilderSupport {
+
+ Session session
+
+ Node currentNode
+
+ AbstractContentBuilder(Session session, Node currentNode) {
+ this.session = session
+ this.currentNode = currentNode
+ }
+
+ @Override
+ void nodeCompleted(parent, node) {
+ session.save()
+
+ currentNode = currentNode.parent
+ }
+
+ @Override
+ void setParent(parent, child) {
+
+ }
+
+ void setProperties(node, properties) {
+ properties.each { name, value ->
+ node.set(name, value)
+ }
+ }
+}
\ No newline at end of file
diff --git a/bundle/src/main/groovy/be/orbinson/aem/groovy/console/builders/NodeBuilder.groovy b/bundle/src/main/groovy/be/orbinson/aem/groovy/console/builders/NodeBuilder.groovy
new file mode 100644
index 00000000..452ada57
--- /dev/null
+++ b/bundle/src/main/groovy/be/orbinson/aem/groovy/console/builders/NodeBuilder.groovy
@@ -0,0 +1,72 @@
+package be.orbinson.aem.groovy.console.builders
+
+import javax.jcr.Node
+import javax.jcr.Session
+
+/**
+ * Builder for JCR content nodes. Each "node" in the syntax tree corresponds to a JCR node in the repository. A new
+ * JCR node is created only if there is no existing node for the current name.
+ *
+ * + * nodeBuilder.etc { + * satirists("sling:Folder") { + * bierce(firstName: "Ambrose", lastName: "Bierce", birthDate: Calendar.instance.updated(year: 1842, month: 5, date: 24)) + * mencken(firstName: "H.L.", lastName: "Mencken", birthDate: Calendar.instance.updated(year: 1880, month: 8, date: 12)) + * other("sling:Folder", "jcr:title": "Other") + * } + * } + *+ * + *
node,
+ * unless the node is a descendant of a jcr:content
node, in which case nodes are treated in the same
+ * manner as NodeBuilder
.
+ *
+ *
+ * pageBuilder.content {
+ * beer {
+ * styles("Styles") {
+ * "jcr:content"("jcr:lastModifiedBy": "me", "jcr:lastModified": Calendar.instance) {
+ * data("sling:Folder")
+ * }
+ * dubbel("Dubbel")
+ * tripel("Tripel")
+ * saison("Saison")
+ * }
+ * breweries("Breweries", "jcr:lastModifiedBy": "me", "jcr:lastModified": Calendar.instance)
+ * }
+ * }
+ *
+ *
+ *
+ * - A single string argument is used to set the page title rather than the node type ("styles").
+ * - Descendants of
jcr:content
nodes are not created with the cq:Page
type by
+ * default and can have their own node type specified as described for the Node builder ("data").
+ * - Page properties can be passed directly as arguments on the page node without explicitly creating a
+ *
jcr:content
node first ("breweries").
+ *
+ */
+class PageBuilder extends AbstractContentBuilder {
+
+ private static final String NT_PAGE_CONTENT = "cq:PageContent"
+
+ PageBuilder(Session session) {
+ super(session, session.rootNode)
+ }
+
+ PageBuilder(Session session, Page rootPage) {
+ super(session, session.getNode(rootPage.path))
+ }
+
+ PageBuilder(Session session, String rootPath) {
+ super(session, session.getNode(rootPath))
+ }
+
+ @Override
+ def createNode(name) {
+ if (isContentNode(name)) {
+ currentNode = currentNode.getOrAddNode(name)
+ } else {
+ currentNode = getOrAddPage(name: name)
+ }
+
+ currentNode
+ }
+
+ @Override
+ def createNode(name, title) {
+ if (isContentNode(name)) {
+ currentNode = currentNode.getOrAddNode(name, title)
+ } else {
+ currentNode = getOrAddPage(name: name, title: title)
+ }
+
+ currentNode
+ }
+
+ @Override
+ def createNode(name, Map properties) {
+ if (isContentNode(name)) {
+ currentNode = currentNode.getOrAddNode(name)
+
+ setProperties(currentNode, properties)
+ } else {
+ currentNode = getOrAddPage(name: name, properties: properties)
+ }
+
+ currentNode
+ }
+
+ @Override
+ def createNode(name, Map properties, value) {
+ if (isContentNode(name)) {
+ currentNode = currentNode.getOrAddNode(name, value)
+
+ setProperties(currentNode, properties)
+ } else {
+ currentNode = getOrAddPage(name: name, title: value, properties: properties)
+ }
+
+ currentNode
+ }
+
+ private Node getOrAddPage(map) {
+ def pageNode = currentNode.getOrAddNode(map.name, NameConstants.NT_PAGE)
+ def contentNode = pageNode.getOrAddNode(JcrConstants.JCR_CONTENT, NT_PAGE_CONTENT)
+
+ if (map.title) {
+ contentNode.set(JcrConstants.JCR_TITLE, map.title)
+ }
+
+ if (map.properties) {
+ setProperties(contentNode, map.properties)
+ }
+
+ pageNode
+ }
+
+ private boolean isContentNode(name) {
+ name == JcrConstants.JCR_CONTENT || currentNode.path.contains(JcrConstants.JCR_CONTENT)
+ }
+}
\ No newline at end of file
diff --git a/bundle/src/main/groovy/org/cid15/aem/groovy/console/components/AboutPanel.groovy b/bundle/src/main/groovy/be/orbinson/aem/groovy/console/components/AboutPanel.groovy
similarity index 80%
rename from bundle/src/main/groovy/org/cid15/aem/groovy/console/components/AboutPanel.groovy
rename to bundle/src/main/groovy/be/orbinson/aem/groovy/console/components/AboutPanel.groovy
index 6fa178fd..a1c54f2d 100644
--- a/bundle/src/main/groovy/org/cid15/aem/groovy/console/components/AboutPanel.groovy
+++ b/bundle/src/main/groovy/be/orbinson/aem/groovy/console/components/AboutPanel.groovy
@@ -1,4 +1,4 @@
-package org.cid15.aem.groovy.console.components
+package be.orbinson.aem.groovy.console.components
import org.apache.sling.api.resource.Resource
import org.apache.sling.models.annotations.Model
diff --git a/bundle/src/main/groovy/org/cid15/aem/groovy/console/components/ActiveJobsPanel.groovy b/bundle/src/main/groovy/be/orbinson/aem/groovy/console/components/ActiveJobsPanel.groovy
similarity index 71%
rename from bundle/src/main/groovy/org/cid15/aem/groovy/console/components/ActiveJobsPanel.groovy
rename to bundle/src/main/groovy/be/orbinson/aem/groovy/console/components/ActiveJobsPanel.groovy
index 5ba13b5d..f3fc3dd7 100644
--- a/bundle/src/main/groovy/org/cid15/aem/groovy/console/components/ActiveJobsPanel.groovy
+++ b/bundle/src/main/groovy/be/orbinson/aem/groovy/console/components/ActiveJobsPanel.groovy
@@ -1,7 +1,8 @@
-package org.cid15.aem.groovy.console.components
+package be.orbinson.aem.groovy.console.components
-import org.cid15.aem.groovy.console.GroovyConsoleService
-import org.cid15.aem.groovy.console.api.ActiveJob
+
+import be.orbinson.aem.groovy.console.GroovyConsoleService
+import be.orbinson.aem.groovy.console.api.ActiveJob
import org.apache.sling.api.SlingHttpServletRequest
import org.apache.sling.models.annotations.Model
import org.apache.sling.models.annotations.injectorspecific.OSGiService
diff --git a/bundle/src/main/groovy/org/cid15/aem/groovy/console/components/BindingsPanel.groovy b/bundle/src/main/groovy/be/orbinson/aem/groovy/console/components/BindingsPanel.groovy
similarity index 73%
rename from bundle/src/main/groovy/org/cid15/aem/groovy/console/components/BindingsPanel.groovy
rename to bundle/src/main/groovy/be/orbinson/aem/groovy/console/components/BindingsPanel.groovy
index d09942f3..35419f0e 100644
--- a/bundle/src/main/groovy/org/cid15/aem/groovy/console/components/BindingsPanel.groovy
+++ b/bundle/src/main/groovy/be/orbinson/aem/groovy/console/components/BindingsPanel.groovy
@@ -1,7 +1,8 @@
-package org.cid15.aem.groovy.console.components
+package be.orbinson.aem.groovy.console.components
-import org.cid15.aem.groovy.console.api.BindingVariable
-import org.cid15.aem.groovy.console.api.impl.RequestScriptContext
+import be.orbinson.aem.groovy.console.api.BindingVariable
+import be.orbinson.aem.groovy.console.api.impl.RequestScriptContext
+import be.orbinson.aem.groovy.console.extension.ExtensionService
import groovy.transform.Memoized
import org.apache.sling.api.SlingHttpServletRequest
import org.apache.sling.api.SlingHttpServletResponse
@@ -9,7 +10,6 @@ import org.apache.sling.models.annotations.Model
import org.apache.sling.models.annotations.injectorspecific.OSGiService
import org.apache.sling.models.annotations.injectorspecific.ScriptVariable
import org.apache.sling.models.annotations.injectorspecific.Self
-import org.cid15.aem.groovy.console.extension.ExtensionService
@Model(adaptables = SlingHttpServletRequest)
class BindingsPanel {
@@ -26,8 +26,8 @@ class BindingsPanel {
@Memoized
Map getBindingVariables() {
def scriptContext = new RequestScriptContext(
- request: request,
- response: response
+ request: request,
+ response: response
)
extensionService.getBindingVariables(scriptContext)
diff --git a/bundle/src/main/groovy/org/cid15/aem/groovy/console/components/Body.groovy b/bundle/src/main/groovy/be/orbinson/aem/groovy/console/components/Body.groovy
similarity index 73%
rename from bundle/src/main/groovy/org/cid15/aem/groovy/console/components/Body.groovy
rename to bundle/src/main/groovy/be/orbinson/aem/groovy/console/components/Body.groovy
index 74a475fb..3bf8f98e 100644
--- a/bundle/src/main/groovy/org/cid15/aem/groovy/console/components/Body.groovy
+++ b/bundle/src/main/groovy/be/orbinson/aem/groovy/console/components/Body.groovy
@@ -1,9 +1,10 @@
-package org.cid15.aem.groovy.console.components
+package be.orbinson.aem.groovy.console.components
-import org.cid15.aem.groovy.console.GroovyConsoleService
-import org.cid15.aem.groovy.console.audit.AuditRecord
-import org.cid15.aem.groovy.console.audit.AuditService
-import org.cid15.aem.groovy.console.configuration.ConfigurationService
+
+import be.orbinson.aem.groovy.console.GroovyConsoleService
+import be.orbinson.aem.groovy.console.audit.AuditRecord
+import be.orbinson.aem.groovy.console.audit.AuditService
+import be.orbinson.aem.groovy.console.configuration.ConfigurationService
import groovy.json.JsonBuilder
import org.apache.sling.api.SlingHttpServletRequest
import org.apache.sling.models.annotations.Model
@@ -12,8 +13,8 @@ import org.apache.sling.models.annotations.injectorspecific.Self
import javax.annotation.PostConstruct
-import static org.cid15.aem.groovy.console.constants.GroovyConsoleConstants.SCRIPT
-import static org.cid15.aem.groovy.console.constants.GroovyConsoleConstants.USER_ID
+import static be.orbinson.aem.groovy.console.constants.GroovyConsoleConstants.SCRIPT
+import static be.orbinson.aem.groovy.console.constants.GroovyConsoleConstants.USER_ID
@Model(adaptables = SlingHttpServletRequest)
class Body {
diff --git a/bundle/src/main/groovy/org/cid15/aem/groovy/console/components/HistoryPanel.groovy b/bundle/src/main/groovy/be/orbinson/aem/groovy/console/components/HistoryPanel.groovy
similarity index 83%
rename from bundle/src/main/groovy/org/cid15/aem/groovy/console/components/HistoryPanel.groovy
rename to bundle/src/main/groovy/be/orbinson/aem/groovy/console/components/HistoryPanel.groovy
index 43bc3ed6..a4c7c929 100644
--- a/bundle/src/main/groovy/org/cid15/aem/groovy/console/components/HistoryPanel.groovy
+++ b/bundle/src/main/groovy/be/orbinson/aem/groovy/console/components/HistoryPanel.groovy
@@ -1,6 +1,6 @@
-package org.cid15.aem.groovy.console.components
+package be.orbinson.aem.groovy.console.components
-import org.cid15.aem.groovy.console.audit.AuditService
+import be.orbinson.aem.groovy.console.audit.AuditService
import org.apache.sling.api.SlingHttpServletRequest
import org.apache.sling.models.annotations.Model
import org.apache.sling.models.annotations.injectorspecific.OSGiService
diff --git a/bundle/src/main/groovy/org/cid15/aem/groovy/console/components/ImportsPanel.groovy b/bundle/src/main/groovy/be/orbinson/aem/groovy/console/components/ImportsPanel.groovy
similarity index 69%
rename from bundle/src/main/groovy/org/cid15/aem/groovy/console/components/ImportsPanel.groovy
rename to bundle/src/main/groovy/be/orbinson/aem/groovy/console/components/ImportsPanel.groovy
index f274fe03..1250a74c 100644
--- a/bundle/src/main/groovy/org/cid15/aem/groovy/console/components/ImportsPanel.groovy
+++ b/bundle/src/main/groovy/be/orbinson/aem/groovy/console/components/ImportsPanel.groovy
@@ -1,10 +1,10 @@
-package org.cid15.aem.groovy.console.components
+package be.orbinson.aem.groovy.console.components
-import org.cid15.aem.groovy.console.api.StarImport
+import be.orbinson.aem.groovy.console.api.StarImport
+import be.orbinson.aem.groovy.console.extension.ExtensionService
import org.apache.sling.api.resource.Resource
import org.apache.sling.models.annotations.Model
import org.apache.sling.models.annotations.injectorspecific.OSGiService
-import org.cid15.aem.groovy.console.extension.ExtensionService
@Model(adaptables = Resource)
class ImportsPanel {
diff --git a/bundle/src/main/groovy/org/cid15/aem/groovy/console/components/Scheduler.groovy b/bundle/src/main/groovy/be/orbinson/aem/groovy/console/components/Scheduler.groovy
similarity index 76%
rename from bundle/src/main/groovy/org/cid15/aem/groovy/console/components/Scheduler.groovy
rename to bundle/src/main/groovy/be/orbinson/aem/groovy/console/components/Scheduler.groovy
index e41d142a..4d190b9c 100644
--- a/bundle/src/main/groovy/org/cid15/aem/groovy/console/components/Scheduler.groovy
+++ b/bundle/src/main/groovy/be/orbinson/aem/groovy/console/components/Scheduler.groovy
@@ -1,6 +1,6 @@
-package org.cid15.aem.groovy.console.components
+package be.orbinson.aem.groovy.console.components
-import org.cid15.aem.groovy.console.configuration.ConfigurationService
+import be.orbinson.aem.groovy.console.configuration.ConfigurationService
import org.apache.sling.api.SlingHttpServletRequest
import org.apache.sling.models.annotations.Model
import org.apache.sling.models.annotations.injectorspecific.OSGiService
diff --git a/bundle/src/main/groovy/be/orbinson/aem/groovy/console/components/Toolbar.groovy b/bundle/src/main/groovy/be/orbinson/aem/groovy/console/components/Toolbar.groovy
new file mode 100644
index 00000000..1318d089
--- /dev/null
+++ b/bundle/src/main/groovy/be/orbinson/aem/groovy/console/components/Toolbar.groovy
@@ -0,0 +1,16 @@
+package be.orbinson.aem.groovy.console.components
+
+import be.orbinson.aem.groovy.console.configuration.ConfigurationService
+import org.apache.sling.api.SlingHttpServletRequest
+import org.apache.sling.models.annotations.Model
+import org.apache.sling.models.annotations.injectorspecific.OSGiService
+
+@Model(adaptables = SlingHttpServletRequest)
+class Toolbar {
+ @OSGiService
+ private ConfigurationService configurationService
+
+ boolean isDistributedExecutionEnabled() {
+ configurationService.distributedExecutionEnabled
+ }
+}
diff --git a/bundle/src/main/groovy/org/cid15/aem/groovy/console/configuration/ConfigurationService.groovy b/bundle/src/main/groovy/be/orbinson/aem/groovy/console/configuration/ConfigurationService.groovy
similarity index 77%
rename from bundle/src/main/groovy/org/cid15/aem/groovy/console/configuration/ConfigurationService.groovy
rename to bundle/src/main/groovy/be/orbinson/aem/groovy/console/configuration/ConfigurationService.groovy
index e79605ed..633cae1f 100644
--- a/bundle/src/main/groovy/org/cid15/aem/groovy/console/configuration/ConfigurationService.groovy
+++ b/bundle/src/main/groovy/be/orbinson/aem/groovy/console/configuration/ConfigurationService.groovy
@@ -1,4 +1,4 @@
-package org.cid15.aem.groovy.console.configuration
+package be.orbinson.aem.groovy.console.configuration
import org.apache.sling.api.SlingHttpServletRequest
@@ -58,4 +58,18 @@ interface ConfigurationService {
* @return thread timeout
*/
long getThreadTimeout()
-}
\ No newline at end of file
+
+ /**
+ * Check if distributed execution is enabled. In this way scripts can be replicated and auto executed on replication.
+ *
+ * @return true is distributed execution is enabled
+ */
+ boolean isDistributedExecutionEnabled()
+
+ /**
+ * Check if the service is running on an author instance
+ *
+ * @return true if the author runmode is present
+ */
+ boolean isAuthor()
+}
diff --git a/bundle/src/main/groovy/org/cid15/aem/groovy/console/configuration/impl/DefaultConfigurationService.groovy b/bundle/src/main/groovy/be/orbinson/aem/groovy/console/configuration/impl/DefaultConfigurationService.groovy
similarity index 79%
rename from bundle/src/main/groovy/org/cid15/aem/groovy/console/configuration/impl/DefaultConfigurationService.groovy
rename to bundle/src/main/groovy/be/orbinson/aem/groovy/console/configuration/impl/DefaultConfigurationService.groovy
index d407bd3c..d0cc3bf7 100755
--- a/bundle/src/main/groovy/org/cid15/aem/groovy/console/configuration/impl/DefaultConfigurationService.groovy
+++ b/bundle/src/main/groovy/be/orbinson/aem/groovy/console/configuration/impl/DefaultConfigurationService.groovy
@@ -1,12 +1,13 @@
-package org.cid15.aem.groovy.console.configuration.impl
+package be.orbinson.aem.groovy.console.configuration.impl
+import be.orbinson.aem.groovy.console.configuration.ConfigurationService
import groovy.transform.Synchronized
import groovy.util.logging.Slf4j
import org.apache.jackrabbit.api.security.user.User
import org.apache.jackrabbit.api.security.user.UserManager
import org.apache.sling.api.SlingHttpServletRequest
import org.apache.sling.api.resource.ResourceResolverFactory
-import org.cid15.aem.groovy.console.configuration.ConfigurationService
+import org.osgi.framework.BundleContext
import org.osgi.service.component.annotations.Activate
import org.osgi.service.component.annotations.Component
import org.osgi.service.component.annotations.Modified
@@ -35,6 +36,10 @@ class DefaultConfigurationService implements ConfigurationService {
private long threadTimeout
+ private boolean distributedExecutionEnabled
+
+ private boolean author
+
@Override
boolean hasPermission(SlingHttpServletRequest request) {
isAdminOrAllowedGroupMember(request, allowedGroups)
@@ -70,10 +75,20 @@ class DefaultConfigurationService implements ConfigurationService {
threadTimeout
}
+ @Override
+ boolean isDistributedExecutionEnabled() {
+ distributedExecutionEnabled
+ }
+
+ @Override
+ boolean isAuthor() {
+ return author
+ }
+
@Activate
@Modified
@Synchronized
- void activate(ConfigurationServiceProperties properties) {
+ void activate(ConfigurationServiceProperties properties, BundleContext bundleContext) {
emailEnabled = properties.emailEnabled()
emailRecipients = (properties.emailRecipients() ?: []).findAll() as Set
allowedGroups = (properties.allowedGroups() ?: []).findAll() as Set
@@ -81,6 +96,10 @@ class DefaultConfigurationService implements ConfigurationService {
auditDisabled = properties.auditDisabled()
displayAllAuditRecords = properties.auditDisplayAll()
threadTimeout = properties.threadTimeout()
+ distributedExecutionEnabled = properties.distributedExecutionEnabled()
+ if (bundleContext.getProperty("sling.run.modes") != null) {
+ author = bundleContext.getProperty("sling.run.modes").contains("author")
+ }
}
private boolean isAdminOrAllowedGroupMember(SlingHttpServletRequest request, Set groupIds) {
diff --git a/bundle/src/main/groovy/org/cid15/aem/groovy/console/constants/GroovyConsoleConstants.groovy b/bundle/src/main/groovy/be/orbinson/aem/groovy/console/constants/GroovyConsoleConstants.groovy
similarity index 71%
rename from bundle/src/main/groovy/org/cid15/aem/groovy/console/constants/GroovyConsoleConstants.groovy
rename to bundle/src/main/groovy/be/orbinson/aem/groovy/console/constants/GroovyConsoleConstants.groovy
index c0251e3e..3bf9428d 100644
--- a/bundle/src/main/groovy/org/cid15/aem/groovy/console/constants/GroovyConsoleConstants.groovy
+++ b/bundle/src/main/groovy/be/orbinson/aem/groovy/console/constants/GroovyConsoleConstants.groovy
@@ -1,15 +1,17 @@
-package org.cid15.aem.groovy.console.constants
+package be.orbinson.aem.groovy.console.constants
import com.google.common.base.Charsets
import com.google.common.net.MediaType
class GroovyConsoleConstants {
- public static final String SYSTEM_USER_NAME = "groovy-console-system-user"
+ public static final String SYSTEM_USER_NAME = "aem-groovy-console-service"
public static final String PATH_CONSOLE_ROOT = "/var/groovyconsole"
- public static final String PATH_SCRIPTS_FOLDER = "$PATH_CONSOLE_ROOT/scripts"
+ public static final String PATH_SCRIPTS_FOLDER = "/conf/groovyconsole/scripts"
+
+ public static final String PATH_REPLICATION_FOLDER = "/conf/groovyconsole/replication"
public static final String EXTENSION_GROOVY = ".groovy"
@@ -70,24 +72,24 @@ class GroovyConsoleConstants {
public static final String JOB_TOPIC = "groovyconsole/job"
public static final Set JOB_PROPERTIES = [
- JOB_TITLE,
- JOB_DESCRIPTION,
- SCRIPT,
- DATA,
- CRON_EXPRESSION,
- EMAIL_TO,
- MEDIA_TYPE
+ JOB_TITLE,
+ JOB_DESCRIPTION,
+ SCRIPT,
+ DATA,
+ CRON_EXPRESSION,
+ EMAIL_TO,
+ MEDIA_TYPE
] as Set
// audit
public static final Set AUDIT_JOB_PROPERTIES = [
- SCHEDULED_JOB_ID,
- JOB_TITLE,
- JOB_DESCRIPTION,
- CRON_EXPRESSION,
- EMAIL_TO,
- MEDIA_TYPE
+ SCHEDULED_JOB_ID,
+ JOB_TITLE,
+ JOB_DESCRIPTION,
+ CRON_EXPRESSION,
+ EMAIL_TO,
+ MEDIA_TYPE
] as Set
public static final String AUDIT_NODE_NAME = "audit"
@@ -97,10 +99,10 @@ class GroovyConsoleConstants {
public static final String AUDIT_PATH = "$PATH_CONSOLE_ROOT/$AUDIT_NODE_NAME"
public static final Map MEDIA_TYPE_EXTENSIONS = [
- (MediaType.CSV_UTF_8.withoutParameters().toString()): "csv",
- (MediaType.PLAIN_TEXT_UTF_8.withoutParameters().toString()): "txt",
- (MediaType.HTML_UTF_8.withoutParameters().toString()): "html",
- (MediaType.XML_UTF_8.withoutParameters().toString()): "xml"
+ (MediaType.CSV_UTF_8.withoutParameters().toString()) : "csv",
+ (MediaType.PLAIN_TEXT_UTF_8.withoutParameters().toString()): "txt",
+ (MediaType.HTML_UTF_8.withoutParameters().toString()) : "html",
+ (MediaType.XML_UTF_8.withoutParameters().toString()) : "xml"
]
private GroovyConsoleConstants() {
diff --git a/bundle/src/main/groovy/org/cid15/aem/groovy/console/extension/ExtensionService.groovy b/bundle/src/main/groovy/be/orbinson/aem/groovy/console/extension/ExtensionService.groovy
similarity index 57%
rename from bundle/src/main/groovy/org/cid15/aem/groovy/console/extension/ExtensionService.groovy
rename to bundle/src/main/groovy/be/orbinson/aem/groovy/console/extension/ExtensionService.groovy
index 33ece746..90e9863f 100644
--- a/bundle/src/main/groovy/org/cid15/aem/groovy/console/extension/ExtensionService.groovy
+++ b/bundle/src/main/groovy/be/orbinson/aem/groovy/console/extension/ExtensionService.groovy
@@ -1,15 +1,15 @@
-package org.cid15.aem.groovy.console.extension
+package be.orbinson.aem.groovy.console.extension
-import org.cid15.aem.groovy.console.api.BindingExtensionProvider
-import org.cid15.aem.groovy.console.api.CompilationCustomizerExtensionProvider
-import org.cid15.aem.groovy.console.api.context.ScriptContext
-import org.cid15.aem.groovy.console.api.StarImportExtensionProvider
+import be.orbinson.aem.groovy.console.api.BindingExtensionProvider
+import be.orbinson.aem.groovy.console.api.CompilationCustomizerExtensionProvider
+import be.orbinson.aem.groovy.console.api.StarImportExtensionProvider
+import be.orbinson.aem.groovy.console.api.context.ScriptContext
/**
* Service that dynamically binds extensions providing additional script bindings, star imports, and script metaclasses.
*/
interface ExtensionService extends BindingExtensionProvider, CompilationCustomizerExtensionProvider,
- StarImportExtensionProvider {
+ StarImportExtensionProvider {
/**
* Get a list of all script metaclass closures for bound extensions.
diff --git a/bundle/src/main/groovy/be/orbinson/aem/groovy/console/extension/impl/DefaultBindingExtensionProvider.groovy b/bundle/src/main/groovy/be/orbinson/aem/groovy/console/extension/impl/DefaultBindingExtensionProvider.groovy
new file mode 100644
index 00000000..6f60ec58
--- /dev/null
+++ b/bundle/src/main/groovy/be/orbinson/aem/groovy/console/extension/impl/DefaultBindingExtensionProvider.groovy
@@ -0,0 +1,87 @@
+package be.orbinson.aem.groovy.console.extension.impl
+
+import be.orbinson.aem.groovy.console.api.BindingExtensionProvider
+import be.orbinson.aem.groovy.console.api.BindingVariable
+import be.orbinson.aem.groovy.console.api.context.ScriptContext
+import be.orbinson.aem.groovy.console.api.context.ServletScriptContext
+import be.orbinson.aem.groovy.console.builders.PageBuilder
+import be.orbinson.aem.groovy.console.builders.NodeBuilder
+import com.day.cq.search.QueryBuilder
+import com.day.cq.wcm.api.PageManager
+import groovy.json.JsonException
+import groovy.json.JsonSlurper
+import org.apache.sling.api.SlingHttpServletRequest
+import org.apache.sling.api.SlingHttpServletResponse
+import org.apache.sling.api.resource.ResourceResolver
+import org.osgi.framework.BundleContext
+import org.osgi.service.component.annotations.Activate
+import org.osgi.service.component.annotations.Component
+import org.osgi.service.component.annotations.Reference
+import org.slf4j.Logger
+import org.slf4j.LoggerFactory
+
+import javax.jcr.Session
+
+@Component(service = BindingExtensionProvider, immediate = true)
+class DefaultBindingExtensionProvider implements BindingExtensionProvider {
+
+ @Reference
+ private QueryBuilder queryBuilder
+
+ private BundleContext bundleContext
+
+ @Override
+ Map getBindingVariables(ScriptContext scriptContext) {
+ def resourceResolver = scriptContext.resourceResolver
+ def session = resourceResolver.adaptTo(Session)
+
+ def bindingVariables = [
+ log : new BindingVariable(LoggerFactory.getLogger("groovyconsole"), Logger,
+ "http://www.slf4j.org/api/org/slf4j/Logger.html"),
+ session : new BindingVariable(session, Session,
+ "https://developer.adobe.com/experience-manager/reference-materials/spec/javax.jcr/javadocs/jcr-2.0/javax/jcr/Session.html"),
+ pageManager : new BindingVariable(resourceResolver.adaptTo(PageManager), PageManager),
+ resourceResolver: new BindingVariable(resourceResolver, ResourceResolver,
+ "https://sling.apache.org/apidocs/sling12/org/apache/sling/api/resource/ResourceResolver.html"),
+ queryBuilder : new BindingVariable(queryBuilder, QueryBuilder,
+ "https://developer.adobe.com/experience-manager/reference-materials/6-5/javadoc/com/day/cq/search/QueryBuilder.html"),
+ nodeBuilder : new BindingVariable(new NodeBuilder(session), NodeBuilder,
+ "http://code.digitalatolson.com/aem-groovy-extension/groovydocs/com/icfolson/aem/groovy/extension" +
+ "/builders/NodeBuilder.html"),
+ pageBuilder : new BindingVariable(new PageBuilder(session), PageBuilder,
+ "http://code.digitalatolson.com/aem-groovy-extension/groovydocs/com/icfolson/aem/groovy/extension" +
+ "/builders/PageBuilder.html"),
+ bundleContext : new BindingVariable(bundleContext, BundleContext,
+ "http://www.osgi.org/javadoc/r4v43/core/org/osgi/framework/BundleContext.html"),
+ out : new BindingVariable(scriptContext.printStream, PrintStream,
+ "https://docs.oracle.com/javase/8/docs/api/java/io/PrintStream.html")
+ ]
+
+ if (scriptContext instanceof ServletScriptContext) {
+ bindingVariables.putAll([
+ slingRequest : new BindingVariable(scriptContext.request, SlingHttpServletRequest,
+ "https://sling.apache.org/apidocs/sling12/org/apache/sling/api/SlingHttpServletRequest.html"),
+ slingResponse: new BindingVariable(scriptContext.response, SlingHttpServletResponse,
+ "https://sling.apache.org/apidocs/sling12/org/apache/sling/api/SlingHttpServletResponse.html")
+ ])
+ }
+
+ if (scriptContext.data) {
+ try {
+ def json = new JsonSlurper().parseText(scriptContext.data)
+
+ bindingVariables["data"] = new BindingVariable(json, json.class)
+ } catch (JsonException ignored) {
+ // if data cannot be parsed as a JSON object, bind it as a String
+ bindingVariables["data"] = new BindingVariable(scriptContext.data, String)
+ }
+ }
+
+ bindingVariables
+ }
+
+ @Activate
+ void activate(BundleContext bundleContext) {
+ this.bundleContext = bundleContext
+ }
+}
diff --git a/bundle/src/main/groovy/org/cid15/aem/groovy/console/extension/impl/DefaultExtensionService.groovy b/bundle/src/main/groovy/be/orbinson/aem/groovy/console/extension/impl/DefaultExtensionService.groovy
similarity index 87%
rename from bundle/src/main/groovy/org/cid15/aem/groovy/console/extension/impl/DefaultExtensionService.groovy
rename to bundle/src/main/groovy/be/orbinson/aem/groovy/console/extension/impl/DefaultExtensionService.groovy
index 938ab2a9..1e00f93b 100644
--- a/bundle/src/main/groovy/org/cid15/aem/groovy/console/extension/impl/DefaultExtensionService.groovy
+++ b/bundle/src/main/groovy/be/orbinson/aem/groovy/console/extension/impl/DefaultExtensionService.groovy
@@ -1,15 +1,15 @@
-package org.cid15.aem.groovy.console.extension.impl
-
-import org.cid15.aem.groovy.console.api.BindingExtensionProvider
-import org.cid15.aem.groovy.console.api.BindingVariable
-import org.cid15.aem.groovy.console.api.CompilationCustomizerExtensionProvider
-import org.cid15.aem.groovy.console.api.ScriptMetaClassExtensionProvider
-import org.cid15.aem.groovy.console.api.StarImport
-import org.cid15.aem.groovy.console.api.StarImportExtensionProvider
-import org.cid15.aem.groovy.console.api.context.ScriptContext
+package be.orbinson.aem.groovy.console.extension.impl
+
+import be.orbinson.aem.groovy.console.api.BindingExtensionProvider
+import be.orbinson.aem.groovy.console.api.BindingVariable
+import be.orbinson.aem.groovy.console.api.CompilationCustomizerExtensionProvider
+import be.orbinson.aem.groovy.console.api.ScriptMetaClassExtensionProvider
+import be.orbinson.aem.groovy.console.api.StarImport
+import be.orbinson.aem.groovy.console.api.StarImportExtensionProvider
+import be.orbinson.aem.groovy.console.api.context.ScriptContext
+import be.orbinson.aem.groovy.console.extension.ExtensionService
import groovy.transform.Synchronized
import groovy.util.logging.Slf4j
-import org.cid15.aem.groovy.console.extension.ExtensionService
import org.codehaus.groovy.control.customizers.CompilationCustomizer
import org.codehaus.groovy.control.customizers.ImportCustomizer
import org.osgi.service.component.annotations.Component
@@ -30,7 +30,7 @@ class DefaultExtensionService implements ExtensionService {
private volatile List scriptMetaClassExtensionProviders = new CopyOnWriteArrayList<>()
private volatile List compilationCustomizerExtensionProviders =
- new CopyOnWriteArrayList<>()
+ new CopyOnWriteArrayList<>()
@Override
Map getBindingVariables(ScriptContext scriptContext) {
@@ -40,7 +40,7 @@ class DefaultExtensionService implements ExtensionService {
extension.getBindingVariables(scriptContext).each { name, variable ->
if (bindingVariables[name]) {
LOG.debug("binding variable {} is currently bound to value {}, overriding with value = {}", name,
- bindingVariables[name], variable.value)
+ bindingVariables[name], variable.value)
}
bindingVariables[name] = variable
diff --git a/bundle/src/main/groovy/org/cid15/aem/groovy/console/extension/impl/DefaultScriptMetaClassExtensionProvider.groovy b/bundle/src/main/groovy/be/orbinson/aem/groovy/console/extension/impl/DefaultScriptMetaClassExtensionProvider.groovy
similarity index 89%
rename from bundle/src/main/groovy/org/cid15/aem/groovy/console/extension/impl/DefaultScriptMetaClassExtensionProvider.groovy
rename to bundle/src/main/groovy/be/orbinson/aem/groovy/console/extension/impl/DefaultScriptMetaClassExtensionProvider.groovy
index 2ce9790f..b455ed3c 100755
--- a/bundle/src/main/groovy/org/cid15/aem/groovy/console/extension/impl/DefaultScriptMetaClassExtensionProvider.groovy
+++ b/bundle/src/main/groovy/be/orbinson/aem/groovy/console/extension/impl/DefaultScriptMetaClassExtensionProvider.groovy
@@ -1,14 +1,14 @@
-package org.cid15.aem.groovy.console.extension.impl
+package be.orbinson.aem.groovy.console.extension.impl
+import be.orbinson.aem.groovy.console.api.ScriptMetaClassExtensionProvider
+import be.orbinson.aem.groovy.console.api.context.ScriptContext
+import be.orbinson.aem.groovy.console.table.Table
import com.day.cq.replication.ReplicationActionType
import com.day.cq.replication.ReplicationOptions
import com.day.cq.replication.Replicator
import com.day.cq.search.PredicateGroup
import com.day.cq.search.QueryBuilder
import com.day.cq.wcm.api.PageManager
-import org.cid15.aem.groovy.console.api.context.ScriptContext
-import org.cid15.aem.groovy.console.api.ScriptMetaClassExtensionProvider
-import org.cid15.aem.groovy.console.table.Table
import org.apache.sling.models.factory.ModelFactory
import org.osgi.framework.BundleContext
import org.osgi.service.component.annotations.Activate
@@ -128,6 +128,14 @@ class DefaultScriptMetaClassExtensionProvider implements ScriptMetaClassExtensio
queryBuilder.createQuery(PredicateGroup.create(predicates), session)
}
+ delegate.xpathQuery { String query ->
+ session.workspace.queryManager.createQuery(query, "xpath").execute().nodes
+ }
+
+ delegate.sql2Query { String query ->
+ session.workspace.queryManager.createQuery(query, "JCR-SQL2").execute().nodes
+ }
+
delegate.table = { Closure closure ->
def table = new Table()
diff --git a/bundle/src/main/groovy/be/orbinson/aem/groovy/console/extension/impl/DefaultStarImportExtensionProvider.groovy b/bundle/src/main/groovy/be/orbinson/aem/groovy/console/extension/impl/DefaultStarImportExtensionProvider.groovy
new file mode 100644
index 00000000..dfad064e
--- /dev/null
+++ b/bundle/src/main/groovy/be/orbinson/aem/groovy/console/extension/impl/DefaultStarImportExtensionProvider.groovy
@@ -0,0 +1,35 @@
+package be.orbinson.aem.groovy.console.extension.impl
+
+import be.orbinson.aem.groovy.console.api.StarImport
+import be.orbinson.aem.groovy.console.api.StarImportExtensionProvider
+import com.google.common.collect.ImmutableSet
+import org.osgi.service.component.annotations.Component
+
+@Component(service = StarImportExtensionProvider, immediate = true)
+class DefaultStarImportExtensionProvider implements StarImportExtensionProvider {
+
+ private static final String AEM_JAVADOC_PREFIX = "https://developer.adobe.com/experience-manager/reference-materials/6-5/javadoc"
+
+ private static final String JCR_JAVADOC_PREFIX = "https://developer.adobe.com/experience-manager/reference-materials/spec/javax.jcr/javadocs/jcr-2.0"
+
+ private static final String SLING_JAVADOC_PREFIX = "http://sling.apache.org/apidocs/sling12"
+
+ private static final String JAVADOC_SUFFIX = "package-summary.html"
+
+ private static final Set IMPORTS = ImmutableSet.of(
+ new StarImport("com.day.cq.dam.api", "$AEM_JAVADOC_PREFIX/com/day/cq/dam/api/$JAVADOC_SUFFIX"),
+ new StarImport("com.day.cq.search", "$AEM_JAVADOC_PREFIX/com/day/cq/search/$JAVADOC_SUFFIX"),
+ new StarImport("com.day.cq.tagging", "$AEM_JAVADOC_PREFIX/com/day/cq/tagging/$JAVADOC_SUFFIX"),
+ new StarImport("com.day.cq.wcm.api", "$AEM_JAVADOC_PREFIX/com/day/cq/wcm/api/$JAVADOC_SUFFIX"),
+ new StarImport("com.day.cq.replication", "$AEM_JAVADOC_PREFIX/com/day/cq/replication/$JAVADOC_SUFFIX"),
+ new StarImport("javax.jcr", "$JCR_JAVADOC_PREFIX/javax/jcr/$JAVADOC_SUFFIX"),
+ new StarImport("org.apache.sling.api", "$SLING_JAVADOC_PREFIX/org/apache/sling/api/$JAVADOC_SUFFIX"),
+ new StarImport("org.apache.sling.api.resource",
+ "$SLING_JAVADOC_PREFIX/org/apache/sling/api/resource/$JAVADOC_SUFFIX")
+ )
+
+ @Override
+ Set getStarImports() {
+ IMPORTS
+ }
+}
diff --git a/bundle/src/main/groovy/org/cid15/aem/groovy/console/impl/DefaultGroovyConsoleService.groovy b/bundle/src/main/groovy/be/orbinson/aem/groovy/console/impl/DefaultGroovyConsoleService.groovy
similarity index 78%
rename from bundle/src/main/groovy/org/cid15/aem/groovy/console/impl/DefaultGroovyConsoleService.groovy
rename to bundle/src/main/groovy/be/orbinson/aem/groovy/console/impl/DefaultGroovyConsoleService.groovy
index 96260d2e..8f9a3336 100755
--- a/bundle/src/main/groovy/org/cid15/aem/groovy/console/impl/DefaultGroovyConsoleService.groovy
+++ b/bundle/src/main/groovy/be/orbinson/aem/groovy/console/impl/DefaultGroovyConsoleService.groovy
@@ -1,27 +1,27 @@
-package org.cid15.aem.groovy.console.impl
-
+package be.orbinson.aem.groovy.console.impl
+
+import be.orbinson.aem.groovy.console.GroovyConsoleService
+import be.orbinson.aem.groovy.console.api.ActiveJob
+import be.orbinson.aem.groovy.console.api.JobProperties
+import be.orbinson.aem.groovy.console.api.context.ScriptContext
+import be.orbinson.aem.groovy.console.api.context.ScriptData
+import be.orbinson.aem.groovy.console.audit.AuditService
+import be.orbinson.aem.groovy.console.configuration.ConfigurationService
+import be.orbinson.aem.groovy.console.constants.GroovyConsoleConstants
+import be.orbinson.aem.groovy.console.extension.ExtensionService
+import be.orbinson.aem.groovy.console.notification.NotificationService
+import be.orbinson.aem.groovy.console.response.RunScriptResponse
+import be.orbinson.aem.groovy.console.response.SaveScriptResponse
+import be.orbinson.aem.groovy.console.response.impl.DefaultRunScriptResponse
+import be.orbinson.aem.groovy.console.response.impl.DefaultSaveScriptResponse
import com.day.cq.commons.jcr.JcrConstants
import com.day.cq.commons.jcr.JcrUtil
import com.google.common.net.MediaType
-import org.cid15.aem.groovy.console.GroovyConsoleService
-import org.cid15.aem.groovy.console.audit.AuditService
-import org.cid15.aem.groovy.console.configuration.ConfigurationService
-import org.cid15.aem.groovy.console.notification.NotificationService
import groovy.transform.Synchronized
import groovy.transform.TimedInterrupt
import groovy.util.logging.Slf4j
import org.apache.jackrabbit.util.Text
import org.apache.sling.event.jobs.JobManager
-import org.cid15.aem.groovy.console.api.ActiveJob
-import org.cid15.aem.groovy.console.api.JobProperties
-import org.cid15.aem.groovy.console.api.context.ScriptContext
-import org.cid15.aem.groovy.console.api.context.ScriptData
-import org.cid15.aem.groovy.console.constants.GroovyConsoleConstants
-import org.cid15.aem.groovy.console.extension.ExtensionService
-import org.cid15.aem.groovy.console.response.RunScriptResponse
-import org.cid15.aem.groovy.console.response.SaveScriptResponse
-import org.cid15.aem.groovy.console.response.impl.DefaultRunScriptResponse
-import org.cid15.aem.groovy.console.response.impl.DefaultSaveScriptResponse
import org.codehaus.groovy.control.CompilerConfiguration
import org.codehaus.groovy.control.MultipleCompilationErrorsException
import org.codehaus.groovy.control.customizers.ASTTransformationCustomizer
@@ -35,10 +35,10 @@ import javax.jcr.Node
import javax.jcr.Session
import java.util.concurrent.CopyOnWriteArrayList
-import static org.cid15.aem.groovy.console.constants.GroovyConsoleConstants.CHARSET
-import static org.cid15.aem.groovy.console.constants.GroovyConsoleConstants.FORMAT_RUNNING_TIME
-import static org.cid15.aem.groovy.console.constants.GroovyConsoleConstants.PATH_SCRIPTS_FOLDER
-import static org.cid15.aem.groovy.console.constants.GroovyConsoleConstants.TIME_ZONE_RUNNING_TIME
+import static be.orbinson.aem.groovy.console.constants.GroovyConsoleConstants.CHARSET
+import static be.orbinson.aem.groovy.console.constants.GroovyConsoleConstants.FORMAT_RUNNING_TIME
+import static be.orbinson.aem.groovy.console.constants.GroovyConsoleConstants.PATH_SCRIPTS_FOLDER
+import static be.orbinson.aem.groovy.console.constants.GroovyConsoleConstants.TIME_ZONE_RUNNING_TIME
@Component(service = GroovyConsoleService, immediate = true)
@Slf4j("LOG")
@@ -91,19 +91,19 @@ class DefaultGroovyConsoleService implements GroovyConsoleService {
LOG.debug("script execution completed, running time : {}", runningTime)
runScriptResponse = DefaultRunScriptResponse.fromResult(scriptContext, result,
- scriptContext.outputStream.toString(CHARSET), runningTime)
+ scriptContext.outputStream.toString(CHARSET), runningTime)
auditAndNotify(runScriptResponse)
} catch (MultipleCompilationErrorsException e) {
LOG.error("script compilation error", e)
runScriptResponse = DefaultRunScriptResponse.fromException(scriptContext,
- scriptContext.outputStream.toString(CHARSET), e)
+ scriptContext.outputStream.toString(CHARSET), e)
} catch (Throwable t) {
LOG.error("error running script", t)
runScriptResponse = DefaultRunScriptResponse.fromException(scriptContext,
- scriptContext.outputStream.toString(CHARSET), t)
+ scriptContext.outputStream.toString(CHARSET), t)
auditAndNotify(runScriptResponse)
} finally {
@@ -143,10 +143,10 @@ class DefaultGroovyConsoleService implements GroovyConsoleService {
LOG.info("adding scheduled job with properties : {}", jobProperties.toMap())
jobManager.createJob(GroovyConsoleConstants.JOB_TOPIC)
- .properties(jobProperties.toMap())
- .schedule()
- .cron(jobProperties.cronExpression)
- .add()
+ .properties(jobProperties.toMap())
+ .schedule()
+ .cron(jobProperties.cronExpression)
+ .add()
} else {
LOG.info("adding immediate job with properties : {}", jobProperties.toMap())
@@ -200,11 +200,11 @@ class DefaultGroovyConsoleService implements GroovyConsoleService {
}
configuration.addCompilationCustomizers(extensionService.compilationCustomizers
- as CompilationCustomizer[])
+ as CompilationCustomizer[])
}
private void saveFile(Session session, Node folderNode, String script, String fileName, Date date,
- String mimeType) {
+ String mimeType) {
def fileNode = folderNode.addNode(Text.escapeIllegalJcrChars(fileName), JcrConstants.NT_FILE)
def resourceNode = fileNode.addNode(JcrConstants.JCR_CONTENT, JcrConstants.NT_RESOURCE)
diff --git a/bundle/src/main/groovy/org/cid15/aem/groovy/console/job/consumer/GroovyConsoleScheduledJobConsumer.groovy b/bundle/src/main/groovy/be/orbinson/aem/groovy/console/job/consumer/GroovyConsoleScheduledJobConsumer.groovy
similarity index 67%
rename from bundle/src/main/groovy/org/cid15/aem/groovy/console/job/consumer/GroovyConsoleScheduledJobConsumer.groovy
rename to bundle/src/main/groovy/be/orbinson/aem/groovy/console/job/consumer/GroovyConsoleScheduledJobConsumer.groovy
index e86c2b69..ae605a8f 100644
--- a/bundle/src/main/groovy/org/cid15/aem/groovy/console/job/consumer/GroovyConsoleScheduledJobConsumer.groovy
+++ b/bundle/src/main/groovy/be/orbinson/aem/groovy/console/job/consumer/GroovyConsoleScheduledJobConsumer.groovy
@@ -1,18 +1,18 @@
-package org.cid15.aem.groovy.console.job.consumer
+package be.orbinson.aem.groovy.console.job.consumer
+import be.orbinson.aem.groovy.console.GroovyConsoleService
+import be.orbinson.aem.groovy.console.api.JobProperties
+import be.orbinson.aem.groovy.console.api.impl.ScheduledJobScriptContext
import com.google.common.base.Charsets
-import org.cid15.aem.groovy.console.GroovyConsoleService
-import org.cid15.aem.groovy.console.api.impl.ScheduledJobScriptContext
import groovy.util.logging.Slf4j
import org.apache.sling.api.resource.ResourceResolverFactory
import org.apache.sling.event.jobs.Job
import org.apache.sling.event.jobs.consumer.JobConsumer
-import org.cid15.aem.groovy.console.api.JobProperties
import org.osgi.service.component.annotations.Component
import org.osgi.service.component.annotations.Reference
@Component(service = JobConsumer, immediate = true, property = [
- "job.topics=groovyconsole/job"
+ "job.topics=groovyconsole/job"
])
@Slf4j("LOG")
class GroovyConsoleScheduledJobConsumer implements JobConsumer {
@@ -33,11 +33,11 @@ class GroovyConsoleScheduledJobConsumer implements JobConsumer {
def outputStream = new ByteArrayOutputStream()
def scriptContext = new ScheduledJobScriptContext(
- resourceResolver: resourceResolver,
- outputStream: outputStream,
- printStream: new PrintStream(outputStream, true, Charsets.UTF_8.name()),
- jobId: job.id,
- jobProperties: JobProperties.fromJob(job)
+ resourceResolver: resourceResolver,
+ outputStream: outputStream,
+ printStream: new PrintStream(outputStream, true, Charsets.UTF_8.name()),
+ jobId: job.id,
+ jobProperties: JobProperties.fromJob(job)
)
groovyConsoleService.runScript(scriptContext)
diff --git a/bundle/src/main/groovy/org/cid15/aem/groovy/console/job/event/AbstractGroovyConsoleScheduledJobEventHandler.groovy b/bundle/src/main/groovy/be/orbinson/aem/groovy/console/job/event/AbstractGroovyConsoleScheduledJobEventHandler.groovy
similarity index 83%
rename from bundle/src/main/groovy/org/cid15/aem/groovy/console/job/event/AbstractGroovyConsoleScheduledJobEventHandler.groovy
rename to bundle/src/main/groovy/be/orbinson/aem/groovy/console/job/event/AbstractGroovyConsoleScheduledJobEventHandler.groovy
index 582ec180..ac348f41 100644
--- a/bundle/src/main/groovy/org/cid15/aem/groovy/console/job/event/AbstractGroovyConsoleScheduledJobEventHandler.groovy
+++ b/bundle/src/main/groovy/be/orbinson/aem/groovy/console/job/event/AbstractGroovyConsoleScheduledJobEventHandler.groovy
@@ -1,9 +1,9 @@
-package org.cid15.aem.groovy.console.job.event
+package be.orbinson.aem.groovy.console.job.event
-import org.cid15.aem.groovy.console.audit.AuditService
+import be.orbinson.aem.groovy.console.audit.AuditService
+import be.orbinson.aem.groovy.console.response.RunScriptResponse
import groovy.util.logging.Slf4j
import org.apache.sling.event.jobs.NotificationConstants
-import org.cid15.aem.groovy.console.response.RunScriptResponse
import org.osgi.service.event.Event
import org.osgi.service.event.EventHandler
@@ -17,7 +17,7 @@ abstract class AbstractGroovyConsoleScheduledJobEventHandler implements EventHan
@Override
final void handleEvent(Event event) {
LOG.debug("handling completed scheduled job with properties : {}", event.propertyNames
- .collectEntries { propertyName -> [propertyName, event.getProperty(propertyName)] })
+ .collectEntries { propertyName -> [propertyName, event.getProperty(propertyName)] })
def jobId = event.getProperty(NotificationConstants.NOTIFICATION_PROPERTY_JOB_ID) as String
def auditRecord = getAuditService().getAuditRecord(jobId)
diff --git a/bundle/src/main/groovy/org/cid15/aem/groovy/console/job/event/impl/DefaultGroovyConsoleEmailNotificationEventHandler.groovy b/bundle/src/main/groovy/be/orbinson/aem/groovy/console/job/event/impl/DefaultGroovyConsoleEmailNotificationEventHandler.groovy
similarity index 78%
rename from bundle/src/main/groovy/org/cid15/aem/groovy/console/job/event/impl/DefaultGroovyConsoleEmailNotificationEventHandler.groovy
rename to bundle/src/main/groovy/be/orbinson/aem/groovy/console/job/event/impl/DefaultGroovyConsoleEmailNotificationEventHandler.groovy
index 9488863d..691378e0 100644
--- a/bundle/src/main/groovy/org/cid15/aem/groovy/console/job/event/impl/DefaultGroovyConsoleEmailNotificationEventHandler.groovy
+++ b/bundle/src/main/groovy/be/orbinson/aem/groovy/console/job/event/impl/DefaultGroovyConsoleEmailNotificationEventHandler.groovy
@@ -1,11 +1,11 @@
-package org.cid15.aem.groovy.console.job.event.impl
+package be.orbinson.aem.groovy.console.job.event.impl
-import org.cid15.aem.groovy.console.audit.AuditService
-import org.cid15.aem.groovy.console.notification.EmailNotificationService
+import be.orbinson.aem.groovy.console.audit.AuditService
+import be.orbinson.aem.groovy.console.job.event.AbstractGroovyConsoleScheduledJobEventHandler
+import be.orbinson.aem.groovy.console.notification.EmailNotificationService
+import be.orbinson.aem.groovy.console.response.RunScriptResponse
import groovy.util.logging.Slf4j
import org.apache.sling.event.jobs.NotificationConstants
-import org.cid15.aem.groovy.console.job.event.AbstractGroovyConsoleScheduledJobEventHandler
-import org.cid15.aem.groovy.console.response.RunScriptResponse
import org.osgi.service.component.annotations.Component
import org.osgi.service.component.annotations.Reference
import org.osgi.service.event.EventHandler
diff --git a/bundle/src/main/groovy/org/cid15/aem/groovy/console/notification/EmailNotificationService.groovy b/bundle/src/main/groovy/be/orbinson/aem/groovy/console/notification/EmailNotificationService.groovy
similarity index 86%
rename from bundle/src/main/groovy/org/cid15/aem/groovy/console/notification/EmailNotificationService.groovy
rename to bundle/src/main/groovy/be/orbinson/aem/groovy/console/notification/EmailNotificationService.groovy
index 3e6cf9b8..2a160c88 100644
--- a/bundle/src/main/groovy/org/cid15/aem/groovy/console/notification/EmailNotificationService.groovy
+++ b/bundle/src/main/groovy/be/orbinson/aem/groovy/console/notification/EmailNotificationService.groovy
@@ -1,6 +1,6 @@
-package org.cid15.aem.groovy.console.notification
+package be.orbinson.aem.groovy.console.notification
-import org.cid15.aem.groovy.console.response.RunScriptResponse
+import be.orbinson.aem.groovy.console.response.RunScriptResponse
/**
* Services may implement this interface to send email notifications for Groovy Console script executions.
@@ -27,5 +27,5 @@ interface EmailNotificationService extends NotificationService {
* @param attachOutput if true, attach the script output file
*/
void notify(RunScriptResponse response, Set recipients, String successTemplate,
- String failureTemplate, boolean attachOutput)
+ String failureTemplate, boolean attachOutput)
}
diff --git a/bundle/src/main/groovy/org/cid15/aem/groovy/console/notification/NotificationService.groovy b/bundle/src/main/groovy/be/orbinson/aem/groovy/console/notification/NotificationService.groovy
similarity index 74%
rename from bundle/src/main/groovy/org/cid15/aem/groovy/console/notification/NotificationService.groovy
rename to bundle/src/main/groovy/be/orbinson/aem/groovy/console/notification/NotificationService.groovy
index 953c10f1..32dd789a 100644
--- a/bundle/src/main/groovy/org/cid15/aem/groovy/console/notification/NotificationService.groovy
+++ b/bundle/src/main/groovy/be/orbinson/aem/groovy/console/notification/NotificationService.groovy
@@ -1,6 +1,6 @@
-package org.cid15.aem.groovy.console.notification
+package be.orbinson.aem.groovy.console.notification
-import org.cid15.aem.groovy.console.response.RunScriptResponse
+import be.orbinson.aem.groovy.console.response.RunScriptResponse
/**
* Services may implement this interface to provide additional notifications for Groovy Console script executions.
diff --git a/bundle/src/main/groovy/org/cid15/aem/groovy/console/notification/impl/DefaultEmailNotificationService.groovy b/bundle/src/main/groovy/be/orbinson/aem/groovy/console/notification/impl/DefaultEmailNotificationService.groovy
similarity index 77%
rename from bundle/src/main/groovy/org/cid15/aem/groovy/console/notification/impl/DefaultEmailNotificationService.groovy
rename to bundle/src/main/groovy/be/orbinson/aem/groovy/console/notification/impl/DefaultEmailNotificationService.groovy
index 3067a4d7..8b80ba62 100644
--- a/bundle/src/main/groovy/org/cid15/aem/groovy/console/notification/impl/DefaultEmailNotificationService.groovy
+++ b/bundle/src/main/groovy/be/orbinson/aem/groovy/console/notification/impl/DefaultEmailNotificationService.groovy
@@ -1,17 +1,17 @@
-package org.cid15.aem.groovy.console.notification.impl
+package be.orbinson.aem.groovy.console.notification.impl
+import be.orbinson.aem.groovy.console.configuration.ConfigurationService
+import be.orbinson.aem.groovy.console.notification.EmailNotificationService
+import be.orbinson.aem.groovy.console.notification.NotificationService
+import be.orbinson.aem.groovy.console.response.RunScriptResponse
import com.day.cq.mailer.MailService
import com.google.common.base.Charsets
import com.google.common.net.MediaType
-import org.cid15.aem.groovy.console.notification.EmailNotificationService
-import org.cid15.aem.groovy.console.notification.NotificationService
import groovy.text.GStringTemplateEngine
import groovy.util.logging.Slf4j
import org.apache.commons.mail.Email
import org.apache.commons.mail.HtmlEmail
import org.apache.commons.mail.MultiPartEmail
-import org.cid15.aem.groovy.console.configuration.ConfigurationService
-import org.cid15.aem.groovy.console.response.RunScriptResponse
import org.osgi.service.component.annotations.Component
import org.osgi.service.component.annotations.Reference
import org.osgi.service.component.annotations.ReferenceCardinality
@@ -48,7 +48,7 @@ class DefaultEmailNotificationService implements EmailNotificationService {
@Override
void notify(RunScriptResponse response, Set recipients, String successTemplate,
- String failureTemplate, boolean attachOutput) {
+ String failureTemplate, boolean attachOutput) {
if (configurationService.emailEnabled && mailService) {
if (recipients) {
def email = createEmail(response, recipients, successTemplate, failureTemplate, attachOutput)
@@ -65,7 +65,7 @@ class DefaultEmailNotificationService implements EmailNotificationService {
}
private Email createEmail(RunScriptResponse response, Set recipients, String successTemplate,
- String failureTemplate, boolean attachOutput) {
+ String failureTemplate, boolean attachOutput) {
def email = attachOutput ? new MultiPartEmail() : new HtmlEmail()
recipients.each { name ->
@@ -81,7 +81,7 @@ class DefaultEmailNotificationService implements EmailNotificationService {
(email as MultiPartEmail).addPart(message, MediaType.HTML_UTF_8.toString())
def dataSource = new ByteArrayDataSource(response.output.getBytes(Charsets.UTF_8.name()),
- MediaType.parse(response.mediaType).toString())
+ MediaType.parse(response.mediaType).toString())
// attach output file
(email as MultiPartEmail).attach(dataSource, response.outputFileName, null)
@@ -102,28 +102,28 @@ class DefaultEmailNotificationService implements EmailNotificationService {
}
new GStringTemplateEngine()
- .createTemplate(template)
- .make(createBinding(response))
- .toString()
+ .createTemplate(template)
+ .make(createBinding(response))
+ .toString()
}
private Map createBinding(RunScriptResponse response) {
def binding = [
- username: response.userId,
- timestamp: new Date().format(FORMAT_TIMESTAMP),
- script: response.script
+ username : response.userId,
+ timestamp: new Date().format(FORMAT_TIMESTAMP),
+ script : response.script
]
if (response.exceptionStackTrace) {
binding.putAll([
- stackTrace: response.exceptionStackTrace,
- output: response.output
+ stackTrace: response.exceptionStackTrace,
+ output : response.output
])
} else {
binding.putAll([
- result: response.result,
- output: response.output,
- runningTime: response.runningTime
+ result : response.result,
+ output : response.output,
+ runningTime: response.runningTime
])
}
diff --git a/bundle/src/main/groovy/be/orbinson/aem/groovy/console/replication/ReplicatedScriptListener.groovy b/bundle/src/main/groovy/be/orbinson/aem/groovy/console/replication/ReplicatedScriptListener.groovy
new file mode 100644
index 00000000..537a5c66
--- /dev/null
+++ b/bundle/src/main/groovy/be/orbinson/aem/groovy/console/replication/ReplicatedScriptListener.groovy
@@ -0,0 +1,76 @@
+package be.orbinson.aem.groovy.console.replication
+
+import be.orbinson.aem.groovy.console.GroovyConsoleService
+import be.orbinson.aem.groovy.console.api.context.ScriptContext
+import be.orbinson.aem.groovy.console.api.impl.ResourceScriptContext
+import be.orbinson.aem.groovy.console.configuration.ConfigurationService
+import com.day.cq.commons.jcr.JcrConstants
+import com.google.common.base.Charsets
+import groovy.util.logging.Slf4j
+import org.apache.sling.api.resource.ResourceResolver
+import org.apache.sling.api.resource.ResourceResolverFactory
+import org.apache.sling.api.resource.observation.ResourceChange
+import org.apache.sling.api.resource.observation.ResourceChangeListener
+import org.jetbrains.annotations.NotNull
+import org.osgi.service.component.annotations.Component
+import org.osgi.service.component.annotations.Reference
+
+import javax.jcr.Session
+
+import static com.google.common.base.Preconditions.checkNotNull
+
+@Component(property = [
+ "resource.paths=glob:/conf/groovyconsole/replication/*.groovy",
+ "resource.change.types=ADDED"
+])
+@Slf4j("LOG")
+public class ReplicatedScriptListener implements ResourceChangeListener {
+ @Reference
+ private GroovyConsoleService consoleService;
+
+ @Reference
+ private ResourceResolverFactory resourceResolverFactory;
+
+ @Reference
+ private ConfigurationService configurationService;
+
+ @Override
+ public void onChange(@NotNull List list) {
+ if (!configurationService.isAuthor() && configurationService.isDistributedExecutionEnabled()) {
+ list.each { change ->
+ resourceResolverFactory.getServiceResourceResolver(null).withCloseable { resourceResolver ->
+ LOG.debug("Detected replicated script on path '{}'", change.path)
+ consoleService.runScript(getScriptContext(resourceResolver, change.path))
+ }
+ }
+ }
+ }
+
+ private ScriptContext getScriptContext(ResourceResolver resourceResolver, String scriptPath) {
+ def outputStream = new ByteArrayOutputStream()
+
+ new ResourceScriptContext(
+ resourceResolver: resourceResolver,
+ outputStream: outputStream,
+ printStream: new PrintStream(outputStream, true, Charsets.UTF_8.name()),
+ script: checkNotNull(loadScript(resourceResolver, scriptPath), "Script cannot be empty.")
+ )
+ }
+
+ // FIXME: extract to service that can be shared between services and servlets
+ private String loadScript(ResourceResolver resourceResolver, String scriptPath) {
+ def session = resourceResolver.adaptTo(Session)
+
+ // FIXME: use adaptTo(InputStream.class) to get binary data
+ def binary = session.getNode(scriptPath)
+ .getNode(JcrConstants.JCR_CONTENT)
+ .getProperty(JcrConstants.JCR_DATA)
+ .binary
+
+ def script = binary.stream.text
+
+ binary.dispose()
+
+ script
+ }
+}
diff --git a/bundle/src/main/groovy/be/orbinson/aem/groovy/console/response/ReplicateScriptResponse.groovy b/bundle/src/main/groovy/be/orbinson/aem/groovy/console/response/ReplicateScriptResponse.groovy
new file mode 100644
index 00000000..cf3ce7a9
--- /dev/null
+++ b/bundle/src/main/groovy/be/orbinson/aem/groovy/console/response/ReplicateScriptResponse.groovy
@@ -0,0 +1,10 @@
+package be.orbinson.aem.groovy.console.response
+
+/**
+ * Response for replicated scripts.
+ */
+interface ReplicateScriptResponse {
+
+ String getResult()
+
+}
diff --git a/bundle/src/main/groovy/org/cid15/aem/groovy/console/response/RunScriptResponse.groovy b/bundle/src/main/groovy/be/orbinson/aem/groovy/console/response/RunScriptResponse.groovy
similarity index 82%
rename from bundle/src/main/groovy/org/cid15/aem/groovy/console/response/RunScriptResponse.groovy
rename to bundle/src/main/groovy/be/orbinson/aem/groovy/console/response/RunScriptResponse.groovy
index 8b1f1433..165be455 100644
--- a/bundle/src/main/groovy/org/cid15/aem/groovy/console/response/RunScriptResponse.groovy
+++ b/bundle/src/main/groovy/be/orbinson/aem/groovy/console/response/RunScriptResponse.groovy
@@ -1,6 +1,6 @@
-package org.cid15.aem.groovy.console.response
+package be.orbinson.aem.groovy.console.response
-import org.cid15.aem.groovy.console.api.JobProperties
+import be.orbinson.aem.groovy.console.api.JobProperties
/**
* Response for script executions.
diff --git a/bundle/src/main/groovy/org/cid15/aem/groovy/console/response/SaveScriptResponse.groovy b/bundle/src/main/groovy/be/orbinson/aem/groovy/console/response/SaveScriptResponse.groovy
similarity index 67%
rename from bundle/src/main/groovy/org/cid15/aem/groovy/console/response/SaveScriptResponse.groovy
rename to bundle/src/main/groovy/be/orbinson/aem/groovy/console/response/SaveScriptResponse.groovy
index b2eb6928..3de654df 100644
--- a/bundle/src/main/groovy/org/cid15/aem/groovy/console/response/SaveScriptResponse.groovy
+++ b/bundle/src/main/groovy/be/orbinson/aem/groovy/console/response/SaveScriptResponse.groovy
@@ -1,4 +1,4 @@
-package org.cid15.aem.groovy.console.response
+package be.orbinson.aem.groovy.console.response
/**
* Response for saved scripts.
diff --git a/bundle/src/main/groovy/be/orbinson/aem/groovy/console/response/impl/DefaultReplicateScriptResponse.groovy b/bundle/src/main/groovy/be/orbinson/aem/groovy/console/response/impl/DefaultReplicateScriptResponse.groovy
new file mode 100644
index 00000000..dea6d09c
--- /dev/null
+++ b/bundle/src/main/groovy/be/orbinson/aem/groovy/console/response/impl/DefaultReplicateScriptResponse.groovy
@@ -0,0 +1,9 @@
+package be.orbinson.aem.groovy.console.response.impl
+
+import be.orbinson.aem.groovy.console.response.ReplicateScriptResponse
+import groovy.transform.TupleConstructor
+
+@TupleConstructor
+class DefaultReplicateScriptResponse implements ReplicateScriptResponse {
+ String result
+}
diff --git a/bundle/src/main/groovy/be/orbinson/aem/groovy/console/response/impl/DefaultRunScriptResponse.groovy b/bundle/src/main/groovy/be/orbinson/aem/groovy/console/response/impl/DefaultRunScriptResponse.groovy
new file mode 100644
index 00000000..ea287d7e
--- /dev/null
+++ b/bundle/src/main/groovy/be/orbinson/aem/groovy/console/response/impl/DefaultRunScriptResponse.groovy
@@ -0,0 +1,149 @@
+package be.orbinson.aem.groovy.console.response.impl
+
+import be.orbinson.aem.groovy.console.api.JobProperties
+import be.orbinson.aem.groovy.console.api.context.JobScriptContext
+import be.orbinson.aem.groovy.console.api.context.ScriptContext
+import be.orbinson.aem.groovy.console.response.RunScriptResponse
+import be.orbinson.aem.groovy.console.table.Table
+import com.day.cq.commons.jcr.JcrConstants
+import com.day.cq.commons.jcr.JcrUtil
+import com.day.text.Text
+import com.google.common.net.MediaType
+import groovy.json.JsonBuilder
+import groovy.transform.TupleConstructor
+import org.apache.commons.lang3.exception.ExceptionUtils
+import org.apache.sling.api.resource.Resource
+import org.apache.sling.api.resource.ResourceUtil
+
+import static be.orbinson.aem.groovy.console.constants.GroovyConsoleConstants.DATA
+import static be.orbinson.aem.groovy.console.constants.GroovyConsoleConstants.DATE_FORMAT_FILE_NAME
+import static be.orbinson.aem.groovy.console.constants.GroovyConsoleConstants.EXCEPTION_STACK_TRACE
+import static be.orbinson.aem.groovy.console.constants.GroovyConsoleConstants.JOB_ID
+import static be.orbinson.aem.groovy.console.constants.GroovyConsoleConstants.MEDIA_TYPE_EXTENSIONS
+import static be.orbinson.aem.groovy.console.constants.GroovyConsoleConstants.OUTPUT
+import static be.orbinson.aem.groovy.console.constants.GroovyConsoleConstants.RESULT
+import static be.orbinson.aem.groovy.console.constants.GroovyConsoleConstants.RUNNING_TIME
+import static be.orbinson.aem.groovy.console.constants.GroovyConsoleConstants.SCRIPT
+
+@TupleConstructor
+class DefaultRunScriptResponse implements RunScriptResponse {
+
+ private static final int LEVEL_USERID = 4
+
+ static RunScriptResponse fromResult(ScriptContext scriptContext, Object result, String output, String runningTime) {
+ def resultString
+
+ if (result instanceof Table) {
+ resultString = new JsonBuilder([table: result]).toString()
+ } else {
+ resultString = result as String
+ }
+
+ new DefaultRunScriptResponse(
+ date: Calendar.instance,
+ script: scriptContext.script,
+ data: scriptContext.data,
+ result: resultString,
+ output: output,
+ exceptionStackTrace: "",
+ runningTime: runningTime,
+ userId: scriptContext.userId,
+ jobId: scriptContext instanceof JobScriptContext ? scriptContext.jobId : null,
+ jobProperties: scriptContext instanceof JobScriptContext ? scriptContext.jobProperties : null
+ )
+ }
+
+ static RunScriptResponse fromException(ScriptContext scriptContext, String output, Throwable throwable) {
+ def exceptionStackTrace = ExceptionUtils.getStackTrace(throwable)
+
+ new DefaultRunScriptResponse(
+ date: Calendar.instance,
+ script: scriptContext.script,
+ data: scriptContext.data,
+ result: "",
+ output: output,
+ exceptionStackTrace: exceptionStackTrace,
+ runningTime: "",
+ userId: scriptContext.userId,
+ jobId: scriptContext instanceof JobScriptContext ? scriptContext.jobId : null,
+ jobProperties: scriptContext instanceof JobScriptContext ? scriptContext.jobProperties : null
+ )
+ }
+
+ static RunScriptResponse fromAuditRecordResource(Resource resource) {
+ def properties = resource.valueMap
+
+ def exceptionStackTrace = properties.get(EXCEPTION_STACK_TRACE, "")
+ def userIdResourcePath = ResourceUtil.getParent(resource.path, LEVEL_USERID)
+ def userId = Text.getName(userIdResourcePath)
+
+ new DefaultRunScriptResponse(
+ date: properties.get(JcrConstants.JCR_CREATED, Calendar),
+ script: properties.get(SCRIPT, ""),
+ data: properties.get(DATA, ""),
+ result: exceptionStackTrace ? "" : properties.get(RESULT, ""),
+ output: properties.get(OUTPUT, ""),
+ exceptionStackTrace: exceptionStackTrace ?: "",
+ runningTime: exceptionStackTrace ? "" : properties.get(RUNNING_TIME, ""),
+ userId: userId,
+ jobId: properties.get(JOB_ID, String),
+ jobProperties: JobProperties.fromValueMap(properties)
+ )
+ }
+
+ Calendar date
+
+ String script
+
+ String data
+
+ String result
+
+ String output
+
+ String exceptionStackTrace
+
+ String runningTime
+
+ String userId
+
+ String jobId
+
+ JobProperties jobProperties
+
+ @Override
+ String getMediaType() {
+ def mediaType
+
+ if (jobProperties?.mediaType) {
+ mediaType = MediaType.parse(jobProperties.mediaType)
+ } else {
+ mediaType = MediaType.PLAIN_TEXT_UTF_8
+ }
+
+ mediaType.withoutParameters().toString()
+ }
+
+ @Override
+ String getOutputFileName() {
+ new StringBuilder()
+ .append(outputFileNamePrefix)
+ .append(date.format(DATE_FORMAT_FILE_NAME))
+ .append(".")
+ .append(MEDIA_TYPE_EXTENSIONS[mediaType])
+ .toString()
+ }
+
+ private String getOutputFileNamePrefix() {
+ def outputFileNamePrefix
+
+ if (jobProperties?.jobTitle) {
+ outputFileNamePrefix = JcrUtil.createValidName(jobProperties.jobTitle,
+ JcrUtil.HYPHEN_LABEL_CHAR_MAPPING).toLowerCase() + "-"
+ } else {
+ outputFileNamePrefix = "output-"
+ }
+
+ outputFileNamePrefix
+ }
+}
diff --git a/bundle/src/main/groovy/org/cid15/aem/groovy/console/response/impl/DefaultSaveScriptResponse.groovy b/bundle/src/main/groovy/be/orbinson/aem/groovy/console/response/impl/DefaultSaveScriptResponse.groovy
similarity index 53%
rename from bundle/src/main/groovy/org/cid15/aem/groovy/console/response/impl/DefaultSaveScriptResponse.groovy
rename to bundle/src/main/groovy/be/orbinson/aem/groovy/console/response/impl/DefaultSaveScriptResponse.groovy
index 5fdde0de..9ff63eaf 100644
--- a/bundle/src/main/groovy/org/cid15/aem/groovy/console/response/impl/DefaultSaveScriptResponse.groovy
+++ b/bundle/src/main/groovy/be/orbinson/aem/groovy/console/response/impl/DefaultSaveScriptResponse.groovy
@@ -1,7 +1,7 @@
-package org.cid15.aem.groovy.console.response.impl
+package be.orbinson.aem.groovy.console.response.impl
+import be.orbinson.aem.groovy.console.response.SaveScriptResponse
import groovy.transform.Immutable
-import org.cid15.aem.groovy.console.response.SaveScriptResponse
@Immutable
class DefaultSaveScriptResponse implements SaveScriptResponse {
diff --git a/bundle/src/main/groovy/org/cid15/aem/groovy/console/servlets/AbstractJsonResponseServlet.groovy b/bundle/src/main/groovy/be/orbinson/aem/groovy/console/servlets/AbstractJsonResponseServlet.groovy
similarity index 82%
rename from bundle/src/main/groovy/org/cid15/aem/groovy/console/servlets/AbstractJsonResponseServlet.groovy
rename to bundle/src/main/groovy/be/orbinson/aem/groovy/console/servlets/AbstractJsonResponseServlet.groovy
index d384df74..0c81f3f4 100644
--- a/bundle/src/main/groovy/org/cid15/aem/groovy/console/servlets/AbstractJsonResponseServlet.groovy
+++ b/bundle/src/main/groovy/be/orbinson/aem/groovy/console/servlets/AbstractJsonResponseServlet.groovy
@@ -1,7 +1,7 @@
-package org.cid15.aem.groovy.console.servlets
+package be.orbinson.aem.groovy.console.servlets
+import be.orbinson.aem.groovy.console.constants.GroovyConsoleConstants
import com.google.common.net.MediaType
-import org.cid15.aem.groovy.console.constants.GroovyConsoleConstants
import groovy.json.JsonBuilder
import org.apache.sling.api.SlingHttpServletResponse
import org.apache.sling.api.servlets.SlingAllMethodsServlet
diff --git a/bundle/src/main/groovy/org/cid15/aem/groovy/console/servlets/AuditServlet.groovy b/bundle/src/main/groovy/be/orbinson/aem/groovy/console/servlets/AuditServlet.groovy
similarity index 72%
rename from bundle/src/main/groovy/org/cid15/aem/groovy/console/servlets/AuditServlet.groovy
rename to bundle/src/main/groovy/be/orbinson/aem/groovy/console/servlets/AuditServlet.groovy
index 7e032281..f47b841a 100644
--- a/bundle/src/main/groovy/org/cid15/aem/groovy/console/servlets/AuditServlet.groovy
+++ b/bundle/src/main/groovy/be/orbinson/aem/groovy/console/servlets/AuditServlet.groovy
@@ -1,10 +1,11 @@
-package org.cid15.aem.groovy.console.servlets
+package be.orbinson.aem.groovy.console.servlets
-import org.cid15.aem.groovy.console.audit.AuditRecord
-import org.cid15.aem.groovy.console.audit.AuditService
-import org.cid15.aem.groovy.console.configuration.ConfigurationService
-import org.cid15.aem.groovy.console.constants.GroovyConsoleConstants
-import org.cid15.aem.groovy.console.utils.GroovyScriptUtils
+
+import be.orbinson.aem.groovy.console.audit.AuditRecord
+import be.orbinson.aem.groovy.console.audit.AuditService
+import be.orbinson.aem.groovy.console.configuration.ConfigurationService
+import be.orbinson.aem.groovy.console.constants.GroovyConsoleConstants
+import be.orbinson.aem.groovy.console.utils.GroovyScriptUtils
import org.apache.sling.api.SlingHttpServletRequest
import org.apache.sling.api.SlingHttpServletResponse
import org.osgi.service.component.annotations.Component
@@ -13,7 +14,7 @@ import org.osgi.service.component.annotations.Reference
import javax.servlet.Servlet
@Component(service = Servlet, immediate = true, property = [
- "sling.servlet.paths=/bin/groovyconsole/audit"
+ "sling.servlet.paths=/bin/groovyconsole/audit"
])
class AuditServlet extends AbstractJsonResponseServlet {
@@ -54,16 +55,16 @@ class AuditServlet extends AbstractJsonResponseServlet {
[data: auditRecords.collect { auditRecord ->
[
- date: auditRecord.date.format(GroovyConsoleConstants.DATE_FORMAT_DISPLAY),
- scriptPreview: GroovyScriptUtils.getScriptPreview(auditRecord.script),
- jobTitle: auditRecord.jobProperties.jobTitle,
- userId: auditRecord.userId,
- script: auditRecord.script,
- data: auditRecord.data,
- exception: auditRecord.exception,
- queryString: "?userId=${auditRecord.userId}&script=${auditRecord.relativePath}",
- relativePath: auditRecord.relativePath,
- downloadUrl: auditRecord.downloadUrl
+ date : auditRecord.date.format(GroovyConsoleConstants.DATE_FORMAT_DISPLAY),
+ scriptPreview: GroovyScriptUtils.getScriptPreview(auditRecord.script),
+ jobTitle : auditRecord.jobProperties.jobTitle,
+ userId : auditRecord.userId,
+ script : auditRecord.script,
+ data : auditRecord.data,
+ exception : auditRecord.exception,
+ queryString : "?userId=${auditRecord.userId}&script=${auditRecord.relativePath}",
+ relativePath : auditRecord.relativePath,
+ downloadUrl : auditRecord.downloadUrl
]
}]
}
diff --git a/bundle/src/main/groovy/be/orbinson/aem/groovy/console/servlets/ReplicateScriptServlet.groovy b/bundle/src/main/groovy/be/orbinson/aem/groovy/console/servlets/ReplicateScriptServlet.groovy
new file mode 100644
index 00000000..88528fe5
--- /dev/null
+++ b/bundle/src/main/groovy/be/orbinson/aem/groovy/console/servlets/ReplicateScriptServlet.groovy
@@ -0,0 +1,82 @@
+package be.orbinson.aem.groovy.console.servlets
+
+import be.orbinson.aem.groovy.console.configuration.ConfigurationService
+import be.orbinson.aem.groovy.console.response.impl.DefaultReplicateScriptResponse
+import com.day.cq.commons.jcr.JcrConstants
+import com.day.cq.replication.ReplicationActionType
+import com.day.cq.replication.Replicator
+import com.google.common.base.Charsets
+import com.google.common.net.MediaType
+import groovy.util.logging.Slf4j
+import org.apache.commons.io.IOUtils
+import org.apache.sling.api.SlingHttpServletRequest
+import org.apache.sling.api.SlingHttpServletResponse
+import org.apache.sling.api.resource.ResourceResolverFactory
+import org.jetbrains.annotations.NotNull
+import org.osgi.service.component.annotations.Component
+import org.osgi.service.component.annotations.Reference
+
+import javax.jcr.Session
+import javax.servlet.Servlet
+import javax.servlet.ServletException
+
+import static be.orbinson.aem.groovy.console.constants.GroovyConsoleConstants.*
+import static javax.servlet.http.HttpServletResponse.SC_BAD_REQUEST
+import static javax.servlet.http.HttpServletResponse.SC_FORBIDDEN
+
+@Component(service = Servlet, immediate = true, property = [
+ "sling.servlet.paths=/bin/groovyconsole/replicate"
+])
+@Slf4j("LOG")
+class ReplicateScriptServlet extends AbstractJsonResponseServlet {
+ @Reference
+ private ConfigurationService configurationService
+
+ @Reference
+ private ResourceResolverFactory resourceResolverFactory
+
+ @Reference
+ Replicator replicator
+
+ @Override
+ protected void doPost(@NotNull SlingHttpServletRequest request, @NotNull SlingHttpServletResponse response) throws ServletException, IOException {
+ if (configurationService.hasPermission(request) && configurationService.isDistributedExecutionEnabled()) {
+ def script = request.getRequestParameter(SCRIPT)?.getString(Charsets.UTF_8.name())
+ if (script) {
+ def resourceResolver = request.resourceResolver
+ def scriptName = createScriptResource(script)
+ LOG.debug("Replicate script '{}'", scriptName)
+ def session = resourceResolver.adaptTo(Session)
+ def scriptPath = "${PATH_REPLICATION_FOLDER}/${scriptName}"
+ replicator.replicate(session, ReplicationActionType.ACTIVATE, "${scriptPath}")
+ writeJsonResponse(response, new DefaultReplicateScriptResponse("Replicated script on path '${scriptPath}'"))
+ } else {
+ LOG.warn("Script should not be empty")
+ response.status = SC_BAD_REQUEST
+ }
+ } else {
+ response.status = SC_FORBIDDEN
+ }
+ }
+
+ private String createScriptResource(String script) {
+ resourceResolverFactory.getServiceResourceResolver(null).withCloseable { resourceResolver ->
+ def parent = resourceResolver.getResource(PATH_REPLICATION_FOLDER)
+ Map properties = new HashMap<>()
+
+ properties.put(JcrConstants.JCR_PRIMARYTYPE, JcrConstants.NT_FILE)
+ def scriptName = "script-${System.currentTimeMillis()}.groovy"
+ def scriptResource = resourceResolver.create(parent, scriptName, properties)
+
+ properties.clear()
+ properties.put(JcrConstants.JCR_PRIMARYTYPE, JcrConstants.NT_RESOURCE)
+ properties.put(JcrConstants.JCR_ENCODING, CHARSET)
+ properties.put(JcrConstants.JCR_MIMETYPE, MediaType.OCTET_STREAM.toString())
+ properties.put(JcrConstants.JCR_DATA, IOUtils.toInputStream(script, CHARSET))
+ resourceResolver.create(scriptResource, JcrConstants.JCR_CONTENT, properties)
+
+ resourceResolver.commit()
+ scriptName
+ }
+ }
+}
diff --git a/bundle/src/main/groovy/org/cid15/aem/groovy/console/servlets/ScheduledJobsServlet.groovy b/bundle/src/main/groovy/be/orbinson/aem/groovy/console/servlets/ScheduledJobsServlet.groovy
similarity index 66%
rename from bundle/src/main/groovy/org/cid15/aem/groovy/console/servlets/ScheduledJobsServlet.groovy
rename to bundle/src/main/groovy/be/orbinson/aem/groovy/console/servlets/ScheduledJobsServlet.groovy
index 9d20e51f..6b700819 100755
--- a/bundle/src/main/groovy/org/cid15/aem/groovy/console/servlets/ScheduledJobsServlet.groovy
+++ b/bundle/src/main/groovy/be/orbinson/aem/groovy/console/servlets/ScheduledJobsServlet.groovy
@@ -1,32 +1,33 @@
-package org.cid15.aem.groovy.console.servlets
-
+package be.orbinson.aem.groovy.console.servlets
+
+import be.orbinson.aem.groovy.console.GroovyConsoleService
+import be.orbinson.aem.groovy.console.api.JobProperties
+import be.orbinson.aem.groovy.console.audit.AuditRecord
+import be.orbinson.aem.groovy.console.audit.AuditService
+import be.orbinson.aem.groovy.console.configuration.ConfigurationService
+import be.orbinson.aem.groovy.console.constants.GroovyConsoleConstants
+import be.orbinson.aem.groovy.console.utils.GroovyScriptUtils
import com.google.common.collect.ImmutableMap
-import org.cid15.aem.groovy.console.GroovyConsoleService
-import org.cid15.aem.groovy.console.api.JobProperties
-import org.cid15.aem.groovy.console.audit.AuditRecord
-import org.cid15.aem.groovy.console.audit.AuditService
-import org.cid15.aem.groovy.console.configuration.ConfigurationService
-import org.cid15.aem.groovy.console.utils.GroovyScriptUtils
import groovy.util.logging.Slf4j
import org.apache.sling.api.SlingHttpServletRequest
import org.apache.sling.api.SlingHttpServletResponse
import org.apache.sling.event.jobs.JobManager
import org.apache.sling.event.jobs.ScheduledJobInfo
-import org.cid15.aem.groovy.console.constants.GroovyConsoleConstants
import org.osgi.service.component.annotations.Component
import org.osgi.service.component.annotations.Reference
import javax.servlet.Servlet
import javax.servlet.ServletException
-import static org.cid15.aem.groovy.console.constants.GroovyConsoleConstants.DATE_CREATED
-import static org.cid15.aem.groovy.console.constants.GroovyConsoleConstants.SCHEDULED_JOB_ID
-import static org.cid15.aem.groovy.console.constants.GroovyConsoleConstants.SCRIPT
+import static be.orbinson.aem.groovy.console.constants.GroovyConsoleConstants.DATE_CREATED
+import static be.orbinson.aem.groovy.console.constants.GroovyConsoleConstants.SCHEDULED_JOB_ID
+import static be.orbinson.aem.groovy.console.constants.GroovyConsoleConstants.SCRIPT
+
import static javax.servlet.http.HttpServletResponse.SC_BAD_REQUEST
import static javax.servlet.http.HttpServletResponse.SC_FORBIDDEN
@Component(service = Servlet, immediate = true, property = [
- "sling.servlet.paths=/bin/groovyconsole/jobs"
+ "sling.servlet.paths=/bin/groovyconsole/jobs"
])
@Slf4j("LOG")
class ScheduledJobsServlet extends AbstractJsonResponseServlet {
@@ -45,7 +46,7 @@ class ScheduledJobsServlet extends AbstractJsonResponseServlet {
@Override
protected void doGet(SlingHttpServletRequest request, SlingHttpServletResponse response)
- throws ServletException, IOException {
+ throws ServletException, IOException {
def scheduledJob = findScheduledJobById(request)
if (scheduledJob) {
@@ -56,19 +57,19 @@ class ScheduledJobsServlet extends AbstractJsonResponseServlet {
// list all jobs
def scheduledJobs = jobManager.getScheduledJobs(GroovyConsoleConstants.JOB_TOPIC, 0, null)
- .collect { scheduledJobInfo ->
- def auditRecords = scheduledJobAuditRecords.findAll { record ->
- isAuditRecordForScheduledJob(record, scheduledJobInfo)
+ .collect { scheduledJobInfo ->
+ def auditRecords = scheduledJobAuditRecords.findAll { record ->
+ isAuditRecordForScheduledJob(record, scheduledJobInfo)
+ }
+
+ new ImmutableMap.Builder()
+ .putAll(scheduledJobInfo.jobProperties)
+ .put("downloadUrl", (auditRecords ? auditRecords.last().downloadUrl : null) ?: "")
+ .put("scriptPreview", GroovyScriptUtils.getScriptPreview(scheduledJobInfo.jobProperties[SCRIPT] as String))
+ .put("nextExecutionDate", scheduledJobInfo.nextScheduledExecution.format(GroovyConsoleConstants.DATE_FORMAT_DISPLAY))
+ .build()
}
-
- new ImmutableMap.Builder()
- .putAll(scheduledJobInfo.jobProperties)
- .put("downloadUrl", (auditRecords ? auditRecords.last().downloadUrl : null) ?: "")
- .put("scriptPreview", GroovyScriptUtils.getScriptPreview(scheduledJobInfo.jobProperties[SCRIPT] as String))
- .put("nextExecutionDate", scheduledJobInfo.nextScheduledExecution.format(GroovyConsoleConstants.DATE_FORMAT_DISPLAY))
- .build()
- }
- .sort { properties -> properties[DATE_CREATED] }
+ .sort { properties -> properties[DATE_CREATED] }
writeJsonResponse(response, [data: scheduledJobs])
}
@@ -76,7 +77,7 @@ class ScheduledJobsServlet extends AbstractJsonResponseServlet {
@Override
protected void doPost(SlingHttpServletRequest request, SlingHttpServletResponse response)
- throws ServletException, IOException {
+ throws ServletException, IOException {
if (configurationService.hasScheduledJobPermission(request)) {
def scheduledJob = findScheduledJobById(request)
@@ -105,7 +106,7 @@ class ScheduledJobsServlet extends AbstractJsonResponseServlet {
@Override
protected void doDelete(SlingHttpServletRequest request, SlingHttpServletResponse response)
- throws ServletException, IOException {
+ throws ServletException, IOException {
if (configurationService.hasScheduledJobPermission(request)) {
def scheduledJob = findScheduledJobById(request)
diff --git a/bundle/src/main/groovy/org/cid15/aem/groovy/console/servlets/ScriptDownloadServlet.groovy b/bundle/src/main/groovy/be/orbinson/aem/groovy/console/servlets/ScriptDownloadServlet.groovy
similarity index 86%
rename from bundle/src/main/groovy/org/cid15/aem/groovy/console/servlets/ScriptDownloadServlet.groovy
rename to bundle/src/main/groovy/be/orbinson/aem/groovy/console/servlets/ScriptDownloadServlet.groovy
index 3e2eadba..4a3d7319 100644
--- a/bundle/src/main/groovy/org/cid15/aem/groovy/console/servlets/ScriptDownloadServlet.groovy
+++ b/bundle/src/main/groovy/be/orbinson/aem/groovy/console/servlets/ScriptDownloadServlet.groovy
@@ -1,11 +1,11 @@
-package org.cid15.aem.groovy.console.servlets
+package be.orbinson.aem.groovy.console.servlets
+import be.orbinson.aem.groovy.console.audit.AuditService
+import be.orbinson.aem.groovy.console.constants.GroovyConsoleConstants
import com.google.common.net.HttpHeaders
-import org.cid15.aem.groovy.console.audit.AuditService
import org.apache.sling.api.SlingHttpServletRequest
import org.apache.sling.api.SlingHttpServletResponse
import org.apache.sling.api.servlets.SlingSafeMethodsServlet
-import org.cid15.aem.groovy.console.constants.GroovyConsoleConstants
import org.osgi.service.component.annotations.Component
import org.osgi.service.component.annotations.Reference
@@ -14,7 +14,7 @@ import javax.servlet.Servlet
import static javax.servlet.http.HttpServletResponse.SC_BAD_REQUEST
@Component(service = Servlet, immediate = true, property = [
- "sling.servlet.paths=/bin/groovyconsole/download"
+ "sling.servlet.paths=/bin/groovyconsole/download"
])
class ScriptDownloadServlet extends SlingSafeMethodsServlet {
diff --git a/bundle/src/main/groovy/org/cid15/aem/groovy/console/servlets/ScriptPostServlet.groovy b/bundle/src/main/groovy/be/orbinson/aem/groovy/console/servlets/ScriptPostServlet.groovy
similarity index 71%
rename from bundle/src/main/groovy/org/cid15/aem/groovy/console/servlets/ScriptPostServlet.groovy
rename to bundle/src/main/groovy/be/orbinson/aem/groovy/console/servlets/ScriptPostServlet.groovy
index 996a9288..d26467af 100755
--- a/bundle/src/main/groovy/org/cid15/aem/groovy/console/servlets/ScriptPostServlet.groovy
+++ b/bundle/src/main/groovy/be/orbinson/aem/groovy/console/servlets/ScriptPostServlet.groovy
@@ -1,11 +1,11 @@
-package org.cid15.aem.groovy.console.servlets
+package be.orbinson.aem.groovy.console.servlets
+import be.orbinson.aem.groovy.console.GroovyConsoleService
+import be.orbinson.aem.groovy.console.api.context.ScriptContext
+import be.orbinson.aem.groovy.console.api.impl.RequestScriptContext
+import be.orbinson.aem.groovy.console.configuration.ConfigurationService
import com.day.cq.commons.jcr.JcrConstants
import com.google.common.base.Charsets
-import org.cid15.aem.groovy.console.GroovyConsoleService
-import org.cid15.aem.groovy.console.api.context.ScriptContext
-import org.cid15.aem.groovy.console.api.impl.RequestScriptContext
-import org.cid15.aem.groovy.console.configuration.ConfigurationService
import groovy.util.logging.Slf4j
import org.apache.sling.api.SlingHttpServletRequest
import org.apache.sling.api.SlingHttpServletResponse
@@ -16,14 +16,15 @@ import javax.jcr.Session
import javax.servlet.Servlet
import javax.servlet.ServletException
+import static be.orbinson.aem.groovy.console.constants.GroovyConsoleConstants.SCRIPT
+import static be.orbinson.aem.groovy.console.constants.GroovyConsoleConstants.SCRIPT_PATH
+import static be.orbinson.aem.groovy.console.constants.GroovyConsoleConstants.SCRIPT_PATHS
+
import static com.google.common.base.Preconditions.checkNotNull
-import static org.cid15.aem.groovy.console.constants.GroovyConsoleConstants.SCRIPT
-import static org.cid15.aem.groovy.console.constants.GroovyConsoleConstants.SCRIPT_PATH
-import static org.cid15.aem.groovy.console.constants.GroovyConsoleConstants.SCRIPT_PATHS
import static javax.servlet.http.HttpServletResponse.SC_FORBIDDEN
@Component(service = Servlet, immediate = true, property = [
- "sling.servlet.paths=/bin/groovyconsole/post"
+ "sling.servlet.paths=/bin/groovyconsole/post"
])
@Slf4j("LOG")
class ScriptPostServlet extends AbstractJsonResponseServlet {
@@ -36,7 +37,7 @@ class ScriptPostServlet extends AbstractJsonResponseServlet {
@Override
protected void doPost(SlingHttpServletRequest request, SlingHttpServletResponse response) throws
- ServletException, IOException {
+ ServletException, IOException {
if (configurationService.hasPermission(request)) {
def scriptPaths = request.getParameterValues(SCRIPT_PATHS)
@@ -70,11 +71,11 @@ class ScriptPostServlet extends AbstractJsonResponseServlet {
def outputStream = new ByteArrayOutputStream()
new RequestScriptContext(
- request: request,
- response: response,
- outputStream: outputStream,
- printStream: new PrintStream(outputStream, true, Charsets.UTF_8.name()),
- script: checkNotNull(getScript(request, scriptPath), "Script cannot be empty.")
+ request: request,
+ response: response,
+ outputStream: outputStream,
+ printStream: new PrintStream(outputStream, true, Charsets.UTF_8.name()),
+ script: checkNotNull(getScript(request, scriptPath), "Script cannot be empty.")
)
}
@@ -90,9 +91,9 @@ class ScriptPostServlet extends AbstractJsonResponseServlet {
def session = request.resourceResolver.adaptTo(Session)
def binary = session.getNode(scriptPath)
- .getNode(JcrConstants.JCR_CONTENT)
- .getProperty(JcrConstants.JCR_DATA)
- .binary
+ .getNode(JcrConstants.JCR_CONTENT)
+ .getProperty(JcrConstants.JCR_DATA)
+ .binary
def script = binary.stream.text
diff --git a/bundle/src/main/groovy/org/cid15/aem/groovy/console/servlets/ScriptSavingServlet.groovy b/bundle/src/main/groovy/be/orbinson/aem/groovy/console/servlets/ScriptSavingServlet.groovy
similarity index 73%
rename from bundle/src/main/groovy/org/cid15/aem/groovy/console/servlets/ScriptSavingServlet.groovy
rename to bundle/src/main/groovy/be/orbinson/aem/groovy/console/servlets/ScriptSavingServlet.groovy
index eec00684..7718e2ee 100644
--- a/bundle/src/main/groovy/org/cid15/aem/groovy/console/servlets/ScriptSavingServlet.groovy
+++ b/bundle/src/main/groovy/be/orbinson/aem/groovy/console/servlets/ScriptSavingServlet.groovy
@@ -1,7 +1,8 @@
-package org.cid15.aem.groovy.console.servlets
+package be.orbinson.aem.groovy.console.servlets
-import org.cid15.aem.groovy.console.GroovyConsoleService
-import org.cid15.aem.groovy.console.api.impl.RequestScriptData
+
+import be.orbinson.aem.groovy.console.GroovyConsoleService
+import be.orbinson.aem.groovy.console.api.impl.RequestScriptData
import org.apache.sling.api.SlingHttpServletRequest
import org.apache.sling.api.SlingHttpServletResponse
import org.osgi.service.component.annotations.Component
@@ -11,7 +12,7 @@ import javax.servlet.Servlet
import javax.servlet.ServletException
@Component(service = Servlet, immediate = true, property = [
- "sling.servlet.paths=/bin/groovyconsole/save"
+ "sling.servlet.paths=/bin/groovyconsole/save"
])
class ScriptSavingServlet extends AbstractJsonResponseServlet {
@@ -20,7 +21,7 @@ class ScriptSavingServlet extends AbstractJsonResponseServlet {
@Override
protected void doPost(SlingHttpServletRequest request, SlingHttpServletResponse response) throws
- ServletException, IOException {
+ ServletException, IOException {
def scriptData = new RequestScriptData(request)
writeJsonResponse(response, consoleService.saveScript(scriptData))
diff --git a/bundle/src/main/groovy/org/cid15/aem/groovy/console/servlets/ServicesListServlet.groovy b/bundle/src/main/groovy/be/orbinson/aem/groovy/console/servlets/ServicesListServlet.groovy
similarity index 95%
rename from bundle/src/main/groovy/org/cid15/aem/groovy/console/servlets/ServicesListServlet.groovy
rename to bundle/src/main/groovy/be/orbinson/aem/groovy/console/servlets/ServicesListServlet.groovy
index 4819cea5..21a8ce85 100644
--- a/bundle/src/main/groovy/org/cid15/aem/groovy/console/servlets/ServicesListServlet.groovy
+++ b/bundle/src/main/groovy/be/orbinson/aem/groovy/console/servlets/ServicesListServlet.groovy
@@ -1,4 +1,4 @@
-package org.cid15.aem.groovy.console.servlets
+package be.orbinson.aem.groovy.console.servlets
import org.apache.commons.lang3.StringUtils
import org.apache.sling.api.SlingHttpServletRequest
@@ -17,7 +17,7 @@ import static org.apache.sling.api.adapter.AdapterFactory.ADAPTER_CLASSES
import static org.osgi.framework.Constants.OBJECTCLASS
@Component(service = Servlet, immediate = true, property = [
- "sling.servlet.paths=/bin/groovyconsole/services"
+ "sling.servlet.paths=/bin/groovyconsole/services"
])
class ServicesListServlet extends AbstractJsonResponseServlet {
@@ -25,7 +25,7 @@ class ServicesListServlet extends AbstractJsonResponseServlet {
@Override
protected void doGet(SlingHttpServletRequest request,
- SlingHttpServletResponse response) throws ServletException, IOException {
+ SlingHttpServletResponse response) throws ServletException, IOException {
writeJsonResponse(response, adaptersMap + servicesMap)
}
diff --git a/bundle/src/main/groovy/org/cid15/aem/groovy/console/table/Table.groovy b/bundle/src/main/groovy/be/orbinson/aem/groovy/console/table/Table.groovy
similarity index 96%
rename from bundle/src/main/groovy/org/cid15/aem/groovy/console/table/Table.groovy
rename to bundle/src/main/groovy/be/orbinson/aem/groovy/console/table/Table.groovy
index 9bb37b7e..4ba8a2d7 100644
--- a/bundle/src/main/groovy/org/cid15/aem/groovy/console/table/Table.groovy
+++ b/bundle/src/main/groovy/be/orbinson/aem/groovy/console/table/Table.groovy
@@ -1,4 +1,4 @@
-package org.cid15.aem.groovy.console.table
+package be.orbinson.aem.groovy.console.table
class Table {
diff --git a/bundle/src/main/groovy/org/cid15/aem/groovy/console/utils/GroovyScriptUtils.groovy b/bundle/src/main/groovy/be/orbinson/aem/groovy/console/utils/GroovyScriptUtils.groovy
similarity index 94%
rename from bundle/src/main/groovy/org/cid15/aem/groovy/console/utils/GroovyScriptUtils.groovy
rename to bundle/src/main/groovy/be/orbinson/aem/groovy/console/utils/GroovyScriptUtils.groovy
index ad9991c4..b64f99ef 100644
--- a/bundle/src/main/groovy/org/cid15/aem/groovy/console/utils/GroovyScriptUtils.groovy
+++ b/bundle/src/main/groovy/be/orbinson/aem/groovy/console/utils/GroovyScriptUtils.groovy
@@ -1,4 +1,4 @@
-package org.cid15.aem.groovy.console.utils
+package be.orbinson.aem.groovy.console.utils
final class GroovyScriptUtils {
diff --git a/bundle/src/main/groovy/org/cid15/aem/groovy/console/extension/impl/DefaultBindingExtensionProvider.groovy b/bundle/src/main/groovy/org/cid15/aem/groovy/console/extension/impl/DefaultBindingExtensionProvider.groovy
deleted file mode 100644
index d34b8f04..00000000
--- a/bundle/src/main/groovy/org/cid15/aem/groovy/console/extension/impl/DefaultBindingExtensionProvider.groovy
+++ /dev/null
@@ -1,88 +0,0 @@
-package org.cid15.aem.groovy.console.extension.impl
-
-import com.day.cq.search.QueryBuilder
-import com.day.cq.wcm.api.PageManager
-import org.cid15.aem.groovy.console.api.BindingExtensionProvider
-import org.cid15.aem.groovy.console.api.BindingVariable
-import org.cid15.aem.groovy.console.api.context.ScriptContext
-import org.cid15.aem.groovy.console.api.context.ServletScriptContext
-import com.icfolson.aem.groovy.extension.builders.NodeBuilder
-import com.icfolson.aem.groovy.extension.builders.PageBuilder
-import groovy.json.JsonException
-import groovy.json.JsonSlurper
-import org.apache.sling.api.SlingHttpServletRequest
-import org.apache.sling.api.SlingHttpServletResponse
-import org.apache.sling.api.resource.ResourceResolver
-import org.osgi.framework.BundleContext
-import org.osgi.service.component.annotations.Activate
-import org.osgi.service.component.annotations.Component
-import org.osgi.service.component.annotations.Reference
-import org.slf4j.Logger
-import org.slf4j.LoggerFactory
-
-import javax.jcr.Session
-
-@Component(service = BindingExtensionProvider, immediate = true)
-class DefaultBindingExtensionProvider implements BindingExtensionProvider {
-
- @Reference
- private QueryBuilder queryBuilder
-
- private BundleContext bundleContext
-
- @Override
- Map getBindingVariables(ScriptContext scriptContext) {
- def resourceResolver = scriptContext.resourceResolver
- def session = resourceResolver.adaptTo(Session)
-
- def bindingVariables = [
- log: new BindingVariable(LoggerFactory.getLogger("groovyconsole"), Logger,
- "http://www.slf4j.org/api/org/slf4j/Logger.html"),
- session: new BindingVariable(session, Session,
- "https://docs.adobe.com/docs/en/spec/javax.jcr/javadocs/jcr-2.0/javax/jcr/Session.html"),
- pageManager: new BindingVariable(resourceResolver.adaptTo(PageManager), PageManager),
- resourceResolver: new BindingVariable(resourceResolver, ResourceResolver,
- "https://sling.apache.org/apidocs/sling10/org/apache/sling/api/resource/ResourceResolver.html"),
- queryBuilder: new BindingVariable(queryBuilder, QueryBuilder,
- "https://helpx.adobe.com/experience-manager/6-4/sites/developing/using/reference-materials/javadoc" +
- "/com/day/cq/search/QueryBuilder.html"),
- nodeBuilder: new BindingVariable(new NodeBuilder(session), NodeBuilder,
- "http://code.digitalatolson.com/aem-groovy-extension/groovydocs/com/icfolson/aem/groovy/extension" +
- "/builders/NodeBuilder.html"),
- pageBuilder: new BindingVariable(new PageBuilder(session), PageBuilder,
- "http://code.digitalatolson.com/aem-groovy-extension/groovydocs/com/icfolson/aem/groovy/extension" +
- "/builders/PageBuilder.html"),
- bundleContext: new BindingVariable(bundleContext, BundleContext,
- "http://www.osgi.org/javadoc/r4v43/core/org/osgi/framework/BundleContext.html"),
- out: new BindingVariable(scriptContext.printStream, PrintStream,
- "https://docs.oracle.com/javase/8/docs/api/java/io/PrintStream.html")
- ]
-
- if (scriptContext instanceof ServletScriptContext) {
- bindingVariables.putAll([
- slingRequest: new BindingVariable(scriptContext.request, SlingHttpServletRequest,
- "https://sling.apache.org/apidocs/sling10/org/apache/sling/api/SlingHttpServletRequest.html"),
- slingResponse: new BindingVariable(scriptContext.response, SlingHttpServletResponse,
- "https://sling.apache.org/apidocs/sling10/org/apache/sling/api/SlingHttpServletResponse.html")
- ])
- }
-
- if (scriptContext.data) {
- try {
- def json = new JsonSlurper().parseText(scriptContext.data)
-
- bindingVariables["data"] = new BindingVariable(json, json.class)
- } catch (JsonException ignored) {
- // if data cannot be parsed as a JSON object, bind it as a String
- bindingVariables["data"] = new BindingVariable(scriptContext.data, String)
- }
- }
-
- bindingVariables
- }
-
- @Activate
- void activate(BundleContext bundleContext) {
- this.bundleContext = bundleContext
- }
-}
\ No newline at end of file
diff --git a/bundle/src/main/groovy/org/cid15/aem/groovy/console/extension/impl/DefaultStarImportExtensionProvider.groovy b/bundle/src/main/groovy/org/cid15/aem/groovy/console/extension/impl/DefaultStarImportExtensionProvider.groovy
deleted file mode 100644
index 7999309c..00000000
--- a/bundle/src/main/groovy/org/cid15/aem/groovy/console/extension/impl/DefaultStarImportExtensionProvider.groovy
+++ /dev/null
@@ -1,36 +0,0 @@
-package org.cid15.aem.groovy.console.extension.impl
-
-import com.google.common.collect.ImmutableSet
-import org.cid15.aem.groovy.console.api.StarImport
-import org.cid15.aem.groovy.console.api.StarImportExtensionProvider
-import org.osgi.service.component.annotations.Component
-
-@Component(service = StarImportExtensionProvider, immediate = true)
-class DefaultStarImportExtensionProvider implements StarImportExtensionProvider {
-
- private static final String AEM_JAVADOC_PREFIX = "https://helpx.adobe" +
- ".com/experience-manager/6-5/sites/developing/using/reference-materials/javadoc"
-
- private static final String JCR_JAVADOC_PREFIX = "https://docs.adobe.com/docs/en/spec/javax.jcr/javadocs/jcr-2.0"
-
- private static final String SLING_JAVADOC_PREFIX = "http://sling.apache.org/apidocs/sling9"
-
- private static final String JAVADOC_SUFFIX = "package-summary.html"
-
- private static final Set IMPORTS = ImmutableSet.of(
- new StarImport("com.day.cq.dam.api", "$AEM_JAVADOC_PREFIX/com/day/cq/dam/api/$JAVADOC_SUFFIX"),
- new StarImport("com.day.cq.search", "$AEM_JAVADOC_PREFIX/com/day/cq/search/$JAVADOC_SUFFIX"),
- new StarImport("com.day.cq.tagging", "$AEM_JAVADOC_PREFIX/com/day/cq/tagging/$JAVADOC_SUFFIX"),
- new StarImport("com.day.cq.wcm.api", "$AEM_JAVADOC_PREFIX/com/day/cq/wcm/api/$JAVADOC_SUFFIX"),
- new StarImport("com.day.cq.replication", "$AEM_JAVADOC_PREFIX/com/day/cq/replication/$JAVADOC_SUFFIX"),
- new StarImport("javax.jcr", "$JCR_JAVADOC_PREFIX/javax/jcr/$JAVADOC_SUFFIX"),
- new StarImport("org.apache.sling.api", "$SLING_JAVADOC_PREFIX/org/apache/sling/api/$JAVADOC_SUFFIX"),
- new StarImport("org.apache.sling.api.resource",
- "$SLING_JAVADOC_PREFIX/org/apache/sling/api/resource/$JAVADOC_SUFFIX")
- )
-
- @Override
- Set getStarImports() {
- IMPORTS
- }
-}
\ No newline at end of file
diff --git a/bundle/src/main/groovy/org/cid15/aem/groovy/console/response/impl/DefaultRunScriptResponse.groovy b/bundle/src/main/groovy/org/cid15/aem/groovy/console/response/impl/DefaultRunScriptResponse.groovy
deleted file mode 100644
index 70b85702..00000000
--- a/bundle/src/main/groovy/org/cid15/aem/groovy/console/response/impl/DefaultRunScriptResponse.groovy
+++ /dev/null
@@ -1,149 +0,0 @@
-package org.cid15.aem.groovy.console.response.impl
-
-import com.day.cq.commons.jcr.JcrConstants
-import com.day.cq.commons.jcr.JcrUtil
-import com.day.text.Text
-import com.google.common.net.MediaType
-import org.cid15.aem.groovy.console.api.JobProperties
-import org.cid15.aem.groovy.console.api.context.JobScriptContext
-import org.cid15.aem.groovy.console.api.context.ScriptContext
-import org.cid15.aem.groovy.console.response.RunScriptResponse
-import org.cid15.aem.groovy.console.table.Table
-import groovy.json.JsonBuilder
-import groovy.transform.TupleConstructor
-import org.apache.commons.lang3.exception.ExceptionUtils
-import org.apache.sling.api.resource.Resource
-import org.apache.sling.api.resource.ResourceUtil
-
-import static org.cid15.aem.groovy.console.constants.GroovyConsoleConstants.DATA
-import static org.cid15.aem.groovy.console.constants.GroovyConsoleConstants.DATE_FORMAT_FILE_NAME
-import static org.cid15.aem.groovy.console.constants.GroovyConsoleConstants.EXCEPTION_STACK_TRACE
-import static org.cid15.aem.groovy.console.constants.GroovyConsoleConstants.JOB_ID
-import static org.cid15.aem.groovy.console.constants.GroovyConsoleConstants.MEDIA_TYPE_EXTENSIONS
-import static org.cid15.aem.groovy.console.constants.GroovyConsoleConstants.OUTPUT
-import static org.cid15.aem.groovy.console.constants.GroovyConsoleConstants.RESULT
-import static org.cid15.aem.groovy.console.constants.GroovyConsoleConstants.RUNNING_TIME
-import static org.cid15.aem.groovy.console.constants.GroovyConsoleConstants.SCRIPT
-
-@TupleConstructor
-class DefaultRunScriptResponse implements RunScriptResponse {
-
- private static final int LEVEL_USERID = 4
-
- static RunScriptResponse fromResult(ScriptContext scriptContext, Object result, String output, String runningTime) {
- def resultString
-
- if (result instanceof Table) {
- resultString = new JsonBuilder([table: result]).toString()
- } else {
- resultString = result as String
- }
-
- new DefaultRunScriptResponse(
- date: Calendar.instance,
- script: scriptContext.script,
- data: scriptContext.data,
- result: resultString,
- output: output,
- exceptionStackTrace: "",
- runningTime: runningTime,
- userId: scriptContext.userId,
- jobId: scriptContext instanceof JobScriptContext ? scriptContext.jobId : null,
- jobProperties: scriptContext instanceof JobScriptContext ? scriptContext.jobProperties : null
- )
- }
-
- static RunScriptResponse fromException(ScriptContext scriptContext, String output, Throwable throwable) {
- def exceptionStackTrace = ExceptionUtils.getStackTrace(throwable)
-
- new DefaultRunScriptResponse(
- date: Calendar.instance,
- script: scriptContext.script,
- data: scriptContext.data,
- result: "",
- output: output,
- exceptionStackTrace: exceptionStackTrace,
- runningTime: "",
- userId: scriptContext.userId,
- jobId: scriptContext instanceof JobScriptContext ? scriptContext.jobId : null,
- jobProperties: scriptContext instanceof JobScriptContext ? scriptContext.jobProperties : null
- )
- }
-
- static RunScriptResponse fromAuditRecordResource(Resource resource) {
- def properties = resource.valueMap
-
- def exceptionStackTrace = properties.get(EXCEPTION_STACK_TRACE, "")
- def userIdResourcePath = ResourceUtil.getParent(resource.path, LEVEL_USERID)
- def userId = Text.getName(userIdResourcePath)
-
- new DefaultRunScriptResponse(
- date: properties.get(JcrConstants.JCR_CREATED, Calendar),
- script: properties.get(SCRIPT, ""),
- data: properties.get(DATA, ""),
- result: exceptionStackTrace ? "" : properties.get(RESULT, ""),
- output: properties.get(OUTPUT, ""),
- exceptionStackTrace: exceptionStackTrace ?: "",
- runningTime: exceptionStackTrace ? "" : properties.get(RUNNING_TIME, ""),
- userId: userId,
- jobId: properties.get(JOB_ID, String),
- jobProperties: JobProperties.fromValueMap(properties)
- )
- }
-
- Calendar date
-
- String script
-
- String data
-
- String result
-
- String output
-
- String exceptionStackTrace
-
- String runningTime
-
- String userId
-
- String jobId
-
- JobProperties jobProperties
-
- @Override
- String getMediaType() {
- def mediaType
-
- if (jobProperties?.mediaType) {
- mediaType = MediaType.parse(jobProperties.mediaType)
- } else {
- mediaType = MediaType.PLAIN_TEXT_UTF_8
- }
-
- mediaType.withoutParameters().toString()
- }
-
- @Override
- String getOutputFileName() {
- new StringBuilder()
- .append(outputFileNamePrefix)
- .append(date.format(DATE_FORMAT_FILE_NAME))
- .append(".")
- .append(MEDIA_TYPE_EXTENSIONS[mediaType])
- .toString()
- }
-
- private String getOutputFileNamePrefix() {
- def outputFileNamePrefix
-
- if (jobProperties?.jobTitle) {
- outputFileNamePrefix = JcrUtil.createValidName(jobProperties.jobTitle,
- JcrUtil.HYPHEN_LABEL_CHAR_MAPPING).toLowerCase() + "-"
- } else {
- outputFileNamePrefix = "output-"
- }
-
- outputFileNamePrefix
- }
-}
diff --git a/bundle/src/main/java/org/cid15/aem/groovy/console/configuration/impl/ConfigurationServiceProperties.java b/bundle/src/main/java/be/orbinson/aem/groovy/console/configuration/impl/ConfigurationServiceProperties.java
similarity index 74%
rename from bundle/src/main/java/org/cid15/aem/groovy/console/configuration/impl/ConfigurationServiceProperties.java
rename to bundle/src/main/java/be/orbinson/aem/groovy/console/configuration/impl/ConfigurationServiceProperties.java
index f54e5412..f163eac6 100644
--- a/bundle/src/main/java/org/cid15/aem/groovy/console/configuration/impl/ConfigurationServiceProperties.java
+++ b/bundle/src/main/java/be/orbinson/aem/groovy/console/configuration/impl/ConfigurationServiceProperties.java
@@ -1,4 +1,4 @@
-package org.cid15.aem.groovy.console.configuration.impl;
+package be.orbinson.aem.groovy.console.configuration.impl;
import org.osgi.service.metatype.annotations.AttributeDefinition;
import org.osgi.service.metatype.annotations.ObjectClassDefinition;
@@ -32,10 +32,15 @@
boolean auditDisabled() default false;
@AttributeDefinition(name = "Display All Audit Records?",
- description = "If enabled, all audit records (including records for other users) will be displayed in the console history.")
+ description = "If enabled, all audit records (including records for other users) will be displayed in the console history.")
boolean auditDisplayAll() default false;
@AttributeDefinition(name = "Thread Timeout",
- description = "Time in seconds that scripts are allowed to execute before being interrupted. If 0, no timeout is enforced.")
+ description = "Time in seconds that scripts are allowed to execute before being interrupted. If 0, no timeout is enforced.")
long threadTimeout() default 0;
-}
\ No newline at end of file
+
+ @AttributeDefinition(name = "Distributed execution enabled?",
+ description = "If enabled, a script will be able to be replicated from an author and executed on all default replication agents."
+ )
+ boolean distributedExecutionEnabled() default false;
+}
diff --git a/bundle/src/main/javadoc/README b/bundle/src/main/javadoc/README
deleted file mode 100644
index 30c5e1de..00000000
--- a/bundle/src/main/javadoc/README
+++ /dev/null
@@ -1 +0,0 @@
-The AEM Groovy Console does not provide a Javadoc as it contains no Java source classes. See the published source JAR for comments and implementation details.
\ No newline at end of file
diff --git a/bundle/src/test/groovy/be/orbinson/aem/groovy/console/audit/impl/DefaultAuditServiceTest.groovy b/bundle/src/test/groovy/be/orbinson/aem/groovy/console/audit/impl/DefaultAuditServiceTest.groovy
new file mode 100644
index 00000000..36f1cebe
--- /dev/null
+++ b/bundle/src/test/groovy/be/orbinson/aem/groovy/console/audit/impl/DefaultAuditServiceTest.groovy
@@ -0,0 +1,137 @@
+package be.orbinson.aem.groovy.console.audit.impl
+
+import be.orbinson.aem.groovy.console.api.impl.RequestScriptContext
+import be.orbinson.aem.groovy.console.audit.AuditRecord
+import be.orbinson.aem.groovy.console.audit.AuditService
+import be.orbinson.aem.groovy.console.configuration.impl.DefaultConfigurationService
+import be.orbinson.aem.groovy.console.response.impl.DefaultRunScriptResponse
+import io.wcm.testing.mock.aem.junit5.AemContext
+import io.wcm.testing.mock.aem.junit5.AemContextExtension
+import org.apache.commons.lang3.exception.ExceptionUtils
+import org.apache.sling.testing.mock.sling.ResourceResolverType
+import org.junit.jupiter.api.BeforeEach
+import org.junit.jupiter.api.Test
+import org.junit.jupiter.api.extension.ExtendWith
+
+import static org.junit.jupiter.api.Assertions.assertEquals
+import static org.junit.jupiter.api.Assertions.assertNotNull
+
+@ExtendWith(AemContextExtension.class)
+class DefaultAuditServiceTest {
+
+ private final AemContext context = new AemContext(ResourceResolverType.JCR_MOCK);
+
+ AuditService auditService;
+
+ @BeforeEach
+ void beforeEach() {
+ context.build().resource("/var/groovyconsole").commit();
+ context.registerInjectActivateService(new DefaultConfigurationService())
+ auditService = context.registerInjectActivateService(new DefaultAuditService())
+ }
+
+ @Test
+ void createAuditRecordForScriptWithResultAndOutput() {
+ def request = context.request()
+ def response = context.response()
+
+ def script = "script content"
+ def output = "output"
+ def runningTime = "running time"
+ def result = "result"
+
+ def scriptContext = new RequestScriptContext(request, response, new ByteArrayOutputStream(), null, script)
+
+ def runScriptResponse = DefaultRunScriptResponse.fromResult(scriptContext, result, output, runningTime)
+
+ def auditRecord = auditService.createAuditRecord(runScriptResponse)
+
+ assertNotNull(context.resourceResolver().getResource(auditRecord.path))
+
+ assertEquals(auditRecord.script, script)
+ assertEquals(auditRecord.result, result)
+ assertEquals(auditRecord.output, output)
+ }
+
+ @Test
+ void createAuditRecordWithException() {
+ def request = context.request()
+ def response = context.response()
+
+ def scriptContext = new RequestScriptContext(request, response, new ByteArrayOutputStream(), null, "script content")
+
+ def exception = new RuntimeException("")
+
+ def runScriptResponse = DefaultRunScriptResponse.fromException(scriptContext, "output", exception)
+
+ def auditRecord = auditService.createAuditRecord(runScriptResponse)
+
+ assertNotNull(context.resourceResolver().getResource(auditRecord.path))
+
+ assertEquals(auditRecord.script, "script content")
+ assertEquals(auditRecord.output, "output")
+ assertEquals(auditRecord.exceptionStackTrace, ExceptionUtils.getStackTrace(exception))
+
+ }
+
+ @Test
+ void createMultipleAuditRecords() {
+ def request = context.request()
+ def response = context.response()
+
+ def scriptContext = new RequestScriptContext(request, response, new ByteArrayOutputStream(), null, "script content")
+
+ def runScriptResponse = DefaultRunScriptResponse.fromResult(scriptContext, "result", "output", "running time")
+
+ def auditRecords = []
+
+ (1..5).each {
+ auditRecords.add(auditService.createAuditRecord(runScriptResponse))
+ }
+
+ assertAuditRecordsCreated(auditRecords)
+ }
+
+ @Test
+ void getAuditRecordsForValidDateRange() {
+ def request = context.request()
+ def response = context.response()
+
+ def scriptContext = new RequestScriptContext(request, response, new ByteArrayOutputStream(), null, "script content")
+
+ def runScriptResponse = DefaultRunScriptResponse.fromResult(scriptContext, "result", "output", "running time")
+
+ auditService.createAuditRecord(runScriptResponse)
+
+ def tests = [
+ [startDateOffset: -2, endDateOffset: -1, size: 0],
+ [startDateOffset: -1, endDateOffset: 0, size: 1],
+ [startDateOffset: 0, endDateOffset: 0, size: 1],
+ [startDateOffset: 0, endDateOffset: 1, size: 1],
+ [startDateOffset: -1, endDateOffset: 1, size: 1],
+ [startDateOffset: 1, endDateOffset: 2, size: 0]
+ ]
+ tests.each { map ->
+ def startDate = getDate(map.startDateOffset)
+ def endDate = getDate(map.endDateOffset)
+ assertEquals(map.size, auditService.getAuditRecords(context.resourceResolver().userID, startDate, endDate).size())
+ }
+ }
+
+ private Calendar getDate(Integer offset) {
+ def date = (new Date() + offset).toCalendar()
+
+ date.set(Calendar.HOUR_OF_DAY, 0)
+ date.set(Calendar.MINUTE, 0)
+ date.set(Calendar.SECOND, 0)
+ date.set(Calendar.MILLISECOND, 0)
+
+ date
+ }
+
+ private void assertAuditRecordsCreated(List auditRecords) {
+ auditRecords.each {
+ assertNotNull(context.resourceResolver().getResource(it.path))
+ }
+ }
+}
diff --git a/bundle/src/test/groovy/org/cid15/aem/groovy/console/extension/impl/DefaultExtensionServiceSpec.groovy b/bundle/src/test/groovy/be/orbinson/aem/groovy/console/extension/impl/DefaultExtensionServiceTest.groovy
similarity index 54%
rename from bundle/src/test/groovy/org/cid15/aem/groovy/console/extension/impl/DefaultExtensionServiceSpec.groovy
rename to bundle/src/test/groovy/be/orbinson/aem/groovy/console/extension/impl/DefaultExtensionServiceTest.groovy
index e4ae7fcc..7000634d 100644
--- a/bundle/src/test/groovy/org/cid15/aem/groovy/console/extension/impl/DefaultExtensionServiceSpec.groovy
+++ b/bundle/src/test/groovy/be/orbinson/aem/groovy/console/extension/impl/DefaultExtensionServiceTest.groovy
@@ -1,24 +1,30 @@
-package org.cid15.aem.groovy.console.extension.impl
+package be.orbinson.aem.groovy.console.extension.impl
+import be.orbinson.aem.groovy.console.api.*
+import be.orbinson.aem.groovy.console.api.context.ScriptContext
+import be.orbinson.aem.groovy.console.api.impl.RequestScriptContext
+import be.orbinson.aem.groovy.console.extension.ExtensionService
import com.google.common.io.ByteStreams
-import org.cid15.aem.groovy.console.api.impl.RequestScriptContext
-import com.icfolson.aem.prosper.specs.ProsperSpec
-import org.cid15.aem.groovy.console.api.BindingExtensionProvider
-import org.cid15.aem.groovy.console.api.BindingVariable
-import org.cid15.aem.groovy.console.api.ScriptMetaClassExtensionProvider
-import org.cid15.aem.groovy.console.api.StarImport
-import org.cid15.aem.groovy.console.api.StarImportExtensionProvider
-import org.cid15.aem.groovy.console.api.context.ScriptContext
-import org.cid15.aem.groovy.console.extension.ExtensionService
+import io.wcm.testing.mock.aem.junit5.AemContext
+import io.wcm.testing.mock.aem.junit5.AemContextExtension
+import org.apache.sling.testing.mock.sling.ResourceResolverType
import org.codehaus.groovy.control.CompilerConfiguration
import org.codehaus.groovy.control.MultipleCompilationErrorsException
import org.codehaus.groovy.control.customizers.CompilationCustomizer
+import org.junit.jupiter.api.Test
+import org.junit.jupiter.api.extension.ExtendWith
import java.text.SimpleDateFormat
-class DefaultExtensionServiceSpec extends ProsperSpec {
+import static org.junit.jupiter.api.Assertions.assertEquals
+import static org.junit.jupiter.api.Assertions.assertThrows
- static final def SELECTORS = ["mobile"]
+@ExtendWith(AemContextExtension.class)
+class DefaultExtensionServiceTest {
+
+ private final AemContext context = new AemContext(ResourceResolverType.JCR_MOCK);
+
+ static final def SELECTORS = "mobile"
static final def PARAMETERS = [firstName: "Clarence", lastName: "Wiggum"]
@@ -37,8 +43,8 @@ class DefaultExtensionServiceSpec extends ProsperSpec {
@Override
Map getBindingVariables(ScriptContext scriptContext) {
[
- parameterNames: new BindingVariable((scriptContext as RequestScriptContext).request.parameterMap.keySet()),
- selectors: new BindingVariable([])
+ parameterNames: new BindingVariable((scriptContext as RequestScriptContext).request.parameterMap.keySet()),
+ selectors : new BindingVariable([])
]
}
}
@@ -48,8 +54,8 @@ class DefaultExtensionServiceSpec extends ProsperSpec {
@Override
Map getBindingVariables(ScriptContext scriptContext) {
[
- path: new BindingVariable((scriptContext as RequestScriptContext).request.requestPathInfo.resourcePath),
- selectors: new BindingVariable((scriptContext as RequestScriptContext).request.requestPathInfo.selectors as List)
+ path : new BindingVariable((scriptContext as RequestScriptContext).request.requestPathInfo.resourcePath),
+ selectors: new BindingVariable((scriptContext as RequestScriptContext).request.requestPathInfo.selectors as List)
]
}
}
@@ -66,57 +72,45 @@ class DefaultExtensionServiceSpec extends ProsperSpec {
}
}
- def "get compilation customizers"() {
- setup:
+ @Test
+ void getCompilationCustomizers() {
def extensionService = new DefaultExtensionService()
def firstProvider = new TestStarImportExtensionProvider()
- when:
extensionService.bindStarImportExtensionProvider(firstProvider)
- then:
- extensionService.compilationCustomizers.size() == 1
+ assertEquals(extensionService.compilationCustomizers.size(), 1)
- when:
extensionService.unbindStarImportExtensionProvider(firstProvider)
- then:
- extensionService.compilationCustomizers.size() == 0
+ assertEquals(extensionService.compilationCustomizers.size(), 0)
}
- def "star imports"() {
- setup:
+ @Test
+ void starImports() {
def extensionService = new DefaultExtensionService()
def starImportExtensionProvider = new TestStarImportExtensionProvider()
- when:
extensionService.bindStarImportExtensionProvider(starImportExtensionProvider)
- and:
runScriptWithExtensionService(extensionService)
- then:
- notThrown(MultipleCompilationErrorsException)
-
- when:
extensionService.unbindStarImportExtensionProvider(starImportExtensionProvider)
- and:
- runScriptWithExtensionService(extensionService)
- then:
- thrown(MultipleCompilationErrorsException)
+ assertThrows(MultipleCompilationErrorsException) {
+ runScriptWithExtensionService(extensionService)
+ }
}
- def "get binding"() {
- setup:
- def request = requestBuilder.build {
- path = "/"
- selectors = SELECTORS
- parameterMap = PARAMETERS
- }
+ @Test
+ void getBinding() {
+ def request = context.request();
+ request.setParameterMap(PARAMETERS);
+ request.getRequestPathInfo().setSelectorString(SELECTORS)
+ request.getRequestPathInfo().setResourcePath("/")
- def response = responseBuilder.build()
+ def response = context.response()
def scriptContext = new RequestScriptContext(request, response, null, null, null)
@@ -124,31 +118,23 @@ class DefaultExtensionServiceSpec extends ProsperSpec {
def firstProvider = new FirstBindingExtensionProvider()
def secondProvider = new SecondBindingExtensionProvider()
- when:
extensionService.bindBindingExtensionProvider(firstProvider)
extensionService.bindBindingExtensionProvider(secondProvider)
- then:
- extensionService.getBindingVariables(scriptContext)["selectors"].value == request.requestPathInfo.selectors as List
- extensionService.getBindingVariables(scriptContext)["parameterNames"].value == request.parameterMap.keySet()
- extensionService.getBindingVariables(scriptContext)["path"].value == "/"
+ assert extensionService.getBindingVariables(scriptContext)["selectors"].value == request.requestPathInfo.selectors as List
+ assert extensionService.getBindingVariables(scriptContext)["parameterNames"].value == request.parameterMap.keySet()
+ assert extensionService.getBindingVariables(scriptContext)["path"].value == "/"
- when:
extensionService.unbindBindingExtensionProvider(secondProvider)
- then:
- extensionService.getBindingVariables(scriptContext)["selectors"].value == []
+ assert extensionService.getBindingVariables(scriptContext)["selectors"].value == []
- and:
- !extensionService.getBindingVariables(scriptContext)["path"]
+ assert !extensionService.getBindingVariables(scriptContext)["path"]
}
- def "get script metaclasses"() {
- setup:
- def request = requestBuilder.build {
- selectors = SELECTORS
- parameterMap = PARAMETERS
- }
+ @Test
+ void getScriptMetaClasses() {
+ def request = context.request();
def scriptContext = new RequestScriptContext(request)
@@ -156,25 +142,21 @@ class DefaultExtensionServiceSpec extends ProsperSpec {
def firstProvider = new TestScriptMetaClassExtensionProvider()
def secondProvider = new TestScriptMetaClassExtensionProvider()
- when:
extensionService.bindScriptMetaClassExtensionProvider(firstProvider)
extensionService.bindScriptMetaClassExtensionProvider(secondProvider)
- then:
- extensionService.getScriptMetaClasses(scriptContext).size() == 2
+ assert extensionService.getScriptMetaClasses(scriptContext).size() == 2
- when:
extensionService.unbindScriptMetaClassExtensionProvider(secondProvider)
- then:
- extensionService.getScriptMetaClasses(scriptContext).size() == 1
+ assert extensionService.getScriptMetaClasses(scriptContext).size() == 1
}
private void runScriptWithExtensionService(ExtensionService extensionService) {
def binding = new Binding(out: new PrintStream(ByteStreams.nullOutputStream()))
def configuration = new CompilerConfiguration().addCompilationCustomizers(
- extensionService.compilationCustomizers as CompilationCustomizer[])
+ extensionService.compilationCustomizers as CompilationCustomizer[])
new GroovyShell(binding, configuration).parse(SCRIPT).run()
}
diff --git a/bundle/src/test/groovy/be/orbinson/aem/groovy/console/impl/DefaultGroovyConsoleServiceTest.groovy b/bundle/src/test/groovy/be/orbinson/aem/groovy/console/impl/DefaultGroovyConsoleServiceTest.groovy
new file mode 100755
index 00000000..a87c8a8d
--- /dev/null
+++ b/bundle/src/test/groovy/be/orbinson/aem/groovy/console/impl/DefaultGroovyConsoleServiceTest.groovy
@@ -0,0 +1,123 @@
+package be.orbinson.aem.groovy.console.impl
+
+import be.orbinson.aem.groovy.console.GroovyConsoleService
+import be.orbinson.aem.groovy.console.api.impl.RequestScriptContext
+import be.orbinson.aem.groovy.console.api.impl.RequestScriptData
+import be.orbinson.aem.groovy.console.audit.AuditService
+import be.orbinson.aem.groovy.console.configuration.ConfigurationService
+import be.orbinson.aem.groovy.console.constants.GroovyConsoleConstants
+import be.orbinson.aem.groovy.console.extension.impl.DefaultBindingExtensionProvider
+import be.orbinson.aem.groovy.console.extension.impl.DefaultExtensionService
+import be.orbinson.aem.groovy.console.extension.impl.DefaultScriptMetaClassExtensionProvider
+import com.day.cq.commons.jcr.JcrConstants
+import com.day.cq.replication.Replicator
+import com.day.cq.search.QueryBuilder
+import com.google.common.base.Charsets
+import io.wcm.testing.mock.aem.junit5.AemContext
+import io.wcm.testing.mock.aem.junit5.AemContextExtension
+import org.apache.sling.event.jobs.JobManager
+import org.apache.sling.testing.mock.sling.ResourceResolverType
+import org.junit.jupiter.api.BeforeEach
+import org.junit.jupiter.api.Test
+import org.junit.jupiter.api.extension.ExtendWith
+
+import javax.jcr.Session
+
+import static be.orbinson.aem.groovy.console.constants.GroovyConsoleConstants.PATH_SCRIPTS_FOLDER
+import static be.orbinson.aem.groovy.console.constants.GroovyConsoleConstants.SCRIPT
+import static org.junit.jupiter.api.Assertions.*
+import static org.mockito.Mockito.mock
+
+@ExtendWith(AemContextExtension.class)
+class DefaultGroovyConsoleServiceTest {
+
+ private final AemContext context = new AemContext(ResourceResolverType.JCR_MOCK);
+
+ def SCRIPT_NAME = "Script"
+
+ def SCRIPT_FILE_NAME = "${SCRIPT_NAME}.groovy"
+
+ def PATH_FILE = "$PATH_SCRIPTS_FOLDER/$SCRIPT_FILE_NAME"
+
+ def PATH_FILE_CONTENT = "$PATH_FILE/${JcrConstants.JCR_CONTENT}"
+
+ @BeforeEach
+ void beforeEach() {
+ context.registerService(JobManager, mock(JobManager))
+ context.registerService(QueryBuilder, mock(QueryBuilder))
+ context.registerService(ConfigurationService, mock(ConfigurationService))
+ context.registerService(AuditService, mock(AuditService))
+ context.registerService(Replicator, mock(Replicator))
+ context.registerInjectActivateService(new DefaultBindingExtensionProvider())
+ context.registerInjectActivateService(new DefaultExtensionService())
+ context.registerInjectActivateService(new DefaultScriptMetaClassExtensionProvider())
+ context.registerInjectActivateService(new DefaultGroovyConsoleService())
+ }
+
+ @Test
+ void runScript() {
+ def consoleService = context.getService(GroovyConsoleService)
+
+ def request = context.request()
+ def response = context.response();
+
+ def outputStream = new ByteArrayOutputStream()
+
+ def scriptContext = new RequestScriptContext(
+ request: request,
+ response: response,
+ outputStream: outputStream,
+ printStream: new PrintStream(outputStream, true, Charsets.UTF_8.name()),
+ script: scriptAsString
+ )
+
+ def map = consoleService.runScript(scriptContext)
+ assertScriptResult(map)
+ }
+
+ @Test
+ void saveScript() {
+
+ def consoleService = context.getService(GroovyConsoleService)
+
+ def request = context.request();
+ request.setParameterMap(this.parameterMap)
+
+ def scriptData = new RequestScriptData(request)
+
+ consoleService.saveScript(scriptData)
+
+ assertNodeExists(PATH_SCRIPTS_FOLDER, JcrConstants.NT_FOLDER)
+ assertNodeExists(PATH_FILE, JcrConstants.NT_FILE)
+ assertNodeExists(PATH_FILE_CONTENT, JcrConstants.NT_RESOURCE)
+
+ assertNotNull(context.resourceResolver().adaptTo(Session).getNode(PATH_FILE_CONTENT).getProperty(JcrConstants.JCR_DATA).getBinary().getStream().getText())
+ }
+
+ void assertScriptResult(map) {
+ assertNull(map.result)
+ assertEquals("BEER" + System.lineSeparator(), map.output)
+ assertEquals("",map.exceptionStackTrace)
+ assertNotNull(map.runningTime)
+ }
+
+ private String getScriptAsString() {
+ def scriptAsString = null
+
+ this.class.getResourceAsStream("/$SCRIPT_FILE_NAME").withStream { stream ->
+ scriptAsString = stream.text
+ }
+
+ scriptAsString
+ }
+
+ private Map getParameterMap() {
+ [(GroovyConsoleConstants.FILE_NAME): (SCRIPT_NAME), (SCRIPT): scriptAsString]
+ }
+
+ void assertNodeExists(String path, String type) {
+ def node = context.resourceResolver().getResource(path);
+ assertNotNull(node)
+ assertTrue(node.isResourceType(type))
+ }
+}
diff --git a/bundle/src/test/groovy/org/cid15/aem/groovy/console/audit/impl/DefaultAuditServiceSpec.groovy b/bundle/src/test/groovy/org/cid15/aem/groovy/console/audit/impl/DefaultAuditServiceSpec.groovy
deleted file mode 100644
index e190891c..00000000
--- a/bundle/src/test/groovy/org/cid15/aem/groovy/console/audit/impl/DefaultAuditServiceSpec.groovy
+++ /dev/null
@@ -1,146 +0,0 @@
-package org.cid15.aem.groovy.console.audit.impl
-
-import org.cid15.aem.groovy.console.api.impl.RequestScriptContext
-import org.cid15.aem.groovy.console.configuration.impl.DefaultConfigurationService
-import com.icfolson.aem.prosper.specs.ProsperSpec
-import org.apache.commons.lang3.exception.ExceptionUtils
-import org.apache.sling.jcr.resource.JcrResourceConstants
-import org.cid15.aem.groovy.console.audit.AuditRecord
-import org.cid15.aem.groovy.console.response.impl.DefaultRunScriptResponse
-import spock.lang.Shared
-import spock.lang.Unroll
-
-@Unroll
-class DefaultAuditServiceSpec extends ProsperSpec {
-
- @Shared
- DefaultAuditService auditService = new DefaultAuditService()
-
- def setupSpec() {
- pageBuilder.var {
- groovyconsole(JcrResourceConstants.NT_SLING_FOLDER)
- }
-
- slingContext.registerInjectActivateService(new DefaultConfigurationService())
- slingContext.registerInjectActivateService(auditService)
- }
-
- def cleanup() {
- // remove all audit nodes
- auditService.getAllAuditRecords(resourceResolver.userID)*.path.each {
- session.getNode(it).remove()
- }
-
- session.save()
- }
-
- def "create audit record for script with result and output"() {
- when:
- def request = requestBuilder.build()
- def response = responseBuilder.build()
-
- def scriptContext = new RequestScriptContext(request, response, new ByteArrayOutputStream(), null, script)
-
- def runScriptResponse = DefaultRunScriptResponse.fromResult(scriptContext, result, output, runningTime)
-
- def auditRecord = auditService.createAuditRecord(runScriptResponse)
-
- then:
- assertNodeExists(auditRecord.path)
-
- and:
- auditRecord.script == script
- auditRecord.result == result
- auditRecord.output == output
-
- where:
- script | result | output | runningTime
- "script content" | "result" | "output" | "running time"
- }
-
- def "create audit record for script with exception"() {
- when:
- def request = requestBuilder.build()
- def response = responseBuilder.build()
-
- def scriptContext = new RequestScriptContext(request, response, new ByteArrayOutputStream(), null, "script content")
-
- def exception = new RuntimeException("")
-
- def runScriptResponse = DefaultRunScriptResponse.fromException(scriptContext, "output", exception)
-
- def auditRecord = auditService.createAuditRecord(runScriptResponse)
-
- then:
- assertNodeExists(auditRecord.path)
-
- and:
- auditRecord.script == "script content"
- auditRecord.output == "output"
- auditRecord.exceptionStackTrace == ExceptionUtils.getStackTrace(exception)
- }
-
- def "create multiple audit records"() {
- setup:
- def request = requestBuilder.build()
- def response = responseBuilder.build()
-
- def scriptContext = new RequestScriptContext(request, response, new ByteArrayOutputStream(), null, "script content")
-
- def runScriptResponse = DefaultRunScriptResponse.fromResult(scriptContext, "result", "output", "running time")
-
- def auditRecords = []
-
- when:
- (1..5).each {
- auditRecords.add(auditService.createAuditRecord(runScriptResponse))
- }
-
- then:
- assertAuditRecordsCreated(auditRecords)
- }
-
- def "get audit records for valid date range"() {
- setup:
- def request = requestBuilder.build()
- def response = responseBuilder.build()
-
- def scriptContext = new RequestScriptContext(request, response, new ByteArrayOutputStream(), null, "script content")
-
- def runScriptResponse = DefaultRunScriptResponse.fromResult(scriptContext, "result", "output", "running time")
-
- auditService.createAuditRecord(runScriptResponse)
-
- def startDate = getDate(startDateOffset)
- def endDate = getDate(endDateOffset)
-
- expect:
- auditService.getAuditRecords(resourceResolver.userID, startDate, endDate).size() == size
-
- where:
- startDateOffset | endDateOffset | size
- -2 | -1 | 0
- -1 | 0 | 1
- 0 | 0 | 1
- 0 | 1 | 1
- -1 | 1 | 1
- 1 | 2 | 0
- }
-
- private Calendar getDate(Integer offset) {
- def date = (new Date() + offset).toCalendar()
-
- date.set(Calendar.HOUR_OF_DAY, 0)
- date.set(Calendar.MINUTE, 0)
- date.set(Calendar.SECOND, 0)
- date.set(Calendar.MILLISECOND, 0)
-
- date
- }
-
- private void assertAuditRecordsCreated(List auditRecords) {
- auditRecords.each {
- assertNodeExists(it.path)
- }
- }
-}
diff --git a/bundle/src/test/groovy/org/cid15/aem/groovy/console/impl/DefaultGroovyConsoleServiceSpec.groovy b/bundle/src/test/groovy/org/cid15/aem/groovy/console/impl/DefaultGroovyConsoleServiceSpec.groovy
deleted file mode 100755
index 5ac7290f..00000000
--- a/bundle/src/test/groovy/org/cid15/aem/groovy/console/impl/DefaultGroovyConsoleServiceSpec.groovy
+++ /dev/null
@@ -1,116 +0,0 @@
-package org.cid15.aem.groovy.console.impl
-
-import com.day.cq.commons.jcr.JcrConstants
-import com.day.cq.replication.Replicator
-import com.day.cq.search.QueryBuilder
-import com.google.common.base.Charsets
-import org.cid15.aem.groovy.console.GroovyConsoleService
-import org.cid15.aem.groovy.console.api.impl.RequestScriptContext
-import org.cid15.aem.groovy.console.api.impl.RequestScriptData
-import org.cid15.aem.groovy.console.configuration.ConfigurationService
-import com.icfolson.aem.prosper.specs.ProsperSpec
-import org.apache.sling.event.jobs.JobManager
-import org.apache.sling.jcr.resource.JcrResourceConstants
-import org.cid15.aem.groovy.console.audit.AuditService
-import org.cid15.aem.groovy.console.constants.GroovyConsoleConstants
-import org.cid15.aem.groovy.console.extension.impl.DefaultBindingExtensionProvider
-import org.cid15.aem.groovy.console.extension.impl.DefaultExtensionService
-import org.cid15.aem.groovy.console.extension.impl.DefaultScriptMetaClassExtensionProvider
-
-import static org.cid15.aem.groovy.console.constants.GroovyConsoleConstants.PATH_SCRIPTS_FOLDER
-import static org.cid15.aem.groovy.console.constants.GroovyConsoleConstants.SCRIPT
-
-class DefaultGroovyConsoleServiceSpec extends ProsperSpec {
-
- static final def SCRIPT_NAME = "Script"
-
- static final def SCRIPT_FILE_NAME = "${SCRIPT_NAME}.groovy"
-
- static final def PATH_FILE = "$PATH_SCRIPTS_FOLDER/$SCRIPT_FILE_NAME"
-
- static final def PATH_FILE_CONTENT = "$PATH_FILE/${JcrConstants.JCR_CONTENT}"
-
- def setupSpec() {
- slingContext.registerService(JobManager, Mock(JobManager))
- slingContext.registerService(QueryBuilder, Mock(QueryBuilder))
- slingContext.registerService(ConfigurationService, Mock(ConfigurationService))
- slingContext.registerService(AuditService, Mock(AuditService))
- slingContext.registerService(Replicator, Mock(Replicator))
- slingContext.registerInjectActivateService(new DefaultBindingExtensionProvider())
- slingContext.registerInjectActivateService(new DefaultExtensionService())
- slingContext.registerInjectActivateService(new DefaultScriptMetaClassExtensionProvider())
- slingContext.registerInjectActivateService(new DefaultGroovyConsoleService())
- }
-
- def "run script"() {
- setup:
- def consoleService = slingContext.getService(GroovyConsoleService)
-
- def request = requestBuilder.build()
- def response = responseBuilder.build()
-
- def outputStream = new ByteArrayOutputStream()
-
- def scriptContext = new RequestScriptContext(
- request: request,
- response: response,
- outputStream: outputStream,
- printStream: new PrintStream(outputStream, true, Charsets.UTF_8.name()),
- script: scriptAsString
- )
-
- when:
- def map = consoleService.runScript(scriptContext)
-
- then:
- assertScriptResult(map)
- }
-
- def "save script"() {
- setup:
- nodeBuilder.var {
- groovyconsole(JcrResourceConstants.NT_SLING_FOLDER)
- }
-
- def consoleService = slingContext.getService(GroovyConsoleService)
-
- def request = requestBuilder.build {
- parameterMap = this.parameterMap
- }
-
- def scriptData = new RequestScriptData(request)
-
- when:
- consoleService.saveScript(scriptData)
-
- then:
- assertNodeExists(PATH_SCRIPTS_FOLDER, JcrConstants.NT_FOLDER)
- assertNodeExists(PATH_FILE, JcrConstants.NT_FILE)
- assertNodeExists(PATH_FILE_CONTENT, JcrConstants.NT_RESOURCE,
- [(JcrConstants.JCR_MIMETYPE): "application/octet-stream"])
-
- and:
- assert session.getNode(PATH_FILE_CONTENT).get(JcrConstants.JCR_DATA).stream.text == scriptAsString
- }
-
- void assertScriptResult(map) {
- assert !map.result
- assert map.output == "BEER" + System.getProperty("line.separator")
- assert !map.exceptionStackTrace
- assert map.runningTime
- }
-
- private String getScriptAsString() {
- def scriptAsString = null
-
- this.class.getResourceAsStream("/$SCRIPT_FILE_NAME").withStream { stream ->
- scriptAsString = stream.text
- }
-
- scriptAsString
- }
-
- private Map getParameterMap() {
- [(GroovyConsoleConstants.FILE_NAME): (SCRIPT_NAME), (SCRIPT): scriptAsString]
- }
-}
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
index 7d787c2d..c049758a 100644
--- a/pom.xml
+++ b/pom.xml
@@ -4,10 +4,10 @@
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
4.0.0
- org.cid15.aem.groovy.console
+ be.orbinson.aem
aem-groovy-console
pom
- 17.0.0
+ 18.0.0
AEM Groovy Console
The AEM Groovy Console provides an interface for running Groovy scripts in the AEM container. Scripts can be
@@ -24,18 +24,21 @@
ui.content
- https://github.com/cid15/aem-groovy-console
-
-
- CID 15
- https://www.cid15.org
-
+ https://github.com/orbinson/aem-groovy-console
Mark Daugherty
mark.r.daugherty@gmail.com
+
+ Barry d'Hoine
+ barrydhoine@gmail.com
+
+
+ Roy Teeuwen
+ roy@orbinson.be
+
@@ -47,24 +50,26 @@
- scm:git:git@github.com:cid15/aem-groovy-console.git
- scm:git:git@github.com:cid15/aem-groovy-console.git
- https://github.com/cid15/aem-groovy-console
+ scm:git:git@github.com:orbinson/aem-groovy-console.git
+ scm:git:git@github.com:orbinson/aem-groovy-console.git
+ https://github.com/orbinson/aem-groovy-console
GitHub
- https://github.com/cid15/aem-groovy-console/issues
+ https://github.com/orbinson/aem-groovy-console/issues
- sonatype-nexus-staging
- https://oss.sonatype.org/content/repositories/snapshots
+ ossrh
+ Central Repository OSSRH - Snapshots
+ https://s01.oss.sonatype.org/content/repositories/snapshots
- sonatype-nexus-staging
- https://oss.sonatype.org/service/local/staging/deploy/maven2/
+ ossrh
+ Central Repository OSSRH
+ https://s01.oss.sonatype.org/service/local/staging/deploy/maven2/
@@ -83,60 +88,100 @@
admin
admin
aem-groovy-console
-
-
- 2020.12.4676.20201216T130744Z-201201
- adobe-public
+ on-prem
true
- adobe-public-releases
- Adobe Public Releases
- https://repo.adobe.com/nexus/content/groups/public
+ 6.5.10
-
-
- adobe-public-releases
- Adobe Public Repository
- https://repo.adobe.com/nexus/content/groups/public
-
- true
- never
-
-
- false
-
-
-
- oss-snapshots
- https://oss.sonatype.org/content/repositories/snapshots
-
- false
-
-
- true
-
-
-
-
-
- adobe-public-releases
- Adobe Public Repository
- https://repo.adobe.com/nexus/content/groups/public
-
- true
- never
-
-
- false
-
-
-
+
+
+
+
+ com.adobe.aem
+ uber-jar
+ ${aem.version}
+ provided
+
+
+
+
+
+
+ cloud
+
+ 2022.11.9850.20221116T162329Z-220900
+
+
+
+
+
+ io.wcm.maven
+ io.wcm.maven.aem-cloud-dependencies
+ ${aem.version}.0000
+ pom
+ import
+
+
+
+
+
+
+ autoInstallBundle
+
+ false
+
+
+
+
+
+ org.apache.sling
+ sling-maven-plugin
+
+
+ install-bundle
+
+ install
+
+
+
+
+
+
+
+
+
+
+ autoInstallBundlePublish
+
+ false
+
+
+
+
+
+ org.apache.sling
+ sling-maven-plugin
+
+ http://${aem.publish.host}:${aem.publish.port}/system/console
+
+
+
+ install-bundle
+
+ install
+
+
+
+
+
+
+
@@ -160,8 +205,8 @@