org.jahia.modules.tools.taglibs.GroovyConsoleHelper.java Source code

Java tutorial

Introduction

Here is the source code for org.jahia.modules.tools.taglibs.GroovyConsoleHelper.java

Source

/**
 * ==========================================================================================
 * =                   JAHIA'S DUAL LICENSING - IMPORTANT INFORMATION                       =
 * ==========================================================================================
 *
 *                                 http://www.jahia.com
 *
 *     Copyright (C) 2002-2017 Jahia Solutions Group SA. All rights reserved.
 *
 *     THIS FILE IS AVAILABLE UNDER TWO DIFFERENT LICENSES:
 *     1/GPL OR 2/JSEL
 *
 *     1/ GPL
 *     ==================================================================================
 *
 *     IF YOU DECIDE TO CHOOSE THE GPL LICENSE, YOU MUST COMPLY WITH THE FOLLOWING TERMS:
 *
 *     This program is free software: you can redistribute it and/or modify
 *     it under the terms of the GNU General Public License as published by
 *     the Free Software Foundation, either version 3 of the License, or
 *     (at your option) any later version.
 *
 *     This program is distributed in the hope that it will be useful,
 *     but WITHOUT ANY WARRANTY; without even the implied warranty of
 *     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 *     GNU General Public License for more details.
 *
 *     You should have received a copy of the GNU General Public License
 *     along with this program. If not, see <http://www.gnu.org/licenses/>.
 *
 *
 *     2/ JSEL - Commercial and Supported Versions of the program
 *     ===================================================================================
 *
 *     IF YOU DECIDE TO CHOOSE THE JSEL LICENSE, YOU MUST COMPLY WITH THE FOLLOWING TERMS:
 *
 *     Alternatively, commercial and supported versions of the program - also known as
 *     Enterprise Distributions - must be used in accordance with the terms and conditions
 *     contained in a separate written agreement between you and Jahia Solutions Group SA.
 *
 *     If you are unsure which license is appropriate for your use,
 *     please contact the sales department at sales@jahia.com.
 */
package org.jahia.modules.tools.taglibs;

import java.io.IOException;
import java.net.URL;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Enumeration;
import java.util.List;
import java.util.Properties;

import javax.servlet.http.HttpServletRequest;

import org.apache.commons.lang.StringUtils;
import org.jahia.data.templates.JahiaTemplatesPackage;
import org.jahia.osgi.BundleResource;
import org.jahia.registries.ServicesRegistry;
import org.osgi.framework.Bundle;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.core.io.UrlResource;

/**
 * Utility class for the Groovy Console.
 */
public class GroovyConsoleHelper {

    private static final Logger logger = LoggerFactory.getLogger(GroovyConsoleHelper.class);

    public static final String WARN_MSG = "WARNING: You are about to execute a script, which can manipulate the repository data or execute services in DX. Are you sure, you want to continue?";

    private static void generateCbFormElement(String paramName, StringBuilder sb, Properties confs,
            HttpServletRequest request) {
        sb.append("<p><label for=\"scriptParam_").append(paramName).append("\">");
        sb.append(confs.getProperty(String.format("script.param.%s.label", paramName), paramName))
                .append("</label> ");
        sb.append("<input type=\"checkbox\" name=\"scriptParam_").append(paramName).append("\" id=\"scriptParam_")
                .append(paramName);
        final String paramVal;
        if ("true".equals(request.getParameter("runScript"))) {
            paramVal = request.getParameter("scriptParam_" + paramName);
        } else {
            paramVal = confs.getProperty(String.format("script.param.%s.default", paramName), "").trim();
        }
        if (StringUtils.isNotBlank(paramVal)
                && ("on".equalsIgnoreCase(paramVal.trim()) || "true".equalsIgnoreCase(paramVal.trim())))
            sb.append("\" checked=\"true");
        sb.append("\" /></p>");
    }

    private static void generateFormElement(String paramName, StringBuilder sb, Properties confs,
            HttpServletRequest request) {
        final String paramType = confs.getProperty(String.format("script.param.%s.type", paramName), "checkbox")
                .trim();
        if ("checkbox".equals(paramType)) {
            generateCbFormElement(paramName, sb, confs, request);
        } else if ("text".equals(paramType)) {
            generateTextFormElement(paramName, sb, confs, request);
        } else {
            logger.error(
                    String.format("Unsupported form element type form the parameter %s: %s", paramName, paramType));
        }
    }

    public static StringBuilder generateScriptSkeleton() {

        final StringBuilder code = new StringBuilder(2048);
        code.append("import com.google.common.collect.*\n");
        code.append("import com.google.common.io.*\n");
        code.append("import com.sun.enterprise.web.connector.grizzly.comet.*\n");
        code.append("import com.sun.grizzly.comet.*\n");
        code.append("import com.sun.grizzly.tcp.*\n");
        code.append("import com.sun.grizzly.websockets.*\n");
        code.append("import com.sun.image.codec.jpeg.*\n");
        code.append("import com.sun.medialib.mlib.*\n");
        code.append("import com.sun.net.httpserver.*\n");
        code.append("import com.sun.syndication.feed.synd.*\n");
        code.append("import com.sun.syndication.fetcher.*\n");
        code.append("import com.sun.syndication.fetcher.impl.*\n");
        code.append("import com.sun.syndication.io.*\n");
        code.append("import eu.infomas.annotation.*\n");
        code.append("import groovy.lang.*\n");
        code.append("import groovy.util.*\n");
        code.append("import groovy.util.slurpersupport.*\n");
        code.append("import groovy.xml.*\n");
        code.append("import javax.annotation.security.*\n");
        code.append("import javax.ejb.*\n");
        code.append("import javax.enterprise.context.*\n");
        code.append("import javax.enterprise.context.spi.*\n");
        code.append("import javax.enterprise.event.*\n");
        code.append("import javax.enterprise.inject.*\n");
        code.append("import javax.enterprise.inject.spi.*\n");
        code.append("import javax.enterprise.util.*\n");
        code.append("import javax.inject.*\n");
        code.append("import javax.interceptor.*\n");
        code.append("import javax.jcr.*\n");
        code.append("import javax.jcr.nodetype.*\n");
        code.append("import javax.jcr.observation.*\n");
        code.append("import javax.jcr.query.*\n");
        code.append("import javax.jcr.query.qom.*\n");
        code.append("import javax.jcr.version.*\n");
        code.append("import javax.mail.*\n");
        code.append("import javax.mail.internet.*\n");
        code.append("import javax.mail.util.*\n");
        code.append("import javax.persistence.*\n");
        code.append("import javax.servlet.*\n");
        code.append("import javax.servlet.annotation.*\n");
        code.append("import javax.servlet.http.*\n");
        code.append("import javax.servlet.resources.*\n");
        code.append("import javax.validation.*\n");
        code.append("import name.fraser.neil.plaintext.*\n");
        code.append("import net.htmlparser.jericho.*\n");
        code.append("import nu.xom.*\n");
        code.append("import oauth.signpost.*\n");
        code.append("import oauth.signpost.basic.*\n");
        code.append("import oauth.signpost.commonshttp.*\n");
        code.append("import oauth.signpost.exception.*\n");
        code.append("import oauth.signpost.http.*\n");
        code.append("import oracle.xml.parser.*\n");
        code.append("import oracle.xml.parser.v2.*\n");
        code.append("import org.aopalliance.aop.*\n");
        code.append("import org.aopalliance.intercept.*\n");
        code.append("import org.apache.camel.*\n");
        code.append("import org.apache.camel.builder.*\n");
        code.append("import org.apache.camel.component.mail.*\n");
        code.append("import org.apache.camel.impl.*\n");
        code.append("import org.apache.camel.model.*\n");
        code.append("import org.apache.camel.spring.*\n");
        code.append("import org.apache.camel.util.*\n");
        code.append("import org.apache.catalina.connector.*\n");
        code.append("import org.apache.catalina.util.*\n");
        code.append("import org.apache.catalina.websocket.*\n");
        code.append("import org.apache.commons.beanutils.*\n");
        code.append("import org.apache.commons.codec.binary.*\n");
        code.append("import org.apache.commons.codec.digest.*\n");
        code.append("import org.apache.commons.collections.*\n");
        code.append("import org.apache.commons.collections.iterators.*\n");
        code.append("import org.apache.commons.collections.keyvalue.*\n");
        code.append("import org.apache.commons.collections.list.*\n");
        code.append("import org.apache.commons.collections.map.*\n");
        code.append("import org.apache.commons.httpclient.*\n");
        code.append("import org.apache.commons.httpclient.auth.*\n");
        code.append("import org.apache.commons.httpclient.methods.*\n");
        code.append("import org.apache.commons.httpclient.methods.multipart.*\n");
        code.append("import org.apache.commons.httpclient.params.*\n");
        code.append("import org.apache.commons.httpclient.protocol.*\n");
        code.append("import org.apache.commons.id.*\n");
        code.append("import org.apache.commons.lang.*\n");
        code.append("import org.apache.commons.lang.builder.*\n");
        code.append("import org.apache.commons.lang.exception.*\n");
        code.append("import org.apache.commons.lang.math.*\n");
        code.append("import org.apache.commons.lang.time.*\n");
        code.append("import org.apache.commons.logging.*\n");
        code.append("import org.apache.coyote.http11.upgrade.*\n");
        code.append("import org.apache.jackrabbit.commons.query.*\n");
        code.append("import org.apache.jackrabbit.util.*\n");
        code.append("import org.apache.jackrabbit.value.*\n");
        code.append("import org.apache.log4j.*\n");
        code.append("import org.apache.oro.text.regex.*\n");
        code.append("import org.apache.pdfbox.pdmodel.*\n");
        code.append("import org.apache.pluto.container.*\n");
        code.append("import org.apache.regexp.*\n");
        code.append("import org.apache.solr.client.solrj.response.*\n");
        code.append("import org.apache.tika.io.*\n");
        code.append("import org.apache.tomcat.util.http.mapper.*\n");
        code.append("import org.apache.tools.ant.*\n");
        code.append("import org.apache.velocity.tools.generic.*\n");
        code.append("import org.apache.xerces.dom.*\n");
        code.append("import org.apache.xerces.jaxp.*\n");
        code.append("import org.apache.xerces.parsers.*\n");
        code.append("import org.artofsolving.jodconverter.document.*\n");
        code.append("import org.artofsolving.jodconverter.office.*\n");
        code.append("import org.codehaus.groovy.runtime.*\n");
        code.append("import org.codehaus.groovy.runtime.typehandling.*\n");
        code.append("import org.cyberneko.html.parsers.*\n");
        code.append("import org.dom4j.*\n");
        code.append("import org.dom4j.io.*\n");
        code.append("import org.dom4j.tree.*\n");
        code.append("import org.drools.*\n");
        code.append("import org.drools.spi.*\n");
        code.append("import org.drools.util.*\n");
        code.append("import org.eclipse.jetty.continuation.*\n");
        code.append("import org.eclipse.jetty.websocket.*\n");
        code.append("import org.glassfish.grizzly.*\n");
        code.append("import org.glassfish.grizzly.comet.*\n");
        code.append("import org.glassfish.grizzly.filterchain.*\n");
        code.append("import org.glassfish.grizzly.http.*\n");
        code.append("import org.glassfish.grizzly.http.server.*\n");
        code.append("import org.glassfish.grizzly.http.server.util.*\n");
        code.append("import org.glassfish.grizzly.http.util.*\n");
        code.append("import org.glassfish.grizzly.servlet.*\n");
        code.append("import org.glassfish.grizzly.utils.*\n");
        code.append("import org.glassfish.grizzly.websockets.*\n");
        code.append("import org.hibernate.*\n");
        code.append("import org.hibernate.cfg.*\n");
        code.append("import org.hibernate.classic.*\n");
        code.append("import org.hibernate.criterion.*\n");
        code.append("import org.jahia.admin.*\n");
        code.append("import org.jahia.admin.sites.*\n");
        code.append("import org.jahia.ajax.gwt.client.widget.contentengine.*\n");
        code.append("import org.jahia.ajax.gwt.client.widget.edit.sidepanel.*\n");
        code.append("import org.jahia.ajax.gwt.client.widget.publication.*\n");
        code.append("import org.jahia.ajax.gwt.client.widget.subscription.*\n");
        code.append("import org.jahia.ajax.gwt.client.widget.toolbar.action.*\n");
        code.append("import org.jahia.ajax.gwt.helper.*\n");
        code.append("import org.jahia.ajax.gwt.utils.*\n");
        code.append("import org.jahia.api.*\n");
        code.append("import org.jahia.bin.*\n");
        code.append("import org.jahia.bin.errors.*\n");
        code.append("import org.jahia.data.*\n");
        code.append("import org.jahia.data.applications.*\n");
        code.append("import org.jahia.data.beans.portlets.*\n");
        code.append("import org.jahia.data.templates.*\n");
        code.append("import org.jahia.data.viewhelper.principal.*\n");
        code.append("import org.jahia.defaults.config.spring.*\n");
        code.append("import org.jahia.engines.*\n");
        code.append("import org.jahia.exceptions.*\n");
        code.append("import org.jahia.modules.visibility.rules.*\n");
        code.append("import org.jahia.params.*\n");
        code.append("import org.jahia.params.valves.*\n");
        code.append("import org.jahia.pipelines.*\n");
        code.append("import org.jahia.pipelines.valves.*\n");
        code.append("import org.jahia.registries.*\n");
        code.append("import org.jahia.security.license.*\n");
        code.append("import org.jahia.services.*\n");
        code.append("import org.jahia.services.applications.*\n");
        code.append("import org.jahia.services.atmosphere.*\n");
        code.append("import org.jahia.services.cache.*\n");
        code.append("import org.jahia.services.channels.*\n");
        code.append("import org.jahia.services.channels.providers.*\n");
        code.append("import org.jahia.services.content.*\n");
        code.append("import org.jahia.services.content.decorator.*\n");
        code.append("import org.jahia.services.content.nodetypes.*\n");
        code.append("import org.jahia.services.content.nodetypes.initializers.*\n");
        code.append("import org.jahia.services.content.nodetypes.renderer.*\n");
        code.append("import org.jahia.services.content.rules.*\n");
        code.append("import org.jahia.services.image.*\n");
        code.append("import org.jahia.services.importexport.*\n");
        code.append("import org.jahia.services.logging.*\n");
        code.append("import org.jahia.services.mail.*\n");
        code.append("import org.jahia.services.notification.*\n");
        code.append("import org.jahia.services.preferences.user.*\n");
        code.append("import org.jahia.services.pwdpolicy.*\n");
        code.append("import org.jahia.services.query.*\n");
        code.append("import org.jahia.services.render.*\n");
        code.append("import org.jahia.services.render.filter.*\n");
        code.append("import org.jahia.services.render.filter.cache.*\n");
        code.append("import org.jahia.services.render.scripting.*\n");
        code.append("import org.jahia.services.scheduler.*\n");
        code.append("import org.jahia.services.search.*\n");
        code.append("import org.jahia.services.seo.*\n");
        code.append("import org.jahia.services.seo.jcr.*\n");
        code.append("import org.jahia.services.seo.urlrewrite.*\n");
        code.append("import org.jahia.services.sites.*\n");
        code.append("import org.jahia.services.tags.*\n");
        code.append("import org.jahia.services.tasks.*\n");
        code.append("import org.jahia.services.templates.*\n");
        code.append("import org.jahia.services.transform.*\n");
        code.append("import org.jahia.services.translation.*\n");
        code.append("import org.jahia.services.uicomponents.bean.*\n");
        code.append("import org.jahia.services.uicomponents.bean.contentmanager.*\n");
        code.append("import org.jahia.services.uicomponents.bean.editmode.*\n");
        code.append("import org.jahia.services.uicomponents.bean.toolbar.*\n");
        code.append("import org.jahia.services.usermanager.*\n");
        code.append("import org.jahia.services.usermanager.jcr.*\n");
        code.append("import org.jahia.services.visibility.*\n");
        code.append("import org.jahia.services.workflow.*\n");
        code.append("import org.jahia.settings.*\n");
        code.append("import org.jahia.tools.files.*\n");
        code.append("import org.jahia.tools.jvm.*\n");
        code.append("import org.jahia.utils.*\n");
        code.append("import org.jahia.utils.comparator.*\n");
        code.append("import org.jahia.utils.i18n.*\n");
        code.append("import org.jahia.utils.zip.*\n");
        code.append("import org.jaxen.*\n");
        code.append("import org.jaxen.jdom.*\n");
        code.append("import org.jbpm.api.activity.*\n");
        code.append("import org.jbpm.api.model.*\n");
        code.append("import org.jbpm.api.task.*\n");
        code.append("import org.joda.time.*\n");
        code.append("import org.joda.time.format.*\n");
        code.append("import org.mortbay.util.ajax.*\n");
        code.append("import org.quartz.*\n");
        code.append("import org.springframework.aop.*\n");
        code.append("import org.springframework.aop.framework.*\n");
        code.append("import org.springframework.aop.support.*\n");
        code.append("import org.springframework.beans.*\n");
        code.append("import org.springframework.beans.factory.*\n");
        code.append("import org.springframework.beans.factory.annotation.*\n");
        code.append("import org.springframework.beans.factory.config.*\n");
        code.append("import org.springframework.beans.factory.support.*\n");
        code.append("import org.springframework.beans.factory.xml.*\n");
        code.append("import org.springframework.beans.propertyeditors.*\n");
        code.append("import org.springframework.context.*\n");
        code.append("import org.springframework.context.event.*\n");
        code.append("import org.springframework.context.support.*\n");
        code.append("import org.springframework.core.*\n");
        code.append("import org.springframework.core.enums.*\n");
        code.append("import org.springframework.core.io.*\n");
        code.append("import org.springframework.core.io.support.*\n");
        code.append("import org.springframework.dao.*\n");
        code.append("import org.springframework.jdbc.core.*\n");
        code.append("import org.springframework.orm.*\n");
        code.append("import org.springframework.orm.hibernate3.*\n");
        code.append("import org.springframework.orm.hibernate3.annotation.*\n");
        code.append("import org.springframework.orm.hibernate3.support.*\n");
        code.append("import org.springframework.scheduling.quartz.*\n");
        code.append("import org.springframework.ui.context.*\n");
        code.append("import org.springframework.ui.context.support.*\n");
        code.append("import org.springframework.util.*\n");
        code.append("import org.springframework.util.xml.*\n");
        code.append("import org.springframework.web.context.*\n");
        code.append("import org.springframework.web.context.support.*\n");
        code.append("import org.springframework.web.servlet.*\n");
        code.append("import org.springframework.web.servlet.mvc.*\n");
        code.append("import org.springframework.webflow.core.collection.*\n");
        code.append("import sun.awt.image.*\n");
        code.append("import sun.awt.image.codec.*\n");
        code.append("import sun.security.action.*\n");
        code.append("import ucar.nc2.util.net.*\n");
        code.append("\n");

        return code;
    }

    private static void generateTextFormElement(String paramName, StringBuilder sb, Properties confs,
            HttpServletRequest request) {
        sb.append("<p><label for=\"scriptParam_").append(paramName).append("\">");
        sb.append(confs.getProperty(String.format("script.param.%s.label", paramName), paramName))
                .append("</label> ");
        sb.append("<input type=\"text\" name=\"scriptParam_").append(paramName).append("\" id=\"scriptParam_")
                .append(paramName);
        final String paramVal;
        if ("true".equals(request.getParameter("runScript"))) {
            paramVal = request.getParameter("scriptParam_" + paramName);
        } else {
            paramVal = confs.getProperty(String.format("script.param.%s.default", paramName), "");
        }
        if (StringUtils.isNotBlank(paramVal))
            sb.append("\" value=\"").append(paramVal);
        sb.append("\" /></p>");
    }

    /**
     * Returns a collection of BundleResource, representing scripts, which are found in all active module bundles.
     * 
     * @return a collection of BundleResource, representing scripts, which are found in all active module bundles
     */
    public static Collection<BundleResource> getGroovyConsoleScripts() {
        final List<BundleResource> scripts = new ArrayList<>();
        for (final JahiaTemplatesPackage aPackage : ServicesRegistry.getInstance().getJahiaTemplateManagerService()
                .getAvailableTemplatePackages()) {
            final Bundle bundle = aPackage.getBundle();
            if (bundle != null) {
                final Enumeration<URL> resourceEnum = bundle.findEntries("META-INF/groovyConsole", "*.groovy",
                        false);
                if (resourceEnum == null)
                    continue;
                while (resourceEnum.hasMoreElements()) {
                    final BundleResource bundleResource = new BundleResource(resourceEnum.nextElement(), bundle);
                    scripts.add(bundleResource);
                }
            }
        }
        return scripts;
    }

    /**
     * Returns a generated HTML with form elements for the script parameters.
     * 
     * @param scriptURI
     * @param request
     * @return
     */
    public static String getScriptCustomFormElements(String scriptURI, HttpServletRequest request) {
        if (StringUtils.isBlank(scriptURI)) {
            return StringUtils.EMPTY;
        }
        final StringBuilder sb = new StringBuilder();
        try {
            final UrlResource resource = new UrlResource(
                    StringUtils.substringBeforeLast(scriptURI, ".groovy") + ".properties");
            if (resource.exists()) {
                final Properties confs = new Properties();
                confs.load(resource.getInputStream());
                final String[] paramNames = StringUtils
                        .split(confs.getProperty("script.parameters.names", "").replaceAll("\\s", ""), ",");
                for (String paramName : paramNames) {
                    generateFormElement(paramName.trim(), sb, confs, request);
                }

            }
        } catch (IOException e) {
            logger.error("An error occured while reading the configurations for the script " + scriptURI, e);
            return StringUtils.EMPTY;
        }
        final String formElements = sb.toString();
        if (StringUtils.isBlank(formElements)) {
            return StringUtils.EMPTY;
        }
        return sb.delete(0, sb.length()).append("<fieldset><legend>Script configuration</legend>")
                .append(formElements).append("</fieldset>").toString();
    }

    /**
     * Returns an array of parameter names for the specified script or <code>null</code> if the script has no parameters.
     * 
     * @param scriptURI the script URI to get parameter names for
     * @return an array of parameter names for the specified script or <code>null</code> if the script has no parameters
     */
    public static String[] getScriptParamNames(String scriptURI) {
        try {
            final UrlResource resource = new UrlResource(
                    StringUtils.substringBeforeLast(scriptURI, ".groovy") + ".properties");
            if (resource.exists()) {
                final Properties confs = new Properties();
                confs.load(resource.getInputStream());
                return StringUtils.split(confs.getProperty("script.parameters.names", "").replaceAll("\\s", ""),
                        ",");
            }
        } catch (IOException e) {
            logger.error("An error occured while reading the configurations for the script " + scriptURI, e);
        }
        return null;
    }

}