What is the replacement of deprecated if_exist in freemarker - freemarker

Previously in freemarker in could print a field value this way -
${mObject?if_exist.fieldValue}
Now after deprecating if_exist, freemarker suggest to use !
For null check now, i can use ! like -
${anotherModelAttribute!} or ${anotherModelAttribute!('default')}
But can not really do -
${mObject!.fieldValue} or something similar
When mObject is null it throws exception.
Any approach without null check in <#if> </#if> is appreciated.

You can use:
${(mObject.fieldValue)!}
Usage of the default value operator with non top-level variables is described here.

Related

Is it possible to save an empty value for an integer type in gremlin

g.V(123).property('myProperty', myproperty? myProperty: null)
Here myProperty is of integer type and I wish to save an empty value for 'myProperty'.
I know null is not supported. Is there another alternative to achieve the same? (I can't save the value as 0 either)
As there is no notion of null in TinkerPop (for now) I'm afraid that you either have to remove the property or define some sort of constant to represent it. You say that you can't use "zero" but perhaps you could use something like Integer.MIN_VALUE or something? Or, if you are using a graph that doesn't have an explicit schema you could set it to a non-integer value like a "null" string? I can't reall think of any other workarounds.

Uipath string null

Does anyone know how to check for an unassigned string in uipath? Uipath seems to crash when an if statement looks for a null string. Not sure how to handle that. String.empty doesn't seem to work, and if the string is unassigned uipath stops logging and nothing happens.
There are many different approaches and ideas, but – according to me – what you can do is:
Always make sure before to define any variable by default, initialize it with empty strings(""). So it will be easy to check it with equal operator as well.
The Other approaches you can take in Uipath is based on .Net So u can use it's Is Nothing.
You can also use .Net String.IsNullOrEmpty Method (String) Method.
To check if a string variable is Null, you need to use either an If or Decision activity. The condition of those should be:
a is Nothing
This will return true if variable a is null and false otherwise
Best way to check string has value or not -->
These are some of the ways it can be checked.
1.
String.IsNullOrEmpty(yourString)
2.
yourString.Equals("")
3.
yourString.Equals(Nothing)
4.
yourString is Nothing
5.
String.IsNullOrWhiteSpace(yourString)
There are logical OR, AND and NOT to combine the different checks and they can clubbed together to check the best way to find out blank, null and whitespace string.
You can compare the string using:
Convert.ToString(DBNULL.Value)
We can check whether String is null with the following Syntax
String.IsNullOrWhiteSpace("Name_of_the_variable")
It will return boolean value
My suggestion is using the following method in UiPath
An If/Decision activity with the condition string.IsNullOrEmpty() making use of the IsNullOrEmpty() method
The best and easiest way will be the following:
String.IsNullOrWhiteSpace(stringVariableName)

Xpath Expression evaluation on attributes with any namespace prefix

Could you please help me on this xpath expression evaluation
I am working on fetching the proxy references. In the xml file the references will get stored as:
One way of XML file will have the reference as below:
con1:service ref="MyProject/ProxyServices/service1"
xsi:type="con2:PipelineRef" xmlns:ref="http://www.bea.com/wli/sb/reference"/
here in the xml file the name spaces are:
xmlns:con1="http://www.bea.com/wli/sb/stages/config"
xmlns:con2="http://www.bea.com/wli/sb/pipeline/config"
Another way of XML will have the reference as below.
con1:service ref="MyProject/ProxyServices/service2"
xsi:type="ref:ProxyRef" xmlns:ref="http://www.bea.com/wli/sb/reference"/
here in the xml file the name spaces are:
xmlns:con1="http://www.bea.com/wli/sb/stages/config"
xmlns:ref="http://www.bea.com/wli/sb/reference"
I have used this xpath expression, this is not fetching the reference service values, could you please help what is wrong in it.
"//service[#type= #*[local-name() ='ProxyRef' or #type=#*[local-name() ='PipelineRef']]/#ref"
when I used like this it is working but, name space prefix is keep on changes when there are multiple references in the xml file.
"//service[#type='ref:ProxyRef'or #type='con:PipelineRef' or #type='con1:PipelineRef' or #type='con2:PipelineRef' or #type='con3:PipelineRef' ...#type='con20:PipelineRef' ]/#ref";
Now here basically the type attribute PipelineRef is keep on changing the name space prefix from con to con(n). Now I am looking for something which supports some thing like #type='*:PipelineRef' or #type='con*:PipelineRef' or the best way to fetch the service element reference attribute value.
Thanks in advance.
Try using contains() like so :
//service[contains(#type,':ProxyRef') or contains(#type,':PipelineRef')]
Another alternative would be using ends-with() function which is more precise for this purpose compared to contains() function. However, ends-with() isn't available in xpath 1.0, so there is a chance that you need to implement it yourself (feasible, but the xpath result is less intuitive for me).

Formatting Dates in Freemarker Where Date Type is Unknown

I have a Freemarker function whose aim is to print any value passed to it and am having difficulty handling dates in particular.
I understand that when Freemarker cannot determine what portion of a date is in use, that it will error when attempting to print the value directly, and so some special-casing is required for dates, but I've been unable to find a reliable workaround of this feature.
My function looks something like this:
<#function format value=''>
<#if value?is_date>
<#-- code to attempt to handle all types of date -->
<#else>
<#-- handle non-date values -->
</#if>
</#function>
So far, I have tried the following:
First attempt: just always print date and time; e.g. value?datetime
Problem: bombs if the value has already 'been told' it's date-only (e.g. format(value?date) - a usage I want to support)
Second attempt: attempt to print raw value using attempt/recover directives to handle problem cases; e.g.
<#attempt>
<#return value>
<#recover>
<#return value?datetime>
</#attempt>
Problem: the attempt/recover directives don't successful catch the exception - instead it's propagated out as before
I've tried many other things but the above approaches were the more sensible, and unfortunately neither were successful. There seems to be a catch-22: if the date-type is unknown I can only print by choosing an arbitrary type to apply to all date values, but if I attempt to apply that type to a known-type date, it will fail where the types don't match.
Is there any way to determine whether the date type of a value is known before trying to print the value? If so, I could use the ?datetime built in only when necessary.
Ideally, I could tell Freemarker to just print the full date where it's unable to determine the exact type, instead of bombing - but I'm not sure this is currently possible.
Update: In FreeMarker 2.3.21 you can use <#if value?is_date_like>${value?datetime_if_unknown}<#else>...
Yeah, there should exist something like ?is_unknown_type_date, but it doesn't... I'm an FM maintainer so I will add that in 2.3.21 (but don't hold your breath until that's released). Meanwhile, you can write a TemplateMethodModelEx that does just that. Implementing it trivial as you will see, how to make them accessible to templates is a bit underdocumented... One way is just doping the TemplateMethodModelEx into the data-model or into the "shared variable" set of the Configuration. Another is putting this into some of your commonly #import-ed or #included template like <#assign isUnknownTypeDate='com.example.IsUnknownTypeDateMethod'?new()>.
BTW, #recover works for me for this (using a nightly 2.3.21, but I don't remember that it was ever broken). But don't use it for this anyway, as it will log the error. #recover is for emergency situations only, not for normal program flow.
As of providing a default format for unknowns-type dates... I feel uneasy about it as then these issues won't be caught during development, and very few will care to use a different FM configuration for production than for development.

Displaying default variable if multiple variables are missing in Freemarker

Currently, I have multiple variables:
${top_1}
${top_2}
${top_3}
${top_4}
And I have this conditional logic for a default variable present:
<#if top_1 == "">not available<#else>${top_1}</#if>
How would I include all of the variables and display the default when all fields are missing?
Found the answer.
Expressions like + can tie the multiple variables together. And including the statement at the end of list will include everything without errors.
example:
<#if top_1 + top_2 + top_3 + top_4 == "">not available<#else>${top_1} ${top_2} ${top_3} ${top_4}</#if>
Any kind of styling will work in between that last part of the list as well. Sorry, graphic designer learning Freemarker here.

Resources