[midPoint] Issue with simple inbound mapping.

Ivan Noris ivan.noris at evolveum.com
Tue Aug 26 19:17:55 CEST 2014


Hi Deepak,

Errrrr... Now I have a feeling, that to address your "id" property, you
need to use "icfs:name". The CSV connector is masking that attribute as
the icfs:name attribute. (Because it is configured as the unique key in
configurationProperties.)

So please to get your "id" try to use the path:
<path>$account/attributes/icfs:name</path>

Regards,
Ivan

On 08/26/2014 05:44 PM, Deepak Natarajan wrote:
> Hi Ivan -
>
> I would like to discuss a bit about this issue since I've been running
> into it over the past year (and I believe we have also had a few email
> exchanges!).
>
> I am doing EXACTLY as you are doing below (I tried just now without the
> ri: namespace, same result).
>
> My CSV Feed looks like this :
>
> "id";"encoded-attributes"
> "foo";"bar"
>
> My CSV Resource Conf is :
> <icfccsvfile:filePath>/Users/dnataraj/dev/axapoint/apos-home/apos-test-encoded.csv</icfccsvfile:filePath>
> <icfccsvfile:encoding>utf-8</icfccsvfile:encoding><icfccsvfile:valueQualifier>"</icfccsvfile:valueQualifier><icfccsvfile:fieldDelimiter>;</icfccsvfile:fieldDelimiter><icfccsvfile:multivalueDelimiter>,</icfccsvfile:multivalueDelimiter><icfccsvfile:usingMultivalue>false</icfccsvfile:usingMultivalue><icfccsvfile:uniqueAttribute>id</icfccsvfile:uniqueAttribute>
>
> And my attribute mapping looks like :
>
>                 <attribute>
>                     <ref>ri:encoded-attributes</ref>
>                     <inbound>
>                         <source>
>                             <name>encodedAttrs</name>
>
> <path>$account/attributes/encoded-attributes</path>
>                         </source>
>                         <expression>
>                             <script>
>                                 <code>
> 				...
>                                 </code>
>                             </script>
>                         </expression>
>                         <target>
>                             <path>extension/apos:encoded</path>
>                         </target>
>                     </inbound>
>                     <inbound>
>                         <source>
>                             <name>encodedAttrs</name>
>
> <path>$account/attributes/encoded-attributes</path>
>                         </source>
>                         <source>
>                             <name>id</name>
>                             <path>$account/attributes/id</path>
>                         </source>
>                         <expression>
>                             <script>
> 				...
>                             </script>
>                         </expression>
>                         <target>
>                             <path>$user/givenName</path>
>                         </target>
>                     </inbound>
>
>
> Something that I have to do (and it works...) is have two or even more
> <inbound> elements for the same resource attributes since I often have
> to map and transform the same incoming field to different attributes in
> MPT (This seems natural, and I guess it is supported)
>
> In the above example, encodedAttrs is not null, but id is !
>
> Over the past year I have been running into these strange periods when
> the attributes I refer to in script expressions are NULL, but usually
> they seem to work. It's as if I have a bug lurking somewhere, or these
> variables go out of scope or something.
>
> A good example is 'input' - here is my usage :
>
>                 <attribute>
>                     <ref>icfs:name</ref>
>                     <inbound>
> 			<c:expression>
>                             <c:script>
>                                 <c:code>
>                                     input + '-apos'
>                                 </c:code>
>                             </c:script>
>                         </c:expression>
>                         <target>
>                             <path>$user/name</path>
>                         </target>
>                     </inbound>
>                 </attribute>
>
> And this works! But 'input' seems to be null (to be fair, the error
> refers to the earlier mapping I have shown):
>
> Caused by:
> com.evolveum.midpoint.util.exception.ExpressionEvaluationException:
> java.lang.NullPointerException expression in mapping in inbound
> expression for
> {http://midpoint.evolveum.com/xml/ns/public/resource/instance-3}encoded-attributes
> in resource:036f0100-2fe8-49e1-a8fd-5548374f8703(APOS CSV Feeder
> Resource Definition)({.../common/common-3}input=null;
> {.../common/common-3}id=null;
> {.../common/common-3}encodedAttrs=PPV(String:bar) in expression in
> mapping in inbound expression for
> {http://midpoint.evolveum.com/xml/ns/public/resource/instance-3}encoded-attributes
> in resource:036f0100-2fe8-49e1-a8fd-5548374f8703(APOS CSV Feeder
> Resource Definition)
>         at
> com.evolveum.midpoint.model.common.expression.evaluator.AbstractValueTransformationExpressionEvaluator$1.process(AbstractValueTransformationExpressionEvaluator.java:423)
> ~[model-common-3.0.jar:na]
>         at
> com.evolveum.midpoint.model.common.expression.evaluator.AbstractValueTransformationExpressionEvaluator$1.process(AbstractValueTransformationExpressionEvaluator.java:350)
> ~[model-common-3.0.jar:na]
>         at
>
> I actually have a working resource configuration, where 'input' works in
> this case :
>
>                 <attribute>
>                     <ref>ri:managerGroups</ref>
>                     <displayName>Managers Group</displayName>
>                     <inbound>
>                         <expression>
>                             <script>
>                                 <code>
>                                     return input ? input.tokenize(',') : []
>
>                                 </code>
>                             </script>
>                         </expression>
>                         <target>
>       <path>extension/apos:managerGroupMembership</path>
>                         </target>
>                     </inbound>
>                 </attribute>
>
> But it does not work in another mapping in the same resource! (I could
> not use 'input' in the script expression, so had to create an explicit var :
>
>                 <attribute>
>                     <ref>ri:unitchain</ref>
>                     <limitations>
>                         <layer>presentation</layer>
>                         <ignore>true</ignore>
>                     </limitations>
>                     <inbound>
>                         <source>
>                             <name>unitChain</name>
>                             <path>$account/attributes/ri:unitchain</path>
>                         </source>
>                         <expression>
>                             <script>
>                                 <code>
>                                     return
> unitChain.split('/').reverse().join("/")
>                                 </code>
>                             </script>
>                         </expression>
>                         <target>
>
> <path>extension/apos:aposUnitUuidPathToRoot</path>
>                         </target>
>                     </inbound>
>                 </attribute>
>
> But above, you can see that $account/attributes/ri:unitchain works! (And
> I have a similar expression that does not work now).
>
> Also, I have to first set another variable to 'input' before I can use
> it, like so :
>
>                 <attribute>
>                     <ref>ri:email</ref>
>                     <inbound>
> 			<c:expression>
>                             <c:script>
>                                 <c:code>
> 									def email = input
> 									return email ? email.split('@')[0] + '-apos@' +
> email.split('@')[1] : ''
>                                 </c:code>
>                             </c:script>
>                         </c:expression>
>                         <target>
>                             <path>$user/emailAddress</path>
>                         </target>
>                     </inbound>
>                 </attribute>
>
> Using input directly in the expression, results in a NPE.
>
> It's quite baffling imo, but luckily can be worked around.
>
> But now I'm stuck with account attributes being null, plain and simple :(
>
>
> Ivan Noris wrote:
>> Hi Deepak,
>>
>> I've just checked one of my customer objects for 3.0.x
>>
>> I'm using this:
>>
>>             <attribute>
>>                     <ref>ri:P0000_ATTR1</ref>
>>                     <displayName>Attr1</displayName>
>>                     <inbound>
>>                            <source>
>>                                     <name>ATTRX</name>
>>                                    
>> <path>$account/attributes/P0001_ATTRX</path>
>>                             </source>
>>                             <source>
>>                                     <name>ATTRY</name>
>>                                     <path>$account/attributes/ATTRY</path>
>>                             </source>
>>                             <expression>
>> . . .
>>
>> But it should also work with "ri:" prefixes, if the "ri" namespace is
>> defined and correct
>> (xmlns:ri="http://midpoint.evolveum.com/xml/ns/public/resource/instance-3"
>> - I define it usually at the resource level).
>>
>> How are you referencing your "input" implicit variable?
>> In my expression (Groovy) it is:
>>
>> if (*input* == '0') return 'FormerEmployee'
>>
>> Are you perhaps referencing it as "$input" instead of "input"... ?
>> Also, the source attributes in my sample would be referenced as "ATTRX"
>> / "ATTRY" in the Groovy expressions.
>>
>>
>> Regards,
>> Ivan
>>
>>
>> On 08/26/2014 11:35 AM, Deepak Natarajan wrote:
>>> Hi -
>>>
>>> I find some simple inbound mapping behaving inconsistently (I'm
>>> obviously doing something wrong)
>>>
>>> My source feed (CSV) :
>>>
>>>                 <icfccsvfile:encoding>utf-8</icfccsvfile:encoding>
>>>                 <icfccsvfile:valueQualifier>"</icfccsvfile:valueQualifier>
>>>                 <icfccsvfile:fieldDelimiter>;</icfccsvfile:fieldDelimiter>
>>>                
>>> <icfccsvfile:multivalueDelimiter>,</icfccsvfile:multivalueDelimiter>
>>>                
>>> <icfccsvfile:usingMultivalue>false</icfccsvfile:usingMultivalue>
>>>                
>>> <icfccsvfile:uniqueAttribute>id</icfccsvfile:uniqueAttribute>
>>>
>>> "id";"encoded-attributes"
>>> "foo";"3AARpkJyaXR0YalSYXNtdXN"
>>>
>>> and my mappings :
>>>
>>>                 <attribute>
>>>                     <ref>icfs:uid</ref>
>>>                     <limitations>
>>>                         <access>
>>>                             <read>true</read>
>>>                         </access>
>>>                     </limitations>
>>>                 </attribute>
>>>
>>>                 <attribute>
>>>                     <ref>icfs:name</ref>
>>>                     <inbound>
>>>                         <c:expression>
>>>                             <c:script>
>>>                                 <c:code>
>>>                                     input + '-suffix'
>>>                                 </c:code>
>>>                             </c:script>
>>>                         </c:expression>
>>>                         <target>
>>>                             <path>$user/name</path>
>>>                         </target>
>>>                     </inbound>
>>>                 </attribute>
>>>
>>>                 <attribute>
>>>                     <ref>ri:encoded-attributes</ref>
>>>                     <inbound>
>>>                         <source>
>>>                             <name>encodedAttrs</name>
>>>                            
>>> <path>$account/attributes/ri:encoded-attributes</path>
>>>                         </source>
>>>                         <source>
>>>                             <name>id</name>
>>>                             <path>$account/attributes/ri:id</path>
>>>                         </source>
>>>                         ....
>>>                         ....
>>>                     </inbound>
>>>
>>> Is this incorrect?
>>>  
>>> The thing is, I have used this configuration before, without any
>>> changes, and it used to work. Today it fails (my VCS system shows my
>>> working version had these mappings)
>>>
>>> Caused by:
>>> com.evolveum.midpoint.util.exception.ExpressionEvaluationException:
>>> java.lang.NullPointerException expression in mapping in inbound
>>> expression for
>>> {http://midpoint.evolveum.com/xml/ns/public/resource/instance-3}encoded-attributes
>>> in resource:036f0100-2fe8-49e1-a8fd-5548374f8703(APOS CSV Feeder
>>> Resource Definition)({.../common/common-3}input=null;
>>> {.../common/common-3}id=null;
>>> {.../common/common-3}encodedAttrs=PPV(String:3AARpkJyaXR0YalSYXNtdXN );
>>> ) in expression in mapping in inbound expression for
>>> {http://midpoint.evolveum.com/xml/ns/public/resource/instance-3}encoded-attributes
>>> in resource:036f0100-2fe8-49e1-a8fd-5548374f8703(APOS CSV Feeder
>>> Resource Definition)
>>>
>>> Why is "input" implicit variable and id both null?
>>>
>>> Thanks for any help!
>>>
>>> -
>>> Deepak Natarajan
>>>
>>> _______________________________________________
>>> midPoint mailing list
>>> midPoint at lists.evolveum.com
>>> http://lists.evolveum.com/mailman/listinfo/midpoint
>> -- 
>>   Ing. Ivan Noris
>>   Senior Identity Management Engineer
>>   evolveum.com
>>   ___________________________________________
>>            "Idem per idem - semper idem Vix."
>>
>> _______________________________________________
>> midPoint mailing list
>> midPoint at lists.evolveum.com
>> http://lists.evolveum.com/mailman/listinfo/midpoint

-- 
  Ing. Ivan Noris
  Senior Identity Management Engineer
  evolveum.com
  ___________________________________________
           "Idem per idem - semper idem Vix."




More information about the midPoint mailing list