Concordion - Returning MultiValueResult

Concordion execute command can be used to get the result of a behavior in the form of a Map using which we can get multiple outputs of a behavior. For example, consider the following requirement −

The full name Robert De is to be broken into its first name Robert and last name De.

Here we need to have a split function which accepts a user name and returns a Map object having firstName and lastName as its keys with their corresponding values so that we can use them.

If we want write a specification for such a split function which will accept a user name and output a result object, then the specification would be as follows −

<p>The full name <span concordion:execute = "#result = split(#TEXT)">Robert 
   De</span> is to be broken into first name 
   <span concordion:assertEquals = "#result.firstName">Robert</span> and last name 
   <span concordion:assertEquals = "#result.lastName">De</span>.</p>

When Concordion parses the document, it will set the value of the special variable #TEXT to be the value of current element as "Robert De" and pass it to the split function. Then it will execute the split() method with parameters as #TEXT using execute command and set the result into the #result variable and using result map, print the firstName and lastName values as the output.


Let us have a working Eclipse IDE in place and follow the steps given below to create a Concordion application −

Step Description
1 Create a project with the name concordion and create a package com.tutorialspoint under the src folder in the created project.
2 Add the required Concordion libraries using Add External JARs option as explained in the Concordion - First Application chapter.
3 Create Java class System under the com.tutorialspoint package.
4 Create Fixture class SystemFixture under the specs.tutorialspoint package.
5 Create Specification html System.html under the specs.tutorialspoint package.
6 The final step is to create the content of all the Java files and specification file and run the application as explained below.

Here is the content of file −

package com.tutorialspoint;
import org.concordion.api.MultiValueResult;

public class System { 
   public MultiValueResult split(String userName){  
      MultiValueResult result = new MultiValueResult();
      String[] words = userName.split(" ");   
      result.with("firstName", words[0]).with("lastName", words[1]);       
      return result;

Following is the content of file −

package specs.tutorialspoint;

import org.concordion.api.MultiValueResult;
import org.concordion.integration.junit4.ConcordionRunner;
import org.junit.runner.RunWith;

import com.tutorialspoint.System;

public class SystemFixture {
   System system = new System();
   public MultiValueResult split(String userName){
      return system.split(userName);

Following is the content of System.html file −

<html xmlns:concordion = "">
      <link href = "../concordion.css" rel = "stylesheet" type = "text/css" />

      <h1>System Specifications</h1>
      <p>We are building specifications for our online order tracking application.</p>
      <p>Following is the requirement to split full name of a logged in 
         user to its constituents by splitting name by whitespace:</p>
      <div class = "example">      
         <p>The full name <span concordion:execute = "#result = split(#TEXT)">Robert De</span> 
            is to be broken into first name <span 
            concordion:assertEquals = "#result.firstName">Robert</span> and last name <span 
            concordion:assertEquals = "#result.lastName">De</span>.</p>


Once you are done with creating the source and specification files, let us run the application as JUnit Test. If everything is fine with your application, then it will produce the following result −

Successes: 2, Failures: 0

System.html is the output of Concordion test run.

concordion Returning Map Output