Portalizing an IBM Lotus Domino view or form
Transcription
Portalizing an IBM Lotus Domino view or form
Portalizing an IBM Lotus Domino view or form It has been reviewed by two experts Stephan wissel ( IBM Singapore) and Kiran Bellari ( ex- IBMer and Consulatant in Infosys India) Introduction: This article demonstrates how simply you can use Web services in the Lotus Domino development environment. It shows how you can extract a list of all Action button names from a Lotus Notes view or form. This ability gives you an edge when you want to portalize a Lotus Domino application. The major advantage here is we are using lotus script to create this webservice , this gives advantage to many domino developers who are well versed with lotus script ,to play with Webservice and can leverage their skills in creating webservice without much effort. here we make use of Standard classes of lotus script such as NotesDXLExporter,NotesXSLTransformer and NotesDOMParser ,. Etc Abstract: This article helps domino developers to understand how easily one can leverage the power of webservice with a simple example along with the code in lotus script .The basic idea of the article is to show how easily we can create a Web service in an IBM Lotus Domino database to pull out the names of Action buttons in design elements (forms/views) This is quite useful in leveraging domino capabilities to support webservice , especially in case of portalizing any domino application . This will enable the developer to pull out all action buttons of any design element (form/view ) of any database dynamically. In current situations many organizations have a Mixed environment with Lotus Domino and IBM websphere and It is very Important to have a portalization of their current existing complex notes applications This article shows how simple to create a webservice especially in the context of moving any domino application on to Portal server or for dual access (on domino as well as Portal server).Developers will understand the Power and importance of Webservice in the current World as Webservice is a Universal Interface between different technologies This article covers how to design a webservice including code and also tells about how to test it and see the output Designing a Webservice from Notes designer client: Softwares used: Websphere Portal Server 6.0, Domino 7.0.2 The following steps explain how to create a Web service and to request this Web service from WebSphere Portal. 1)open notes designer client and create a new database by choosing File-> databse New from Menu 2)Select the Sever and enter database title as “Portal configuration tool” and file name as “PortalConfig.nsf” and press OK button to create a new lotus notes database 3)In the database expand shared code by clicking on “+” sign next to “Shared Code” Folder and locate webservices as shown in figure 1 Figure 1 4)Click on webservices to see different options like “New Web Service “,”Sign”,”export WSDL” and “show WSDL” as shown in below figure2 Figure2 5)click on “new webservice” to create a new web service 6) It opens a new window with blank webservice as shown in below Figure3 Figure3 7)Enter details like name ,Comment port type class etc , in this case enter Name as ” dbviewformInfo” ,comment as “Delivers information about the structure in a db like actions and other thing” and in port type class “dbInfoClass” and once you enter all this information click on Right Icon to save the name and click on close 8)Go to declarations section in the above saved web service and paste the following code . Please select entire code from starting to ending Const DefaultNameSpace = "reddy.ws.viewformactions" Public Class dbInfoClass Public Function getFormActions(FormDefinition As FormDefinition) As formActionSetInfo Dim w As formActionSetInfo Set w = New formActionSetInfo Call w.PopulateActionsform(FormDefinition) Set getFormActions = w End Function Public Function getViewActions(ViewDefinition As ViewDefinition) As ActionSetInfo Dim x As ActionSetInfo Set x = New ActionSetInfo Call x.PopulateActions(ViewDefinition) Set getViewActions = x End Function End Class Public Class ViewDefinition Public dbName As String Public viewName As String End Class Public Class FormDefinition Public dbName As String Public formName As String Public includeSubForms As Boolean Public IncludeButtons As Boolean End Class Public Class ActionSetInfo Public ActionSets() As ActionInfo Public source As ViewDefinition Public errorCode As Integer Public errorText As String Public Sub PopulateActions(viewSource As ViewDefinition) Set Me.source = viewSource On Error Goto Err_PopulateActions Dim s As New NotesSession Dim db As NotesDatabase Dim dbView As NotesDatabase Dim v As NotesView Set db = s.CurrentDatabase Set dbView = New Notesdatabase(db.Server,viewSource.dbName) Set v = dbView.GetView(viewSource.ViewName) If v Is Nothing Then Me.errorcode = 999 Me.errorText = "The view you were seeking is out of sight, but endless others exist" Goto Exit_PopulateActions End If 'Get the view into DXL and transform Dim viewUnid As String Dim viewDoc As NotesDocument viewUnid =v.UniversalID Set viewDoc=dbView.GetDocumentByUNID(viewUnid) Dim Dim Dim Dim Dim Dim Dim Dim Dim Dim Dim 'REM Export document as DXL exporter As NotesDXLExporter transformer As NotesXSLTransformer domParser As NotesDOMParser docNode As NotesDOMDocumentNode actionNodeList As NotesDOMNodeList actionNode As NotesDOMNode attributes As notesDOMNamedNodeMap nodeCount As Integer i As Integer x As Integer y As Integer Set exporter = s.CreateDXLExporter Set domParser=s.CreateDOMParser Call exporter.SetInput(viewDoc) Call domParser.setInput(exporter) exporter.Process 'get the document node Set docNode = domParser.Document Set actionNodeList = docNode.GetElementsByTagName("action") nodeCount = actionNodeList.NumberOfEntries If nodeCount = 0 Then Msgbox "No actions found" End If Redim ResultArray(nodeCount) Redim Me.ActionSets(nodeCount) For i = 1 To nodeCount Set actionNode = actionNodeList.GetItem(i) Set attributes = actionNode.Attributes x = attributes.NumberOfEntries Dim r As ActionInfo Set r = New ActionInfo For y = 1 To x If attributes.GetItem(y).NodeName="systemcommand" Then r.name =attributes.GetItem(y).NodeValue End If If attributes.GetItem(y).NodeName="title" Then r.label =attributes.GetItem(y).NodeValue End If Next Set Me.ActionSets(i-1) = r Next Exit_PopulateActions: Exit Sub Err_PopulateActions: Me.errorCode = Err Me.errorText = Error$ & " in Line " & Cstr(Erl) Resume Exit_PopulateActions End Sub End Class 'new class for form actions Public Class formActionSetInfo Public ActionSets() As formActionInfo Public source As FormDefinition Public errorCode As Integer Public errorText As String Public Sub PopulateActionsform(FormSource As FormDefinition) Set Me.source = FormSource On Error Goto Err_PopulateActionsForm Dim s As New NotesSession Dim db As NotesDatabase Dim dbView As NotesDatabase Dim Fo As Notesform Dim ncol As NotesNoteCollection Dim FormDoc As NotesDocument Dim FormDocInt As NotesDocument Set db = s.CurrentDatabase Set dbView = New Notesdatabase(db.Server,FormSource.dbName) Set Fo = dbView.GetForm(FormSource.FormName) If Fo Is Nothing Then Me.errorcode = 999 Me.errorText = "The form you were seeking is out of sight, but endless others exist" Goto Exit_PopulateActionsForm End If Dim nid As String, nextid As String 'note IDs Dim i As Integer Set db = s.CurrentDatabase Set ncol = dbView.CreateNoteCollection(False) ncol.SelectForms= True Call ncol.BuildCollection nid = ncol.GetFirstNoteId Set FormDocInt= dbView.GetDocumentByID(nid) 'get access of form as NotesACL document For i = 1 To ncol.Count Forall j In FormDocInt.Items If j.name="$TITLE" Then 'Msgbox j.text If j.text Like "*;*" Then If Strleftback ( j.text,";" )=FormSource.FormName Or Strrightback ( j.text,";" )=FormSource.FormName Then Set FormDoc=FormDocInt End If Else If j.text=FormSource.FormName Then Set FormDoc=FormDocInt End If End If End If End Forall nextid = ncol.GetNextNoteId(nid) If nextid="" Then Set FormDocInt= Nothing Else Set FormDocInt=dbView .GetDocumentByID(nextid) End If nid=nextid Next If FormDoc Is Nothing Then Me.errorcode = 998 Me.errorText = "The form name you were seeking is not matching.please type exactly(case sensitive) as the name exists in form design element" Goto Exit_PopulateActionsForm End If 'Get theforminto DXL and transform 'REM Export document as DXL Dim Dim Dim Dim Dim Dim Dim Dim Dim Dim Dim ' exporter As NotesDXLExporter transformer As NotesXSLTransformer domParser As NotesDOMParser docNode As NotesDOMDocumentNode actionNodeList As NotesDOMNodeList actionNode As NotesDOMNode attributes As notesDOMNamedNodeMap nodeCount As Integer i As Integer x As Integer y As Integer Set exporter = s.CreateDXLExporter Set domParser=s.CreateDOMParser Call exporter.SetInput(FormDoc) Call domParser.setInput(exporter) exporter.Process 'get the document node Set docNode = domParser.Document Set actionNodeList = docNode.GetElementsByTagName("action") nodeCount = actionNodeList.NumberOfEntries If nodeCount = 0 Then Msgbox "No actions found" End If Redim ResultArray(nodeCount) Redim Me.ActionSets(nodeCount) For i = 1 To nodeCount Set actionNode = actionNodeList.GetItem(i) Set attributes = actionNode.Attributes x = attributes.NumberOfEntries Dim r As formActionInfo Set r = New formActionInfo For y = 1 To x 'Msgbox attributes.GetItem(y).NodeName,0,attributes.GetItem(y).NodeValue If attributes.GetItem(y).NodeName="systemcommand" Then r.label =attributes.GetItem(y).NodeValue End If If attributes.GetItem(y).NodeName="title" Then r.name =attributes.GetItem(y).NodeValue End If Next Set Me.ActionSets(i-1) = r Next Exit_PopulateActionsForm: Exit Sub Err_PopulateActionsForm: Me.errorCode = Err Me.errorText = Error$ & " in Line " & Cstr(Erl) Resume Exit_PopulateActionsForm End Sub End Class Public Class ActionInfo Public Name As String Public Label As String End Class Public Class formActionInfo Public Name As String Public Label As String Public Code As String End Class 9) save and close the webservice 10)now you are ready to test the webservice for Testing you can open the webservice in a browser by using following url http://hub.wwcorp.com/PortalConfig.nsf/dbviewformInfo?wsdl this Url contains hostname(hub.wwcorp.com is the server name, PortalConfig.nsf is notes database name and dbviewforminfo is webservice name before “?” mark in the URL you can see WDSL file in the browser. We can also test this in any standard tools from where we can create new SOAP request . use any standard tool (like XML spy, Oxygen xml editor etc ) You need to enter URL of webservice to create a SOAP request for example as shown in below figure 5 http://hub.wwcorp.com/PortalConfig.nsf/dbviewformInfo?wsdl Figure5 please change the hostname, database name accordingly as per your domino setup 11) The SOAP request will show you to options to select as we have two classes one for View actions, and other for view actions, as shown in below figure6 Figure6 12) Select one option and then enter to see the content like shown in below figure 7 Figure 7 here the parameters we need to enter is database name,view name accordingly as shown below example in figure 8 Figure8 13) Once we enter database name and view name then send the the request to server as shown below in figure9 Figure 9 14) Once request is processed by domino server, It will populate all action button details of Given design element name of the given database as shown below in figure10 Figure10 15) Once you have tested and satisfied that it is working fine then we can call the same SOAP request from Portal to pull out required information(View actions or form actions) to Portal Conclusion: Please note that it will only list out all the action buttons ,but it does not get any code /code event related with the action button. there could be several ways to test this webservice. I have shown the simple screenshots to make the basic concept clear Webservice is very vital concept and going to be very popular as different technologies can communicate each other by using a standard webservice and hence domino developer can not ignore this powerful feature The above article shows how we can write our own webservice with simple lotusscript which is mastered technology by Lotus domino devlopers already Similarly we can design and develop several Webservices to suit our customized requirements Srinivas Reddy Kothapally , IBM Certified Application Developer – Lotus Notes and Domino /6.5 and IBM Certified Admin Domino 6/6.5 has been working as a Principal software engineer for ASEAN customer in ISL Labservices in the area of domino and domino extended products. My Special Thanks to My Guru Stephan H Wissel, Stephan H Wissel/Singapore/IBM, who was very instrumental with able guidance in understanding and developing webservices.