• 沒有找到結果。

TIBCO Cloud™

N/A
N/A
Protected

Academic year: 2022

Share "TIBCO Cloud™"

Copied!
158
0
0

加載中.... (立即查看全文)

全文

(1)

(PAYG)

User's Guide

Software Release 2.9.0

July 2020

(2)

Important Information

SOME TIBCO SOFTWARE EMBEDS OR BUNDLES OTHER TIBCO SOFTWARE. USE OF SUCH EMBEDDED OR BUNDLED TIBCO SOFTWARE IS SOLELY TO ENABLE THE FUNCTIONALITY (OR PROVIDE LIMITED ADD-ON FUNCTIONALITY) OF THE LICENSED TIBCO SOFTWARE. THE EMBEDDED OR BUNDLED SOFTWARE IS NOT LICENSED TO BE USED OR ACCESSED BY ANY OTHER TIBCO SOFTWARE OR FOR ANY OTHER PURPOSE.

USE OF TIBCO SOFTWARE AND THIS DOCUMENT IS SUBJECT TO THE TERMS AND CONDITIONS OF A LICENSE AGREEMENT FOUND IN EITHER A SEPARATELY EXECUTED SOFTWARE LICENSE AGREEMENT, OR, IF THERE IS NO SUCH SEPARATE AGREEMENT, THE CLICKWRAP END USER LICENSE AGREEMENT WHICH IS DISPLAYED DURING DOWNLOAD OR INSTALLATION OF THE SOFTWARE (AND WHICH IS DUPLICATED IN THE LICENSE FILE) OR IF THERE IS NO SUCH SOFTWARE LICENSE AGREEMENT OR CLICKWRAP END USER LICENSE AGREEMENT, THE LICENSE(S) LOCATED IN THE “LICENSE” FILE(S) OF THE

SOFTWARE. USE OF THIS DOCUMENT IS SUBJECT TO THOSE TERMS AND CONDITIONS, AND YOUR USE HEREOF SHALL CONSTITUTE ACCEPTANCE OF AND AN AGREEMENT TO BE BOUND BY THE SAME.

This document is subject to U.S. and international copyright laws and treaties. No part of this document may be reproduced in any form without the written authorization of TIBCO Software Inc.

TIBCO, the TIBCO logo, the TIBCO O logo, and Flogo are either registered trademarks or trademarks of TIBCO Software Inc. in the United States and/or other countries.

All other product and company names and marks mentioned in this document are the property of their respective owners and are mentioned for identification purposes only.

This software may be available on multiple operating systems. However, not all operating system platforms for a specific software version are released at the same time. Please see the readme.txt file for the availability of this software version on a specific operating system platform.

THIS DOCUMENT IS PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF

MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR NON-INFRINGEMENT.

THIS DOCUMENT COULD INCLUDE TECHNICAL INACCURACIES OR TYPOGRAPHICAL ERRORS. CHANGES ARE PERIODICALLY ADDED TO THE INFORMATION HEREIN; THESE CHANGES WILL BE INCORPORATED IN NEW EDITIONS OF THIS DOCUMENT. TIBCO SOFTWARE INC. MAY MAKE IMPROVEMENTS AND/OR CHANGES IN THE PRODUCT(S) AND/OR THE PROGRAM(S) DESCRIBED IN THIS DOCUMENT AT ANY TIME.

THE CONTENTS OF THIS DOCUMENT MAY BE MODIFIED AND/OR QUALIFIED, DIRECTLY OR INDIRECTLY, BY OTHER DOCUMENTATION WHICH ACCOMPANIES THIS SOFTWARE,

INCLUDING BUT NOT LIMITED TO ANY RELEASE NOTES AND "READ ME" FILES.

This and other products of TIBCO Software Inc. may be covered by registered patents. Please refer to TIBCO's Virtual Patent Marking document (https://www.tibco.com/patents) for details.

Copyright © 2016-2020. TIBCO Software Inc. All Rights Reserved.

(3)

Contents

Figures . . . 8

TIBCO Documentation and Support Services. . . .9

Introduction. . . . 10

Concepts. . . .10

Creating your First REST API. . . .11

App Development. . . .25

Creating and Managing a Flogo App in the Web UI. . . .25

Creating a TIBCO Flogo® App. . . 25

Creating an App from a Saved Specification. . . .25

Validating your App. . . .26

Renaming an App. . . .26

Reverting Changes to an App. . . .26

Switching Between Display Views on the App Page. . . .26

Deleting an App. . . .28

Exporting and Importing an App. . . .28

Exporting an App. . . .28

Exporting an App's JSON File. . . .29

Importing an App. . . .29

Creating Flows and Triggers. . . .33

Flows. . . .33

Creating a Flow. . . .34

Selecting a Trigger When Creating a New Flow. . . .35

Starting with a Trigger. . . .36

Creating a Flow Attached to a REST (Receive HTTP Message) Trigger. . . .36

Creating a Flow attached to the GraphQL Trigger. . . .38

Creating a Flow Attached to Other Triggers. . . .38

Creating a Flow Attached to a gRPC Trigger. . . .39

Creating a Blank Flow (Flow without a Trigger). . . .39

Flow Inputs & Outputs Tab . . . .41

Attaching a Flow to One or More Triggers. . . .42

Catching Errors. . . 42

Creating An Error Handler Flow. . . .42

Viewing Errors and Warnings . . . .44

Using Subflows. . . .46

Creating Subflows. . . .46

Creating a Flow Execution Branch. . . .47

(4)

Types of Branch Conditions. . . .48

Order in which Branches Get Executed. . . .49

Setting Branch Conditions. . . .50

Deleting a Branch. . . .51

Duplicating a Flow. . . .52

Editing a Flow. . . .52

Reverting Changes to a Flow. . . .52

Switching Between Flows in an App. . . .53

Deleting a Flow. . . .53

Adding an Activity. . . .53

Searching for a Category or Activity. . . .54

Configuring an Activity. . . .54

Duplicating an Activity . . . 55

Using the Loop Feature in an Activity. . . .56

Accumulating the Activity Output for All Iterations. . . .57

Deleting an Activity. . . .58

Triggers. . . .58

Creating a Trigger without a Flow. . . .58

Deleting a Trigger. . . 59

Synchronizing Schema Between Trigger and Flow. . . .59

Data Mappings. . . 59

Data Mappings Interface. . . .59

Scopes in Data Mappings. . . 61

Reserved Keywords to be Avoided in Schemas. . . .62

Mapping Different Types of Data. . . .63

Mapping a Single Element of Primitive Data Type. . . .64

Mapping an Object. . . .65

Mapping Arrays. . . .66

Mapping an Array of Primitive Data Types. . . .66

Mapping Complex Arrays - Using the array.forEach() Function. . . .68

Understanding array.ForEach() Function with an Example. . . .68

Mapping Identical Arrays of Objects. . . .71

Mapping Array Child Elements to Non-Array Elements or to an Element in a Non-Matching Array. . . 72 Mapping Nested Arrays. . . .74

Mapping Child Elements within a Nested Array Scope. . . .77

Mapping a Nested Array Child Element outside the Nested Array Scope. . . .78

Mapping an Element from a Parent Array to a Child Element in a Nested Array within the Parent . . . .79

Filtering Array Elements to Map Based on a Condition. . . .80

(5)

Mapping JSON Data with the json.path() Function. . . .81

Constructing the any, param, or object Data Type in Mapper. . . .83

Coercing of Activity Input, Output, and Trigger Reply Fields. . . .86

Clear Mapping of Child Elements in Objects and Arrays. . . .87

Ignoring Missing Object Properties when Mapping Objects. . . .88

Using Functions. . . .88

Using the array.forEach() Function. . . .89

Using the json.path() Function. . . .89

Using Expressions. . . 89

Supported Operators. . . .90

Developing APIs. . . .90

Using an Open API Specification (Swagger). . . .91

Configuring the REST Reply. . . .92

Testing the Deployed App. . . .94

Downloading the API Specification Used. . . .94

Using GraphQL Schema. . . .95

Using gRPC . . . .97

Using App Properties and Schemas. . . .100

App Properties. . . .100

Creating App Properties. . . .100

App Properties Dialog Views. . . .101

Creating a Standalone App Property. . . .102

Creating a Group. . . .103

Deleting a Group or Property. . . .104

Using App Properties in a Flow. . . .104

Using App Properties in the Mapper. . . .105

Unlinking an App Property from a Field Value. . . .105

Using App Properties in Connections. . . .106

Editing an App Property. . . .108

Changing the Default Value of a Property from the App Properties Dialog. . . .108

Changing the Name or Data Type of an App Property after Using It. . . .108

When Importing an App. . . .108

Exporting App Properties to a File. . . .108

App Schemas. . . .109

Defining an App-Level Schema. . . .109

Editing an App-Level Schema . . . .110

Deleting an App-Level Schema . . . .110

Using an App-Level Schema . . . .110

Flow Inputs & Outputs Tab . . . .110

(6)

Input or Output Settings Tab of an Activity . . . .111

Output or Reply Settings Tab of a Trigger . . . .111

Using Connectors. . . .112

Creating Connections. . . .112

Editing or Deleting Existing Connections. . . .113

Uploading Extensions. . . .113

Pulling Extensions from an Open Source Public Git Repository. . . .117

Adding Custom Golang Code or Dependencies to the App. . . .118

Flow Tester. . . .119

Testing Flows from the UI. . . .119

What is a Launch Configuration?. . . .119

Creating and Using a Launch Configuration. . . .120

Configuring a Launch Configuration. . . .123

Exporting a Launch Configuration. . . .124

Importing a Launch Configuration. . . .125

Cloning a Launch Configuration. . . .126

Deleting a Launch Configuration. . . .127

Deployment and Configuration. . . .128

Building an App Binary. . . .128

Building the App. . . .128

Environment Variables. . . .129

App Configuration Management. . . .130

Consul. . . .130

Using Consul with TIBCO Cloud Integration - Flogo (PAYG). . . .131

Consul Connection Parameters. . . .131

Setting the Consul Connection Parameters. . . .133

AWS Systems Manager Parameter Store. . . .135

Using the Parameter Store with TIBCO Cloud Integration - Flogo (PAYG). . . .135

Parameter Store Connection Parameters. . . .136

Setting the Parameter Store Connection Parameters. . . .137

Evironment Variables. . . .139

Using Environment Variables to Override App Property Values. . . .139

Encrypting Password Values. . . .140

Container Deployments for AWS Marketplace. . . .141

Build the Flogo Application Docker Image. . . .141

About AWS Deployment Templates. . . .142

Example: Deploying a Flogo App on AWS EKS. . . .142

Prerequisites. . . .142

Deploying a Flogo App on AWS EKS. . . .143

(7)

Troubleshooting. . . .146

Serverless Deployments. . . .146

Calling Lambda Functions. . . .146

Creating a Connection with the AWS Connector. . . .146

AWS Connection Details. . . .147

Publishing to TIBCO Cloud Mashery. . . .148

Monitoring. . . .149

App Metrics. . . .149

Enabling App Metrics. . . .150

Enabling statistics collection using environment variables. . . .150

Logging App Metrics. . . .150

Fields returned in the response. . . .151

Prometheus. . . .152

Using Prometheus to Analyze Flogo App Metrics. . . .153

Often-Used Queries. . . .153

Best Practices in TIBCO Cloud Integration - Flogo (PAYG). . . . 156

(8)

Figures

Trigger View . . . .27 Flow View . . . .28

(9)

TIBCO Documentation and Support Services

How to Access TIBCO Documentation

Documentation for TIBCO products is available on the TIBCO Product Documentation website, mainly in HTML and PDF formats.

The TIBCO Product Documentation website is updated frequently and is more current than any other documentation included with the product. To access the latest documentation, visit https://

docs.tibco.com.

Documentation for TIBCO Cloud Integration - Flogo® (PAYG) is available on the TIBCO Cloud Integration - Flogo (PAYG) Product Documentation page.

Product-Specific Documentation

The following documents for this product can be found on the TIBCO Documentation site:

TIBCO Cloud Integration - Flogo® (PAYG) Release Notes

TIBCO Cloud Integration - Flogo® (PAYG) Getting Started

TIBCO Cloud Integration - Flogo® (PAYG) User's Guide

TIBCO Cloud Integration - Flogo® (PAYG) Activities and Triggers Guide

How to Contact TIBCO Support

You can contact TIBCO Support in the following ways:

For an overview of TIBCO Support, visit http://www.tibco.com/services/support.

For accessing the Support Knowledge Base and getting personalized content about products you are interested in, visit the TIBCO Support portal at https://support.tibco.com.

For creating a Support case, you must have a valid maintenance or support contract with TIBCO.

You also need a user name and password to log in to https://support.tibco.com. If you do not have a user name, you can request one by clicking Register on the website.

How to Join TIBCO Community

TIBCO Community is the official channel for TIBCO customers, partners, and employee subject matter experts to share and access their collective experience. TIBCO Community offers access to Q&A forums, product wikis, and best practices. It also offers access to extensions, adapters, solution accelerators, and tools that extend and enable customers to gain full value from TIBCO products. In addition, users can submit and vote on feature requests from within the TIBCO Ideas Portal. For a free registration, go to https://community.tibco.com.

(10)

Introduction

Concepts

This section describes some concepts that are used in the TIBCO Cloud Integration - Flogo (PAYG) environment.

Apps

Flogo apps are developed as event-driven apps using triggers and actions and contain the logic to process incoming events. A Flogo app consists of one or more triggers and one or more actions such as flows.

Trigger

Triggers receive events from external sources such as Kafka, Salesforce, GraphQL and so on. Handlers dispatch events to actions such as flow. TIBCO Cloud Integration - Flogo (PAYG) provides a set of out- of-the-box triggers as well as a range of connectors for receiving events from a variety of external systems.

Flow

The Flogo ecosystem provides a set of actions for processing events in a manner suitable to your implementation logic. The flow is one of the actions in Flogo that allows you to implement the business logic as a process. Flows are visually designed and tested using the Web UI. A Flow can consist of one or more activities that perform a specific task. Activities are linked and can contain conditional logic for branching. Each Flow also has a default error handler. A Flogo app can have one or more flows. A flow can be triggered by one or more Triggers within the app.

Activity

Activities perform specific tasks within the flow. A flow typically contains multiple activities.

How TIBCO Cloud Integration - Flogo (PAYG) Works

The trigger consists of one or more handlers that serve as the means of communication between the trigger and the flow. When the trigger receives an event, the data from the event is passed on to the flow in the form of flow input. The business logic in the flow then can use event data through the flow input. When the trigger expects a reply from the flow, the data from the flow is passed on to the trigger in the form of flow output. A flow can contain one or more conditional branches.

(11)

In a nutshell, to use TIBCO Cloud Integration - Flogo (PAYG), you have to follow these steps:

1. Create an app.

2. Create a flow in your app.

3. Add one or more activities to the flow and configure them.

4. Optionally, add a trigger to your flow. You can add one or more triggers to a flow as and when you need them.

5. Build your app.

Creating your First REST API

The following tutorial walks you through building a simple REST service in TIBCO Cloud Integration - Flogo® (PAYG).

This tutorial walks you through creating a basic airlines flight reservation app which takes input from a user (a potential passenger), checks to see if the passenger's last name is "Jones" and for passengers with last name "Jones" upgrades them to Business Class.

The app contains a REST flow, FlightBookings, which implements the POST HTTP operation to book a seat for the passenger requesting it on the flight. The flow is triggered by the ReceiveHTTPMessage REST trigger which listens for a request to book a seat that comes in from a passenger. The flow contains a LogMessage activity which you configure to log a custom message when a request has been received successfully. The LogMessage activity has two branches. Each branch must have its own Return activity, so you will need to add a Return activity at the end of each branch.

When a request comes in:

1. The first branch accepts requests with any last name that appears in the REST request.

2. The second branch then checks to see if the last name in the request is "Jones". You configure this check (condition) in the Branch Mapping Settings for this branch. If the last name is "Jones" then the flow outputs the passenger details with the Class element automatically set to Business Class meaning that the passenger's seat has been booked in Business Class. You configure this action of automatically setting the Class element to BusinessClass for passengers with last name "Jones" in the Return activity for this branch.

3. If the last name received is not "Jones" the control is transferred to the first branch whose flow outputs the details of the request as received with the Class to Economy.

(12)

Creating the JSON Schema for REST Request and Response

In this tutorial, we will use a simple JSON schema for the REST request that the service receives and the response that the service sends back. The following is the structure of our JSON schema used in this tutorial. This JSON message will be converted internally into a JSON schema:

{

"Class" : "string", "Cost" : 0,

"DepartureDate" : "2017-05-27", "DeparturePoint" : "string", "Destination" : "string", "FirstName" : "string", "Id" : 0,

"LastName" : "string"

}

High-level Steps in the Tutorial

The high-level steps for creating and configuring the airlines flight reservation service REST app in this tutorial are as follows:

1. Create a New TIBCO Flogo® App

2. Create a Flow in the App with a REST Trigger

3. Map Trigger Output to Flow Input. This is the bridge between the trigger and the flow where the

trigger passes on the request data to the flow a flow input.

4. Map Flow Output to Trigger Reply. This is the bridge between the flow output and the response

that the trigger sends back to the HTTP request it received. After the flow has finished executing, the output of the flow execution is passed back to the trigger by the Return activity. Hence, we map the flow output to the trigger reply. This mapping is done in the trigger configuration.

5. Add a Log Message Activity to the Flow and configure a message that the activity must log in the

logs for the app as soon as it receives a request.

6. Add the First Branch and Configure It to accept any last name that appears in the REST request.

7. Add a Second Branch to Check for Last Name "Jones". If the last name of the passenger is "Jones",

this branch is executed and the passenger is placed in Business Class.

8. Validate the App to make sure that there are no errors or warnings in any flows or activities.

9. Build the App

10.Test the App

Step 1: Create a New TIBCO Flogo® App

Create a new TIBCO Flogo® App in TIBCO Cloud Integration - Flogo (PAYG).

Follow these steps to create a new app:

1. Open the Apps tab in TIBCO Cloud Integration - Flogo (PAYG).

2. Click Create/Import app.

3. By default, a Flogo app is named New_Flogo_App_<sequential-number> where the sequential- number is the next number of a new app being created. Click the default app name next to the Flogo app icon to make it editable. Edit the app name to FlightApp and click anywhere outside the name to persist your change.

Step 2: Create a Flow in the App with the REST Trigger (Receive HTTP Message) Every app must have at least one flow. Create a new flow with the REST trigger. The

ReceiveHTTPMessage REST trigger listens for an incoming REST request that contains the details of

(13)

the passenger who wants to book a flight. You configure the expected fields for the request in the REST trigger in JSON schema format.

Follow these steps to create a flow:

1. Click Create. The Flow option is selected by default in the Add triggers and flows dialog.

2. Enter FlightBookings in the Name text box and optionally a description for the flow in the Description text box and click Create.

3. Click Start with a trigger.

4. Click the Receive HTTP Message card in the Triggers catalog.

(14)

5. In the Configure trigger: ReceiveHTTPMessage dialog, do the following:

a. Select POST as the Method.

b. Enter /FlightBookings in the Resource path text box.

c. Enter the following schema that an incoming request must adhere to in the Enter a JSON Schema or an example of your JSON message box:

Make sure to use straight quotes when entering the schema elements and values.

{

"Class" : "string", "Cost" : 0,

"DepartureDate" : "2017-05-27", "DeparturePoint" : "string", "Destination" : "string", "FirstName" : "string", "Id" : 0,

(15)

"LastName" : "string"

}

d. Click Continue.

6. Select Copy Schema when prompted as shown below.

The schema that you entered when creating the trigger automatically gets copied to the following locations when the trigger is added:

Flow input in the Input Settings tab of the Flow Inputs & Outputs accordian tab.

It is displayed in a tree format in the Map to Flow Inputs tab of the trigger. This allows you to map the elements from the trigger output to flow input elements, such that the trigger output feeds into the flow input.

The Reply Settings tab of the trigger, if the trigger has a reply. In the next step, you map the flow output schema elements to the trigger reply. By doing so, you send the output from the flow back to the trigger such that it becomes the trigger reply.

A new flow is created attached to a REST trigger.

Your flow should look similar to the following:

(16)

7. Collapse the Flow Inputs & Outputs accordian tab by clicking the left-facing arrow above the tab name in the blue vertical bar.

Step 3: Map Trigger Output to Flow Input

When TIBCO Cloud Integration - Flogo (PAYG) receives a flight booking request from a passenger (a REST request), the data from the request is output by the ReceiveHTTPMessage REST trigger. For the request to be processed, this output must be consumed by the flow in the form of flow input. Hence, you must map the trigger output to the flow input.

To do so, follow these steps:

1. Click the REST trigger on the top left corner of the flow to open its configuration dialog.

2. Click the Map to Flow Inputs tab.

3. Click headers under Flow Input, then click $trigger > headers under Trigger Output to map the headers.

4. Click body under Flow Input, then click $trigger > body to map the elements under body.

5. Click Save.

Step 4: Map Flow Output to Trigger Reply

When the flow has finished executing, its output must be sent back to the trigger for the trigger to send a reply to the REST request initiator. Hence, the flow output data must be mapped to the trigger reply which in turn will return the result of the flow execution to the REST request initiator.

To map the flow output to the trigger reply, do the following:

1. Click the Map from Flow Outputs tab.

a. Click the code under Trigger Reply to open the mapper.

b. Click $flow > code under Flow Output.

c. Click data under Trigger Reply.

d. Click $flow > data under Flow Output.

e. Click Save to save your changes.

f. Click x to close the dialog.

The flow should look like the following:

(17)

Step 5: Add a Log Message Activity to the Flow

The flow uses the LogMessage activity to log an entry in the app logs when the trigger receives a request from the passenger that reaches the trigger in the form of a REST request.

Follow these steps to add a LogMessage activity:

1. Add a new LogMessage activity from the General tab and configure it. To do so,

a. Hover your mouse cursor to the right of the Flow Inputs & Outputs tab and click .

b. In the Add Activity dialog, click General, then click Log Message.

c. Configure the LogMessage activity with a message to log when it receives an incoming request from the ReceiveHTTPMessage trigger. To do so:

a. Click the Input tab.

b. Click message to open the mapper to the right. You will now configure a message to be logged by the LogMessage activity when the flow receives the input from the request that the trigger received and passed on to the flow.

c. To configure the message, expand the string category under Functions and click concat(str, str2) to add this function to the message text box.

d. Select str in the and replace it by entering "We have received a message from

" (include the quotes too).

e. Replace str2 with the last name of the passenger who booked the flight. The last name of the passenger is passed on from the trigger to the flow. We had mapped this trigger output

(18)

to flow input in step 3 above. Hence it is now available for mapping under $flow in Upstream Output.

To map the LastName do the following:

1. Select str2.

2. Expand $flow > body under Upstream Output.

3. Click LastName.

4. Click Save to save your changes.

d. Click the x on the upper right side of the LogMessage box to close it. The LogMessage activity is added to the right of the Flow Inputs & Outputs tab.

Your flow should now look like the following:

Step 6: Add the First Branch and Configure It

We want the flight seat booking to be based on the last name of the passenger. If the last name is "Jones"

we want to book the passenger in the Business Class. If the passenger's last name is anything other than

"Jones", we want the passenger's seat to be booked in the Economy class. To accomplish this, use the conditional branching feature in TIBCO Cloud Integration - Flogo (PAYG). Add a branch from the LogMessage activity.

Do the following to add a branch and configure its condition to accept any last name:

1. Hover your mouse cursor over the LogMessage activity and click .

(19)

The branch gets added with the Add Activity dialog open.

2. Click the x on the upper right corner of the Add Activity dialog to close it.

3. Add a Return activity to the branch. To do so,

a. Hover your mouse cursor to the end of the branch and click the ( ) icon.

b. Scroll to the Default category and click it.

c. Click the Return card to add the activity.

d. Click the x to close the configuration dialog. You must now configure the Return activity with a condition to read the last name of the passenger.

4. Hover your mouse cursor to the end of the branch until you see a button with three dots placed horizontally.

Click the button to expose the following options:

Click ( ). The Branch Mapping Settings dialog opens.

Select the Success with condition branch condition.

1. Click condition to open the mapper on the right.

2. Configure the branch condition with a regular expression that accepts all last names.

1. Expand the string category under Functions and click regex(pattern, str) to add this function to the condition text box.

2. Replace pattern in the expression by manually entering ".*" (include the quotes too).

3. Replace str in the function with the last name that is mapped from the flow output under Upstream Output. To do so, expand $flow > body and click on LastName. Your condition

(20)

4. Click Save.

5. Configure the Return activity for the branch to output the flow results if this branch executes (when the passenger's last name is anything but Jones). To configure the activity, follow these steps:

1. Click on the Return activity to open its configuration.

2. Expand data under Flow Outputs.

3. Click code to open the mapper and enter 200 in the text box.

4. Expand data under Flow Outputs.

5. Click Class and enter "Economy".

6. Expand $flow > body under Upstream Output.

(21)

7. One by one, map all remaining elements of the flow outputs under data (Cost, DepartureDate, DeparturePoint, Destination, FirstName, and LastName) except ID, by first clicking on them under data and then clicking on the corresponding element under body. Do not map id.

8. Click id under data to configure it.

9. Expand the number category under Functions and click random().

10. Enter 999999 as an input parameter to the random() function.

11. Click Save.

12. Click x to close the dialog.

Your flow should continue to look like this:

Step 7: Add a Second Branch to Check for Last Name "Jones"

The second branch you add from the LogMessage activity checks the LastName element in the incoming request to see if it is "Jones". If the passenger's last name is "Jones", the passenger's seat is automatically upgraded to Business Class.

The string for the last name is case sensitive. So, "Jones" is viewed as different from "jones".

To add a second branch from the LogMessage activity, follow these steps:

1. Hover your mouse cursor over the LogMessage activity and click .

(22)

The branch gets added with the Add Activity dialog open.

2. Click the x on the upper right corner of the Add Activity dialog to close it.

3. Add a Return activity. To do so,

a. Hover your mouse cursor to the end of the branch and click the ( ) icon.

b. Scroll to the Default category and click it.

c. Click the Return card to add the activity.

d. Click the x to close the configuration dialog. You must now configure this branch with a condition to read the last name of the passenger and check to see if it is "Jones".

4. Hover your mouse cursor to the end of the branch until you see a button with three dots placed horizontally.

Click the button to expose the following options:

Click ( ). The Branch Mapping Settings dialog opens.

Select the Success with condition branch condition.

5. Configure the condition for the branch to check if the last name ends with "Jones".

The string for the last name is case sensitive. So, "Jones" is considered different from

"jones".

1. Click condition to open the mapper.

2. Expand $flow > body under Upstream Output.

3. Expand the string function group and click endsWith(str, substr).

4. Replace str by manually typing "Jones" (include the quotes).

The string for the last name is case sensitive. So, "Jones" is viewed as different from

"jones".

5. Select substr, then click LastName under body. This replaces the str with the last name extracted from the output of the ReceiveHTTPMessage trigger.

(23)

6. Click Save.

6. Configure the Return1 activity to send the flow results back to the trigger if the second branch executes (it will execute when the passenger's last name is Jones.).

a. Click Return1 to open its configuration dialog.

b. Expand data under Flow Outputs.

c. Click code and enter 200 in its text box.

d. Click Class under data and enter "Business Class" (include the surrounding double quotes).

e. Expand $flow > body under Upstream Output.

f. Map all remaining elements under data (Cost, DepartureDate, DeparturePoint, Destination, FirstName, and LastName) except id, by clicking on them one at a time and then clicking on the corresponding element under body. Do not map id.

g. Click Id under data to configure it.

(24)

h. Expand the number function and click random().

i. Enter 999999 as the input to the random() function.

j. Click Save.

k. Click x to close the dialog.

Your flow should look like the following:

Step 8: Validate the App

Your app is now ready. Before you push the app to the cloud, be sure to validate all the flows in order to confirm that there are no errors or warnings. To do so click the Validate button. TIBCO Cloud Integration - Flogo (PAYG) validates each flow and activity within the flow. If there are any errors or warnings, you see the respective icons next to the flow name or activity tab which contains the error or warning.

On successful validation, you get the following message:

(25)

App Development

TIBCO Cloud Integration - Flogo (PAYG) offers a wizard driven approach to app development. You can create apps in TIBCO Cloud Integration - Flogo (PAYG) using only a browser.

For more information about Project Flogo, go to http://flogo.io/.

Creating and Managing a Flogo App in the Web UI

This section describes how to create and manage Flogo apps.

Creating a TIBCO Flogo

®

App

You can create a Flogo® App from the Apps page in TIBCO Cloud Integration - Flogo® (PAYG).

Follow these steps to create an app:

Procedure

1. Open the Apps page in TIBCO Cloud Integration - Flogo (PAYG).

2. Click Create/Import app.

The app details page opens. By default, the app is named in a sequential order in the format

New_Flogo_App_<sequential_number>. For example, if you created three apps without renaming them, then the first one will have a default name of New_Flogo_App_1, the second one will be called

New_Flogo_App_2 and the third one will be called New_Flogo_App_3.

3. Edit the app name to a meaningful string. To do so, click anywhere within the app name and edit it, then click away to persist your change.

The app name must not contain any spaces. It must start with a letter or underscore and can contain letters, digits, periods, dashes, and underscores.

4. Click Create.

The card for an app type is disabled if the plan you purchased does not entitle you to create certain types of apps such as BusinessWorks app, Flogo app, Mock app or Node.js app, or use certain capabilities within an app type. For example, a Mashery plan may only allow the capability to create and run Mock and Node.js apps. So, if you log in with this plan you cannot create a Flogo or BusinessWorks app as the app cards for Flogo and BusinessWorks apps are disabled.

You can now create one or more flows for the app. See the Creating a Flow topic and its sub topics for details on creating a flow.

Creating an App from a Saved Specification

If you have a specification which you have saved either in TIBCO Cloud Integration - API Modeler or on your local machine, you can use the specification to create a Flogo App. Currently, TIBCO Cloud Integration - Flogo (PAYG) supports app creation using a Swagger specification, GraphQL Schema, or gRPC Protobuf.

The specification must exist prior to creating the Flogo App.

Refer to the appropriate topics under the Building APIs section for information on how to create a Flogo App using the specification:

Using a Swagger Specification Using GraphQL Schema

(26)

Using gRPC

Validating your App

After you have created the flows in your app, you must validate the app before you push it to the cloud.

To validate your app, click the Validate button on the app details page. This validates each flow and activity. If a flow or activity has an error, it displays an error or warning icon on the flow or activity.

TIBCO Cloud Integration - Flogo (PAYG) does not retain the results of the previous validation if you navigate into a flow after you have validated the app. For example, if two of your flows had errors, and you navigated into one of those flows to fix the error, when you get back to the app detail page, the results of the second flow validation will be lost. If you navigate into a flow after you have validated the app, you must validate the app again whether you made changes to the flow or not.

Refer to Viewing Errors and Warnings section for more details.

Renaming an App

You can rename an existing app.

To rename an existing app, do the following:

Procedure

1. Open the app details page by clicking on the app.

2. Click anywhere in the app name and edit the name.

3. Click away from the app name to persist your changes.

Reverting Changes to an App

After editing an existing app, as long as you have not the app, you can revert the app to the state that it was in after the latest . This will revert the changes you just made. You can use the button to undo the changes. The changes will be lost.

To revert your edits to an existing app before it, follow these steps:

Procedure

1. In the app details page, click the ( ) icon to reveal the options.

2. Click . The menu option is activated only if you have made edits to the app after the last , but have not the app with those edits.

Switching Between Display Views on the App Page

When you click an app on the Apps page, the app details page opens. The flows in the app are listed in the app details page. You have the option to view this page from a Trigger View or Flow View. By default, it opens in the Trigger View. Click Trigger View and select Flow View to switch to the flow

(27)

view. When you are in the flow view, click Flow View and select Trigger View from the drop down menu to go back to the trigger view.

Trigger View

In this view, the flows are displayed attached to the trigger(s) that they use. If a flow is attached to multiple triggers, it is attached to each trigger once, so you will see it multiple times in the page but attached to different triggers. Flows that are not attached to any trigger display No trigger in place of the trigger name.

Trigger View

In the image above, MyRESTFlow2 is attached to both TimerTrigger and ReceiveHTTPMessage trigger as shown, hence it appears twice. The MyTimerTrigger flow was created with a new Timer tigger, hence it is not attached to the top Timer trigger which has two flows attached to it and TimerTrigger appears twice on the page.

Hovering on a trigger displays the New flow button. Click on the New flow button to create a new flow to attach it to the trigger from which the button originated.

Hovering over No trigger displays the Add trigger button which takes you to the triggers catalog.

(28)

Flow View

In this view, each flow is shown separately and the trigger that it is attached to it is shown on the extreme left of the flow. Here is a Flow View representation of the Trigger View image above:

Flow View

Notice that MyRESTFlow2 shows two triggers. That is because this flow is attached to two triggers as you can see in the Trigger View. A blank flow shows 0 triggers against it as it is not attached to any triggers.

Deleting an App

You can delete an app using the Delete app button which appears when you hover your mouse cursor to the end of the app row.

To delete an app, do the following:

Procedure

1. On the Apps page, hover your mouse cursor to the end of the app row until the Delete app button ( ) appears.

2. Click the Delete app icon.

3. Click the Delete app icon.

Exporting and Importing an App

You can export and import apps and use them as templates to quick start development or simply put them in a version control system such as GitHub.

Exporting an App

Here are a few things to keep in mind before you export an app:

When you export an app, all flows in your app get exported. You cannot pick and choose flows to export.

Passwords configured in any activity within any flow or connection in the app to be exported will be stripped out in the exported app. You must manually configure the credentials in the flows after importing such apps.

Some apps created in Project Flogo use the any data type. The any data type is not supported in TIBCO Cloud Integration - Flogo (PAYG). Such apps get imported successfully, but the element of type any gets converted into an empty object. You must explicitly use the mapper to populate the empty object with member elements.

(29)

To export an app, follow these steps:

Procedure

1. On the Apps page, click the app to open the app details page.

2. Click the hamburger menu ( ).

3. Click Export.

Exporting an App's JSON File

When an App's binary is built, the .json file is embedded within the binary file. To export the .json file from the binary file to the disk, use the following command.

./<app-binary-name> --export app

The .json is exported as <app-binary-name>.json.

To provide a different file name to the exported .json, use the command:

./<app-binary-name> --export -o <new-app-binary-name>.json app

Importing an App

You can import the triggers and flows from an exported app into an existing app or into a new app. The target app into which you want to import must exist. You can import an app by dragging and dropping its .json file into the Web UI.

Flogo apps that are exported from TIBCO Cloud Integration - Flogo (PAYG) 2.5.0 and later cannot be imported into previous versions of TIBCO Cloud Integration - Flogo (PAYG).

Here are a few things to keep in mind before you import an app:

If any flow in the app uses extensions developed by the community, you need to make sure that those extensions are available to the app into which you are importing when importing. Flows that make use of extensions that are not present will not be imported.

Passwords configured in any activity within any flow or connection in the app to be exported will be stripped out in the exported app. You must manually configure the credentials in the flows after importing such apps.

Some apps created in Project Flogo use the any data type. The any data type is not supported in TIBCO Cloud Integration - Flogo (PAYG). Such apps get imported successfully, but the element of type any gets converted into an empty object. You must explicitly use the mapper to populate the empty object with member elements.

When importing an app, be aware that the long and double data types get converted to the number data type.

When importing an app containing a connection, if you have an existing connection with an identical internal ID as the connection in the app being imported, a new connection does not get created. The imported app uses the existing connection in such a case. However, since the connection credentials do not get exported with the app, if a new connection gets created, you must re-configure the connection credentials after the app has been imported.

(30)

The suffixes used in the Mapper have undergone some changes, because of which, you may receive a mapper-related warning in the Import app dialog when importing an existing app. Click Continue and the app will import successfully. After the import completes, be sure to re-map the properties in the activities that show errors. This will ensure that they switch to the new suffix format. The following table shows you the changes in the suffixes:

Original suffix appearing in imported apps

New suffix used by the Mapper (after you re-

map) For example...

Used when mapping...

activity_id.activity_pa

rameter $activity[activity_id].activit

y_parameter Old suffix:

$InvokeRESTService.r esponseBody.userId

New suffix after re- mapping property:

$activity[InvokeREST Service].responseBod y.userId

When mapping to a parameter in the activity's output.

Used to resolve activity params.

$TriggerData $trigger Old suffix:

$TriggerData.queryPa rams.title

New suffix after re- mapping property:

$trigger.queryParams .title

When mapping from the output of the trigger to flow input

N/A

There was no equivalent for this in the old mapper

$flow.headers.parameter

$flow.body.parameter

$flow is a newly introduced suffix which did not have an

equivalent suffix in the old mapper

When mapping to any parameter in the flow's header or input schema (schema entered in the Input tab of Flow Inputs &

Outputs dialog) which is the same as the output of the trigger since the output of the trigger is mapped to the input of the flow in a blank flow.

Used to resolve parameters from within the current flow. If a flow has a single trigger and no input

parameters defined, then the output of

(31)

Original suffix appearing in imported apps

New suffix used by the Mapper (after you re-

map) For example...

Used when mapping...

the trigger is made available via $flow

In imported apps, the passwords and secrets for any connections configured in the app do not get imported. You must reconfigure any password or secret for the connection after the app has been imported.

When you import an app which does not have a Return activity in any flow (main or branched flow), the Return activity is not added automatically by default. However, if an existing app already has Return activities in main or branched flows, the app is imported as expected.

Importing into a new or empty app

1. Create a new app if you do not already have one. See Creating a Flogo App for details on creating an empty app.

2. On the app details page, select Import app.

3. Navigate to or drag and drop the .json file for the app that you want to import.

4. Click Upload. The Import app dialog displays some generic errors and warnings as well as any specific errors or warnings pertaining to the app you are importing. It validates whether all the activities and triggers used in the app are available in the Extensions tab.

5. You have the option to import all flows from the source app or selectively import flows.

Import all - To import all the triggers and flows in the app, select Import All. If any activities/

triggers are missing in the Extensions tab, the import process ignores the flows that contain those activities and those flows are not imported. If the existing app already has activities or triggers with the same name as the ones you are importing, you see a warning that they will be overwritten. If you do not want to overwrite the flows, you can click Back and clear the

selection and click Next. If you do so, the duplicate flows that you de-selected will not get imported. You have the option to rename the flows in the Web UI and export the app and re- import it.

Selective import - Select Selective Import, to import only specific triggers and flows from the app. The Import app dialog displays a list of triggers with a check box next to each one. If any activities/triggers are missing in the Extensions tab, the activities/triggers missing in the Extensions tab are not listed in the Import app dialog, hence you will not be able to select them to import. By default, all check boxes are selected. Clear the check box next to the triggers that you do not want to import. By default, all flows associated with the selected trigger(s) get imported. If you do not select a trigger, the flows and their subflows associated with the unselected trigger(s) are listed in the next screen.

6. Click Next.

If you had not selected a trigger in the previous dialog, the flows associated with that trigger are displayed. You have the option to select one or more of these flows such that the flows get imported as blank flows that are not attached to any trigger. By default, all flows are selected. Clear the check box for the flows that you do not want to import. If your flow(s) have subflows, and you select only the main flow but do not select the subflow, the main flow gets imported without the subflow. Click Next.

Importing into an app that has existing flows

When importing the app into another app that has existing flows, keep the following in mind:

(32)

If the existing app already has flows, activities or triggers with the same name as the ones you are importing, you see a warning that they will be overwritten. In such a situation, you can opt not to import those flows, activites or triggers. You can go back and rename them in the Web UI and export the app again and re-import it.

If any of the flows that were imported with the app had credentials such as password or a connection, be sure to re-configure them.

1. Open the app details page by clicking on the app name.

2. Click the hamburger menu ( ) and select Import.

3. Navigate to or drag and drop the .json file for the app that you want to import.

4. Click Upload. The Import app dialog displays some generic errors and warnings as well as any specific errors or warnings pertaining to the app you are importing. It validates whether all the activities and triggers used in the app are available in the Extensions tab.

5. You have the option to import all flows from the source app or selectively import flows.

Import all - To import all the triggers and flows in the app, select Import All. If any activities/

triggers are missing in the Extensions tab, the import process ignores the flows that contain those activities and those flows are not imported. If the existing app already has activities or triggers with the same name as the ones you are importing, you see a warning that they will be overwritten. If you do not want to overwrite the flows, you can click Back and clear the

selection and click Next. If you do so, the duplicate flows that you de-selected will not get imported. You have the option to rename the flows in the Web UI and export the app and re- import it.

Selective import - Select Selective Import, to import only specific triggers and flows from the app. The Import app dialog displays a list of triggers with a check box next to each one. If any activities/triggers are missing in the Extensions tab, the activities/triggers missing in the Extensions tab are not listed in the Import app dialog, hence you will not be able to select them to import. By default, all check boxes are selected. Clear the check box next to the triggers that you do not want to import. By default, all flows associated with the selected trigger(s) get imported. If you do not select a trigger, the flows and their subflows associated with the unselected trigger(s) are listed in the next screen.

6. Click Next.

If you had not selected a trigger in the previous dialog, the flows associated with that trigger are displayed. You have the option to select one or more of these flows such that the flows get imported as blank flows that are not attached to any trigger. By default, all flows are selected. Clear the check box for the flows that you do not want to import. If your flow(s) have subflows, and you select only the main flow but do not select the subflow, the main flow gets imported without the subflow. Click Next.

Importing flows without importing the trigger to which they are attached

If you want to import only the flows without importing the triggers that they are attached to, select Selective Import when importing the app, and clear the check box for the triggers that you do not want to import. When you click Next, the flows attached to the triggers that you will not be importing are listed. Select the flows that you would like to import and click Next. The flows get imported as blank flows without being attached to a trigger.

Handling connections when importing an app

Each connection in TIBCO Cloud Integration - Flogo (PAYG) contains a unique internal ID. The IDs are not exposed in the Web UI and are unique based on the user who created them.

When TIBCO Cloud Integration - Flogo (PAYG) compares connections, it does so by comparing their internal IDs. It considers two connections identical if they have the same connection type and same

(33)

connection ID. It considers two connections as similar, if they have the same connection type, but different connection ID.

Hence, if the app you are importing was not created by you, then any connections used in that app can not have the same ID as any existing connection of the same type that you might already have in your installation of TIBCO Cloud Integration - Flogo (PAYG). For example, if you import an app created by some other user that has some Salesforce connections, even though your installation of TIBCO Cloud Integration - Flogo (PAYG) might already have some existing Salesforce connections, the connections will be considered similar because they are of the same type (Salesforce) but not identical because they do not have the same ID.

Keep the following in mind when you import an app with connections:

Import all

If you had selected Import all when importing the app, you have the following options:

If you are the owner who created the app to be imported, if identical connections exist in your environment, the existing connections will automatically be re-used.

If identical connections do not exist, then new connections get created without passwords. You must set the password for such connections after the app has been imported.

If there are similar connections (same type but different IDs) in the host app, TIBCO Cloud Integration - Flogo (PAYG) does not re-use those connections. It creates new connections without passwords. You must set the password for such connections after the app has been imported.

Selective import

If you chose to do a selective import when importing an app, the Import app dialog lists the connections that are used in the flows and triggers that you selected for import in the app to be imported. It displays a drop-down menu next to each connection. You have the following options:

If you have any existing identical connections (same connection type and same connection ID) in the host app, that connection will automatically be selected in the drop-down menu next to the

connection. You have the option to re-use the existing identical connection.

If there are any similar connections in the host app (same connection type but different connection ID), you can select the similar connection instead from the drop-down menu next to it.

You always have the option to select Create new connection from the drop-down menus for any of the connections. TIBCO Cloud Integration - Flogo (PAYG) creates new connections with no

passwords. You must manually create a password for the new connection after importing the app.

Creating Flows and Triggers

An app can have one or more flows and a flow can be attached to one or more triggers.

Flows

Each flow represents specific business logic in an app. A flow contains one or more activities. The flow execution is started by a trigger. A new flow can be created only from the app details page.

Triggers

You have the option to create a trigger without creating a flow. You can create a trigger from an existing specification that you have saved in either the TIBCO Cloud Integration - API Modeler or on your local machine. Optionally, you can create a trigger when creating a flow by selecting the Start with a trigger option during flow creation. A trigger can have multiple flows attached to it.

Flows

An app can contain one or more flows. This section contains information on creating and managing flows in your app.

(34)

Creating a Flow

Every app has at least one flow. Each flow can be attached to one or more triggers. You have the option to begin by creating a blank flow (flow without a trigger) too and attaching the flow to one or more triggers at a later time. Use the Create link on the app details page to create the first flow in an app. If there are existing flows in an app, click the Create button to create additional flows.

Prerequisites

Before creating a flow that uses connectors, make sure that you have created the necessary connections.

If an app has multiple triggers that require a port to be specified, for example REST and/or GraphQL triggers, make sure that the port number is unique for each trigger. Two triggers in the same app cannot run on the same port.

A flow can be attached to multiple triggers. For such flows, you cannot disable a trigger, specify a particular trigger to execute, or specify the order in which the triggers execute. When a flow executes, all triggers get initialized in the order that they appear within the flow.

The output of a trigger provides the input to the flow. Hence, it must be mapped to the flow input. In the absence of a trigger, when creating a flow, there must be a well-defined contract within the flow which specifies the input to the flow and the output expected after the flow completes execution. You define this contract in the Flow Inputs & Outputs dialog. The Flow Inputs & Ouputs contract works as a bridge between the flow and the trigger, hence every trigger has to be configured to map its output to the Input parameters defined in Flow Inputs & Ouputs. You do this in the Map to Flow Inputs tab of the trigger.

Likewise, for triggers such as the ReceiveHTTPMessage REST trigger that send back a reply to the caller, the trigger reply must be mapped to the flow outputs (parameters configured in the Output tab of the Flow Inputs & Ouputs accordian tab). You do this mapping in the Map from Flow Outputs tab of the trigger.

A Return activity is not added by default. Depending on your requirements, you must add and configure the Return activity manually. For example, if any trigger needs to send a response back to a server, its output must be mapped to the output of the Return activity in the flow.

The Map Outputs tab of the Return activity displays the flow output schema that you configured in the Output tab of the Flow Inputs & Outputs accordion tab. The Map from Flow Output tab of the trigger constitutes the trigger reply. This tab also displays the flow output schema that you configured in the Output tab of the Flow Inputs & Outputs accordion tab.

You must do the following when using a ReceiveHTTPMessage REST trigger:

Add a Return activity at the end of the flow.

In the Map Outputs tab of the Return activity, map the elements in the schema to the data coming from the upstream activities.

In the Map from Flow Output tab of the trigger, map the trigger reply elements to the flow output elements.

Follow these steps to create a flow:

Procedure

1. Click an app name on the Apps page in TIBCO Cloud Integration - Flogo (PAYG) to open its page.

2. Click the Create link if this is the first flow in the app. If one or more flows exist, click the Create button.

The Add triggers and flows dialog opens.

3. Enter a name for the flow in the Name text box.

(35)

Flow names within an app must be unique. An app cannot contain two flows with the same name.

4. Optionally, enter a brief description of what the flow does in the Description text box. The Flow option is selected by default.

To create a flow from a specification, select the specification under Start with and refer to the appropriate section under Building APIs.

5. Click Create.

You will be prompted to select one of the following options:

Start with a trigger - If you know the trigger with which you want to activate the flow, select this option. If this is the first flow, the Trigger catalog opens. Select a trigger from the catalog. Refer to the appropriate section under Starting with a Trigger for more details on the the type of trigger that you want to create. If there are existing flows attached to triggers, you get a dialog which gives you an option to either use an existing trigger or use a new trigger that has not been used in an existing flow within the app.

Configure flow inputs and outputs - Select this option if you know the algorithm for the flow, but do not yet know the circumstances that will cause the flow to execute. It will create a blank flow that is not attached to any trigger. Flow inputs and outputs create a contract between the trigger and the flow. When you create a trigger, you must map the output of the trigger to the input to the flow. This contract serves as a bridge between the trigger and the flow. You have the option to attach your flow to one or more triggers at any later time after the flow has been created.

A flow gets created. If you selected Start with a trigger, the flow is attached to the trigger you selected. If you selected Configure flow inputs and outputs, a blank flow without a trigger gets created.

Selecting a Trigger When Creating a New Flow

When creating a new flow, you have the option to either select an existing trigger or select one from the triggers catalog.

Trigger configuration fields are categorized into two groups as explained below. A single trigger can be associated with multiple handlers.

Trigger Settings - these settings are common to the trigger across all flows that use that trigger. If and when a flow attached to the trigger changes any Trigger Settings field, the change gets propagated to all flows attached to the trigger. A warning message gets displayed saying so and asking you to confirm before the changes are committed.

Handler Settings - these settings are applicable to a specific flow attached to the trigger. Hence, each flow can set its own values for the Handler Settings fields in the trigger. To do so, open the flow and click on the trigger to open its configuration dialog. Click the Settings tab and edit the fields in the Handler Settings section.

參考文獻

相關文件

Once you have created a complete dialog with widgets or arbitrary window hier- archy, the Interface Builder generates the source code needed to recreate it programmati- cally and

In taking up the study of disease, you leave the exact and certain for the inexact and doubtful and enter a realm in which to a great extent the certainties are replaced

If you see difficult sentences/ a difficult sentence or have (any) questions / a question, going over/through (=browsing) the article(s) again.. can/may help you

Once you get down to a purely business level, your influence is gone and the true light of your life isdimmed. You must work in the missionary spirit, with a breadth of charity

According to the regulations, the employer needs to provide either a mobile or landline phone number at which the employer (or a contact person) can be reached.. If

 If I buy a call option from you, I am paying you a certain amount of money in return for the right to force you to sell me a share of the stock, if I want it, at the strike price,

(a) In your group, discuss what impact the social issues in Learning Activity 1 (and any other socials issues you can think of) have on the world, Hong Kong and you.. Choose the

Split attractor flow conjecture: a four dimensional multi-center solution exist if and only if there exist a split attractor flow tree in the moduli space.. • Split attractor