introduction to judoscriptjudoscript.org/presentations/introduction_to_judoscript.pdf · ... is...
TRANSCRIPT
Copyright 2005 James J.B. Huang 1
Introduction To JudoScriptA Powerful, Intuitive,
All-In-One Scripting Tool
James J.B. Huang
Copyright 2005 James J.B. Huang 2
Perlis's Postulate
The computing field is alwaysin need of new clichés.
Copyright 2005 James J.B. Huang 3
About the Author
Academic experienceIndustry experienceInvented two language tools:
JudoScript – an all-in-one scripting tool http://www.judoscript.com/judo.html
Jamaica – the JVM Macro Assembly Language http://www.judoscript.com/jamaica.html
Copyright 2005 James J.B. Huang 4
How to Use The SlidesThe slides here can be used for presentation and/or learning JudoScript.Presentations won't cover all slides.The first part provides one way of understanding JudoScript, its idea and vision.The second part lists most of the key language features. You may pick and view whatever you are interested in.The last part presents some general language discussion. It may be interesting but is not important.
Copyright 2005 James J.B. Huang 5
About This Presentation
I. Vision and JudoScript DesignII. JudoScript StrengthsIII. Language Design Discussion
Copyright 2005 James J.B. Huang 6
I. Vision and JudoScript Design
I. Vision and JudoScript DesignII. JudoScript StrengthsIII. Language Design Discussion
Copyright 2005 James J.B. Huang 7
What's the Problem?
We use many scripting tools for a task: e.g. Ant, shell scripts, Perl/Python, SQL scripts, even Java or C programs.Common belief: "different tools have different strengths for the job."BUT, why those strengths have to scatteracross different scripting tools in the 21st century?
Copyright 2005 James J.B. Huang 8
The Vision
Imagine
ONE SCRIPTING TOOLwith all those strengths and beyond …
Copyright 2005 James J.B. Huang 9
Benefits of One-Tool-For-All1. Single mind — synergy
No context switching from tool to toolNo data passing from tool to tool
2. 1 + 1 > 2 — Gestalt3. Single install and configuration4. Productivity5. Maintainability6. Lower stress level
Copyright 2005 James J.B. Huang 10
Vocabulary: synergyMutually advantageous conjunction or compatibility of distinct business participants or elements.
— Merrian-Webster
"Coherence."— James Huang
Copyright 2005 James J.B. Huang 11
Vocabulary: GestaltSomething so integrated as to constitute a functional unit with properties not derivable by summation of its parts.
— Merrian-Webster
"Chemistry."— James Huang
Copyright 2005 James J.B. Huang 13
What Do We Need Today?RDBMS processing and reportingCommon data formats, e.g. SGML, XMLWork with file systems and archivessuch as zip, tar and gzipRun executables in various waysNetwork clients, e.g. e-mail, WSDL, HTTP, etc.
(to be continued)
Copyright 2005 James J.B. Huang 14
What Do We Need Today? cont'd
Script popular resources such as Ant Tasks and HibernateCreate and use Graphical User InterfacesScript Java resourcesScript Windows resources including COM/ActiveXAlgorithmic and O-O programmingHaving all these together!
Copyright 2005 James J.B. Huang 15
The AmbitionsJudoScript is an attempt for such an all-in-one scripting tool in the 21st century.It should excel in these strengths, including programming.Some features are really specialized tools, such as a universal RDBMS scripting client, SGML scraper, files and archives tools, etc.It shall be as easy and intuitive as possible.
Copyright 2005 James J.B. Huang 16
Is JudoScript the 1st Such Attempt?Perl was intended for similar goals.Perl [V1:V5]=>[1987, 88, 89, 91, 94].The idea behind Perl: "Perl is designed to make the easy jobs easy, without making the hard jobs impossible.""And what are these 'easy jobs'? The ones you do everyday. You want a language that makes it easy to manipulate numbers and text, files and directories, computers and networks, and especially programs." Programming Perl Edition 2 (Covers Perl 5), ISBN: 1-56592-149-6
Copyright 2005 James J.B. Huang 17
The Perl 6 Vision"The vision for Perl 6 is more than simply a rewrite of Perl 5. By separating the parsing from the compilation and the runtime, we're opening the doors for multiple languages to cooperate. You'll be able to write your program in Perl 6, Perl 5, TCL, Python, or any other language that there's a parser written for. Interchangeable runtime engines let you interpret your byte-code or convert it to something else (e.g., Java, C, or even back to Perl)."
Copyright 2005 James J.B. Huang 18
The JudoScript Design Goals
1. Useful, powerful2. Easy, intuitive3. Contemporary4. Comprehensive, progressive
Copyright 2005 James J.B. Huang 19
High-Level Requirements
1. Provide all the mentioned strengths2. Easy to read, write and maintain3. NOT to re-invent programming ̶ uses
JavaScript as its base syntax4. Strong programming support
Copyright 2005 James J.B. Huang 20
Language Features (Domain Support)
Powerful algorithmic and O-O programming/scriptingPotent Java scriptingSQL scriptingSGML and XML scriptingI/O and loggingFile system and archiveRun executables
Hibernate scriptingWindows COM scriptingWSDL scriptingInternet clientsSend mailGUI scriptingAnt task scriptingOther features
These are language features, not library features.
Copyright 2005 James J.B. Huang 21
Some Quick Code Samples [I]copy ‘*.java’
in ‘src.jar’recursiveto ‘c:/tmp/src’;
copy ‘*.java’except ‘*/save/*’in ‘c:/tmp/src’recursiveinto ‘src.jar’;
listFiles‘*.java,*.properties’in ‘src.jar’recursive; // result in $_
do ‘com/judoscript/RT.java’in ‘src.jar’ as lines
{lineNo = loopIndex()+1;println lineNo:>3,‘: ‘,$_;
}
Copyright 2005 James J.B. Huang 22
Some Quick Code Samples [II]mail::send
from: ‘[email protected]’to: ‘[email protected], [email protected]’cc: ‘[email protected]’
subject: ‘Test test’attach: ‘judo.jar, src.jar’body: [[*
This is a test!*]];
htmlBody: [[*This is a<u>test</u>!
*]];
do 'index.html' as sgml {<a>: println $_.href;<img>: println $_.src;}
do $$local as xml {<book>: println $_.author;</book>: println '-------';<title>TEXT: println $_;}EndScript ===================<book author="Dan Brown"><title>Da Vinci Code</title>
</book>
Copyright 2005 James J.B. Huang 23
Some Quick Code Samples [III]db::sql {INSERT INTO emp(num,name) VALUES(101,'James');INSERT INTO emp(num,name) VALUES(102,'Daniel');}db::batch {INSERT INTO emp(num,name) VALUES(103,'Lisa');INSERT INTO emp(num,name) VALUES(104,'Mary');}db::query qry:SELECT name, bday FROM emp WHERE bday>?
; with @1:date = Date(2005,1,1);while qry.next() {println qry.name:<20, qry[2].fmtDate(‘yyyy’);
}
Copyright 2005 James J.B. Huang 24
Targeted UsesOS shell functionsUniversal RDBMS client and reportingMultiple format text processorsJava, COM and WSDL glue languageSoftware build, package, test and deployInternet clientsDocumentation generatorJava-based GUI toolkitGeneral-purpose programming/scripting language
Copyright 2005 James J.B. Huang 25
Components of JudoScript
JudoScript consists of 3 components:Syntactic supportBuilt-in data structures and object typesSystem functions
Each functional feature may involve one or more of these components.
Copyright 2005 James J.B. Huang 26
I. Vision and JudoScript Design
I. Vision and JudoScript DesignII. JudoScript StrengthsIII. Language Design Discussion
Copyright 2005 James J.B. Huang 27
II. JudoScript Strengths
I. Vision and JudoScript DesignII. JudoScript StrengthsIII. Language Design Discussion
Copyright 2005 James J.B. Huang 28
JudoScript Domain Support
[sql] SQL scripting[sgml] SGML/XML scripting[fs] F.S. and archives[io] I/O and logging[exec] Run executables[java] Potent Java scripting[prog] Powerful algorithmic and
O-O programming
[hib] Hibernate scripting[wsdl] WSDL scripting[com] MS COM scripting[net] Internet clients[mail] Send mail[gui] GUI scripting[ant] Ant task scripting[misc] Other features
Copyright 2005 James J.B. Huang 29
Topic: SQL Scripting
[sql] SQL scripting[sgml] SGML/XML scripting[fs] F.S. and archives[io] I/O and logging[exec] Run executables[java] Potent Java scripting[prog] Powerful algorithmic and
O-O programming
[hib] Hibernate scripting[wsdl] WSDL scripting[com] MS COM scripting[net] Internet clients[mail] Send mail[gui] GUI scripting[ant] Ant task scripting[misc] Other features
Copyright 2005 James J.B. Huang 30
[sql] SQL Scripting
Run SQL statements in groups/batches.Run parameterized SQL with easy parameter binding.Run dynamically constructed SQL.Invoke stored procedures.Heuristic JDBC connections.Multiple simultaneous connections.
Copyright 2005 James J.B. Huang 31
[sql] Run SQL Statementsdb::connect 'jdbc:mysql://localhost/db','user','pass';db::sql {INSERT INTO emp(num,name) VALUES(104, 'Monier');INSERT INTO emp(num,name) VALUES(105, 'Tan');
}db::batch {INSERT INTO emp(num,name) VALUES(106, 'Lin');INSERT INTO emp(num,name) VALUES(107, 'Patel');
}db::disconnect;
Copyright 2005 James J.B. Huang 32
[sql] Run Parameterized SQLdb::connect dbUrl, dbUser, dbPass;db::prepare upd:INSERT INTO emp(num,name) VALUES(:num,:name);
do $$local as lines {var data = $_.csv('|');db::sql upd with num:int=data[0], name=data[1];
}db::disconnect;EndScript ======================================101|James102|Daniel103|Linda
Copyright 2005 James J.B. Huang 33
[sql] Run Constructed SQLnames = ['James', 'Daniel', 'Linda'];
db::connect dbUrl, dbUser, dbPass;db::query qry:
SELECT num, name FROM emp WHERE name IN((* names.concat( ',', {x|return "'${x}'";} ) *));
// => WHERE name IN ('James','Daniel','Linda')while qry.next() {
println qry.num, ' ', qry.name;}db::disconnect;
Copyright 2005 James J.B. Huang 34
[sql] Call Stored Proceduredb::connect anOracleUrl, dbUser, dbPass;db::any [[*CREATE OR REPLACE PROCEDURE test_proc(p_io IN OUT NUMBER, p_i IN VARCHAR, p_o OUT VARCHAR)AS BEGIN
p_o := p_i;IF p_io IS NOT NULL THEN
p_io := p_io + 1;ELSE
p_io := -1000;END IF;
END;*]]; // to be continued …
Copyright 2005 James J.B. Huang 35
[sql] Call Stored Procedure cont'd
db::prepareCall:{ call test_proc( :pIO, :pIn, :pOut) };
x = null;y = 'abcd';db::sql with @pIO :int <=> x,
@pIn :varchar = y,@pOut:varchar => z;
println 'x = ', x;println 'z = ', z;
db::disconnect;
Copyright 2005 James J.B. Huang 36
Topic: SGML and XML Scripting
[sql] SQL scripting[sgml] SGML/XML scripting[fs] F.S. and archives[io] I/O and logging[exec] Run executables[java] Potent Java scripting[prog] Powerful algorithmic and
O-O programming
[hib] Hibernate scripting[wsdl] WSDL scripting[com] MS COM scripting[net] Internet clients[mail] Send mail[gui] GUI scripting[ant] Ant task scripting[misc] Other features
Copyright 2005 James J.B. Huang 37
[sgml] SGML and XML Scripting
Event-driven statements for processing SGML, XML and JSP/ASP pages:
do src as sgml { … }do src as xml { … }do src as jsp { … }
Copyright 2005 James J.B. Huang 38
[sgml] SGML/HTML Scrapingdo 'http://www.yahoo.com' as sgml{<a>: if ($_.href) println '<a>: ', $_.href;:TEXT: println 'TEXT: length=', $_.length();<>: println 'Tag: ', $_.getName();<!>: println 'Special Tag: ', $_;}
Copyright 2005 James J.B. Huang 39
[sgml] An Internet Roboturls = Set[ 'http://yahoo.com' ];visited = Set[];while urls.size()>0 {
var url = urls.getOne();if visited.contains(url) {
urls.remove(url);} else {
visited.add(url);do url as sgml {<a>: if($_.href) urls.add($_.href);<iframe>: if($_.src) urls.add($_.src);}
}}
Copyright 2005 James J.B. Huang 40
[sgml] XML Scripting: Easy SAXdo $$local as xml {<book>: println 'Book by: ', $_.author;</book>: println '-----------------';<title>TEXT: println 'Titlte: ', $_;}EndScript =======================================
<book author="Dan Brown"><title>The Da Vinci Code</title>
</book>
Copyright 2005 James J.B. Huang 41
Topic: F.S. and Archives
[sql] SQL scripting[sgml] SGML/XML scripting[fs] F.S. and archives[io] I/O and logging[exec] Run executables[java] Potent Java scripting[prog] Powerful algorithmic and
O-O programming
[hib] Hibernate scripting[wsdl] WSDL scripting[com] MS COM scripting[net] Internet clients[mail] Send mail[gui] GUI scripting[ant] Ant task scripting[misc] Other features
Copyright 2005 James J.B. Huang 42
[fs] F.S. and ArchivesThe versatile copy command.The powerful listFiles command.Directory commands: mkdir, rmdir, cd, pushd, popd.The String object is also used to represent file and directory paths.
Copyright 2005 James J.B. Huang 43
[fs] Copy Files between Directories and/or Archives
copy '*.java, *.properties' except '*/save/*, *~'in 'c:/src' recursive to 'c:/backup/src';
copy '*.java, *.properties' except '*/save/*, *~'in 'c:/src' recursive into 'c:/backup.tar.gz';
copy '*.java, *.properties' except '*/save/*, *~'in 'c:/src' recursive into 'c:/backup.zip';
copy '*' in 'c:/backup.zip' recursiveto 'c:/src' Echo;
Copyright 2005 James J.B. Huang 44
[fs] Copy Many Directory Treesinto One Archive
zipName ='c:/backup-' + Date().fmtDate('yyyyMMdd') + '.zip';
arch = createZip(zipName);copy '*.java, *.properties' except '*/save/*, *~'
in 'c:/src' recursive into arch under 'src';copy '*' except '*/save/*'
in 'e:/doc' recursive into arch under 'doc';//copy more trees ...arch.close();
Copyright 2005 James J.B. Huang 45
[fs] Create Executable Jarcopy '*.java, *.properties' in 'c:/temp/classes/' recursive
into 'c:/judo.jar' store manifest[[*
Manifest-Version: 1.0Main-Class: judoCreated-By: James Jianbo Huang (c) 2001-(* #year *)
*]];
Copyright 2005 James J.B. Huang 46
[fs] The listFiles Command
It returns the result in $_.It can return files and directories, or return stats about them.It allows you to perform any actions on files and directories.
Copyright 2005 James J.B. Huang 47
[fs] Find Filesls 'c:/src/com/judoscript/*.java' recursive;
listFiles 'com/judoscript/*.java' except '*/save/*'in 'c:/src' recursiveorder by date // size/name/extensionlimit 500;
for f in $_ { println f; }
listFiles 'com/judoscript/*.java'in 'c:/src' recursive as tree;
for f in $_.bfsAllNodes() { println f.path; }
Copyright 2005 James J.B. Huang 48
[fs] Get File StatslistFiles '*.java' recursive size;
listFiles '*.java' recursive count;
listFiles '*.java' recursive lines;
listFiles '*.java' recursive words;
listFiles '*.java' in 'src.zip' recursivecompressedSize;
Copyright 2005 James J.B. Huang 49
[fs] Operate on FileslistFiles '*.java' setFileTime;listFiles '*.java' setFileTime Date(2002,4,5,11,30);listFiles '*.java' setReadOnly;
listFiles '*.java' // arbitrary shell operationexec isWindows() ? 'attrib +r $_' : 'chmod a+r $_';
listFiles '*.java' { // arbitrary operationif getFileAsString($_).contains('Judo') {
println 'File $_ contains "Judo".';}
}
Copyright 2005 James J.B. Huang 50
Topic: I/O and Logging
[sql] SQL scripting[sgml] SGML/XML scripting[fs] F.S. and archives[io] I/O and logging[exec] Run executables[java] Potent Java scripting[prog] Powerful algorithmic and
O-O programming
[hib] Hibernate scripting[wsdl] WSDL scripting[com] MS COM scripting[net] Internet clients[mail] Send mail[gui] GUI scripting[ant] Ant task scripting[misc] Other features
Copyright 2005 James J.B. Huang 51
[io] The Print Family Commands
The print, println and flushcommands.Can write text to stdout, stderr, logand any text files and output streams.Easy and powerful formatting: alignment and repeating options.
Copyright 2005 James J.B. Huang 52
[io] Printing to different targetsprintln 'Hello, world!';println<out> 'Hello, world!';println<err> 'Well, shit happens.';println<log> 'Oh yeah!';
f = openTextFile('foo.txt', 'w');println<f> 'Lah lah lah lah laah lah.';f.close();
sw = createStringWriter();for x from 1 to 10 { println<sw> '#', x, ' '; };println sw.toString();
Copyright 2005 James J.B. Huang 53
[io] Printing with formattingprintln 'abcdefg':<9, 123:>5, 123.45:*5.3, '*'{5};
name = 'James Huang';println name, nl, '-'{name.length()};
// print a text file with line numbers:do 'judo.java' as lines {
println loopIndex()+1:>3, ': ', $_;}
Copyright 2005 James J.B. Huang 54
Topic: Run Executables
[sql] SQL scripting[sgml] SGML/XML scripting[fs] F.S. and archives[io] I/O and logging[exec] Run executables[java] Potent Java scripting[prog] Powerful algorithmic and
O-O programming
[hib] Hibernate scripting[wsdl] WSDL scripting[com] MS COM scripting[net] Internet clients[mail] Send mail[gui] GUI scripting[ant] Ant task scripting[misc] Other features
Copyright 2005 James J.B. Huang 55
[exec] The exec CommandSupports sophisticated command-lines, including piping and redirections.Can take multiple lines for readability.Can specify the starting directory and environment variables.Run asynchronously and synchronously, and return the executable exit value.Can pump input to and read output from the executable, simultaneously or individually.
Copyright 2005 James J.B. Huang 56
[exec] Run javacexec /bg 'javac *.java';
exec 'javac *.java'with CLASSPATH='${CLASSPATH}${:}${lib}/mylibs.jar';
exec [[* javac ${src}/*.java${src}/com/judoscript/*.java${src}/com/judoscript/util/*.java
*]]from '${JDK13HOME}/bin/';
Copyright 2005 James J.B. Huang 57
[exec] Command-linesexec 'java test.Echo < out_err.judo > alfa';
prg = 'java test.Echo';exec '${prg} < tee.judo > a.dump | ${prg}';
Copyright 2005 James J.B. Huang 58
[exec] Interact with executablesexec <a> 'java test.Hello';println 'Return status code: ', a;
exec /needSystemIn 'java test.ToLower'output {
while (line=readPipe()) != eof {println ' #', loopIndex()+1, ': ', line;
}}
println `dir *.java`;
for x in ``dir *.java`` { println x; }
Copyright 2005 James J.B. Huang 59
[exec] Pump and Read Executableexec 'java test.ToLower | java test.Echo'input {println <pipe> 'Cheers!';
}
exec 'java test.ToLower | java test.Echo'input { // feed input to the cmdlineprintln <pipe> 'Hello, World!';
}output { // read output from the cmdlinewhile (line = readPipe()) != eof {println 'Line #', loopIndex()+1, ': ', line;
}}
Copyright 2005 James J.B. Huang 60
Topic: Java Scripting
[sql] SQL scripting[sgml] SGML/XML scripting[fs] F.S. and archives[io] I/O and logging[exec] Run executables[java] Potent Java scripting[prog] Powerful algorithmic and
O-O programming
[hib] Hibernate scripting[wsdl] WSDL scripting[com] MS COM scripting[net] Internet clients[mail] Send mail[gui] GUI scripting[ant] Ant task scripting[misc] Other features
Copyright 2005 James J.B. Huang 61
[java] Use and Extend JavaUse all public Java classes and arrays.Can extend Java classes, including anonymous Java adapters.Can alias Java static methods into JudoScript functions.Field accesses for Java getter/setters.Consistent syntactic sugar for major Java container data structures.
Copyright 2005 James J.B. Huang 62
[java] Create/Use Java Objectslist = new java::ArrayList;list.add('abc'); list.add(1); list.add(2.5);for x in list { println x; }
Int = new java::Integer(1);println Int.class.name; // = Int.getClass().getName()
import javax.swing.*;frm = new java::JFrame('Simplest GUI');frm.setVisible(true);
Copyright 2005 James J.B. Huang 63
[java] Create/Use Java Arraysarr = new java::int[]{ 1, 2, 3 };for x in arr { println x; }arr = new java::byte[3];arr[0]=2; arr[1]=4; arr[2]=6;
arr = new java::String[]{ 'aa', 'bb', 'cc' };
import javax.swing.*;arr = new java::Button[5];arr[0] = new java::Button('button 1');arr[1] = new java::Button('button 2');
Copyright 2005 James J.B. Huang 64
[java] Use Java Static Membersprintln (java::System).currentTimeMillis();println System::currentTimeMillis();cls = java::System;cls.out.println('Hello, World!');
import java.sql.Types;for sqlType in [ 'BIT', 'TINYINT', 'SMALLINT' ] {
println sqlType, ' = ', Types.(sqlType);}
function pickTrash for System::gc; // aliasingpickTrash();
Copyright 2005 James J.B. Huang 65
[java] Extend Classes/Interfacesimport javax.swing.JButton;class MyButton extends java::JButton {
boolean isSubmit;constructor title {
super(title);isSubmit = false;
}void setText(String title) {
super.setText(title);isSubmit = title.equalsIgnoreCase('submit');
}}
Copyright 2005 James J.B. Huang 66
[java] Java Adaptersimport java.awt.event.*;
listner = new java::ActionListner, textListener {void actionPerformed(ActionEvent ae) {
println 'Action done: ', ae.getActionCommand();}void textValueChanged(TextEvent te) {
println 'Text changed: ', te.paramString();}
}
Copyright 2005 James J.B. Huang 67
Topic: Programming
[sql] SQL scripting[sgml] SGML/XML scripting[fs] F.S. and archives[io] I/O and logging[exec] Run executables[java] Potent Java scripting[prog] Powerful algorithmic and
O-O programming
[hib] Hibernate scripting[wsdl] WSDL scripting[com] MS COM scripting[net] Internet clients[mail] Send mail[gui] GUI scripting[ant] Ant task scripting[misc] Other features
Copyright 2005 James J.B. Huang 68
[prog] General Programming
Superset of JavaScript programming.Genuine O-O programming support.Very powerful data structures.Thread programming.More intuitive syntactic sugar.
We have seen programming in various demos, so here we just show very few specific programming examples.
Copyright 2005 James J.B. Huang 69
[prog] String
String has many methods; its collection of methods is a union of the following:java.lang.String
JavaScript String objectStringUtils and StringEscapeUtils in org.apache.commons.lang
JudoScript's own
Strings also represent files and URLs.
Copyright 2005 James J.B. Huang 70
[prog] Data Structures: the Source of Programming Power
More built-in data structuresMore methods on these data structuresBuilt-in data types and data structures:
Integer, Float, String and Date/timeObject, OrderedMap, SortedMapArray, LinkedList, SetTableDataTreeNodeStack, Queue
Other built-in domain objects
Copyright 2005 James J.B. Huang 71
[prog] Array, LinkedList, Setarr = [ 1, 'abc', Date(2001,11,16) ];list = LinkedList[ 1, 'abc', Date(2001,11,16) ];set = Set[ 1, 'abc', Date(2001,11,16) ];for x in arr { println x; }
arr = [ 4, 2, 7, 5, 10, 9 ];println 'Length: ', arr.length();println 'Sorted: ', arr.sortAsNumber();println 'CSV: ', arr.concat(',');println '[2,3]: ', arr.subarray(2,3);println 'Average: ', arr.average();
Copyright 2005 James J.B. Huang 72
[prog] Custom Sortinga = [ '1.2','3','3.9','1.10','1.2.1','2.3','3' ];for x in a.sort(&my_comparator) { println x; }// Result: 1.10, 1.2, 1.2.1, 2.3, 3, 3, 3.9
function my_comparator(lhs, rhs) {la = lhs.csv('.'); ra = rhs.csv('.');lali = la.lastIndex(); rali = ra.lastIndex();for i from 0 to min(lali,rali) {if (la[i].int()<ra[i].int()) return -1;if (la[i].int()>ra[i].int()) return 1;
}if (lali==rali) return 0;return lali>rali;
}
Copyright 2005 James J.B. Huang 73
[prog] Object and OrderedMapobj = new Object(name='James', bday=Date(2001,11,16));obj = { name='James', bday=Date(2001,11,16) };
omap = OrderedMap{ name='James', sex='M' };omap = new OrderedMap(name='James', sex='M');
println 'name => ', obj.name;println 'bday => ', obj.bday.fmtDate('yyyy-MM-dd');for key in obj {
println key, ' => ', obj.(key);}for key in obj.keysSortByValues() {
println key, ' => ', obj.(key);}
Copyright 2005 James J.B. Huang 74
[prog] TableDataa = new TableData('Name', 'Type', 'Birthday');a.add('Java', 'System', Date(1996,5,23)).add('JudoScript', 'Scripting', Date(2001,11,16));
println 'Language | Type | Birthday';println '----------+-----------+---------';printTable a for
column(0):<10!, '| ',column('Type'):<10!, '| ',column('Birthday').fmtDate('yyyy-MM');
for lang in a.getColumn('Name') {println lang;
}
Copyright 2005 James J.B. Huang 75
[prog] Thread Programmingconst #docroot = ${TMPROOT};
// multi-threaded HTTP server:thread httpHandler(con) { con.serveFile(#docroot); }ss = startServer(8088);while {
start thread httpHandler(acceptHttp(ss));}
// single-threaded HTTP server:ss = startServer(8088);while {
acceptHttp(ss).serveFile(#docroot);}
Copyright 2005 James J.B. Huang 76
Topic: Hibernate Scripting
[sql] SQL scripting[sgml] SGML/XML scripting[fs] F.S. and archives[io] I/O and logging[exec] Run executables[java] Potent Java scripting[prog] Powerful algorithmic and
O-O programming
[hib] Hibernate scripting[wsdl] WSDL scripting[com] MS COM scripting[net] Internet clients[mail] Send mail[gui] GUI scripting[ant] Ant task scripting[misc] Other features
Copyright 2005 James J.B. Huang 77
[hib] Hibernate Scripting
Hibernate scripting allows easy use of persistent objects with the Hibernate ORM framework.Provides syntax similar to JDBC scripting for querying and operations.
Copyright 2005 James J.B. Huang 78
[hib] Persist Objectshib::setup (
hibernate.connection.url= 'jdbc:mysql://localhost/test',
hibernate.connection.username = 'james',hibernate.connection.password = 'james',hibernate.hbm2ddl.auto = 'update',judoscript.echo = true
)TestSimpleTypes // class name(s)
;x = new java::TestSimpleTypes(10.5, 'abc', Date());/* Persist: */ hib::save(x);/* Update: */ x.theFloat = 100.8; hib::update(x);/* Delete: */ hib::delete x;
Copyright 2005 James J.B. Huang 79
[hib] Hibernate Query/Deletehib::query qry:
select o.id, o.theFloat, o.theStringfrom TestSimpleTypes owhere o.id>:startIdx and o.id<:endIdx
; with startIdx:Long=9, endIdx:Long=15;for o in qry { println o; }
hib::delete:from TestSimpleTypes owhere o.id>:startIdx and o.id<:endIdx
; with startIdx:Long=11, endIdx:Long=13;
Copyright 2005 James J.B. Huang 80
Topic: WSDL Scripting
[sql] SQL scripting[sgml] SGML/XML scripting[fs] F.S. and archives[io] I/O and logging[exec] Run executables[java] Potent Java scripting[prog] Powerful algorithmic and
O-O programming
[hib] Hibernate scripting[wsdl] WSDL scripting[com] MS COM scripting[net] Internet clients[mail] Send mail[gui] GUI scripting[ant] Ant task scripting[misc] Other features
Copyright 2005 James J.B. Huang 81
[wsdl] WSDL Scripting
WSDL scripting is extremely simple: obtain the WSDL handle and use it like any object.JudoScript marshals any object values, including JudoScript Object, java.util.Map and Java class, to WSDL object types.
Copyright 2005 James J.B. Huang 82
[wsdl] Test with Echo Servicews = wsdl::'http://testhost/axis/services/echo?wsdl';
println ws.echoStringArray( [ 'o', 'p', 'q' ] );println ws.echoIntegerArray( [ 10, 20, 30 ] );
mapArray = [ { alfa=1 }, { beta='xyz' } ];println ws.echoMapArray( mapArray );
Copyright 2005 James J.B. Huang 83
Topic: MS COM Scripting
[sql] SQL scripting[sgml] SGML/XML scripting[fs] F.S. and archives[io] I/O and logging[exec] Run executables[java] Potent Java scripting[prog] Powerful algorithmic and
O-O programming
[hib] Hibernate scripting[wsdl] WSDL scripting[com] MS COM scripting[net] Internet clients[mail] Send mail[gui] GUI scripting[ant] Ant task scripting[misc] Other features
Copyright 2005 James J.B. Huang 84
[com] Scripting ActiveX/COM
ActiveX/COM scripting is extremely simple: obtain the COM and use it like any object.
Copyright 2005 James J.B. Huang 85
[com] Use VBScript, XMLDOMsc = new com::ScriptControl;sc.Language = 'VBScript';for i from 0 to 9 {
println sc.Eval('${i}+1001');}
xmldoc = new com::Microsoft.XMLDOM;xmldoc.async = false;xmldoc.load('test.xml');children = xmldoc.documentElement.childNodes;for i from 0 to children.length-1 {
c = children['item',i];println c, ' ', c.text;
}
Copyright 2005 James J.B. Huang 86
[com] Use Excelxl = new com::Excel.Application;xl.Visible = true;
workbooks = xl.Workbooks;workbook = workbooks.Add;sheet = workbook.ActiveSheet;a1 = sheet['Range', 'A1'];a2 = sheet['Range', 'A2'];a1.Value = 123.456;a2.Formula = '=A1*2';println 'a1: ', a1.Value, ' a2: ', a2.Value;
workbook.Close();xl.Quit();
Copyright 2005 James J.B. Huang 87
Topic: Internet Clients
[sql] SQL scripting[sgml] SGML/XML scripting[fs] F.S. and archives[io] I/O and logging[exec] Run executables[java] Potent Java scripting[prog] Powerful algorithmic and
O-O programming
[hib] Hibernate scripting[wsdl] WSDL scripting[com] MS COM scripting[net] Internet clients[mail] Send mail[gui] GUI scripting[ant] Ant task scripting[misc] Other features
Copyright 2005 James J.B. Huang 88
[net] HTTP Clienth = httpGet('http://www.yahoo.com');
// set header before send:h.('User-Agent') ='Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)';
// get headers and cookies (connect first):for x in h.getAllHeaders() { println x, ': ', h.(x); }for x in h.getCookies() { println x; }
Copyright 2005 James J.B. Huang 89
Topic: Send Mail
[sql] SQL scripting[sgml] SGML/XML scripting[fs] F.S. and archives[io] I/O and logging[exec] Run executables[java] Potent Java scripting[prog] Powerful algorithmic and
O-O programming
[hib] Hibernate scripting[wsdl] WSDL scripting[com] MS COM scripting[net] Internet clients[mail] Send mail[gui] GUI scripting[ant] Ant task scripting[misc] Other features
Copyright 2005 James J.B. Huang 90
[mail] Send Mail Made E-Z!mail::send
from: ‘[email protected]’to: ‘[email protected], [email protected]’cc: ‘[email protected]’
subject: ‘Test test’attach: ‘${ship}/judo.jar, ${ship}/src.jar’
body: [[*This is a test!
*]];htmlBody: [[*
This is a <u>test</u>!*]];
Copyright 2005 James J.B. Huang 91
Topic: GUI Scripting
[sql] SQL scripting[sgml] SGML/XML scripting[fs] F.S. and archives[io] I/O and logging[exec] Run executables[java] Potent Java scripting[prog] Powerful algorithmic and
O-O programming
[hib] Hibernate scripting[wsdl] WSDL scripting[com] MS COM scripting[net] Internet clients[mail] Send mail[gui] GUI scripting[ant] Ant task scripting[misc] Other features
Copyright 2005 James J.B. Huang 92
[gui] Java GUI Scriptingimport javax.swing.*;
frame = new java::JFrame('Simplest GUI');frame.setVisible(true);
gui::events {<frame : Window : windowClosing>: exit 0;
}
Copyright 2005 James J.B. Huang 93
Topic: Ant Task Scripting
[sql] SQL scripting[sgml] SGML/XML scripting[fs] F.S. and archives[io] I/O and logging[exec] Run executables[java] Potent Java scripting[prog] Powerful algorithmic and
O-O programming
[hib] Hibernate scripting[wsdl] WSDL scripting[com] MS COM scripting[net] Internet clients[mail] Send mail[gui] GUI scripting[ant] Ant task scripting[misc] Other features
Copyright 2005 James J.B. Huang 94
[ant] Why Script Ant Tasks
Ant tasks comprise a unique form of useful library of practical utilities.JudoScript allows you to cut-n-paste Ant task code and script them immediately.
Copyright 2005 James J.B. Huang 95
[ant] Script Ant Tasksa = 'ants';anttask::<echo message="Hello, ${a}!"/>anttask::<echo><![CDATA[ Hello, more ${a}! ]]></echo>
fname = '/usr/bin/judo';anttask::<basename property="b.name" file="${fname}"/>println 'Base name: ', ${b.name};
anttask::<taskdef name="judo"classname="com.judoscript.AntJudoScriptTask" />
anttask::<judo>println 'Judo-in-Ant-in-Judo, a.k.a. AntBurger!';
</judo>
Copyright 2005 James J.B. Huang 96
JudoScript Domain Support
[sql] SQL scripting[sgml] SGML/XML scripting[fs] F.S. and archives[io] I/O and logging[exec] Run executables[java] Potent Java scripting[prog] Powerful algorithmic and
O-O programming
[hib] Hibernate scripting[wsdl] WSDL scripting[com] MS COM scripting[net] Internet clients[mail] Send mail[gui] GUI scripting[ant] Ant task scripting[misc] Other features
Copyright 2005 James J.B. Huang 97
II. JudoScript Strength
I. Vision and JudoScript DesignII. JudoScript StrengthIII. Language Design Discussion
Copyright 2005 James J.B. Huang 98
III. Language Design Discussion
I. Vision and JudoScript DesignII. JudoScript StrengthIII. Language Design Discussion
Copyright 2005 James J.B. Huang 99
Programming Language Use Cases
JudoScript(A Useable Language)
Scripting Languages
Programming Languages
EssentialProgramming
Use Cases
ExtensionMechanism
Real-WorldUse Cases
“Cute”Programming
Use Cases
Common UtilityUse Cases
Copyright 2005 James J.B. Huang 100
Issues with API Programming
VerbosityDuplicated EffortsLeakage-of-concerns
E.g. Use java.util.zip package.E.g. Use javax.mail package.
The opposite of API programming is declarative programming.
Copyright 2005 James J.B. Huang 101
Declarative vs API Programming
Declarative programming focuses on specifying the solution itselfAPI programming focuses on the implementation of a solutionScripting tools are to solve real-world problems – solution should be the focal point!
Copyright 2005 James J.B. Huang 102
JudoScript SummaryTrinity of JudoScript
Algorithmic and O-O programmingJava scriptingDomain scripting
Practically Use Java PlatformScript Intuitively, Effectively, EfficientlyJudoScript is the first all-in-one tool!
Copyright 2005 James J.B. Huang 103
III. Language Design Discussion
I. Vision and JudoScript DesignII. JudoScript StrengthIII. Language Design Discussion
Copyright 2005 James J.B. Huang 104
To Run JudoScript ̶1. Download judo.jar.zip from:
http://www.judoscript.com/download.html2. Unzip and add it to your CLASSPATH for Java.3. To run a script:
% java judo test.judo -opt=1 param1 param24. To run code from the command-line:
% java judo -x "println versionInfo()"% alias jx="java judo -x"% jx ". (1234).fmtHex()"% jx ". 1.075 ** 30"% jx ". Date(2008,9,3).dayOfWeek"
Copyright 2005 James J.B. Huang 105
To Learn More about JudoScript ̶1. This presentation is listed on:
http://www.judoscript.com/tut_pres.html2. The examples library is the best source to get started
and it covers all areas! http://www.judoscript.com/examples/
3. The on-going book and other articles: http://www.judoscript.com/articles/
4. The Language Reference (somewhat out-of-date): http://www.judoscript.com/ref/
5. The whole JudoScript site: http://www.judoscript.com