#!/bin/sh BEANSHELL_JAR=$HOME/Downloads/bsh-2.0b4.jar # replace path to suit your environment java -cp $BEANSHELL_JAR bsh.Interpreter $@
BeanShell recipies
TweetPosted on Sunday Jan 24, 2016 at 04:00PM in Technology
BeanShell is a handy lightweight scripting language for Java. In this entry, I’ll introduce you some useful snippets powered by BeanShell, and some recipies about it.
Setup and hello world
Grab a copy of bsh-2.0b4.jar from http://www.beanshell.org and put following shell script named bsh into your PATH:
Then fire up bsh from your console then just put print("hello, world!"); to confirm it works.
$ bsh
BeanShell 2.0b4 - by Pat Niemeyer (pat@pat.net)
bsh % print("hello, world!");
hello, world!
Hit Ctrl+D to exit interpreter.
You can launch your BeanShell script in a file as follows:
$ echo 'print("hello, world!");' > hello.bsh
$ bsh hello.bsh
hello, world!
Stdin
Text filtering script can be written as follows:
Scanner scanner = new Scanner(System.in);
while (scanner.hasNextLine()) {
String line = scanner.nextLine();
System.out.println(line.toUpperCase());
}
Save this script as toUpperCase.bsh . The script can be executed as follows:
$ echo foo | bsh toUpperCase.bsh FOO
Command line arguments
Command line arguments can be used as follows:
sb = new StringBuilder();
for (arg : bsh.args) {
sb.append(arg);
}
print(sb);
Save this script as args.bsh. The script can be executed as follows:
$ bsh args.bsh foo bar foobar
Use of external jar
Any external jar can be added via addClassPath clause dynamically. For example, a SQL beautifier script powered by a Hibernate class can be written as follows:
addClassPath("/path/to/hibernate-core-4.3.7.Final.jar"); // replace path to suit your environment
import org.hibernate.engine.jdbc.internal.BasicFormatterImpl;
scanner = new Scanner(System.in);
sb = new StringBuilder();
while (scanner.hasNextLine()) {
sb.append(scanner.nextLine()).append('\n');
}
beautifized = new BasicFormatterImpl().format(sb.toString());
print(beautifized);
Save this script as sql-beautifier.bsh then execute following command:
$ SQL="SELECT t0.content AS a2, t0.contenttype AS a3, t0.email AS a4 FROM roller_comment t0, weblogentry t1 WHERE ((t1.websiteid = 'f0588427-f2ca-4843-ac87-bbb31aa6013c') AND (t1.id = t0.entryid)) ORDER BY t0.posttime DESC LIMIT 31 OFFSET 0;" $ echo $SQL | bsh sql-beautifier.bsh
This yields nicely formatted SQL:
SELECT
t0.content AS a2,
t0.contenttype AS a3,
t0.email AS a4
FROM
roller_comment t0,
weblogentry t1
WHERE
(
(
t1.websiteid = 'f0588427-f2ca-4843-ac87-bbb31aa6013c'
)
AND (
t1.id = t0.entryid
)
)
ORDER BY
t0.posttime DESC LIMIT 31 OFFSET 0;
Maven plugin
If you have Maven installed, you can execute any BeanShell script without obtaining bsh-2.0b4.jar by hand. Maven and the beanshell-maven-plugin takes care of it instead of you:
$ mvn com.github.genthaler:beanshell-maven-plugin:1.0:run -Dbsh.file="hello.bsh" ... [INFO] --- beanshell-maven-plugin:1.0:run (default-cli) @ standalone-pom --- [INFO] Executing Script [INFO] file class java.lang.String [INFO] script class java.lang.Object [INFO] interpreting file hello.bsh hello, world!
Note that you don’t need to create pom.xml to execute a simple BeanShell script.
For managing complex dependencies, you can leave that duty to Maven with pom.xml:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>sql-beautifier</groupId>
<artifactId>sql-beautifier</artifactId>
<version>1.0-SNAPSHOT</version>
<build>
<plugins>
<plugin>
<groupId>com.github.genthaler</groupId>
<artifactId>beanshell-maven-plugin</artifactId>
<version>1.0</version>
<configuration>
<script><![CDATA[
import java.nio.charset.Charset;
import org.apache.commons.io.FileUtils;
import org.hibernate.engine.jdbc.internal.BasicFormatterImpl;
file = new File(System.getProperty("sql"));
sql = FileUtils.readFileToString(file, Charset.defaultCharset());
result = new BasicFormatterImpl().format(sql);
print(result);
]]></script>
</configuration>
<dependencies>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>4.3.7.Final</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.4</version>
</dependency>
</dependencies>
</plugin>
</plugins>
</build>
</project>
Save the SQL you want to beautify as original.sql and executing following command yields similar result:
$ mvn bsh:run -Dsql=original.sql
jEdit integration
jEdit has pretty nice integration with BeanShell. You can integrate that SQL beautifier as a jEdit macro. Put following snippet as ~/Library/jEdit/macros/FormatSQL.bsh (for OS X) or create it with Macros → New Macro from jEdit menu bar:
addClassPath("/path/to/hibernate-core-4.3.7.Final.jar"); // replace path to suit your environment
import org.hibernate.engine.jdbc.internal.BasicFormatterImpl;
sql = textArea.getSelectedText();
beautifized = new BasicFormatterImpl().format(sql);
textArea.setSelectedText(beautifized);
Paste SQL to any jEdit buffer, and select SQL statement and execute the macro with Macros → FormatSQL to trigger formatting.