Package org.wicketstuff.console

Source Code of org.wicketstuff.console.ScriptEnginePanel

/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements.  See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License.  You may obtain a copy of the License at
*
*      http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.wicketstuff.console;

import java.util.HashMap;
import java.util.Map;

import org.apache.wicket.Application;
import org.apache.wicket.ajax.AbstractDefaultAjaxBehavior;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.markup.head.CssHeaderItem;
import org.apache.wicket.markup.head.IHeaderResponse;
import org.apache.wicket.markup.head.JavaScriptHeaderItem;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.markup.html.form.TextArea;
import org.apache.wicket.markup.html.form.TextField;
import org.apache.wicket.markup.html.image.Image;
import org.apache.wicket.markup.html.panel.Fragment;
import org.apache.wicket.markup.html.panel.Panel;
import org.apache.wicket.markup.repeater.RepeatingView;
import org.apache.wicket.model.CompoundPropertyModel;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.Model;
import org.apache.wicket.request.resource.PackageResourceReference;
import org.apache.wicket.request.resource.ResourceReference;
import org.wicketstuff.console.clojure.ClojureScriptEnginePanel;
import org.wicketstuff.console.engine.Engines;
import org.wicketstuff.console.engine.IScriptEngine;
import org.wicketstuff.console.engine.IScriptExecutionResult;
import org.wicketstuff.console.engine.Lang;
import org.wicketstuff.console.groovy.GroovyScriptEnginePanel;
import org.wicketstuff.console.jython.JythonScriptEnginePanel;
import org.wicketstuff.console.scala.ScalaScriptEnginePanel;
import org.wicketstuff.console.templates.IScriptTemplateStore;
import org.wicketstuff.console.templates.LangLabel;
import org.wicketstuff.console.templates.ScriptTemplate;

/**
* Abstract panel for executing Scripts.
* <p>
* Usage:
*
* <pre>
* add(new GroovyScriptEnginePanel(&quot;scriptPanel&quot;));
* </pre>
*
* <pre>
* &lt;div wicket:id=&quot;scriptPanel&quot&gt;&lt;/div&gt;
* </pre>
*
* @see ClojureScriptEnginePanel
* @see GroovyScriptEnginePanel
*
* @author cretzel
*/
public class ScriptEnginePanel extends Panel
{

  private static final long serialVersionUID = 1L;

  private static final ResourceReference CSS = new PackageResourceReference(
    ScriptEnginePanel.class, "ScriptEnginePanel.css");

  private static final ResourceReference JS = new PackageResourceReference(
    ScriptEnginePanel.class, "ScriptEnginePanel.js");

  private String input;
  private String output;
  private String returnValue;
  private boolean success;

  private Label titleLabel;
  private LangLabel titleLangLabel;
  private Form<Void> form;
  private TextArea<String> inputTa;
  private OutputTextArea outputTa;
  private TextField<String> returnValueTf;

  private Image indicator;
  private final Lang lang;
  private final IScriptTemplateStore store;

  private RepeatingView controls;

  public ScriptEnginePanel(final String id, final Lang lang)
  {
    this(id, lang, null);
  }


  public ScriptEnginePanel(final String id, final Lang lang, final IScriptTemplateStore store)
  {
    super(id);
    this.lang = lang;
    this.store = store;

    init();
  }

  private void init()
  {
    setDefaultModel(new CompoundPropertyModel<ScriptEnginePanel>(this));
    initComponents();
  }

  protected void initComponents()
  {

    titleLabel = new Label("title", Model.of("Wicket Console"));
    add(titleLabel);

    titleLangLabel = new LangLabel("title-lang", Model.of(lang));
    add(titleLangLabel);

    form = new Form<Void>("form");
    add(form);

    inputTa = new TextArea<String>("input");
    inputTa.setOutputMarkupId(true);
    form.add(inputTa);

    controls = new RepeatingView("controls");
    form.add(controls);

    addControls(controls);

    indicator = new Image("indicator", AbstractDefaultAjaxBehavior.INDICATOR);
    indicator.setOutputMarkupId(true);
    form.add(indicator);

    returnValueTf = new TextField<String>("returnValue");
    returnValueTf.setOutputMarkupId(true);
    add(returnValueTf);

    outputTa = new OutputTextArea("output", this);
    outputTa.setOutputMarkupId(true);
    add(outputTa);
  }


  protected void addControls(final RepeatingView controls)
  {
    final Fragment submitfrag = new Fragment(controls.newChildId(), "submitFragment", this);
    submitfrag.add(new SubmitButton("submit", this));
    controls.add(submitfrag);

    final Fragment clearfrag = new Fragment(controls.newChildId(), "clearFragment", this);
    clearfrag.add(new ClearButton("clear", this));
    controls.add(clearfrag);

    controls.add(new StorePanel(controls.newChildId(), this));
  }

  protected ResourceReference getCSS()
  {
    return CSS;
  }

  @Override
  public void renderHead(final IHeaderResponse response)
  {
    super.renderHead(response);

    final ResourceReference css = getCSS();
    if (css != null)
    {
      response.render(CssHeaderItem.forReference(css));
    }

    response.render(JavaScriptHeaderItem.forReference(JS));
  }

  public void process(final AjaxRequestTarget target)
  {

    final IScriptEngine engine = newEngine();
    final Map<String, Object> bindings = newBindings();

    final IScriptExecutionResult result = engine.execute(input, bindings);

    if (result.isSuccess())
    {
      returnValue = String.valueOf(result.getReturnValue());
      output = result.getOutput();
      success = true;
    }
    else
    {
      returnValue = null;
      output = String.format("%s\n\n%s", result.getOutput(), result.getException());
      success = false;
    }

    target.add(returnValueTf, outputTa);
  }

  protected IScriptEngine newEngine()
  {
    return Engines.getSingletonInstance(lang);
  }

  protected Map<String, Object> newBindings()
  {
    final Map<String, Object> bindings = new HashMap<String, Object>();
    bindings.put("application", Application.get());
    bindings.put("page", getPage());
    bindings.put("component", this);
    return bindings;
  }

  public void setTitle(final IModel<String> title)
  {
    titleLabel.setDefaultModel(title);
  }

  public boolean isSuccess()
  {
    return success;
  }

  public String getInput()
  {
    return input;
  }

  public void setInput(final String input)
  {
    this.input = input;
  }

  public String getOutput()
  {
    return output;
  }

  public void setOutput(final String output)
  {
    this.output = output;
  }

  public String getReturnValue()
  {
    return returnValue;
  }

  public void setReturnValue(final String returnValue)
  {
    this.returnValue = returnValue;
  }

  public TextArea<String> getInputTf()
  {
    return inputTa;
  }

  public TextArea<String> getOutputTf()
  {
    return outputTa;
  }

  public TextField<String> getReturnValueTf()
  {
    return returnValueTf;
  }

  Image getIndicator()
  {
    return indicator;
  }


  public Form<Void> getForm()
  {
    return form;
  }

  public IScriptTemplateStore getStore()
  {
    return store;
  }

  public String getAjaxIndicatorMarkupId()
  {
    return indicator.getMarkupId();
  }

  public static ScriptEnginePanel create(final String wicketId, final Lang lang)
  {
    return create(wicketId, lang, null);
  }

  public static ScriptEnginePanel create(final String wicketId, final Lang lang,
    final IScriptTemplateStore store)
  {
    ScriptEnginePanel enginePanel;
    switch (lang)
    {
      case GROOVY :
        enginePanel = new GroovyScriptEnginePanel(wicketId, store);
        break;
      case CLOJURE :
        enginePanel = new ClojureScriptEnginePanel(wicketId, store);
        break;
      case SCALA :
        enginePanel = new ScalaScriptEnginePanel(wicketId, store);
        break;
      case JYTHON :
        enginePanel = new JythonScriptEnginePanel(wicketId, store);
        break;
      default :
        throw new UnsupportedOperationException("Unsupported language: " + lang);
    }

    return enginePanel;
  }


  /**
   * Stores the current script in the store.
   *
   * @param target
   *
   * @param scriptTitle
   *            Title
   */
  public void storeScriptTemplate(final AjaxRequestTarget target, final String scriptTitle)
  {
    if (store == null)
    {
      throw new UnsupportedOperationException("There is no store attached");
    }

    store.save(new ScriptTemplate(scriptTitle, getInput(), lang));
  }
}
TOP

Related Classes of org.wicketstuff.console.ScriptEnginePanel

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.