The Power of GEL Scripting to Enhance Functionality

Slides:



Advertisements
Similar presentations
PHP II Interacting with Database Data. The whole idea of a database-driven website is to enable the content of the site to reside in a database, and to.
Advertisements

Introducing JavaScript
Presented by Douglas Greer Creating and Maintaining Business Objects Universes.
JavaScript FaaDoOEngineers.com FaaDoOEngineers.com.
1.  Understanding about How to Working with Server Side Scripting using PHP Framework (CodeIgniter) 2.
1 Configuring Internet- related services (April 22, 2015) © Abdou Illia, Spring 2015.
Clarity Educational Community Clarity Educational Community Integration Interface Strategies and Methods.
1 Chapter 12 Working With Access 2000 on the Internet.
DT211/3 Internet Application Development
DT228/3 Web Development JSP: Directives and Scripting elements.
DT228/3 Web Development Databases. Database Almost all web application on the net access a database e.g. shopping sites, message boards, search engines.
ASP.NET Programming with C# and SQL Server First Edition Chapter 8 Manipulating SQL Server Databases with ASP.NET.
Chapter 7 Managing Data Sources. ASP.NET 2.0, Third Edition2.
Introduction to XML This material is based heavily on the tutorial by the same name at
Form Handling, Validation and Functions. Form Handling Forms are a graphical user interfaces (GUIs) that enables the interaction between users and servers.
Chapter 9 Collecting Data with Forms. A form on a web page consists of form objects such as text boxes or radio buttons into which users type information.
DAT602 Database Application Development Lecture 15 Java Server Pages Part 1.
Lecture 3 – Data Storage with XML+AJAX and MySQL+socket.io
M. Taimoor Khan * Java Server Pages (JSP) is a server-side programming technology that enables the creation of dynamic,
JSP Standard Tag Library
PHP Tutorials 02 Olarik Surinta Management Information System Faculty of Informatics.
REFACTORING Lecture 4. Definition Refactoring is a process of changing the internal structure of the program, not affecting its external behavior and.
MySQL in PHP – Page 1 of 17CSCI 2910 – Client/Server-Side Programming CSCI 2910 Client/Server-Side Programming Topic: MySQL in PHP Reading: Williams &
CSCI 6962: Server-side Design and Programming JDBC Database Programming.
Overview of Previous Lesson(s) Over View  ASP.NET Pages  Modular in nature and divided into the core sections  Page directives  Code Section  Page.
Copyright ®xSpring Pte Ltd, All rights reserved Versions DateVersionDescriptionAuthor May First version. Modified from Enterprise edition.NBL.
1 PHP and MySQL. 2 Topics  Querying Data with PHP  User-Driven Querying  Writing Data with PHP and MySQL PHP and MySQL.
Using JavaBeans and Custom Tags in JSP Lesson 3B / Slide 1 of 37 J2EE Web Components Pre-assessment Questions 1.The _____________ attribute of a JSP page.
ADO.NET A2 Teacher Up skilling LECTURE 3. What’s to come today? ADO.NET What is ADO.NET? ADO.NET Objects SqlConnection SqlCommand SqlDataReader DataSet.
JSP Java Server Pages Softsmith Infotech.
Clarity Educational Community Updates and Automation Getting Started with GEL Scripts Presented by : Virginia DeCeglia & Chris Shaffer.
COLD FUSION Deepak Sethi. What is it…. Cold fusion is a complete web application server mainly used for developing e-business applications. It allows.
Clarity Educational Community Enhanced Functionality and Integration Advanced GEL Scripts Presented by: James Gille | Date Prepared:
LiveCycle Data Services Introduction Part 2. Part 2? This is the second in our series on LiveCycle Data Services. If you missed our first presentation,
Tom Castiglia Hershey Technologies
JAVA SERVER PAGES. 2 SERVLETS The purpose of a servlet is to create a Web page in response to a client request Servlets are written in Java, with a little.
XP Tutorial 10New Perspectives on Creating Web Pages with HTML, XHTML, and XML 1 Working with JavaScript Creating a Programmable Web Page for North Pole.
Creating Dynamic Web Pages Using PHP and MySQL CS 320.
NMED 3850 A Advanced Online Design January 12, 2010 V. Mahadevan.
Chapter 3 Servlet Basics. 1.Recall the Servlet Role 2.Basic Servlet Structure 3.A simple servlet that generates plain text 4.A servlet that generates.
JSTL Lec Umair©2006, All rights reserved JSTL (ni) Acronym of  JavaServer Pages Standard Tag Library JSTL (like JSP) is a specification, not an.
Chapter 6 Server-side Programming: Java Servlets
7 1 Chapter 7 Introduction to Structured Query Language (SQL) Database Systems: Design, Implementation, and Management, Seventh Edition, Rob and Coronel.
Database Systems Design, Implementation, and Management Coronel | Morris 11e ©2015 Cengage Learning. All Rights Reserved. May not be scanned, copied or.
Java server pages. A JSP file basically contains HTML, but with embedded JSP tags with snippets of Java code inside them. A JSP file basically contains.
DT228/3 Web Development Databases. Querying a database: Partial info Search engines, on-line catalogues often need to allow user to search a database.
1 Web Servers (Chapter 21 – Pages( ) Outline 21.1 Introduction 21.2 HTTP Request Types 21.3 System Architecture.
1 Theory, Practice & Methodology of Relational Database Design and Programming Copyright © Ellis Cohen Implementing The Middle Tier These slides.
Chapter 9: Advanced SQL and PL/SQL Guide to Oracle 10g.
Web111a_chapt08.ppt HTML: Section 8 JavaScript CGI Programs (Server Side programs) Common Gateway Interface Run on server Communicate with user across.
Implementing and Using the SIRWEB Interface Setup of the CGI script and web procfile Connecting to your database using HTML Retrieving data using the CGI.
ICM – API Server & Forms Gary Ratcliffe.
8 Chapter Eight Server-side Scripts. 8 Chapter Objectives Create dynamic Web pages that retrieve and display database data using Active Server Pages Process.
CSC 405: Web Application Engineering II8.1 Web programming using PHP What have we learnt? What have we learnt? Underlying technologies of database supported.
NMD202 Web Scripting Week2. Web site
Text TCS INTERNAL Oracle PL/SQL – Introduction. TCS INTERNAL PL SQL Introduction PLSQL means Procedural Language extension of SQL. PLSQL is a database.
Session 11: Cookies, Sessions ans Security iNET Academy Open Source Web Development.
Retele de senzori Curs 2 - 1st edition UNIVERSITATEA „ TRANSILVANIA ” DIN BRAŞOV FACULTATEA DE INGINERIE ELECTRICĂ ŞI ŞTIINŢA CALCULATOARELOR.
MICROSOFT ACCESS – CHAPTER 5 MICROSOFT ACCESS – CHAPTER 6 MICROSOFT ACCESS – CHAPTER 7 Sravanthi Lakkimsety Mar 14,2016.
 CONACT UC:  Magnific training   
Interstage BPM v11.2 1Copyright © 2010 FUJITSU LIMITED INTEGRATION.
SOAP, Web Service, WSDL Week 14 Web site:
Lawson Mid-America User Group Spring 2016 Meeting.
ASP.NET Programming with C# and SQL Server First Edition
Data Virtualization Tutorial: Introduction to SQL Script
z/Ware 2.0 Technical Overview
ISC440: Web Programming 2 Server-side Scripting PHP 3
Configuring Internet-related services
Web DB Programming: PHP
Lecture 5: Functions and Parameters
Presentation transcript:

The Power of GEL Scripting to Enhance Functionality Hidden Automation The Power of GEL Scripting to Enhance Functionality

Topics Background of GEL Basic Script Structure Commonly Used Tags Hands on exercises with creating GEL Scripts Best Practices Real-life Examples Q&A

Background of GEL GEL (Generic Execution Language) is a tool you can use to turn XML into executable code. It is based on Jelly, a jakarta.apache.org Commons project. It has been extended and embedded into CA Clarity PPM to enable custom logic to solve business problems. Additional information can be found in the CA Documentation (CAClarityPPM_XOG_DeveloperGuide_ENU.pdf) and at the Apache Jelly website at http://jakarta.apache.org/commons/jelly/index.html.

GEL Setup The GEL run-time is packaged with XOG in the XOG client. Once the client is installed, you can use the GEL command in the bin directory of the XOG client to validate and execute GEL scripts. GEL can also be used within Clarity processes.

Script Structure <gel:script xmlns:core="jelly:core" xmlns:gel="jelly:com.niku.union.gel.GELTagLibrary" xmlns:sql="jelly:sql" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <!-- CODE GOES HERE --> </gel:script> Header Comment Footer

GEL Tags A GEL script is an executable XML file that is built from qualified elements bound to Java code called tags. Using namespace declarations, tags are organized into tag libraries which are made available in a script. Hello World Example: <gel:script xmlns:core="jelly:core" xmlns:gel="jelly:com.niku.union.gel.GELTagLibrary"> <core:forEach indexVar='i' begin='1' end='3'> <gel:out>Hello World ${i}!</gel:out> </core:forEach> </gel:script> Note: An entire script always resides within the GEL script tag.

Common Namespaces xmlns:core="jelly:core" xmlns:gel="jelly:com.niku.union.gel.GELTagLibrary" xmlns:sql="jelly:sql" xmlns:xog=http://www.niku.com/xog" xmlns:soap="jelly:com.niku.union.gel.SOAPTagLibrary" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:file="jelly:com.niku.union.gel.FileTagLibrary" xmlns:util="jelly:util" xmlns:email="jelly:email" xmlns:ftp="jelly:com.niku.union.gel.FTPTagLibrary"

Variables Variables are used extensively throughout GEL scripts. Many tags can set variables. An example of a tag that can set variables is core:set. You can use the common syntax ${variable_name} to reference variables. In the Hello World example, 'i' is a variable which is set by the forEach tag and is incremented with each loop. Hello World Example: <gel:script xmlns:core="jelly:core" xmlns:gel="jelly:com.niku.union.gel.GELTagLibrary"> <core:forEach indexVar='i' begin='1' end='3'> <gel:out>Hello World ${i}!</gel:out> </core:forEach> </gel:script>

Commonly Used Tags Conditionals / Loops Variables / Parameters Database Operations Logging Exception SOAP / XOG File Operations Email

Conditionals / Loops <core:if> <core:if test="${hasDocs}"> … </core:if> <core:choose> <core:when test="${row[6].equals("")}"> </core:when> <core:otherwise> </core:otherwise> </core:choose>

Conditionals / Loops cont. <core:forEach> <core:forEach trim="true" items="${queryResult.rows}" var="row"> … </core:forEach> <gel:forEach> <gel:forEach select="$projectsXML/NikuDataBus/Projects/Project" var="currentPrj"> </gel:forEach> Note that there are two separate forEach loop types. The core version performs basic FOR looping. If you need to retrieve values from an XML document to use in the loop condition (that is, need to use a SELECT clause), then you need the GEL implementation.

Variables <gel:parameter> This tag allows values to be passed into a GEL script from a CA Clarity PPM process. Inside the GEL script, you can refer to the parameter as you would any other variable (that is, using the ${variablename} syntax). The optional attribute secure="true" causes CA Clarity PPM to hide the actual value in the user interface with asterisks (*). <gel:parameter var="XOGUsername" default="admin"/> <gel:parameter var="XOGPassword" default="password" secure="true"/>

Variables cont. <core:set> This tag is used to set basic variables; that is, ones that do not need to be extracted from an XML document. Refer to the variable using the ${variablename} syntax. <core:set value="1" var="yes"/> <gel:out>${yes}</gel:out> You can do some basic math on the variable: <gel:out>${yes+2}</gel:out> <gel:set> Use this tag when it is necessary to extract the value of the variable from an XML document. This tag differs from the <core:set> tag in that it takes a select attribute which in turn requires an XPath statement. If you are unfamiliar with XPath, think of it as a hierarchy mapping of the XML document. In the example below, the select statement points the way to the Statistics node of a XOG output file. <gel:set asString="true" select="$result//XOGOutput/Statistics" var="xogStats"/>

Variables cont. <gel:persist> This tag allows you to set variables with a scope that extends beyond the current script. <gel:parse> The <gel:parse> tag is used to create an XML document in memory. This is how you will build XOG requests. The tag can be used to generate an entire XML document, or specific nodes that can later be attached into an existing XML document. <gel:parse var="loadContent"> <NikuDataBus xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance xsi:noNamespaceSchemaLocation="../xsd/nikuxog_resource.xsd"> <Header version="12.0.0.5028" action="write" objectType="resource“ externalSource=“PS"/> <Resources> <Resource resourceId="abc" isActive="true"> <PersonalInformation lastName="doe" firstName="john" emailAddress="jdoe@ca.com"/> </Resource> </Resources> </NikuDataBus> </gel:parse>

Built-in Parameters Custom Action GEL scripts associated with processes have the following parameters available to them: Object instance ID If no object is associated with the process, the ID is -1. Otherwise the ${gel_objectInstanceId} parameter contains the object instance ID. Process ID ${gel_processId} is the process identifier; all instances of this process share this identifier. Process instance ID ${gel_processInstanceId} is the process instance identifier; all instances have a unique value. All built-in parameters have a "gel_" prefix and are of data type - numeric.

Case Sensitive Issues Information contained within GEL tags is case sensitive. For example, if you declare a variable as follows: <core:set var="v_ProjectID">PRJ-123456</core:set> Then reference the variable as follows: <gel:out>${v_projectid}</gel:out> This will not output PRJ-123456. However, this will not cause an actual error to occur, so you can’t “catch” this error.

Database Operations Datasources SQL Queries SQL Updates SQL Bind Variables / Parameters Transactions

Datasources There are a couple of methods you can use within GEL to connect to your Clarity database. The recommended method is to use: <gel:setDataSource/> The tag takes the database id attribute as follows: <gel:setDataSource dbId="Niku" [var="clarityDS"]/> The above tag takes the connection properties (including password) from Clarity’s properties (set in the CSA). Niku, in the above example, is the ID of the default internal Clarity database. If you create additional external database definitions, you can reference them in the same manner. For example, if you added a second database connection definition called “ORA-FIN” you could reference it as follows: <gel:setDataSource dbId="ORA-FIN"/>

Datasources cont. Note that the var attribute is optional. If you do not specify a variable, the tag uses the default, and all subsequent SQL calls will use the same default. For example, you can do: <gel:setDataSource dbId="Niku"/> <sql:query var="result"> SELECT 1 from dual </sql:query> OR <gel:setDataSource dbId="Niku" var="clarityDS"/> <sql:query dataSource="${clarityDS}" var="result">

Datasources cont. <sql:setDataSource> Reasons to use the <sql:setDataSource> tag You are unable to add the database connection to the CSA You need to connect to a DB that isn’t Oracle or SQL Server You want to run the script from the command line and don’t have a copy of the properties.xml file on your computer <sql:setDataSource url="jdbc:oracle:thin:@localhost:1521:NIKU” driver="oracle.jdbc.driver.OracleDriver” user="${ClarityUser}" password="${ClarityPassword}" var="clarityDS"/> Note: The above example allows you to have more than one datasource defined, and to specify which datasource to use through the “clarityDS” variable.

SQL Query The following is an example of a simple SQL query called from within a GEL script <sql:query dataSource="${clarityDS}" escapeText="0" var="result"> <![CDATA[ SELECT r.full_name resName, r.email resEmail FROM srm_resources r ]]> </sql:query> This query returns data in an array (for all intents and purposes) with the name “result.” Note: Due to the nature of XML, using certain characters (‘<‘, ‘>’) within your query would cause an error without enclosing the query in the CDATA tag. Because of this, it is a best practice to include this tag in all queries.

SQL Query cont. You can then access the data in the “result” array using the <core:forEach> tag. There are a couple of different ways to do this: <!-- By Index --> <core:forEach trim="true" items="${result.rowsByIndex}" var="row"> <gel:out>Resource Name: ${row[0]}</gel:out> </core:forEach> <!-- By Column Name (Preferred Method) --> <core:forEach trim="true" items="${result.rows}" var="row"> <gel:out>Resource Name: ${row.resName}</gel:out> Note: When possible, avoid setting a bunch of variables with the results of the query.

SQL Update Often times processes require updating the values of specific attributes. One of the ways to do this is with a SQL Update statement. Keep in mind the following when performing direct database updates Generally speaking, it is best to avoid Insert statements – these are best suited for XOG Direct database updates will not trigger a process to start – XOG updates typically will trigger processes to start Avoid updating OOTB tables when possible – using XOG will ensure all Clarity business rules are followed It is generally safe to update custom attributes with a SQL update. These are typically found in tables beginning with odf_ca Extra caution should also be used within On-demand environments

SQL Update cont. Example <sql:update dataSource="${clarityDS}" escapeText="0" var="updateCnt"> <![CDATA[ UPDATE odf_ca_project ocp SET ocp.rego_appr_date = sysdate WHERE ocp.id = ${gel_objectInstanceId} ]]> </sql:update> The variable ${updateCnt} will contain the number of rows that the update statement affects Note: Using CDATA tags in update statements is also preferred.

SQL Bind Variables / Parameters Many times SQL statements will include variables that are passed in to the statement. It is best to set these up as parameters within the SQL Statement. This serves a couple of purposes: Ensures data types are correct Prevents SQL injection Allows reuse of SQL statements for performance gains Example: <sql:update dataSource="${clarityDS}" escapeText="0" var="updateCnt"> <![CDATA[ UPDATE odf_ca_project ocp SET ocp.rego_appr_date = sysdate, ocp.rego_resource = ? WHERE ocp.id = ? ]]> <sql:param value="${row.resourceId}"/> <sql:param value="${gel_objectInstanceId}"/> </sql:update> Note: You must have a <sql:param> tag for each ? in the SQL statement, even if they are using the same value. The parameters also must be placed in the order that they appear in the statement.

SQL Transaction Very Useful if you need your updates to be “All or Nothing” <sql:transaction dataSource="${clarityDS}"> <core:set value="0" var="errorCnt"/> <core:catch var="sqlException"> <sql:update escapeText="0" var="updateCnt"> <!-- SQL UPDATE --> </sql:update> </core:catch> <core:if test="${!empty sqlException}"> <core:set value="1" var="errorCnt"/> </core:if> <!-- COMMIT OR ROLLBACK SQL TRANSACTION --> <core:choose> <core:when test="${errorCnt == 0}"> <!-- COMMIT TRANSACTIONS --> <sql:update>COMMIT</sql:update> </core:when> <core:otherwise> <!-- ROLLBACK TRANSACTIONS --> <sql:update>ROLLBACK</sql:update> </core:otherwise> </core:choose> </sql:transaction>

Logging Messages Use this tag to insert status messages into the process engine log table Very useful when debugging scripts Avoid using too many logging statements, as it can impact performance Different levels of logging – INFO, WARN, ERROR <gel:log level="INFO">This is an example log message.</gel:log>

Exceptions Use the GEL fault-handling tags to catch exceptions and exit gracefully when a process failure occurs. Use the <core:catch> tag to capture exceptions into a variable. Outside of the catch tags, you can check the variable and write it to the console. Example: <core:catch var="sqlException"> <sql:query dataSource="${clarityDS}" escapeText="0" var="result"> <![CDATA[ SELECT r.id, FROM srm_resources r ]]> </sql:query> </core:catch> <core:if test="${!empty sqlException}"> <gel:log level="ERROR">Exception: ${sqlException}</gel:log> </core:if>

Hands On Exercises Clarity Environment: http://54.193.48.58:8081/niku/nu#action:homeActionId Username: regou Password: Clarity123 Note: When creating processes, please distinguish your process from others by using your name in the process name and id Example:

Limitations to Rego U Environment URLs are not set up correctly in the properties.xml file. This means that if you need to reference the URL, you’ll have to hard-code it. Example: <gel:parameter var=“URL" default="http://54.193.48.58:8081"/> Caching Issues

Exercise #1 Create a process that uses a GEL script to update the following fields on the project object: Approved By (rego_appr_by): Resource that started the process Approval Date (rego_appr_date): Today’s Date Note: Environment is an Oracle environment Approved By field uses the Resource Browse lookup (srm_resources.id)

Exercise #1 Hint SQL to update project fields: UPDATE odf_ca_project ocp SET ocp.rego_appr_date = sysdate, ocp.rego_appr_by = (SELECT r.id FROM bpm_run_processes brp JOIN srm_resources r ON brp.initiated_by = r.user_id WHERE brp.id = ?) WHERE ocp.id = ?

Exercise #1 Review

SOAP / XOG By including the SOAP and XOG namespaces in GEL scripts, you give GEL the ability to communicate with the XOG web service. You must package each invocation in a proper SOAP envelope. The following steps must be used within a GEL script to communicate with the XOG web service: Include the proper namespaces Obtain a session ID Create the XML file to send Execute the XOG Parse the Results Logout

XOG - Include the proper namespaces <gel:script xmlns:core="jelly:core“ xmlns:gel="jelly:com.niku.union.gel.GELTagLibrary“ xmlns:xog="http://www.niku.com/xog" xmlns:soap="jelly:com.niku.union.gel.SOAPTagLibrary" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">

XOG - Obtain a Session ID <!-- Get sessionId by username --> <gel:parameter var="username" default="admin"/> <core:new className="com.niku.union.security.DefaultSecurityIdentifier" var="secId" /> <core:invokeStatic var="userSessionCtrl" className="com.niku.union.security.UserSessionControllerFactory" method="getInstance" /> <core:set var="secId" value="${userSessionCtrl.init(username, secId)}"/> <core:set var="XOGUsername" value="${secId.getUserName()}"/> <core:set var="sessionID" value="${secId.getSessionId()}"/> <core:choose> <core:when test="${sessionID == null}"> <gel:log level="ERROR"> Unable to obtain a Session ID. </gel:log> </core:when> <core:otherwise> <!-- Execute XOG --> </core:otherwise> </core:choose>

XOG - Create the XML File Example: <gel:parse var="userXML"> <NikuDataBus xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../xsd/nikuxog_user.xsd"> <Header action="write" externalSource="NIKU" objectType="user" version="13.2.0.472"/> <Users> <User externalId=" " isLDAP="false" uiThemeDefaultPartitionCode=" " userLanguage="English" userLocale="en_US” userName="${row.userName}" userStatus="${row.userStatus}" userTimezone="America/Los_Angeles" userType="INTERNAL"> <PersonalInformation emailAddress="${row.email}" firstName="${row.firstName}" lastName="${row.lastName}"/> <Resource resourceId="${row.resourceId}"/> <Groups/> </User> </Users> </NikuDataBus> </gel:parse>

XOG - Execute the XOG <!-- Execute XOG --> <soap:invoke endpoint=“internal" var="result"> <soap:message> <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xog="http://www.niku.com/xog"> <soapenv:Header> <xog:Auth> <xog:SessionID>${sessionID}</xog:SessionID> </xog:Auth> </soapenv:Header> <soapenv:Body> <gel:include select="$userXML"/> </soapenv:Body> </soapenv:Envelope> </soap:message> </soap:invoke>

XOG - Parse the Results <!-- Parse Results --> <gel:set asString="true" select="$result//XOGOutput/Status/@state" var="XOGState"/> <core:choose> <!-- Success --> <core:when test="${XOGState == 'SUCCESS'}"> <gel:set asString="true" select="$result//XOGOutput/Statistics" var="xogStats"/> <gel:log level="INFO">User XOG Stats: ${xogStats} </gel:log> </core:when> <!-- Failure --> <core:otherwise> <gel:log level="WARN"><gel:expr select="$userXML/"/></gel:log> <gel:log level="ERROR"><gel:expr select="$result/"/></gel:log> </core:otherwise> </core:choose>

XOG - Logout <!-- Logout XOG--> <soap:invoke endpoint=“internal" var="result"> <soap:message> <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xog="http://www.niku.com/xog"> <soapenv:Header> <xog:Auth> <xog:SessionID>${sessionID}</xog:SessionID> </xog:Auth> </soapenv:Header> <soapenv:Body> <xog:Logout/> </soapenv:Body> </soapenv:Envelope> </soap:message> </soap:invoke>

Exercise #2 Create a process that can be initiated from a custom object for a Project Request that will XOG in a new project Create project using the Name and ID of the Project Request

Exercise #2 Hint Sample Project XOG: <NikuDataBus xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../xsd/nikuxog_project.xsd"> <Header version="6.0.11" action="write" objectType="project" externalSource="NIKU"/> <Projects> <Project name="Test Project" projectID="PR1234" /> </Projects> </NikuDataBus> SQL to get Project Request Name and ID: SELECT pr.code prjCode, pr.name prjName FROM odf_ca_rego_prj_req pr WHERE pr.id = ?

Exercise #2 Review

File Operations GEL can open a file (and if it is an XML file or a comma-delimited file, parse out all the nodes and attributes), read the file, and write to it. It can also perform FTP operations on files. It cannot, however, create a directory to put files in, move files around, or delete files after it is done with them.

File Operations – Read File <gel:script xmlns:core="jelly:core" xmlns:gel="jelly:com.niku.union.gel.GELTagLibrary" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:files="jelly:com.niku.union.gel.FileTagLibrary"> <gel:parameter var="vFileName" default="/fs0/clarity1/share/RESOURCES.CSV"/> <files:readFile fileName="${vFileName}" delimiter="\|" var="vResourceData" embedded="false"/> <core:forEach items="${vResourceData.rows}" var="row" begin="1" end="10"> <gel:log level="INFO"> Resource Last Name: ${row[0]} </gel:log> <gel:log level="INFO"> Resource First Name: ${row[1]} </gel:log> </core:forEach> </gel:script>

File Operations – Write File <file:writeFile delimiter="," embedded="false" fileName=" Resources.csv "> <sql:query dataSource="${clarityDS}" escapeText="0" var="result"> <![CDATA[ SELECT u.first_name firstName, u.last_name lastName, u.user_name userName FROM cmn_sec_users u WHERE u.user_status_id = 200 ]]> </sql:query> <core:forEach items="${result.rows}" trim="true" var="row"> <file:line> <file:column value="${row.userName}"/> <file:column value="${row.lastName}"/> <file:column value="${row.firstName}"/> </file:line> </core:forEach> </file:writeFile>

Email GEL scripts are often used to send emails. Using a GEL script notification allows for a lot more flexibility than sending an action item. There are two types of email tags, <gel:email> and <email:email>. It is recommended to use the <gel:email> tag where possible.

Email cont. <gel:email> Email server information is derived from the properties.xml of the installation. Supports HTML Example: <gel:script xmlns:gel="jelly:com.niku.union.gel.GELTagLibrary"> <gel:email from="clarity-do-not-reply@ca.com" subject="Clarity - Test Email" to="john@gmail.com"> <![CDATA[ This is a test email. <br/> ------------------------------------------------------------------- This is an automated message, please do not reply. ]]> </gel:email> </gel:script>

Email cont. <email:email> Mail Server must be specified within the tag Does not support HTML Supports Attachments Example: <gel:script xmlns:core="jelly:core" xmlns:gel="jelly:com.niku.union.gel.GELTagLibrary" xmlns:email="jelly:email"> <core:invokeStatic className="java.lang.System" method="getenv" var="NIKU_HOME"> <core:arg value="NIKU_HOME"/> </core:invokeStatic> <gel:parse file="${NIKU_HOME}/config/properties.xml" var="properties"/> <gel:set asString="true" select="$properties/properties/mailServer/@host" var="mailServer"/> <email:email to="john@gmail.com" from="clarity-do-not-reply@ca.com" subject=“app-ca.log file" server="${mailServer}" attach="${NIKU_HOME}/logs/app-ca.log"> App-ca.log File </email:email> </gel:script>

Exercise #3 Write a script that will email a list of all active projects with managers that are not active users in Clarity to the resources within the following group:

Exercise #3 Hint SQL to get Resources in Group: SELECT r.first_name || ' ' || r.last_name resName, r.email resEmail FROM cmn_sec_user_groups ug JOIN cmn_sec_groups g ON ug.group_id = g.id AND g.group_code = 'regou_gel_script' JOIN srm_resources r ON r.user_id = ug.user_id SQL to get Projects: SELECT i.id prjId, i.code prjCode, i.name prjName, r.full_name prjMgr FROM inv_investments i JOIN inv_projects ip ON ip.prid = i.id AND ip.is_template = 0 AND ip.is_program = 0 AND (i.purge_flag = 0 OR i.purge_flag IS NULL) JOIN odf_ca_project ocp ON i.id = ocp.id JOIN cmn_sec_users u ON i.manager_id = u.id AND u.user_status_id != 200 JOIN srm_resources r ON u.id = r.user_id Send Emails from the following email address: technical@regoconsulting.com

Exercise #3 Review

Best Practices If a variable can be changed by an admin, or stores a password, use the <gel:parameter> tag instead of <core:set> Comment your code Properly format and indent your code Place all code within the <gel:script> tags, even comments Avoid excessive logging, but keep enough for debugging purposes When possible, pull server info from properties file on server Example: <core:invokeStatic className="java.lang.System" method="getenv" var="NIKU_HOME"> <core:arg value="NIKU_HOME"/> </core:invokeStatic> <gel:parse file="${NIKU_HOME}/config/properties.xml" var="properties"/> <gel:set asString="true" select="$properties/properties/webServer/webServerInstance[@id='app']/@sslEntryUrl" var="URL"/>

Real Life Examples Integrations with HR Integrations with Financial systems Timesheet Notifications Updating Resource Rights What have you used GEL scripts for?

Questions Contact US Email Contact Web Site 888.813.0444 info@regoconsulting.com Web Site www.regoconsulting.com