Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.
Section
Column

This tutorial demonstrates the Live Forms Data API Java Client library features using a web application and a JSP. The web application is created using JSP (Java Server Pages).  We will refer to several Java Server Page files to explain the API features. You will see these delimiters in the files:

  • <% … %> delimiters in the JSP pages enclose Java code fragments.
  • <%= ... %> delimiters are used for expressions.

 <frevvo-home> in the file paths refers to the frevvo subdirectory that was created when you installed .

Note

In v9.1 and later 's "Applications" are known as "Projects." The API objects and methods still use the word Application.

Column
width240px30%

On This Page:

Table of Contents
maxLevel2
 

...

  1. LoginAs and session management using API.
  2. Upload of a sample Tutorial Application Project into a designer account. 
  3. FormTypeFeed:Initialization of a form with XML data, Attachment and Wet Signature 

    1. List ApplicationsProjects, Forms and Flows Workflows 
    2. Raw and Pop-Up links to use Forms/Flows Workflows 
    3. Edit link to edit Forms/Flows Workflows in design mode 
    4. View Submissions link to list all Form/Flow Workflow Submissions
  4. TaskFeed: embed task list
  5. SubmissionFeed: Logout of user account using API
    1. List of all Form/Flow Workflow submissions
    2. Link to Edit each submission 
    3. Links to submission XMLs 
    4. Link to submission print PDF 
    5. Links to wet signatures in each submission
    6. Links to uploaded attachments in each submission

...

These client libraries are already added in <frevvo-home>\tomcat\webapps\api\WEB-INF\lib directory of the web application that we are using. However, the actual jar versions may be different depending on the version of Live Forms being used. To ensure that you have the latest versions of these files, it is recommended that you replace the client libraries that come with the Java API Tutorial Application with Project with the .jar files located in the <frevvo-home>\ext\client directory of your  build.

...

  1. In the doLogin.jsp page, we create a FormService instance:

    Code Block
    FormsService service = (FormsService) session.getAttribute ( "frevvo.forms.service" ); 
  2. If the service instance is not null, that is if a user login already exists for the service instance, we logout that user from the FormsService session and remove the service instance from the HTTP session:

    Code Block
    if (service != null) { 
              service.logout();  
              session.removeAttribute ("frevvo.forms.service"); 
    } else {  
              service = new FormsService("http", "localhost", 8082, null); 
    } 
  3. Then we use the LoginAs method to login to the account whose username was entered on the login.jsp page. This method allows you to login to Live Forms as any of the existing tenant users provided you can pass in the tenant's admin user and password. This is quite convenient when you want login to Live Forms using the same user that is logged into your application project without having to know their password.

    The request.getParameter( "username" ) gets the username value which was passed from the login.jsp page.

    The LoginAs method also returns the logged in user information in AutoLoginUserInfo object.

    Code Block
    Map<String, String> customParams = new HashMap<String, String>(1); 
    customParams.put("autoLogin", "true"); 
    customParams.put("checkUserCount", "false"); 
    AutoLoginUserInfo alui = service.loginAs (request.getParameter( "username" ), 
           admin@apitutorial, "admin", true, null,  
           request.getParameter( "firstname" ),  
           request.getParameter( "lastname" ),   
           request.getParameter( "email" ),  
           customParams); 
  4. Then we add the service instance to the HTTP session: 

    Code Block
    session.setAttribute ("frevvo.forms.service", service); 
  5. We also save the user information returned in AutoLoginUserInfo object alui to the HTTP session: 

    Code Block
    session.setAttribute ("user.info", alui); 
  6. Lastly we redirect user to the next JSP page of the web application based on the targeturl parameter: 

    Code Block
    String url = request.getParameter("targeturl"); 
    response.sendRedirect(url); 

On your web applications login page, enter your designer user name and click Submit. You will see the formtypes.jsp page shown in the image:

 

Uploading the Tutorial

...

Project

Now that you have displayed the formtypes.jsp page, let's look at the formtypes.jsp file to see how this is implemented:  

...

  1. The formtypes.jsp checks if the HTTP session contains a FormService instance with a valid user login. If not, then it redirects to the login.jsp page to create a valid user login:

    Code Block
    FormsService service = (FormsService) session.getAttribute ( "frevvo.forms.service" );
    if (service == null) {
              response.sendRedirect("login.jsp");
              return;
    }   
  2. It also gets the user information stored in the user.info attribute of the HTTP session. The ApplicationFeed and FormTypeFeed are available only for designer user logins. We will not retrieve the applications projects and forms if the current logged in user is not a designer, i.e. alui.designer is false:

    Code Block
    AutoLoginUserInfo alui = (AutoLoginUserInfo) session.getAttribute ( "user.info" );
       if(!(alui.designer)){
                 ...
  3. Next it gets the ApplicationFeed for the current logged in user:

    Code Block
    ApplicationFeed af = service.getFeed(service.getFeedURL(ApplicationFeed.class), 
    ApplicationFeed.class);
  4. Now it will check if the Tutorial Application exists Project exists in the current logged in designer user account:

    Code Block
    ApplicationEntry TutorialApp = null;
        String TutorialAppName = "Tutorial Application"; 
     
    for (ApplicationEntry appEntry :af.getEntries()) {    
         if (TutorialAppName.equals(appEntry.getTitle().getPlainText())){ 
                  TutorialApp = appEntry;
                  break;        
         } else {
          continue;
         }
    }       
  5. If the Tutorial Application Project does not exist then it will upload the application project to the designer user account. The application The project zip file that we are uploading is <frevvo-home>\tomcat\webapps\api\apitutorial\Resources\TutorialApplication_v52_app.zip.

    Code Block
    String EmpInfoFromName = "Employee Information";
    if(TutorialApp == null){
         String 
    filepath=getServletContext().getRealPath("/apitutorial/Resources/TutorialApplication_v52_app.zip");     
         InputStream appZipStream = new FileInputStream(filepath);
     
         MediaStreamSource appMediaSource = new 
    MediaStreamSource(appZipStream,"application/zip");      
         ApplicationEntry appEntry = af.insert(appMediaSource); 
  6. The default deployment state of the Employee Information form in this uploaded application is project is DEVELOPMENT. We changed the deploy state of the form to PRODUCTION with the code shown below:

    Code Block
         FormTypeFeed ftFeed = appEntry.getFormTypeFeed(); 
         for (FormTypeEntry empform : ftFeed.getEntries()) { 
              if (EmpInfoFromName.equals(empform.getTitle().getPlainText())){ 
                      empform.setDeployState(DeployState.PRODUCTION); 
                      empform = empform.update(); 
                      empform = empform.getSelf(); 
                      break; 
              } else { 
                      continue; 
              } 
         } 
    }  

     

List

...

Projects / Forms and

...

Workflows

Once the application project is uploaded we now list all the ApplicationsProjects/Forms/Flows Workflows in this user account.

  1. We get the updated ApplicationFeed after the Tutorial Application Project is uploaded. The application feed contains all the applications projects in this user account: 

    Code Block
    af = service.getFeed(service.getFeedURL(ApplicationFeed.class), ApplicationFeed.class); 
  2. Then we iterate over each ApplicationEntry in the ApplicationFeed and from each ApplicationEntry we get the FormTypeFeed which contains the forms and flows workflows in that applicationproject:

    Code Block
    String[] types = {"FORM", "FLOW"}; 
    for (ApplicationEntry ae : af.getEntries()) { 
     FormTypeFeed ftf = ae.getFormTypeFeed();  
     … 
  3. We iterate over each FormTypeEntry in the FormTypeFeed twice using the types iterator defined above. Once to collect all the forms and the second time to collect all the flows workflows in that applicationproject:

    Code Block
    for (String mytype : types){
             for (FormTypeEntry fte : ftf.getEntries()) { 
             if(fte.getKind().contentEquals(mytype)){
             … 
  4. Then we get the Raw Link, Popup Link and Edit link for the forms/flows workflows from the FormTypeEntry:

    Code Block
    //Get Raw Link
    String RawLink = fte.getFormTypeLink(null).getHref() + formAction;
    //Get Popup Link
    String PopUpLink = fte.getFormTypePopupLink(null).getHref() + formAction;
    //Get Form Edit Link to edit the form in design mode
    String EditorLink = fte.getFormTypeEditorLink(null).getHref() + formAction;
  5. Next we check if there are any submissions associated with the form/flowworkflow. If yes, then we get the FormTypeID for the form. Then this FormTypeID is appended as the URL parameter to the showSubmissions.jsp page link. The showSubmission.jsp page will use this FormTypeID to list all the form submissions (See SubmissionFeed):

    Code Block
    if(fte.getSubmissionFeed().getEntries().size() > 0) {  
             String formtypeid = fte.getId().split("!")[0];  
             String SubmissionsLink = "showSubmissions.jsp?formtypeId=" + formtypeid;
             ...

       

...

  1.  First the showTaskList.jsp checks if the HTTP session contains a FormService instance with a valid user login. If not, then it redirects to login.jsp page to create a valid user login:

    Code Block
    FormsService service = (FormsService) session.getAttribute ( "frevvo.forms.service" );
    if (service == null) {
       response.sendRedirect("login.jsp?targeturl=showTaskList.jsp");
       return;
    }
  2. Then it gets the TaskFeed for current logged in user:

    Code Block
    TaskFeed tFeed = service.getFeed(service.getFeedURL(TaskFeed.class), TaskFeed.class); 
  3. Using the Taskfeed we then get the Link to embed the users Task List. We use the URL Parameters container, center, resize and width to fit the task list to the space available in the embedded page.

    Code Block
    Map<String, Object> params = new HashMap<String, Object>(); 
    params.put("container", true); 
    params.put("center", false); 
    params.put("resize", false); 
    params.put("width", "1500px"); 
    String taskListEmbedURL = tFeed.getTaskListEmbedLink(params).getHref(); 

List Form /

...

Workflow Submissions

Perform and Submit the saved task in the task list to create a form submission. Click on the Forms/Flows Workflows link in the left menu. You should now see a View Submissions link against the Employee Information form: 

...

  1. The showSubmissions.jsp checks if the HTTP session contains a FormService instance with a valid user login. If not, then it redirects to login.jsp page to create a valid user login:

    Code Block
    FormsService service = (FormsService) session.getAttribute ( "frevvo.forms.service" );
    if (service == null) {     
              response.sendRedirect("login.jsp?targeturl=showSubmissions.jsp");   
              return;   
    }
  2. It also gets the user information stored in the user.info attribute of the HTTP session. The SubmissionFeed is available only for designer user login. We will not retrieve the submissions if the current logged in user is not a designer, i.e. alui.designer equals false:

    Code Block
    AutoLoginUserInfo alui = (AutoLoginUserInfo) session.getAttribute ( "user.info" ); 
    if(!(alui.designer)){ 
              ...
  3. Now we create SubmissionQuery q that will be used to retrieve the SubmissionFeed:

    Code Block
       SubmissionQuery q = new 
    SubmissionQuery(service.getFeedURL(SubmissionFeed.class)); 
  4. We get the FormTypeID that is sent as the URL parameter using request.getParameter( "formtypeId" ) and add it to the SubmissionQuery filter:

    Note that if the formtypeId is not passed to the showSubmissions.jsp page (for example when you click on the Submissions link in the left menu) the filter will not be set and submissions for all the forms/flows workflows in the logged in users account will be listed.

    Code Block
    String ftId = request.getParameter( "formtypeId" );     
    if (ftId != null)       
              q.setFilter("$formTypeId eq " + ftId); 
  5. Next we get the SubmissionFeed using the SubmissionQuery:

    Code Block
    SubmissionFeed sFeed = service.getFeed(q, SubmissionFeed.class); 
  6.  We will iterate over all the SubmissionEntries in the SubmissionFeed:

    Code Block
    for (SubmissionEntry entry : sFeed.getEntries()) { 
            ...
  7. We get these details from each SubmissionEntry:

    1. Link to Edit the submission:

      Code Block
      String SubmissionLink = entry.getFormTypePopupLink(null).getHref() + 
      formAction; 
    2. Submission Form Name:

      Code Block
      entry.getTitle().getPlainText()
    3. Submission Last Updated Date:

      Code Block
      entry.getUpdated()
  8. We use the doctypes iterator to iterate over four types of documents in entry.getDocumentLinks(): 

    Code Block
    String[] doctypes = {"text/xml", "frevvo-snapshot", "frevvo-signature-image", "frevvo-attachment"};
    for (String doctype : doctypes){
      if(entry.getDocumentLinks().size() > 0) {
         if(entry.getDocumentLinks().get(i).getType().contains(doctype)){
                     ...
  9.  The four iterations over all entry.getDocumentLinks() collect:

    1. Links to the Submission XMLs:

      Code Block
      if(doctype == "text/xml"){
                  String XmlName =
      entry.getDocumentLinks().get(i).getType().substring(entry.getDocumentLinks().get(i).getType().lastIndexOf("=") + 1);
                  String XmlLink = entry.getDocumentLinks().get(i).getHref();
    2. Link to the generated Submission PDF:

      Code Block
      }else if(doctype == "frevvo-snapshot"){
                 String PDFname = entry.getTitle().getPlainText() + ".PDF";
                 String PDFLink = entry.getDocumentLinks().get(i).getHref();
    3. Links to the Wet Signature images of the submission:

      Code Block
      }else if(doctype == "frevvo-signature-image"){
                 String SignatureImageName = entry.getDocumentLinks().get(i).getType().substring(entry.getDocumentLinks().get(i).getType().lastIndexOf("=") + 1);
                 String SignatureImageLink = entry.getDocumentLinks().get(i).getHref();
    4. Links to the uploaded attachments in the submission:

      Code Block
      }else if(doctype == "frevvo-attachment"){
                 String AttachmentName = 
      entry.getDocumentLinks().get(i).getType().substring(entry.getDocumentLinks().get(i).getType().indexOf("filename=")+10, 
      entry.getDocumentLinks().get(i).getType().indexOf(';', 
      entry.getDocumentLinks().get(i).getType().indexOf("filename="))-1);
              String AttachmentFileLink = entry.getDocumentLinks().get(i).getHref();
      
      }
      ...

...