25
The Road to Damascus – A Conversion Experience: LS and @Formula to SSJS 2014/09/12 Matthew Fyleman

Icsug dev day2014_road to damascus - conversion experience-lotusscript and @formula to ssjs

Embed Size (px)

DESCRIPTION

Matthew Fyleman from We4IT explain the best ways to move Lotus Script and @Formula language to ServerSide JavaScript (SSJS).

Citation preview

Page 1: Icsug dev day2014_road to damascus - conversion experience-lotusscript and @formula to ssjs

The Road to Damascus – A Conversion Experience:

LS and @Formula to SSJS2014/09/12 –Matthew Fyleman

Page 2: Icsug dev day2014_road to damascus - conversion experience-lotusscript and @formula to ssjs

Matthew Fyleman

21 Years as a Notes/Domino Developer

Mostly Working on:

Xpages conversions

Product development

Who Am I?

Page 3: Icsug dev day2014_road to damascus - conversion experience-lotusscript and @formula to ssjs

When should you convert existing code?

Conversion Options

NotesAgent.run() with parameter doc

Search and Replace

Dedicated Tools

Search and Replace

Preparation

Introduction to Regular Expressions

Examples and Demonstration

Tips and Traps

Dedicated Tools

Questions

What am I talking about?

Page 4: Icsug dev day2014_road to damascus - conversion experience-lotusscript and @formula to ssjs

Never!

When should you convert existing code?

Page 5: Icsug dev day2014_road to damascus - conversion experience-lotusscript and @formula to ssjs

It is always going to be slow

GIGO

You will introduce new bugs

Re-developing will be quicker, cheaper

and you will end up with a better result

But if you really must ...

What is the problem?

Page 6: Icsug dev day2014_road to damascus - conversion experience-lotusscript and @formula to ssjs

NotesAgent.run()

Quick and Dirty

Agent must run independently

Only use when agents are available and time is critical

Scheduled agents excluded – mostly!

Search and Replace

LotusScript -> JavaScript (and Java)

Less useful for @Formula

Dedicated Tools

@Formula

What are your options?

Page 7: Icsug dev day2014_road to damascus - conversion experience-lotusscript and @formula to ssjs

Search and Replace is most useful for LS conversion

Syntactically similar

Easiest if you do a little refactoring first

Option Declare

doc.field(0) -> doc.getItemValue(“Field“)(0)

Camel Case Notes Objects

Make Sure Method calls are consistently named

Best to Avoid All-In-One-Go

Function or Sub at a Time

Variable with one purpose in one location may have a different use elsewhere

Converting LotusScript to SSJS - Preparation

Page 8: Icsug dev day2014_road to damascus - conversion experience-lotusscript and @formula to ssjs

Regular Expressions are your new BFF

Sophisticated Pattern Matching

Elements from search can be carried through to

replace

The Search and Replace built in to DDE can use

Regular Expressions

Useful outside LS conversion (e.g. Validation)

See Planet Lotus - http://planetlotus.org/profiles/ross-swick_97733

Regular Expressions

Page 9: Icsug dev day2014_road to damascus - conversion experience-lotusscript and @formula to ssjs

[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}

Example –What does this do?

Page 10: Icsug dev day2014_road to damascus - conversion experience-lotusscript and @formula to ssjs

Tidy up first – Option Declare, remove clustering e.g.:

Dim x as Integer,y as Integer,z as Integer

We want to match any variable name in the pattern:

Dim <var name> As <Any valid type>

Fairly simple:

Dim[ ]+[A-Za-z0-9_]+[ ]+As[ ]+(Integer|String|Boolean|Double|Variant)

But how do we replace?

Modify the search:

Dim[ ]+([\w]*)[ ]+As[ ]+String

Use this for replace

var \1 = “”;

Starting Simple –Dim Statements

Page 11: Icsug dev day2014_road to damascus - conversion experience-lotusscript and @formula to ssjs

For Notes Objects, Things are simpler

Dim <var name> As Notes<rest of object name>

- Ignore ... As New NotesSession for now

Also, initialising in SSJS, = null is ok:

var <var name>:Notes<rest of object name> = null;

So our terms are:

Search:

Dim[ ]+([\w]*)[ ]+As[ ]+(Notes[\w]*)

Replace:

var \1\:\2 = null;

Starting Simple –Dim Statements (2)

Page 12: Icsug dev day2014_road to damascus - conversion experience-lotusscript and @formula to ssjs

For the most part, simple S & R (but order is important):

End If to \}

[ ]*Then to \) \{

Else[ ]+If[ ]* to \} else if \(

Else [ ]* to \} else \{

If[ ]* to if \(

But what about:

If (x = 10) Then

Use Search: If[ ]+([\w\(\)\[\]\.<>" ]*)=([\w\(\)\[\]\.<> "]*)[ ]+Then

Use Replace: if \(\1==\2\) \{ -

NB: Works but not optimal!

Other comparison operators not a problem

A bit more complex – If Statements

Page 13: Icsug dev day2014_road to damascus - conversion experience-lotusscript and @formula to ssjs

The problem:

Session object is global in ssjs: ‘session’

In LS it is created:

Dim sess As New NotesSession

Need to find all LS session objects, and replace with session

How do you get a list of session object names?

! – session objects

You need a coffee!

Page 14: Icsug dev day2014_road to damascus - conversion experience-lotusscript and @formula to ssjs

Java String Object has regex search and replace

String source = “Dim x As String”;

String result = source.replaceAll(“Dim[ ]+([\w]*)[ ]+As[ ]+String”, “var $1 = \“\”;”);

Pattern and Matcher objects make this even more powerful

Pattern p = Pattern.compile(pattern);

Matcher m = p.matcher(this.source);

int startPos = 0;

while (m.find(startPos)) {

if (!itemList.contains(m.group(1))) {

itemList.add(m.group(1));

}

startPos = m.end() + 1;

}

Adding Java

Page 15: Icsug dev day2014_road to damascus - conversion experience-lotusscript and @formula to ssjs

Similar Issue to Session

Need to find all document object names, and replace field

handling methods

Will probably need to handle dot notation

Arrgghh!

How do you search for dot notation?

<doc name>\.([^GetItemValue])\([0-9]+\)

Still hard work!

Field Handling

Page 16: Icsug dev day2014_road to damascus - conversion experience-lotusscript and @formula to ssjs

There are other types than string!

Always review and test converted code thoroughly

Date handling is a pain

Script libraries can help here – Java?

Watch out for User interaction and particularly dialogues

Work out your strategies in advance!

Search and Replace –Tips and Traps

Page 17: Icsug dev day2014_road to damascus - conversion experience-lotusscript and @formula to ssjs

In some respects @Formula -> SSJS is easier than LS -> SSJS

@Formula JavaScript Wrappers help a lot

Mostly just ‘;’ to ‘,’, and converting lists to arrays

Some constructions are obvious:

@SetField(“Field”, Value);

Goes to:

doc.replaceItemValue(“Field”, Value);

Or

S: @SetField\([ ]*([\w”]*)[ ]*\,[ ]*([\w”]*)[ ]*\);

R: doc\.replaceItemValue\(\1, \2\);

But there are some issues ...

Converting Formula

@

Page 18: Icsug dev day2014_road to damascus - conversion experience-lotusscript and @formula to ssjs

No direct equivalent in SSJS for *+, *= *>= etc.

when applied to Lists

Need to plan for this

Java Class/Library to provide direct substitute

Unfortunately, Java does not permit operator

overloading, so has to be a set of methods

Converting Formula – List Processing

@!

Page 19: Icsug dev day2014_road to damascus - conversion experience-lotusscript and @formula to ssjs

@If(@Contains(_WFData_neu;_Key);"";

@Do(

@Set("_Sachgebiet_Zuordnung";@DbLookup("NOTES":"NOCACHE";"":_ADM$StructureDB;"Workflows";"WFArbeitsanweisung";"Sachgebietzuordnung"));

@If(_Sachgebiet_Zuordnung = "" | !@Contains(_Sachgebiet_Zuordnung;_Key2);@Do(

@Prompt([Ok];"Hinweis";"In der System Struktur VBM wurde für das aktuelle Sachgebiet kein Workflow definiert. Das Dokument wird zum ehemaligen

Kompetenzträger zurückgegeben, damit dieser ein neues Sachgebiet auswählen kann.");

@Set("_Kompetenzträger";Bearbeiter1);

@Set("_tmpintern";5)

);

@Do(

@Prompt([Ok];"Hinweis";"In der System Struktur VBM wurde für das aktuelle Sachgebiet ein neues Sachgebiet konfiguriert. Das Dokument wird zum

Kompetenzträger zurückgegeben, damit dieser das neue Sachgebiet auswählen kann.");

@Set("_neues_Sachgebiet";@Left(@Right(_Sachgebiet_Zuordnung;_key2);"||"));

@Set("_Elements";@Elements(@Explode(@Left(@Left(@Right(_WFData_neu;"||Sachgebiet#");"||"); _neues_Sachgebiet) + _neues_Sachgebiet; "$" )));

@Set("_KompetenzträgerData";@Explode(@Left(@Right(_WFData_neu;"||Kompetenzträger#");"||"); "$"));

@Set("_Kompetenzträger";@Subset(@Subset(_KompetenzträgerData;_Elements);-1));

@Set("_tmpintern";6)

)

)

)

);

Converting Formula - @If, @Do and @While

@!!

Page 20: Icsug dev day2014_road to damascus - conversion experience-lotusscript and @formula to ssjs

Focusing on @If

• @Formula is a FUNCTION language

• @If is a function not a statement

• In practice:

@SetField(“Author”; @If(Status=“1”; Manager; Salesman));

• Needs to convert to:

if (Status == “1”) {

var author = doc.getItemValueString(“Manager”);

} else {

var author = doc.getItemValueString(“Salesman”);

}

doc.replaceItemValue(“Author”, author);

@!!!

Page 21: Icsug dev day2014_road to damascus - conversion experience-lotusscript and @formula to ssjs

Search and Replace can be used for @Formula ->

SSJS ...

... but it can only take you so far

A dedicated tool can go further

Only real alternative to manual translation for complex

statements

Time consuming to create

Still not a silver bullet

Tools

Page 22: Icsug dev day2014_road to damascus - conversion experience-lotusscript and @formula to ssjs

Espresso - http://www.ultrapico.com/Expresso.htm

Good for learning regex, and serious regex dev

Free!

GREP

Sophisticated regex file search

Where regex started (UNIX grep)!

Third Party Tools

Page 23: Icsug dev day2014_road to damascus - conversion experience-lotusscript and @formula to ssjs

OpenNTF – www.openntf.org

Regex Quick Reference

http://www.night-ray.com/regex.pdf

Loads of websites for all aspects of regex

development

Mastering Regular Expressions – Jeffrey E.F. Friedl –

O’Reilly Publishing

Resources and Information

Page 24: Icsug dev day2014_road to damascus - conversion experience-lotusscript and @formula to ssjs

Questions?