1 
The Road to Damascas– A Conversion Experience: 
LS and @Formula to SSJS 
2014/03/17 –Matthew Fyleman
2 
Matthew Fyleman 
21 Years as a Notes/Domino Developer 
Mostly Working on: 
Xpages conversions 
Product development 
Who Am I?
3 
Based on My Experiences 
Converting LotusScript and @Formula to SSJS 
Tools that can help –particularly regular expressions 
What is this Talk About?
4 
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?
5 
Never! 
When should you convert existing code?
6 
What is the problem? 
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 ... 
When should you convert existing code?
7 
What are your options? 
NotesAgent.run() 
Quick and Dirty 
Agent must run independently 
Only use when agents are available and time is critical 
Search and Replace 
LotusScript -> JavaScript (and Java) 
Less useful for @Formula 
Dedicated Tools 
@Formula 
Conversion Options
8 
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
9 
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
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 
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 
For the most part, simple S & R (but order is important): 
End If to} 
[ ]*Thento) { 
Else[ ]+If[ ]*to } else if ( 
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 
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 
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 
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 
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 
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 
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 
@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 
Search and Replace can be used for @Formula -> SSJS ... 
... but it can only take you so far 
A dedicated parser can go further 
Only real alternative to manual translation for complex statements 
Time consuming to create 
Still not a silver bullet 
Parsers
21 
Espresso -http://www.ultrapico.com/Expresso.htm 
Good for learning regex, and serious regexdev 
Free! 
PowerGREP 
Sophisticated regexfile search 
Where regexstarted (UNIX grep)! 
Expensive 
Dedicated Tools
22 
We4IT –www.we4it.com 
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
23 
Questions?
24 
matthew.fyleman@we4it.com

More Related Content

PDF
Icsug dev day2014_road to damascus - conversion experience-lotusscript and @f...
PDF
bccon-2014 dev03 xpages-road_to_damascas-lotus-script-and-@formula-to-ssjs
PPTX
The Road To Damascus - A Conversion Experience: LotusScript and @Formula to SSJS
PDF
JavaScript - Chapter 4 - Types and Statements
PPT
Pxb For Yapc2008
PPT
Ruby For Java Programmers
PDF
JavaScript - Chapter 6 - Basic Functions
PPT
An introduction to javascript
Icsug dev day2014_road to damascus - conversion experience-lotusscript and @f...
bccon-2014 dev03 xpages-road_to_damascas-lotus-script-and-@formula-to-ssjs
The Road To Damascus - A Conversion Experience: LotusScript and @Formula to SSJS
JavaScript - Chapter 4 - Types and Statements
Pxb For Yapc2008
Ruby For Java Programmers
JavaScript - Chapter 6 - Basic Functions
An introduction to javascript

What's hot (19)

PPTX
LinkedIn TBC JavaScript 100: Intro
ODP
What I Love About Ruby
PPTX
Scala Refactoring for Fun and Profit (Japanese subtitles)
PPTX
Java best practices
PPTX
Scala overview
PDF
JavaScript - Chapter 9 - TypeConversion and Regular Expressions
PDF
Powerful JavaScript Tips and Best Practices
PPT
Javascript built in String Functions
PPTX
Javascript basics
PPTX
The JavaScript Programming Language
PDF
DEFUN 2008 - Real World Haskell
PDF
purely_functional_play_framework_application
PPT
Ajax and JavaScript Bootcamp
ODP
What's new, what's hot in PHP 5.3
PDF
Querydsl fin jug - june 2012
PDF
C++11 Idioms @ Silicon Valley Code Camp 2012
PPTX
Scala Matsuri 2016: Japanese Text Mining with Scala and Spark
PPT
Building Data Mapper PHP5
PDF
Querydsl overview 2014
LinkedIn TBC JavaScript 100: Intro
What I Love About Ruby
Scala Refactoring for Fun and Profit (Japanese subtitles)
Java best practices
Scala overview
JavaScript - Chapter 9 - TypeConversion and Regular Expressions
Powerful JavaScript Tips and Best Practices
Javascript built in String Functions
Javascript basics
The JavaScript Programming Language
DEFUN 2008 - Real World Haskell
purely_functional_play_framework_application
Ajax and JavaScript Bootcamp
What's new, what's hot in PHP 5.3
Querydsl fin jug - june 2012
C++11 Idioms @ Silicon Valley Code Camp 2012
Scala Matsuri 2016: Japanese Text Mining with Scala and Spark
Building Data Mapper PHP5
Querydsl overview 2014
Ad

More from ICS User Group (20)

PDF
Domino Security Present and Future ConnectED Review - ICS.UG 2016
PDF
Moving DNUG Usergroup von on-premise in die IBM ConnectionsCloud - ICS.UG 2016
PDF
IBM Notes Traveler & IBM Mobile Connect What's new?, What's next? - ICS.UG 2016
PDF
Warum IBM mit Watson den Büroalltag revolutioniert - ICS.UG 2016
PDF
Private Cloud Storage - ICS.UG 2016
PDF
Die mobile Herausforderung meistern! - ICS.UG 2016
PDF
Cloud Update 2016 IBM Collaboration Solutions - Verse (&Toscana) - ICS.UG 2016
PDF
Cloud Update 2016 IBM Collaboration Solutions - ConnectionsCloud - ICS.UG 2016
PDF
OpenNTF - From Donation to Contribution - ICS.UG 2016
PDF
Virtual, Faster, Better! How to Virtualize the Rich Client and Browser Plugin...
PDF
Find your data - using GraphDB capabilities in XPages applications - ICS.UG 2016
PDF
XPages on IBM Bluemix: The Do's and Dont's - ICS.UG 2016
PDF
Die Zukunft spricht Domino! - ICS.UG 2016
PDF
Smashdocs - Dokumente gemeinsam schreiben - ICS.UG 2016
PDF
Smashdocs - Collaborative authoring & reviewing - ICS.UG 2016
PDF
IBM Digital Experience Overview - ICS.UG 2016
PDF
Watson - Bitte-helfen-Sie - ICS.UG 2016
PDF
Planung / Terminierung eines Außendienstes mit XPages - ICS.UG 2016
PDF
Beyond XPages ICS.UG 2015
PDF
ATLUG comes to you ICS.UG 2015
Domino Security Present and Future ConnectED Review - ICS.UG 2016
Moving DNUG Usergroup von on-premise in die IBM ConnectionsCloud - ICS.UG 2016
IBM Notes Traveler & IBM Mobile Connect What's new?, What's next? - ICS.UG 2016
Warum IBM mit Watson den Büroalltag revolutioniert - ICS.UG 2016
Private Cloud Storage - ICS.UG 2016
Die mobile Herausforderung meistern! - ICS.UG 2016
Cloud Update 2016 IBM Collaboration Solutions - Verse (&Toscana) - ICS.UG 2016
Cloud Update 2016 IBM Collaboration Solutions - ConnectionsCloud - ICS.UG 2016
OpenNTF - From Donation to Contribution - ICS.UG 2016
Virtual, Faster, Better! How to Virtualize the Rich Client and Browser Plugin...
Find your data - using GraphDB capabilities in XPages applications - ICS.UG 2016
XPages on IBM Bluemix: The Do's and Dont's - ICS.UG 2016
Die Zukunft spricht Domino! - ICS.UG 2016
Smashdocs - Dokumente gemeinsam schreiben - ICS.UG 2016
Smashdocs - Collaborative authoring & reviewing - ICS.UG 2016
IBM Digital Experience Overview - ICS.UG 2016
Watson - Bitte-helfen-Sie - ICS.UG 2016
Planung / Terminierung eines Außendienstes mit XPages - ICS.UG 2016
Beyond XPages ICS.UG 2015
ATLUG comes to you ICS.UG 2015
Ad

Recently uploaded (20)

PPTX
2025-08-17 Joseph 03 (shared slides).pptx
PPTX
CASEWORK Power Point Presentation - pointers
PPTX
FINAL TEST 3C_OCTAVIA RAMADHANI SANTOSO-1.pptx
PPTX
Rakhi Presentation vbbrfferregergrgerg.pptx
PPTX
power point presentation ofDracena species.pptx
PDF
MODULE 3 BASIC SECURITY DUTIES AND ROLES.pdf
PPTX
3RD-Q 2022_EMPLOYEE RELATION - Copy.pptx
PDF
COLEAD A2F approach and Theory of Change
PPTX
Copy- of-Lesson-6-Digestive-System.pptx
PDF
5_tips_to_become_a_Presentation_Jedi_@itseugenec.pdf
PDF
Presentation on cloud computing and ppt..
PPT
Lessons from Presentation Zen_ how to craft your story visually
PDF
Unnecessary information is required for the
PPTX
Lesson-7-Gas. -Exchange_074636.pptx
PPTX
Knowledge Knockout ( General Knowledge Quiz )
PPTX
Shizophrnia ppt for clinical psychology students of AS
PPTX
Sustainable Forest Management ..SFM.pptx
PPTX
Module_4_Updated_Presentation CORRUPTION AND GRAFT IN THE PHILIPPINES.pptx
PPTX
Phylogeny and disease transmission of Dipteran Fly (ppt).pptx
PDF
IKS PPT.....................................
2025-08-17 Joseph 03 (shared slides).pptx
CASEWORK Power Point Presentation - pointers
FINAL TEST 3C_OCTAVIA RAMADHANI SANTOSO-1.pptx
Rakhi Presentation vbbrfferregergrgerg.pptx
power point presentation ofDracena species.pptx
MODULE 3 BASIC SECURITY DUTIES AND ROLES.pdf
3RD-Q 2022_EMPLOYEE RELATION - Copy.pptx
COLEAD A2F approach and Theory of Change
Copy- of-Lesson-6-Digestive-System.pptx
5_tips_to_become_a_Presentation_Jedi_@itseugenec.pdf
Presentation on cloud computing and ppt..
Lessons from Presentation Zen_ how to craft your story visually
Unnecessary information is required for the
Lesson-7-Gas. -Exchange_074636.pptx
Knowledge Knockout ( General Knowledge Quiz )
Shizophrnia ppt for clinical psychology students of AS
Sustainable Forest Management ..SFM.pptx
Module_4_Updated_Presentation CORRUPTION AND GRAFT IN THE PHILIPPINES.pptx
Phylogeny and disease transmission of Dipteran Fly (ppt).pptx
IKS PPT.....................................

Icsug conf 14_dev03_xpages-roadtodamascas-lotus-script-and-formula-to-ssjs

  • 1. 1 The Road to Damascas– A Conversion Experience: LS and @Formula to SSJS 2014/03/17 –Matthew Fyleman
  • 2. 2 Matthew Fyleman 21 Years as a Notes/Domino Developer Mostly Working on: Xpages conversions Product development Who Am I?
  • 3. 3 Based on My Experiences Converting LotusScript and @Formula to SSJS Tools that can help –particularly regular expressions What is this Talk About?
  • 4. 4 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?
  • 5. 5 Never! When should you convert existing code?
  • 6. 6 What is the problem? 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 ... When should you convert existing code?
  • 7. 7 What are your options? NotesAgent.run() Quick and Dirty Agent must run independently Only use when agents are available and time is critical Search and Replace LotusScript -> JavaScript (and Java) Less useful for @Formula Dedicated Tools @Formula Conversion Options
  • 8. 8 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
  • 9. 9 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
  • 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 ( 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 Search and Replace can be used for @Formula -> SSJS ... ... but it can only take you so far A dedicated parser can go further Only real alternative to manual translation for complex statements Time consuming to create Still not a silver bullet Parsers
  • 21. 21 Espresso -http://www.ultrapico.com/Expresso.htm Good for learning regex, and serious regexdev Free! PowerGREP Sophisticated regexfile search Where regexstarted (UNIX grep)! Expensive Dedicated Tools
  • 22. 22 We4IT –www.we4it.com 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