The Road to Damascus –A Conversion Experience: 
LS and @Formula to SSJS 
2014/09/12 –Matthew Fyleman
Matthew Fyleman 
21 Years as a Notes/Domino Developer 
Mostly Working on: 
Xpagesconversions 
Product development 
Wh...
When should you convert existing code? 
Conversion Options 
NotesAgent.run() with parameter doc 
Search and Replace 
...
Never! 
When should you convert existing code?
It is always going to be slow 
GIGO 
You will introduce new bugs 
Re-developing will be quicker, cheaper and you will ...
NotesAgent.run() 
Quick and Dirty 
Agent must run independently 
Only use when agents are available and time is critic...
Search and Replace is most useful for LS conversion 
Syntactically similar 
Easiest if you do a little refactoring firs...
Regular Expressions are your new BFF 
Sophisticated Pattern Matching 
Elements from search can be carried through to re...
[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3} 
Example –What does this do?
Tidy up first –Option Declare, remove clustering e.g.: 
Dim xas Integer,yas Integer,zas Integer 
We want to match any va...
For Notes Objects, Things are simpler 
Dim <varname> As Notes<rest of object name> 
-Ignore ... As New NotesSessionfor no...
For the most part, simple S & R (but order is important): 
End If to} 
[ ]*Thento) { 
Else[ ]+If[ ]*to } else if ( 
Else ...
The problem: 
Session object is global in ssjs: ‘session’ 
In LS it is created: 
Dim sessAs New NotesSession 
Need to ...
Java String Object has regexsearch and replace 
String source = “Dim x As String”; 
String result = source.replaceAll(“Di...
Similar Issue to Session 
Need to find all document object names, and replace field handling methods 
Will probably nee...
There are other types than string! 
Always review and test converted code thoroughly 
Date handling is a pain 
Script ...
In some respects @Formula -> SSJS is easier than LS -> SSJS 
@Formula JavaScript Wrappers help a lot 
Mostly just ‘;’ t...
No direct equivalent in SSJS for *+, *= *>= etc. when applied to Lists 
Need to plan for this 
Java Class/Library to pr...
@If(@Contains(_WFData_neu;_Key);""; 
@Do( 
@Set("_Sachgebiet_Zuordnung";@DbLookup("NOTES":"NOCACHE";"":_ADM$StructureDB;"W...
Focusing on @If 
•@Formula is a FUNCTION language 
•@If is a function not a statement 
•In practice: 
@SetField(“Author”; ...
Search and Replace can be used for @Formula -> SSJS ... 
... but it can only take you so far 
A dedicated tool can go f...
Espresso -http://www.ultrapico.com/Expresso.htm 
Good for learning regex, and serious regexdev 
Free! 
GREP 
Sophisti...
OpenNTF–www.openntf.org 
RegexQuick Reference 
http://www.night-ray.com/regex.pdf 
Loads of websites for all aspects of...
Questions?
matthew.fyleman@we4it.com
Upcoming SlideShare
Loading in …5
×

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

468 views

Published on

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

  • Be the first to comment

  • Be the first to like this

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

  1. 1. The Road to Damascus –A Conversion Experience: LS and @Formula to SSJS 2014/09/12 –Matthew Fyleman
  2. 2. Matthew Fyleman 21 Years as a Notes/Domino Developer Mostly Working on: Xpagesconversions Product development Who Am I?
  3. 3. 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?
  4. 4. Never! When should you convert existing code?
  5. 5. 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?
  6. 6. 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?
  7. 7. 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 LotusScriptto SSJS -Preparation
  8. 8. 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
  9. 9. [0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3} Example –What does this do?
  10. 10. Tidy up first –Option Declare, remove clustering e.g.: Dim xas Integer,yas Integer,zas Integer We want to match any variable name in the pattern: Dim <varname> 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 var1 = “”; Starting Simple –Dim Statements
  11. 11. For Notes Objects, Things are simpler Dim <varname> As Notes<rest of object name> -Ignore ... As New NotesSessionfor now Also, initialising in SSJS, = null is ok: var<varname>:Notes<rest of object name> = null; So our terms are: Search: Dim[ ]+([w]*)[ ]+As[ ]+(Notes[w]*) Replace: var1:2 = null; Starting Simple –Dim Statements (2)
  12. 12. For the most part, simple S & R (but order is important): End If to} [ ]*Thento) { 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
  13. 13. The problem: Session object is global in ssjs: ‘session’ In LS it is created: Dim sessAs 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!
  14. 14. Java String Object has regexsearch 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); intstartPos= 0; while (m.find(startPos)) { if (!itemList.contains(m.group(1))) { itemList.add(m.group(1)); } startPos= m.end() + 1; } Adding Java
  15. 15. 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
  16. 16. 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
  17. 17. 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 @
  18. 18. 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 @!
  19. 19. @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 @!!
  20. 20. 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”) { varauthor = doc.getItemValueString(“Manager”); } else { varauthor = doc.getItemValueString(“Salesman”); } doc.replaceItemValue(“Author”, author); @!!!
  21. 21. 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
  22. 22. Espresso -http://www.ultrapico.com/Expresso.htm Good for learning regex, and serious regexdev Free! GREP Sophisticated regexfile search Where regex started (UNIX grep)! Third Party Tools
  23. 23. OpenNTF–www.openntf.org RegexQuick Reference http://www.night-ray.com/regex.pdf Loads of websites for all aspects of regexdevelopment Mastering Regular Expressions –Jeffrey E.F. Friedl– O’Reilly Publishing Resources and Information
  24. 24. Questions?
  25. 25. matthew.fyleman@we4it.com

×