{"id":76239,"date":"2021-01-18T15:30:00","date_gmt":"2021-01-18T06:30:00","guid":{"rendered":"https:\/\/support.questetra.com\/developer-blog\/synchronize-users-chapter2\/"},"modified":"2026-04-14T15:51:43","modified_gmt":"2026-04-14T06:51:43","slug":"synchronize-users-chapter2","status":"publish","type":"post","link":"https:\/\/support.questetra.com\/en\/developer-blog\/synchronize-users-chapter2\/","title":{"rendered":"Synchronizing User Information with Local Data (User Information Chapter)"},"content":{"rendered":"\n<figure class=\"wp-block-image size-large\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"58\" data-attachment-id=\"113212\" data-permalink=\"https:\/\/support.questetra.com\/en\/developer-blog\/message-start-event-http-browser\/attachment\/professional-banner-new-en\/\" data-orig-file=\"https:\/\/i0.wp.com\/support.questetra.com\/wp-content\/uploads\/2018\/12\/professional-banner-new-en.png?fit=1200%2C68&amp;ssl=1\" data-orig-size=\"1200,68\" data-comments-opened=\"0\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"professional-banner-new-en\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/i0.wp.com\/support.questetra.com\/wp-content\/uploads\/2018\/12\/professional-banner-new-en.png?fit=1024%2C58&amp;ssl=1\" src=\"https:\/\/i0.wp.com\/support.questetra.com\/wp-content\/uploads\/2018\/12\/professional-banner-new-en-1024x58.png?resize=1024%2C58&#038;ssl=1\" alt=\"\" class=\"wp-image-113212\" srcset=\"https:\/\/i0.wp.com\/support.questetra.com\/wp-content\/uploads\/2018\/12\/professional-banner-new-en.png?resize=1024%2C58&amp;ssl=1 1024w, https:\/\/i0.wp.com\/support.questetra.com\/wp-content\/uploads\/2018\/12\/professional-banner-new-en.png?resize=600%2C34&amp;ssl=1 600w, https:\/\/i0.wp.com\/support.questetra.com\/wp-content\/uploads\/2018\/12\/professional-banner-new-en.png?resize=768%2C44&amp;ssl=1 768w, https:\/\/i0.wp.com\/support.questetra.com\/wp-content\/uploads\/2018\/12\/professional-banner-new-en.png?w=1200&amp;ssl=1 1200w\" sizes=\"auto, (max-width: 1000px) 100vw, 1000px\" \/><\/figure>\n\n\n\n<div style=\"height:50px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/support.questetra.com\/en\/developer-blog\/synchronize-users-chapter1\/\"><i class=\"fas fa-arrow-left\"><\/i> Previous: Synchronizing User Information with Local Data (Preparatory Chapter)<\/a><\/p>\n\n\n\n<ul class=\"wp-block-list\"><li><a href=\"https:\/\/support.questetra.com\/en\/developer-blog\/synchronize-users-chapter1\/\">Preparatory Chapter<\/a><\/li><li><strong>User Information Chapter<\/strong><\/li><li><a href=\"https:\/\/support.questetra.com\/en\/developer-blog\/synchronize-users-chapter3\/\">Organizational Affiliation Chapter<\/a><\/li><\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">In the previous article, the purpose was to try using &#8220;<em>com.questetra.bpms.client.swagger<\/em>&#8220;, a Questetra BPM Suite library, to implement a search solely on Users registered to Questetra BPM Suite. In this article, we are going to implement methods for manipulating registered User information and create a program which synchronizes User account information in a local TSV file with that on Questetra BPM Suite.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">To align the User information in the TSV file with that registered in Questetra BPM Suite the following steps are required:<\/p>\n\n\n\n<ol class=\"wp-block-list\"><li>Compare TSV file contents with User information on Questetra BPM Suite<\/li><li>Remove from Questetra BPM Suite information that exists only on Questetra BPM Suite<\/li><li>Add to Questetra BPM Suite User information that exists only on the TSV file<\/li><\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">Therefore, the <em>UserDataManager<\/em> class, which is responsible for exchanging User information with Questetra BPM Suite, requires the following methods.<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Method for retrieving User information registered in Questetra BPM Suite<\/li><li>Method for adding Users to Questetra BPM Suite<\/li><li>Method for removing Users from Questetra BPM Suite<\/li><\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">In this chapter, we will add these three methods to the <em>UserDataManager<\/em> class. And we will create a <em>SyncUserWithTSV<\/em> class and implement the final synchronizing program using the <em>UserDataManager<\/em> class.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Editing POM.xml<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">We will use the <em>common-lang<\/em> library for random generation of the initial password, which will be described in detail later. Since in the Maven project the library to be used needs to be described in POM.xml, so add the <em>common-lang<\/em> information before changing the <em>UserDataManager<\/em> class.<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li><a href=\"https:\/\/commons.apache.org\/proper\/commons-lang\/\" target=\"_blank\" rel=\"noreferrer noopener\">Lang &#8211; Home : Apache Commons<\/a><ul><li><a href=\"https:\/\/mvnrepository.com\/artifact\/org.apache.commons\/commons-lang3\" target=\"_blank\" rel=\"noreferrer noopener\">Maven Repository: org.apache.commons \u226b commons-lang3<\/a><\/li><\/ul><\/li><\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;?xml version=\"1.0\" encoding=\"UTF-8\"?&gt;\n&lt;project xmlns=\"http:\/\/maven.apache.org\/POM\/4.0.0\"\n         xmlns:xsi=\"http:\/\/www.w3.org\/2001\/XMLSchema-instance\"\n         xsi:schemaLocation=\"http:\/\/maven.apache.org\/POM\/4.0.0 http:\/\/maven.apache.org\/xsd\/maven-4.0.0.xsd\"&gt;\n    &lt;modelVersion&gt;4.0.0&lt;\/modelVersion&gt;\n\n    &lt;groupId&gt;questetra&lt;\/groupId&gt;\n    &lt;artifactId&gt;swagger-java&lt;\/artifactId&gt;\n    &lt;version&gt;1.0-SNAPSHOT&lt;\/version&gt;\n\n    &lt;properties&gt;\n        &lt;maven.compiler.source&gt;1.8&lt;\/maven.compiler.source&gt;\n        &lt;maven.compiler.target&gt;1.8&lt;\/maven.compiler.target&gt;\n    &lt;\/properties&gt;\n\n    &lt;dependencies&gt;\n        &lt;dependency&gt;\n            &lt;groupId&gt;com.questetra&lt;\/groupId&gt;\n            &lt;artifactId&gt;bpms.client.swagger&lt;\/artifactId&gt;\n            &lt;version&gt;12.3.1&lt;\/version&gt;\n            &lt;scope&gt;compile&lt;\/scope&gt;\n        &lt;\/dependency&gt;\n\n        <strong>&lt;dependency&gt;\n            &lt;groupId&gt;org.apache.commons&lt;\/groupId&gt;\n            &lt;artifactId&gt;commons-lang3&lt;\/artifactId&gt;\n            &lt;version&gt;3.8.1&lt;\/version&gt;\n        &lt;\/dependency&gt;<\/strong>\n    &lt;\/dependencies&gt;\n\n&lt;\/project&gt;<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Adding method to <em>UserDataManager<\/em> class<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">By editing POM.xml, you can now import the required libraries into your Java program. Now let&#8217;s implement the three methods mentioned earlier.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Method for retrieving User information registered in Questetra BPM Suite<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Implement the <em>list<\/em> method that retrieves the list of user information registered in Questetra BPM Suite like the following.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/**\n * List the users registered on Questetra BPM Suite\n * @return QuserList\n *\/\npublic QuserList list() throws ApiException {\n    \/\/ List the registered Users\n    QuserList result = this.apiInstance.listQusers(null, Integer.MAX_VALUE, 0);\n    return result;\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">We use the <em>listQusers<\/em> method <em>QuserApi<\/em> class to enumerate registered users. The <em>QuserApi.listQusers<\/em> method returns a list of user information that satisfies the conditions specified in the argument as <em>QuserList<\/em> type. There are three arguments: &#8220;<em>query<\/em>&#8220;, which passes the filtering condition, &#8220;<em>limit<\/em>&#8220;, which is the upper limit on the number of search results to be returned, and &#8220;<em>start<\/em>&#8220;, which is an offset indicating from which search result to return. Since we want to retrieve all user information, we set it as null, maximum value of Integer type, and 0 respectively.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Method for adding Users to Questetra BPM Suite<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Implement the <em>add<\/em> method to register Users in Questetra BPM Suite as follows.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/**\n * Newly register users in Questetra BPM Suite\n * @param name Name.\n * @param email Email address.\n * @param password Password. 8 to 100 characters, must contain each of lower\/upper case alphabets, numbers and symbols.\n * @return QuserWrapper Added user.\n *\/\npublic QuserWrapper add(String name, String email, String password) throws ApiException {\n    \/\/ Adding Users.\n    QuserWrapper result = this.apiInstance.addQuser(name, email, password);\n    return result;\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">The <em>addQuser<\/em> method of <em>QuserApi<\/em> class is used to add a user. As arguments, <em>name<\/em> for username, <em>email<\/em> for email address, and <em>password<\/em> for password are needed. The username and e-mail address may be obtained from the TSV file, but for the password, it would be better prepared by the program. An 8-digit random password is automatically generated if a <em>createPassword<\/em> method like the following is added to the <em>UserDataManager<\/em> class.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Although a temporary password is issued, it is not meant to be used even for the User&#8217;s first login. Once Users have been registered with Questetra BPM Suite, it is desirable for each User to set their own password using the password reissue function. System administrators should avoid knowing the User&#8217;s password. For that reason this program does not output the issued temporary password anywhere.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Method to randomly generate a temporary password<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/ Import necessary libraries\nimport java.util.List;\nimport java.util.ArrayList;\nimport java.util.Collections;\n\nimport org.apache.commons.lang3.RandomStringUtils;\n\n...\n\n\/**\n * Generate an 8-character temporary password.\n * @return String The generated temporary password.\n *\/\npublic String createPassword() {\n    int length = 8; \/\/ Number of characters of a password\n    List&lt;String&gt; chars = new ArrayList&lt;&gt;();\n\n    chars.add(RandomStringUtils.randomAlphabetic(1).toLowerCase()); \/\/ Lower case alphabet\n    chars.add(RandomStringUtils.randomAlphabetic(1).toUpperCase()); \/\/ Upper case alphabet\n    chars.add(RandomStringUtils.randomNumeric(1)); \/\/ Number\n    chars.add(RandomStringUtils.random(1, \"!\\\"#$%&amp;'()*+,-.\/:;&lt;=&gt;?@&#091;\\\\]^_`{|}~\")); \/\/ Symbol\n\n    \/\/ Put random ASCII characters in the remaining 4 characters\n    for (int i = 4; i &lt; length; i++) {\n        chars.add(RandomStringUtils.randomAscii(1));\n    }\n\n    \/\/ Shuffle the order of the characters\n    Collections.shuffle(chars);\n\n    return String.join(\"\", chars);\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">The <em>common-lang<\/em> library added to POM.xml is used here.\nA random string is easily generated by using <em>org.apache.commons.lang3.RandomStringUtils<\/em>. As the default settings of Questetra BPM Suite have the following password policy, I implemented it to generate according to these.<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Password must be 8 to 100 characters long<\/li><li>Password must contain at least one upper case letter<\/li><li>Password must contain at least one lower case letter<\/li><li>Password must contain at least one number<\/li><li>Password must contain at least one symbol<\/li><\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Method for removing User from Questetra BPM Suite<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Finally, implement the method to remove the registered User from Questetra BPM Suite as follows.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/**\n * Remove User from Questetra BPM Suite.\n * @param id The ID of the user to be removed.\n *\/\npublic void delete(Long id) throws ApiException {\n    \/\/ Remove User\n    this.apiInstance.deleteQuser(id, {ENTER delegateQuserId}, {ENTER delegateQgroupId});\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">The <em>deleteQuser<\/em> method of QuserApi class is used to remove the user. It requires the following arguments:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li><em>id<\/em>: the User to be removed<\/li><li><em>delegateQuserId<\/em>: the User to whom the removed User&#8217;s Tasks will be forcibly assigned<\/li><li><em>delegateQgroupId<\/em>: the Organization where the forcibly assigned User belongs<\/li><\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">What is <em>delegateQuserId<\/em>, <em>delegateQgroupId<\/em>?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Suppose a User who is to be removed holds items in their My Tasks, then who will handle these? For such cases, there are <em>delegateQuserId<\/em> and <em>delegateQgroupId<\/em>. That is, Questetra BPM Suite has a function referred to as Delegate, which forcibly reassigns Tasks of one User to another. And it is possible to specify the forced allocation destination of Tasks that the User to be removed holds in the <em>QuserApi.deleteQuser<\/em> method, so that the person in charge of Operating the Task changes to the specified User by passing the <em>delegateQuserId<\/em> (User ID of forced allocation destination) and <em>delegateQgroupId<\/em> (Organization ID of the forced allocation destination User) to the method. The circumstances of the company, etc. must be considered when specifying the forced allocation destination.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"923\" height=\"366\" data-attachment-id=\"76240\" data-permalink=\"https:\/\/support.questetra.com\/en\/bpmn-icons\/onedrive-file-upload\/attachment\/deleted-user-allocation-change-en\/\" data-orig-file=\"https:\/\/i0.wp.com\/support.questetra.com\/wp-content\/uploads\/2019\/04\/deleted-user-allocation-change-en.png?fit=923%2C366&amp;ssl=1\" data-orig-size=\"923,366\" data-comments-opened=\"0\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"deleted-user-allocation-change-en\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/i0.wp.com\/support.questetra.com\/wp-content\/uploads\/2019\/04\/deleted-user-allocation-change-en.png?fit=923%2C366&amp;ssl=1\" src=\"https:\/\/i0.wp.com\/support.questetra.com\/wp-content\/uploads\/2019\/04\/deleted-user-allocation-change-en.png?resize=923%2C366&#038;ssl=1\" alt=\"\" class=\"wp-image-76240\" srcset=\"https:\/\/i0.wp.com\/support.questetra.com\/wp-content\/uploads\/2019\/04\/deleted-user-allocation-change-en.png?w=923&amp;ssl=1 923w, https:\/\/i0.wp.com\/support.questetra.com\/wp-content\/uploads\/2019\/04\/deleted-user-allocation-change-en.png?resize=600%2C238&amp;ssl=1 600w, https:\/\/i0.wp.com\/support.questetra.com\/wp-content\/uploads\/2019\/04\/deleted-user-allocation-change-en.png?resize=768%2C305&amp;ssl=1 768w\" sizes=\"auto, (max-width: 923px) 100vw, 923px\" \/><figcaption>With the deletion of the User &#8220;Mariana&#8221;, the Task that &#8220;Mariana&#8221; held in My Tasks is forcibly allocated to the specified User<\/figcaption><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">You can confirm the User ID in each User information detail page in  &#8220;User List&#8221; &lt; &#8220;System Settings&#8221;, and the Organization ID which is indicated on the Organization detail page in &#8220;Organization List&#8221; &lt; &#8220;System Setting&#8221;, or jump from the User information detail page. As it is indicated like &#8220;u1&#8221; and &#8220;g1&#8221; respectively, please extract only the part with the number.<\/p>\n\n\n<div class=\"su-note\"  style=\"border-color:#dbdbdb;border-radius:3px;-moz-border-radius:3px;-webkit-border-radius:3px;\"><div class=\"su-note-inner su-u-clearfix su-u-trim\" style=\"background-color:#f5f5f5;border-color:#ffffff;color:#333333;border-radius:3px;-moz-border-radius:3px;-webkit-border-radius:3px;\">\nThese IDs are Long type. When the ID is 1, for example, cast it to Long type by setting (long)1 as parameter.<br \/>\n<\/div><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Implementing <em>SyncUserWithTSV<\/em> class<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Up to this point, you have successfully implemented the <em>UserDataManager<\/em> class that manipulates User information on Questetra BPM Suite. From now on, we will implement the following functions in the newly created <em>SyncUserWithTSV<\/em> class.<\/p>\n\n\n\n<ol class=\"wp-block-list\"><li>Read local TSV files containing User information<\/li><li>Load User information registered on Questetra BPM Suite<\/li><li>Compare both and determine which Users to add\/remove<\/li><li>Manipulate User information using the <em>UserDataManager<\/em> class<\/li><\/ol>\n\n\n\n<h3 class=\"wp-block-heading\">Read local TSV files containing User information <\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">For example, suppose you have a TSV file that contains the information of the Users you want to register in Questetra BPM Suite as follows.<\/p>\n\n\n<div class=\"su-note\"  style=\"border-color:#bcd3e5;border-radius:3px;-moz-border-radius:3px;-webkit-border-radius:3px;\"><div class=\"su-note-inner su-u-clearfix su-u-trim\" style=\"background-color:#d6edff;border-color:#ffffff;color:#333333;border-radius:3px;-moz-border-radius:3px;-webkit-border-radius:3px;\">\nTutorial: tutorial@questetra.com<br \/>\nGalapagos\tquestetra+Galapagos@gmail.com<br \/>\nOahu\tquestetra+Oahu@gmail.com<br \/>\nSumatera\tquestetra+Sumatera@gmail.com<br \/>\nCanarias\tquestetra+Canarias@gmail.com<br \/>\n&#8230;<br \/>\n<\/div><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">Import this with the <em>SyncUserWithTSV<\/em> class, and create a set of email addresses of Users who should be registered on Questetra BPM Suite.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># {PROJECT DIRECTORY}\/src\/main\/java\/SyncUserWithTSV.java\nimport com.questetra.bpms.client.swagger.ApiException;\nimport com.questetra.bpms.client.swagger.model.*;\n\nimport java.io.IOException;\nimport java.util.HashSet;\nimport java.util.List;\nimport java.util.Objects;\nimport java.util.Set;\nimport static java.util.stream.Collectors.toList;\nimport static java.util.stream.Collectors.toSet;\n\nclass SyncUserWithTSV {\n    public static void main(String&#091;] args) throws IOException, ApiException {\n        \/\/ Read TSV data and create a set of email addresses  \n        List&lt;String&#091;]&gt; data = TSVReader.readLines(\"{FILE PATH OF TSV}\");\n        Set&lt;String&gt; tsvSet = data.stream().map(d -&gt; d&#091;1]).collect(toSet());\n\n...\n\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Here, I use my own <em>TSVReader<\/em> class for reading TSV files.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\"><em>TSVReader<\/em> class<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Although there are several Java libraries for reading TSV files,  in this article, we will use a class for reading which I created by myself. It is an implementation that reads all the lines at one time by putting the ones stored in the String [] type into the List &lt;String []&gt; type.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># {PROJECT DIRECTORY}\/src\/main\/java\/TSVReader.java\nimport java.io.*;\nimport java.util.List;\nimport java.util.ArrayList;\nimport java.util.Objects;\n\nclass TSVReader {\n    public static List&lt;String&#091;]&gt; readLines(String filePath) throws IOException {\n        List&lt;String&#091;]&gt; data = new ArrayList&lt;&gt;();\n\n        try (InputStream is = ClassLoader.getSystemResourceAsStream((filePath))) {\n            BufferedReader br = new BufferedReader(new InputStreamReader(Objects.requireNonNull(is), \"UTF-8\"));\n\n            String line = br.readLine();\n            while (line != null) {\n                String&#091;] d = line.split(\"\\t\", 0);\n                data.add(d);\n                line = br.readLine();\n            }\n        }\n\n        return data;\n    }\n}\n<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Load User information registered on Questetra BPM Suite<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Next, the User information registered from Questetra BPM Suite is read, and a set of email addresses is created in the same way as the TSV file. For reading, the <em>list<\/em> method which has been implemented in the <em>UserDataManager<\/em> class is used.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># {PROJECT DIRECTORY}\/src\/main\/java\/SyncUserWithTSV.java\n...\n\n        \/\/ Read User list via Questetra BPM Suite QuserApi and create email set of registered Users\n        UserDataManager manager = new UserDataManager();\n        QuserList list = manager.list();\n        Set&lt;String&gt; qbpmsSet = list.getQusers().stream().map(Quser::getEmail).collect(toSet());\n\n...<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Compare both and determine which Users to add\/remove<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Comparing the set of User&#8217;s email addresses written in the TSV file and the set of User&#8217;s email addresses registered on Questetra BPM Suite determines the Users to be removed from\/added to Questetra BPM Suite.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># {PROJECT DIRECTORY}\/src\/main\/java\/SyncUserWithTSV.java\n...\n\n       \/\/ Create sets of \"email addresses only being in TSV\" and \"email addresses only being on Qusetetra BPM Suite\".\n        Set&lt;String&gt; intersection = new HashSet(tsvSet);\n        intersection.retainAll(qbpmsSet);\n        tsvSet.removeAll(intersection); \/\/ Email addresses only being in TSV\n        qbpmsSet.removeAll(intersection); \/\/ Email addresses only being on Qusetetra BPM Suite\n\n...<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">There, a product of the two sets is taken. The product is email addresses that are both in the TSV file and on Questetra BPM Suite. Then respectively subtracting these from the TSV file set and Questetra BPM Suite set, email addresses of the Users to be removed and those to be added are identified.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Manipulate user information using the <em>UserDataManager<\/em> class<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Now, you know which Users to add and which to remove, so manipulate the User information on Questetra BPM Suite to be the same as the TSV file.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># {PROJECT DIRECTORY}\/src\/main\/java\/SyncUserWithTSV.java\n...\n \n       \/\/ Remove \"email addresses only being in Questetra BPM Suite\" from Questetra BPM Suite\n        for (String email : qbpmsSet) {\n            Quser deleteUser = list.getQusers().stream().filter(user -&gt; Objects.equals(user.getEmail(), email)).collect(toList()).get(0);\n            manager.delete(deleteUser.getId());\n            System.out.printf(\"Delete User \/ %s%n\", deleteUser.getEmail());\n        }\n\n        \/\/ Add \"email addresses only being in TSV file\" to Questetra BPM Suite\n        for (String email : tsvSet) {\n            String&#091;] addUser = data.stream().filter(user -&gt; Objects.equals(user&#091;1], email)).collect(toList()).get(0);\n            String password = manager.createPassword();\n            manager.add(addUser&#091;0], addUser&#091;1], password);\n            System.out.printf(\"Add User \/ %s%n\", addUser&#091;0]);\n        }\n    }\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Since the ID of the user to be removed is required to use the <em>UserDataManager.delete<\/em> method, the corresponding user ID is checked using the registered User list retrieved from Questetra BPM Suite. Also, in order to use the <em>UserDataManager.add<\/em> method, a password is required in addition to the username and email address, so a temporary password is created using the <em>UserDataManager.createPassword<\/em> method. However, as mentioned earlier, temporary passwords are not output because they won&#8217;t be used.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Now, when this program is executed, the local TSV file and the User information on Questetra BPM Suite match. At this time, only the <em>QuserApi<\/em> class has been used among the API libraries, so the User information that can be registered is only the minimum required for login to Questetra BPM Suite; i.e. user name, email address and password. However, of course, that is not all of the User information that can be manipulated with the API library. A lot of useful classes are implemented in Questetra BPM Suite&#8217;s API library, such as <em>MembershipApi<\/em> class, which provides methods to operate Organizational assignment, and <em>RoleMembershipApi<\/em> class, which provides methods to operate Roles to be granted to users. In the next post, I will describe how to use <em>MembershipApi<\/em> class, which is capable of listing and manipulating User affiliations to Organizations.<\/p>\n\n\n\n<p class=\"has-text-align-right wp-block-paragraph\"><a href=\"https:\/\/support.questetra.com\/en\/developer-blog\/synchronize-users-chapter3\/\">Next: Synchronizing User Information with Local Data (Organizational Belonging Chapter) <i class=\"fas fa-arrow-right\"><\/i><\/a><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Appendix: The Full Set of Codes That Were Used<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">SyncUserWithTSV.java<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>import com.questetra.bpms.client.swagger.ApiException;\nimport com.questetra.bpms.client.swagger.model.*;\n\nimport java.io.IOException;\nimport java.util.HashSet;\nimport java.util.List;\nimport java.util.Objects;\nimport java.util.Set;\nimport static java.util.stream.Collectors.toList;\nimport static java.util.stream.Collectors.toSet;\n\nclass SyncUserWithTSV {\n    public static void main(String&#091;] args) throws IOException, ApiException {\n        \/\/ Read TSV data and create a set of email addresses\n        List&lt;String&#091;]&gt; data = TSVReader.readLines(\"{FILE PATH OF TSV}\");\n        Set&lt;String&gt; tsvSet = data.stream().map(d -&gt; d&#091;1]).collect(toSet());\n\n        \/\/ Read User list via Questetra BPM Suite QuserApi and create email set of registered Users\n        UserDataManager manager = new UserDataManager();\n        QuserList list = manager.list();\n        Set&lt;String&gt; qbpmsSet = list.getQusers().stream().map(Quser::getEmail).collect(toSet());\n\n        \/\/ Create sets of \"email addresses only being in TSV\" and \"email addresses only being on Qusetetra BPM Suite\".\n        Set&lt;String&gt; intersection = new HashSet&lt;&gt;(tsvSet);\n        intersection.retainAll(qbpmsSet);\n        tsvSet.removeAll(intersection); \/\/ Email addresses only being in TSV\n        qbpmsSet.removeAll(intersection); \/\/ Email addresses only being on Qusetetra BPM Suite\n\n        \/\/ Remove \"email addresses only being in Questetra BPM Suite\" from Questetra BPM Suite\n        for (String email : qbpmsSet) {\n            Quser deleteUser = list.getQusers().stream().filter(user -&gt; Objects.equals(user.getEmail(), email)).collect(toList()).get(0);\n            manager.delete(deleteUser.getId());\n            System.out.printf(\"Delete User \/ %s%n\", deleteUser.getEmail());\n        }\n\n        \/\/ Add \"email addresses only being in TSV file\" to Questetra BPM Suite\n        for (String email : tsvSet) {\n            String&#091;] addUser = data.stream().filter(user -&gt; Objects.equals(user&#091;1], email)).collect(toList()).get(0);\n            String password = manager.createPassword();\n            manager.add(addUser&#091;0], addUser&#091;1], password);\n            System.out.printf(\"Add User \/ %s%n\", addUser&#091;0]);\n\n        }\n    }\n}<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">TSVReader.java<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>import java.io.*;\nimport java.util.List;\nimport java.util.ArrayList;\nimport java.util.Objects;\n\nclass TSVReader {\n    public static List&lt;String&#091;]&gt; readLines(String filePath) throws IOException {\n        List&lt;String&#091;]&gt; data = new ArrayList&lt;&gt;();\n\n        try (InputStream is = ClassLoader.getSystemResourceAsStream((filePath))) {\n            BufferedReader br = new BufferedReader(new InputStreamReader(Objects.requireNonNull(is), \"UTF-8\"));\n\n            String line = br.readLine();\n            while (line != null) {\n                String&#091;] d = line.split(\"\\t\", 0);\n                data.add(d);\n                line = br.readLine();\n            }\n        }\n\n        return data;\n    }\n}<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">UserDataManager.java<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>import com.questetra.bpms.client.swagger.model.*;\nimport com.questetra.bpms.client.swagger.ApiClient;\nimport com.questetra.bpms.client.swagger.ApiException;\nimport com.questetra.bpms.client.swagger.Configuration;\nimport com.questetra.bpms.client.swagger.auth.*;\nimport com.questetra.bpms.client.swagger.api.QuserApi;\n\nimport java.util.List;\nimport java.util.ArrayList;\nimport java.util.Collections;\n\nimport org.apache.commons.lang3.RandomStringUtils;\n\n\/**\n * Exchange user information with Questetra BPM Suite.\n *\/\nclass UserDataManager {\n    private final QuserApi apiInstance;\n\n    public UserDataManager() {\n        ApiClient defaultClient = Configuration.getDefaultApiClient();\n        \/\/ sET URL\n        defaultClient.setBasePath(\"https:\/\/example.questetra.net\/\");\n\n        \/\/ Basic aUTHENTICATION\n        HttpBasicAuth basic \n                = (HttpBasicAuth) defaultClient.getAuthentication(\"basic\");\n        basic.setUsername(\"{EMAIL ADDRESS}\");\n        basic.setPassword(\"{PASSWORD for Basic Autthentication}\");\n\n        this.apiInstance = new QuserApi();\n    }\n\n    \/**\n     * List the Users registered on Questetra BPM Suite\n     * @return QuserList\n     *\/\n    public QuserList list() throws ApiException {\n        \/\/ List Users\n        QuserList result = this.apiInstance.listQusers(null, Integer.MAX_VALUE, 0);\n        return result;\n    }\n\n    \/**\n     * Search specified users from users registered in Questetra BPM Suite. Throws an exception if not found.\n     * @param id: User ID. Pass {@code null} if unknown. If passes other than {@code null}, it takes precedence over {@code email}.\n     * @param email: Registered email address. Passes {@code null} if unknown.\n     * @return QuserWithPrimaryQgroupWrapper: Retrieved user.\n     *\/\n    public QuserWithPrimaryQgroupWrapper find(Long id, String email) throws ApiException {\n        \/\/ Search user\n        QuserWithPrimaryQgroupWrapper result = this.apiInstance.findQuser(id, email);\n        return result;\n    }\n\n    \/**\n     * Newly register users in Questetra BPM Suite\n     * @param name Name.\n     * @param email Email address.\n     * @param password Password. 8 to 100 characters, must contain each of lower\/upper case alphabets, numbers and symbols.\n     * @return QuserWrapper Added user.\n     *\/\n    public QuserWrapper add(String name, String email, String password) throws ApiException {\n        \/\/ Add User\n        QuserWrapper result = this.apiInstance.addQuser(name, email, password);\n        return result;\n    }\n\n    \/**\n     * Remove User from Questetra BPM Suite.\n     * @param id The ID of the user to removed.\n     *\/\n    public void delete(Long id) throws ApiException {\n        \/\/ \u30e6\u30fc\u30b6\u3092\u524a\u9664\n        this.apiInstance.deleteQuser(id, {ENTER delegateQuserId}, {ENTER delegateQgroupId});\n    }\n\n    \/**\n     * Generate an 8-character temporary password.\n     * @return String The generated temporary password.\n     *\/\n    public String createPassword() {\n        int length = 8; \/\/ Number of characters of a password\n        List&lt;String&gt; chars = new ArrayList&lt;&gt;();\n\n        chars.add(RandomStringUtils.randomAlphabetic(1).toLowerCase()); \/\/ Lower case alphabet\n        chars.add(RandomStringUtils.randomAlphabetic(1).toUpperCase()); \/\/ Upper case alphabet\n        chars.add(RandomStringUtils.randomNumeric(1)); \/\/ Number\n        chars.add(RandomStringUtils.random(1, \"!\\\"#$%&amp;'()*+,-.\/:;&lt;=&gt;?@&#091;\\\\]^_`{|}~\")); \/\/ Symbol\n\n        \/\/ Put random ASCII characters in the remaining 4 characters\n        for (int i = 4; i &lt; length; i++) {\n            chars.add(RandomStringUtils.randomAscii(1));\n        }\n\n        \/\/ Shuffle the order of the characters\n        Collections.shuffle(chars);\n\n        return String.join(\"\", chars);\n    }\n}<\/code><\/pre>\n\n\n\n<p class=\"has-text-align-right wp-block-paragraph\"><a href=\"https:\/\/support.questetra.com\/en\/developer-blog\/synchronize-users-chapter3\/\">Next: Synchronizing User Information with Local Data (Organizational Belonging Chapter) <i class=\"fas fa-arrow-right\"><\/i><\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Synchronize user information on Questetra BPM Suite with local data. The User information chapter introduces a Java program that synchronizes registration information required to login to Questetra BPM Suite.<\/p>\n","protected":false},"author":3,"featured_media":102440,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_coblocks_attr":"","_coblocks_dimensions":"","_coblocks_responsive_height":"","_coblocks_accordion_ie_support":"","_uag_custom_page_level_css":"","advanced_seo_description":"","jetpack_seo_html_title":"","jetpack_seo_noindex":false,"jetpack_seo_schema_type":"","_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_wpcom_ai_launchpad_first_post":false,"_jetpack_feature_clip_id":0,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2},"_wpas_customize_per_network":false,"jetpack_post_was_ever_published":false},"categories":[296],"tags":[420],"faq_section":[],"class_list":["post-76239","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-developer-blog","tag-questetra-system-settings-api"],"jetpack_publicize_connections":[],"uagb_featured_image_src":{"full":["https:\/\/i0.wp.com\/support.questetra.com\/wp-content\/uploads\/2021\/01\/sync-with-local-data-1200x675-1.png?fit=1200%2C675&ssl=1",1200,675,false],"thumbnail":["https:\/\/i0.wp.com\/support.questetra.com\/wp-content\/uploads\/2021\/01\/sync-with-local-data-1200x675-1.png?resize=440%2C440&ssl=1",440,440,true],"medium":["https:\/\/i0.wp.com\/support.questetra.com\/wp-content\/uploads\/2021\/01\/sync-with-local-data-1200x675-1.png?fit=560%2C315&ssl=1",560,315,true],"medium_large":["https:\/\/i0.wp.com\/support.questetra.com\/wp-content\/uploads\/2021\/01\/sync-with-local-data-1200x675-1.png?fit=768%2C432&ssl=1",768,432,true],"large":["https:\/\/i0.wp.com\/support.questetra.com\/wp-content\/uploads\/2021\/01\/sync-with-local-data-1200x675-1.png?fit=1024%2C576&ssl=1",1024,576,true],"1536x1536":["https:\/\/i0.wp.com\/support.questetra.com\/wp-content\/uploads\/2021\/01\/sync-with-local-data-1200x675-1.png?fit=1200%2C675&ssl=1",1200,675,true],"2048x2048":["https:\/\/i0.wp.com\/support.questetra.com\/wp-content\/uploads\/2021\/01\/sync-with-local-data-1200x675-1.png?fit=1200%2C675&ssl=1",1200,675,true],"newspack-article-block-landscape-large":["https:\/\/i0.wp.com\/support.questetra.com\/wp-content\/uploads\/2021\/01\/sync-with-local-data-1200x675-1.png?resize=1200%2C675&ssl=1",1200,675,true],"newspack-article-block-portrait-large":["https:\/\/i0.wp.com\/support.questetra.com\/wp-content\/uploads\/2021\/01\/sync-with-local-data-1200x675-1.png?resize=900%2C675&ssl=1",900,675,true],"newspack-article-block-square-large":["https:\/\/i0.wp.com\/support.questetra.com\/wp-content\/uploads\/2021\/01\/sync-with-local-data-1200x675-1.png?resize=1200%2C675&ssl=1",1200,675,true],"newspack-article-block-landscape-medium":["https:\/\/i0.wp.com\/support.questetra.com\/wp-content\/uploads\/2021\/01\/sync-with-local-data-1200x675-1.png?resize=800%2C600&ssl=1",800,600,true],"newspack-article-block-portrait-medium":["https:\/\/i0.wp.com\/support.questetra.com\/wp-content\/uploads\/2021\/01\/sync-with-local-data-1200x675-1.png?resize=600%2C675&ssl=1",600,675,true],"newspack-article-block-square-medium":["https:\/\/i0.wp.com\/support.questetra.com\/wp-content\/uploads\/2021\/01\/sync-with-local-data-1200x675-1.png?resize=800%2C675&ssl=1",800,675,true],"newspack-article-block-landscape-intermediate":["https:\/\/i0.wp.com\/support.questetra.com\/wp-content\/uploads\/2021\/01\/sync-with-local-data-1200x675-1.png?resize=600%2C450&ssl=1",600,450,true],"newspack-article-block-portrait-intermediate":["https:\/\/i0.wp.com\/support.questetra.com\/wp-content\/uploads\/2021\/01\/sync-with-local-data-1200x675-1.png?resize=450%2C600&ssl=1",450,600,true],"newspack-article-block-square-intermediate":["https:\/\/i0.wp.com\/support.questetra.com\/wp-content\/uploads\/2021\/01\/sync-with-local-data-1200x675-1.png?resize=600%2C600&ssl=1",600,600,true],"newspack-article-block-landscape-small":["https:\/\/i0.wp.com\/support.questetra.com\/wp-content\/uploads\/2021\/01\/sync-with-local-data-1200x675-1.png?resize=400%2C300&ssl=1",400,300,true],"newspack-article-block-portrait-small":["https:\/\/i0.wp.com\/support.questetra.com\/wp-content\/uploads\/2021\/01\/sync-with-local-data-1200x675-1.png?resize=300%2C400&ssl=1",300,400,true],"newspack-article-block-square-small":["https:\/\/i0.wp.com\/support.questetra.com\/wp-content\/uploads\/2021\/01\/sync-with-local-data-1200x675-1.png?resize=400%2C400&ssl=1",400,400,true],"newspack-article-block-landscape-tiny":["https:\/\/i0.wp.com\/support.questetra.com\/wp-content\/uploads\/2021\/01\/sync-with-local-data-1200x675-1.png?resize=200%2C150&ssl=1",200,150,true],"newspack-article-block-portrait-tiny":["https:\/\/i0.wp.com\/support.questetra.com\/wp-content\/uploads\/2021\/01\/sync-with-local-data-1200x675-1.png?resize=150%2C200&ssl=1",150,200,true],"newspack-article-block-square-tiny":["https:\/\/i0.wp.com\/support.questetra.com\/wp-content\/uploads\/2021\/01\/sync-with-local-data-1200x675-1.png?resize=200%2C200&ssl=1",200,200,true],"newspack-article-block-uncropped":["https:\/\/i0.wp.com\/support.questetra.com\/wp-content\/uploads\/2021\/01\/sync-with-local-data-1200x675-1.png?fit=1200%2C675&ssl=1",1200,675,true]},"uagb_author_info":{"display_name":"Hirotaka NISHI","author_link":"https:\/\/support.questetra.com\/en\/author\/nishiquestetra\/"},"uagb_comment_info":2,"uagb_excerpt":"Synchronize user information on Questetra BPM Suite with local data. The User information chapter introduces a Java program that synchronizes registration information required to login to Questetra BPM Suite.","jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/p9DiIh-jPF","jetpack-related-posts":[{"id":76060,"url":"https:\/\/support.questetra.com\/en\/developer-blog\/synchronize-users-chapter1\/","url_meta":{"origin":76239,"position":0},"title":"Synchronizing User Information with Local Data (Preparatory Chapter)","author":"Hirotaka NISHI","date":"2021-01-18","format":false,"excerpt":"Synchronize user information on Questetra BPM Suite with local data. In this Preparatory Chapter, introducing a Java program that retrieves for information of users on QBPMS.","rel":"","context":"In &quot;Questetra Developers Blog&quot;","block_context":{"text":"Questetra Developers Blog","link":"https:\/\/support.questetra.com\/en\/category\/developer-blog\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/support.questetra.com\/wp-content\/uploads\/2021\/01\/sync-with-local-data-1200x675-1.png?fit=1200%2C675&ssl=1&resize=350%2C200","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/support.questetra.com\/wp-content\/uploads\/2021\/01\/sync-with-local-data-1200x675-1.png?fit=1200%2C675&ssl=1&resize=350%2C200 1x, https:\/\/i0.wp.com\/support.questetra.com\/wp-content\/uploads\/2021\/01\/sync-with-local-data-1200x675-1.png?fit=1200%2C675&ssl=1&resize=525%2C300 1.5x, https:\/\/i0.wp.com\/support.questetra.com\/wp-content\/uploads\/2021\/01\/sync-with-local-data-1200x675-1.png?fit=1200%2C675&ssl=1&resize=700%2C400 2x, https:\/\/i0.wp.com\/support.questetra.com\/wp-content\/uploads\/2021\/01\/sync-with-local-data-1200x675-1.png?fit=1200%2C675&ssl=1&resize=1050%2C600 3x"},"classes":[]},{"id":76781,"url":"https:\/\/support.questetra.com\/en\/developer-blog\/synchronize-users-chapter3\/","url_meta":{"origin":76239,"position":1},"title":"Synchronizing User Information in QBPMS with Local Data (Organizational Affiliation Chapter)","author":"Hirotaka NISHI","date":"2021-01-18","format":false,"excerpt":"Synchronize user information on Questetra BPM Suite with local data. In the Organizational Affiliation Chapter, we introduce you a Java program that synchronizes affiliation information such as \"which organization the user is affiliated to\".","rel":"","context":"In &quot;Questetra Developers Blog&quot;","block_context":{"text":"Questetra Developers Blog","link":"https:\/\/support.questetra.com\/en\/category\/developer-blog\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/support.questetra.com\/wp-content\/uploads\/2021\/01\/sync-with-local-data-1200x675-1.png?fit=1200%2C675&ssl=1&resize=350%2C200","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/support.questetra.com\/wp-content\/uploads\/2021\/01\/sync-with-local-data-1200x675-1.png?fit=1200%2C675&ssl=1&resize=350%2C200 1x, https:\/\/i0.wp.com\/support.questetra.com\/wp-content\/uploads\/2021\/01\/sync-with-local-data-1200x675-1.png?fit=1200%2C675&ssl=1&resize=525%2C300 1.5x, https:\/\/i0.wp.com\/support.questetra.com\/wp-content\/uploads\/2021\/01\/sync-with-local-data-1200x675-1.png?fit=1200%2C675&ssl=1&resize=700%2C400 2x, https:\/\/i0.wp.com\/support.questetra.com\/wp-content\/uploads\/2021\/01\/sync-with-local-data-1200x675-1.png?fit=1200%2C675&ssl=1&resize=1050%2C600 3x"},"classes":[]},{"id":74618,"url":"https:\/\/support.questetra.com\/en\/developer-blog\/message-start-event-http-python\/","url_meta":{"origin":76239,"position":2},"title":"Starting a Case from Outside of Questetra BPM Suite (Python Chapter)","author":"Hirotaka NISHI","date":"2019-01-28","format":false,"excerpt":"Introducing how to access Message Start Event (HTTP) API from Python script.","rel":"","context":"In &quot;Questetra Developers Blog&quot;","block_context":{"text":"Questetra Developers Blog","link":"https:\/\/support.questetra.com\/en\/category\/developer-blog\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/support.questetra.com\/wp-content\/uploads\/2019\/01\/message-start-event-http-with-python-1200x675-1.png?fit=1200%2C675&ssl=1&resize=350%2C200","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/support.questetra.com\/wp-content\/uploads\/2019\/01\/message-start-event-http-with-python-1200x675-1.png?fit=1200%2C675&ssl=1&resize=350%2C200 1x, https:\/\/i0.wp.com\/support.questetra.com\/wp-content\/uploads\/2019\/01\/message-start-event-http-with-python-1200x675-1.png?fit=1200%2C675&ssl=1&resize=525%2C300 1.5x, https:\/\/i0.wp.com\/support.questetra.com\/wp-content\/uploads\/2019\/01\/message-start-event-http-with-python-1200x675-1.png?fit=1200%2C675&ssl=1&resize=700%2C400 2x, https:\/\/i0.wp.com\/support.questetra.com\/wp-content\/uploads\/2019\/01\/message-start-event-http-with-python-1200x675-1.png?fit=1200%2C675&ssl=1&resize=1050%2C600 3x"},"classes":[]},{"id":73811,"url":"https:\/\/support.questetra.com\/en\/developer-blog\/message-start-event-http-curl\/","url_meta":{"origin":76239,"position":3},"title":"Starting a Case from Outside of Questetra BPM Suite (curl Chapter)","author":"Hirotaka NISHI","date":"2019-01-04","format":false,"excerpt":"Introducing how to access the Message Start Event (HTTP) API from the curl command. This allows Starting a Case from the command shell.","rel":"","context":"In &quot;Questetra Developers Blog&quot;","block_context":{"text":"Questetra Developers Blog","link":"https:\/\/support.questetra.com\/en\/category\/developer-blog\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/support.questetra.com\/wp-content\/uploads\/2019\/01\/message-start-event-http-with-curl-1200x675-1.png?fit=1200%2C675&ssl=1&resize=350%2C200","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/support.questetra.com\/wp-content\/uploads\/2019\/01\/message-start-event-http-with-curl-1200x675-1.png?fit=1200%2C675&ssl=1&resize=350%2C200 1x, https:\/\/i0.wp.com\/support.questetra.com\/wp-content\/uploads\/2019\/01\/message-start-event-http-with-curl-1200x675-1.png?fit=1200%2C675&ssl=1&resize=525%2C300 1.5x, https:\/\/i0.wp.com\/support.questetra.com\/wp-content\/uploads\/2019\/01\/message-start-event-http-with-curl-1200x675-1.png?fit=1200%2C675&ssl=1&resize=700%2C400 2x, https:\/\/i0.wp.com\/support.questetra.com\/wp-content\/uploads\/2019\/01\/message-start-event-http-with-curl-1200x675-1.png?fit=1200%2C675&ssl=1&resize=1050%2C600 3x"},"classes":[]},{"id":191892,"url":"https:\/\/support.questetra.com\/en\/developer-blog\/google-workspace-setup\/","url_meta":{"origin":76239,"position":4},"title":"Setting Up Google Workspace Integration","author":"kobayashi","date":"2026-07-16","format":false,"excerpt":"This section explains how to configure the integration between Questetra BPM Suite and Google Workspace.","rel":"","context":"In &quot;Questetra Developers Blog&quot;","block_context":{"text":"Questetra Developers Blog","link":"https:\/\/support.questetra.com\/en\/category\/developer-blog\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/support.questetra.com\/wp-content\/uploads\/2026\/07\/setting_up_google_workspace-en.png?fit=1200%2C679&ssl=1&resize=350%2C200","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/support.questetra.com\/wp-content\/uploads\/2026\/07\/setting_up_google_workspace-en.png?fit=1200%2C679&ssl=1&resize=350%2C200 1x, https:\/\/i0.wp.com\/support.questetra.com\/wp-content\/uploads\/2026\/07\/setting_up_google_workspace-en.png?fit=1200%2C679&ssl=1&resize=525%2C300 1.5x, https:\/\/i0.wp.com\/support.questetra.com\/wp-content\/uploads\/2026\/07\/setting_up_google_workspace-en.png?fit=1200%2C679&ssl=1&resize=700%2C400 2x, https:\/\/i0.wp.com\/support.questetra.com\/wp-content\/uploads\/2026\/07\/setting_up_google_workspace-en.png?fit=1200%2C679&ssl=1&resize=1050%2C600 3x"},"classes":[]},{"id":74056,"url":"https:\/\/support.questetra.com\/en\/incident\/bug-20190110\/","url_meta":{"origin":76239,"position":5},"title":"When Synchronizing with G Suite Group in Batch Registration of Roles, an Error Occurs if There Is a Group with No Member (Fixed)","author":"Hirotaka NISHI","date":"2019-01-10","format":false,"excerpt":"Fixed Version Version 11.9.0 Affected Version and Operation Ver. 11.8.2 To Synchronize with G Suite by [Role batch registration] Bug Details Occurs in operating \"Synchronize with G Suite\" < [Import Roles] < [Role List] < [System Setting] (\"Role\" of Questetra will be synchronized with \"group\" of G Suite) What will\u2026","rel":"","context":"In &quot;Incident Info&quot;","block_context":{"text":"Incident Info","link":"https:\/\/support.questetra.com\/en\/category\/incident\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/support.questetra.com\/wp-content\/uploads\/2020\/04\/bug-report-en-1200x675-1.png?fit=1200%2C675&ssl=1&resize=350%2C200","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/support.questetra.com\/wp-content\/uploads\/2020\/04\/bug-report-en-1200x675-1.png?fit=1200%2C675&ssl=1&resize=350%2C200 1x, https:\/\/i0.wp.com\/support.questetra.com\/wp-content\/uploads\/2020\/04\/bug-report-en-1200x675-1.png?fit=1200%2C675&ssl=1&resize=525%2C300 1.5x, https:\/\/i0.wp.com\/support.questetra.com\/wp-content\/uploads\/2020\/04\/bug-report-en-1200x675-1.png?fit=1200%2C675&ssl=1&resize=700%2C400 2x, https:\/\/i0.wp.com\/support.questetra.com\/wp-content\/uploads\/2020\/04\/bug-report-en-1200x675-1.png?fit=1200%2C675&ssl=1&resize=1050%2C600 3x"},"classes":[]}],"jetpack_featured_media_url":"https:\/\/i0.wp.com\/support.questetra.com\/wp-content\/uploads\/2021\/01\/sync-with-local-data-1200x675-1.png?fit=1200%2C675&ssl=1","_links":{"self":[{"href":"https:\/\/support.questetra.com\/en\/wp-json\/wp\/v2\/posts\/76239","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/support.questetra.com\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/support.questetra.com\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/support.questetra.com\/en\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/support.questetra.com\/en\/wp-json\/wp\/v2\/comments?post=76239"}],"version-history":[{"count":16,"href":"https:\/\/support.questetra.com\/en\/wp-json\/wp\/v2\/posts\/76239\/revisions"}],"predecessor-version":[{"id":113288,"href":"https:\/\/support.questetra.com\/en\/wp-json\/wp\/v2\/posts\/76239\/revisions\/113288"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/support.questetra.com\/en\/wp-json\/wp\/v2\/media\/102440"}],"wp:attachment":[{"href":"https:\/\/support.questetra.com\/en\/wp-json\/wp\/v2\/media?parent=76239"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/support.questetra.com\/en\/wp-json\/wp\/v2\/categories?post=76239"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/support.questetra.com\/en\/wp-json\/wp\/v2\/tags?post=76239"},{"taxonomy":"faq_section","embeddable":true,"href":"https:\/\/support.questetra.com\/en\/wp-json\/wp\/v2\/faq_section?post=76239"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}