001/*
002 * Copyright (c) 2006-2011 Nuxeo SA (http://nuxeo.com/) and others.
003 *
004 * All rights reserved. This program and the accompanying materials
005 * are made available under the terms of the Eclipse Public License v1.0
006 * which accompanies this distribution, and is available at
007 * http://www.eclipse.org/legal/epl-v10.html
008 *
009 * Contributors:
010 *     bstefanescu
011 */
012package org.nuxeo.ecm.automation.core.operations;
013
014import java.io.IOException;
015
016import org.nuxeo.ecm.automation.OperationContext;
017import org.nuxeo.ecm.automation.OperationException;
018import org.nuxeo.ecm.automation.core.Constants;
019import org.nuxeo.ecm.automation.core.annotations.Context;
020import org.nuxeo.ecm.automation.core.annotations.Operation;
021import org.nuxeo.ecm.automation.core.annotations.OperationMethod;
022import org.nuxeo.ecm.automation.core.annotations.Param;
023import org.nuxeo.ecm.automation.core.scripting.Scripting.GroovyScript;
024import org.nuxeo.ecm.automation.core.scripting.Scripting.MvelScript;
025import org.nuxeo.ecm.core.api.Blob;
026import org.nuxeo.ecm.core.api.Blobs;
027import org.nuxeo.ecm.core.api.NuxeoPrincipal;
028
029/**
030 * Run a script given as the input of the operation (as a blob). Note that this operation is available only as
031 * administrator
032 *
033 * @author <a href="mailto:bs@nuxeo.com">Bogdan Stefanescu</a>
034 */
035@Operation(id = RunInputScript.ID, category = Constants.CAT_SCRIPTING, label = "Run Input Script", description = "Run a script from the input blob. A blob comtaining script result is returned.", aliases = { "Context.RunInputScript" })
036public class RunInputScript {
037
038    public static final String ID = "RunInputScript";
039
040    @Context
041    protected OperationContext ctx;
042
043    @Param(name = "type", required = false, values = { "mvel", "groovy" }, widget = Constants.W_OPTION)
044    protected String type = "mvel";
045
046    @OperationMethod
047    public Blob run(Blob blob) throws OperationException, IOException {
048        if (!((NuxeoPrincipal) ctx.getPrincipal()).isAdministrator()) {
049            throw new OperationException("Not allowed. You must be administrator to run scripts");
050        }
051        Object r = null;
052        if (type.equals("mvel")) {
053            r = MvelScript.compile(blob.getString()).eval(ctx);
054        } else if (type.equals("groovy")) {
055            r = new GroovyScript(blob.getString()).eval(ctx);
056        } else {
057            throw new OperationException("Unknown scripting language " + type);
058        }
059        if (r != null) {
060            Blob b = Blobs.createBlob(r.toString());
061            b.setFilename("result");
062            return b;
063        }
064        return null;
065    }
066
067}