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?
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
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