introduction to judoscriptjudoscript.org/presentations/introduction_to_judoscript.pdf · ... is...

105
Copyright 2005 James J.B. Huang 1 Introduction To JudoScript A Powerful, Intuitive, All-In-One Scripting Tool James J.B. Huang

Upload: duongxuyen

Post on 25-Mar-2018

225 views

Category:

Documents


3 download

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 12

Is this Vision Feasible?

POSITIVE!

Because we know what we need.

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