Diese Präsentation wurde erfolgreich gemeldet.
Wir verwenden Ihre LinkedIn Profilangaben und Informationen zu Ihren Aktivitäten, um Anzeigen zu personalisieren und Ihnen relevantere Inhalte anzuzeigen. Sie können Ihre Anzeigeneinstellungen jederzeit ändern.
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
Nächste SlideShare
Wird geladen in …5
×

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

483 Aufrufe

Veröffentlicht am

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

Veröffentlicht in: Präsentationen & Vorträge
  • Als Erste(r) kommentieren

  • Gehören Sie zu den Ersten, denen das gefällt!

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

×