All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.citytechinc.aem.groovy.console.servlets.AuditServlet.groovy Maven / Gradle / Ivy

package com.citytechinc.aem.groovy.console.servlets

import com.citytechinc.aem.groovy.console.audit.AuditRecord
import com.citytechinc.aem.groovy.console.audit.AuditService
import com.citytechinc.aem.groovy.console.configuration.ConfigurationService
import org.apache.felix.scr.annotations.Reference
import org.apache.felix.scr.annotations.sling.SlingServlet
import org.apache.sling.api.SlingHttpServletRequest
import org.apache.sling.api.SlingHttpServletResponse

import javax.servlet.ServletException

import static com.citytechinc.aem.groovy.console.constants.GroovyConsoleConstants.PARAMETER_SCRIPT

@SlingServlet(paths = "/bin/groovyconsole/audit")
class AuditServlet extends AbstractJsonResponseServlet {

    private static final def PARAMETER_START_DATE = "startDate"

    private static final def PARAMETER_END_DATE = "endDate"

    private static final String DATE_FORMAT = "yyyy-MM-dd"

    private static final String DATE_FORMAT_DISPLAY = "yyyy-MM-dd HH:mm:ss"

    @Reference
    AuditService auditService

    @Reference
    ConfigurationService configurationService

    @Override
    protected void doGet(SlingHttpServletRequest request,
        SlingHttpServletResponse response) throws ServletException, IOException {
        def script = request.getParameter(PARAMETER_SCRIPT)

        if (script) {
            writeJsonResponse(response, auditService.getAuditRecord(script) ?: [:])
        } else {
            writeJsonResponse(response, loadAuditRecords(request))
        }
    }

    @Override
    protected void doDelete(SlingHttpServletRequest request,
        SlingHttpServletResponse response) throws ServletException, IOException {
        def script = request.getParameter(PARAMETER_SCRIPT)

        if (script) {
            auditService.deleteAuditRecord(script)
        } else {
            auditService.deleteAllAuditRecords()
        }
    }

    private def loadAuditRecords(SlingHttpServletRequest request) {
        def auditRecords = getAuditRecords(request)
        def consoleHref = configurationService.consoleHref

        def data = []

        auditRecords.each { auditRecord ->
            def lines = auditRecord.script.readLines()

            def map = [
                date         : auditRecord.date.format(DATE_FORMAT_DISPLAY),
                scriptPreview: lines.first() + (lines.size() > 1 ? " [...]" : ""),
                script       : auditRecord.script,
                exception    : getException(auditRecord),
                link         : "$consoleHref?script=${auditRecord.relativePath}",
                relativePath : auditRecord.relativePath
            ]

            data.add(map)
        }

        [data: data]
    }

    private List getAuditRecords(SlingHttpServletRequest request) {
        def startDateParameter = request.getParameter(PARAMETER_START_DATE)
        def endDateParameter = request.getParameter(PARAMETER_END_DATE)

        def auditRecords

        if (!startDateParameter || !endDateParameter) {
            auditRecords = auditService.allAuditRecords
        } else {
            def startDate = Date.parse(DATE_FORMAT, startDateParameter)
            def endDate = Date.parse(DATE_FORMAT, endDateParameter)

            auditRecords = auditService.getAuditRecords(startDate.toCalendar(), endDate.toCalendar())
        }

        auditRecords.sort { a, b -> b.date.timeInMillis <=> a.date.timeInMillis }
    }

    private static def getException(AuditRecord auditRecord) {
        def exceptionStackTrace = auditRecord.exceptionStackTrace

        def exception

        if (exceptionStackTrace) {
            def firstLine = exceptionStackTrace.readLines().first()

            if (firstLine.contains(":")) {
                exception = firstLine.substring(0, firstLine.indexOf(":"))
            } else {
                exception = firstLine
            }
        } else {
            exception = ""
        }

        exception
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy