Hi Lorenzo,
Schema and mapping are corrected now. I can propagate information from
a group to an account if I use a mapping like:
"groups[appAdmin].appName".
My question is what can I do to dynamically change, maybe by program,
the value "appAdmin" ?
Best regards,
Stéphane POPOFF
{
"key": "admin",
"connector": "019be54f-fec3-7403-b739-f82d00f6012f",
"connectorDisplayName": "RestAdmin",
"provisions": [
{
"anyType": "GROUP",
"objectClass": "__GROUP__",
"auxClasses": [
"AdminGroup"
],
"syncToken": null,
"ignoreCaseMatch": false,
"uidOnCreate": null,
"mapping": {
"items": [
{
"intAttrName": "name",
"extAttrName": "appName",
"connObjectKey": true,
"password": false,
"mandatoryCondition": "true",
"purpose": "BOTH",
"propagationJEXLTransformer": null,
"pullJEXLTransformer": null,
"transformers": []
},
{
"intAttrName": "key",
"extAttrName": "key",
"connObjectKey": false,
"password": false,
"mandatoryCondition": "false",
"purpose": "BOTH",
"propagationJEXLTransformer": null,
"pullJEXLTransformer": null,
"transformers": []
},
{
"intAttrName": "groups[appAdmin].projects",
"extAttrName": "projects",
"connObjectKey": false,
"password": false,
"mandatoryCondition": "false",
"purpose": "PROPAGATION",
"propagationJEXLTransformer": null,
"pullJEXLTransformer": null,
"transformers": []
},
{
"intAttrName": "groups[appAdmin].appName",
"extAttrName": "appName",
"connObjectKey": false,
"password": false,
"mandatoryCondition": "false",
"purpose": "PROPAGATION",
"propagationJEXLTransformer": null,
"pullJEXLTransformer": null,
"transformers": []
}
],
"connObjectLink": null
}
},
{
"anyType": "USER",
"objectClass": "__ACCOUNT__",
"auxClasses": [
"AdminGroup"
],
"syncToken": null,
"ignoreCaseMatch": false,
"uidOnCreate": null,
"mapping": {
"items": [
{
"intAttrName": "username",
"extAttrName": "login",
"connObjectKey": true,
"password": false,
"mandatoryCondition": "true",
"purpose": "BOTH",
"propagationJEXLTransformer": null,
"pullJEXLTransformer": null,
"transformers": []
},
{
"intAttrName": "appName",
"extAttrName": "appName",
"connObjectKey": false,
"password": false,
"mandatoryCondition": "false",
"purpose": "BOTH",
"propagationJEXLTransformer": null,
"pullJEXLTransformer": null,
"transformers": []
},
{
"intAttrName": "key",
"extAttrName": "key",
"connObjectKey": false,
"password": false,
"mandatoryCondition": "false",
"purpose": "BOTH",
"propagationJEXLTransformer": null,
"pullJEXLTransformer": null,
"transformers": []
},
{
"intAttrName": "login",
"extAttrName": "login",
"connObjectKey": false,
"password": false,
"mandatoryCondition": "false",
"purpose": "BOTH",
"propagationJEXLTransformer": null,
"pullJEXLTransformer": null,
"transformers": []
},
{
"intAttrName": "projects",
"extAttrName": "projects",
"connObjectKey": false,
"password": false,
"mandatoryCondition": "false",
"purpose": "BOTH",
"propagationJEXLTransformer": null,
"pullJEXLTransformer": null,
"transformers": []
},
{
"intAttrName": "groups[appAdmin].appName",
"extAttrName": "appName",
"connObjectKey": false,
"password": false,
"mandatoryCondition": "false",
"purpose": "PROPAGATION",
"propagationJEXLTransformer": null,
"pullJEXLTransformer": null,
"transformers": []
},
{
"intAttrName": "groups[appAdmin].projects",
"extAttrName": "projects",
"connObjectKey": false,
"password": false,
"mandatoryCondition": "false",
"purpose": "PROPAGATION",
"propagationJEXLTransformer": null,
"pullJEXLTransformer": null,
"transformers": []
}
],
"connObjectLink": null
}
}
],
"orgUnit": null,
"propagationPriority": 10,
"enforceMandatoryCondition": true,
"createTraceLevel": "ALL",
"updateTraceLevel": "ALL",
"deleteTraceLevel": "ALL",
"provisioningTraceLevel": "ALL",
"passwordPolicy": null,
"accountPolicy": null,
"propagationPolicy": null,
"inboundPolicy": null,
"pushPolicy": null,
"provisionSorter": null,
"authPolicy": null,
"accessPolicy": null,
"confOverrideFlag": true,
"confOverrideValue": [],
"capabilitiesOverrideFlag": false,
"capabilitiesOverrideValue": null,
"propagationActions": []
}
Le mer. 21 janv. 2026 à 10:14, Lorenzo Di Cola <[email protected]> a écrit :
>
> Hi Stéphane,
>
> nice to hear you're going ahead.
> Here, what I can see is some problem in the groovy script, probably in your
> SchemaScript.groovy
> I can suppose in your script you're passing AttributeInfoBuilder instead of
> AttributeInfo, so you're missing the build() method.
> Please take as a reference the SchemaScript [1].
>
> [1]
> https://github.com/apache/syncope/blob/master/fit/core-reference/src/test/resources/rest/SchemaScript.groovy
>
> Best regards,
> Lorenzo
>
>
>
> Il giorno mar 20 gen 2026 alle ore 23:41 Stéphane Popoff
> <[email protected]> ha scritto:
>>
>> Hi Lorenzo,
>>
>> Thank's for the reply. I have a better result now [1] but don't
>> understand why I also have errors when reading schema [2]. ([2] is
>> before [1] from the same Syncope log)
>>
>> Best regards,
>>
>> Stéphane POPOFF
>>
>> [1] 2026-01-20 15:25:39.218 DEBUG [ Thread-6]
>> net.tirasa.connid.commons.scripted.AbstractScriptedConnector :
>> ObjectClass: __ACCOUNT__ Method: executeQuery
>> 2026-01-20 15:25:39.223 INFO [ Thread-6]
>> net.tirasa.connid.commons.scripted.AbstractScriptedConnector :
>> Entering SEARCH Script Method: invoke
>> 2026-01-20 15:25:39.302 DEBUG [ Thread-6]
>> net.tirasa.connid.commons.scripted.AbstractScriptedConnector : Search
>> ok Method: executeQuery
>> 2026-01-20 15:25:39.302 DEBUG [ Thread-6]
>> g.identityconnectors.framework.common.objects.ResultsHandler :
>> instance='RestAdmin' Enter: handle({Uid=Attribute: {Name=__UID__,
>> Value=[appAdmin]}, ObjectClass=ObjectClass: __ACCOUNT__,
>> Attributes=[Attribute: {Name=projects, Value=[projet1, projet2]},
>> Attribute: {Name=appName, Value=[appAdmin]}, Attribute:
>> {Name=__NAME__, Value=[appAdmin]}, Attribute: {Name=__UID__,
>> Value=[appAdmin]}], Name=Attribute: {Name=__NAME__,
>> Value=[appAdmin]}}) Method: handle
>> 2026-01-20 15:25:39.304
>> [operation.id=019bdc02-ec90-7f4b-a905-d7c8af685ed4] DEBUG
>> [handler-409] g.identityconnectors.framework.common.objects.ResultsHandler
>> : Enter: handle({Uid=Attribute: {Name=__UID__, Value=[appAdmin]},
>> ObjectClass=ObjectClass: __ACCOUNT__, Attributes=[Attribute:
>> {Name=projects, Value=[projet1, projet2]}, Attribute: {Name=appName,
>> Value=[appAdmin]}, Attribute: {Name=__NAME__, Value=[appAdmin]},
>> Attribute: {Name=__UID__, Value=[appAdmin]}], Name=Attribute:
>> {Name=__NAME__, Value=[appAdmin]}}) Method: handle
>> 2026-01-20 15:25:39.304
>> [operation.id=019bdc02-ec90-7f4b-a905-d7c8af685ed4] DEBUG
>> [handler-409] g.identityconnectors.framework.common.objects.ResultsHandler
>> : Return: false Method: handle
>> 2026-01-20 15:25:39.304 DEBUG [ Thread-6]
>> g.identityconnectors.framework.common.objects.ResultsHandler :
>> instance='RestAdmin' Return: false Method: handle
>> 2026-01-20 15:25:39.305 DEBUG [ Thread-6]
>> net.tirasa.connid.commons.scripted.AbstractScriptedConnector :
>> ConnectorObject is built Method: processResults
>> 2026-01-20 15:25:39.305 DEBUG [ Thread-6]
>> org.identityconnectors.framework.spi.SearchResultsHandler :
>> instance='RestAdmin' Enter: handleResult(SearchResult:
>> {PagedResultsCookie=null, RemainingPagedResults=-1,
>> AllResultsReturned=true}) Method: handleResult
>> 2026-01-20 15:25:39.306 DEBUG [ Thread-6]
>> org.identityconnectors.framework.spi.SearchResultsHandler :
>> instance='RestAdmin' Return Method: handleResult
>> 2026-01-20 15:25:39.306 DEBUG [ Thread-6]
>> org.identityconnectors.framework.spi.operations.SearchOp :
>> instance='RestAdmin' Return Method: executeQuery
>> 2026-01-20 15:25:39.308
>> [operation.id=019bdc02-ec90-7f4b-a905-d7c8af685ed4] DEBUG
>> [handler-409] org.identityconnectors.framework.api.operations.SearchApiOp
>> : Return: SearchResult: {PagedResultsCookie=null,
>> RemainingPagedResults=-1, AllResultsReturned=true} Method: search
>>
>> [2] Caused by: java.lang.ClassCastException: class
>> org.identityconnectors.framework.common.objects.AttributeInfoBuilder
>> cannot be cast to class
>> org.identityconnectors.framework.common.objects.AttributeInfo
>> (org.identityconnectors.framework.common.objects.AttributeInfoBuilder
>> and org.identityconnectors.framework.common.objects.AttributeInfo are
>> in unnamed module of loader
>> org.springframework.boot.loader.launch.LaunchedClassLoader @6ce253f1)
>> at
>> org.identityconnectors.framework.common.objects.ObjectClassInfoBuilder.addAllAttributeInfo(ObjectClassInfoBuilder.java:87)
>> at
>> org.identityconnectors.framework.common.objects.ObjectClassInfoBuilder$addAllAttributeInfo$0.call(Unknown
>> Source)
>> at
>> org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:45)
>> at
>> org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:125)
>> at org.kohsuke.groovy.sandbox.impl.Checker$1.call(Checker.java:176)
>> at
>> org.kohsuke.groovy.sandbox.GroovyInterceptor.onMethodCall(GroovyInterceptor.java:24)
>> at
>> org.jenkinsci.plugins.scriptsecurity.sandbox.groovy.SandboxInterceptor.onMethodCall(SandboxInterceptor.java:176)
>> at org.kohsuke.groovy.sandbox.impl.Checker$1.call(Checker.java:174)
>> at
>> org.kohsuke.groovy.sandbox.impl.Checker.checkedCall(Checker.java:178)
>> at
>> org.codehaus.groovy.vmplugin.v8.IndyInterface.fromCache(IndyInterface.java:344)
>> at Script1.run(Script1.groovy:49)
>> at
>> org.identityconnectors.common.script.groovy.GroovyScriptExecutorFactory$GroovyScriptExecutor.execute(GroovyScriptExecutorFactory.java:100)
>> at
>> net.tirasa.connid.commons.scripted.AbstractScriptedConnector.schema(AbstractScriptedConnector.java:573)
>> ... 28 more
>>
>> 2026-01-20 15:25:37.824
>> [operation.id=019bdc02-ec90-7f4b-a905-d7c8af685ed4] DEBUG
>> [handler-409] org.identityconnectors.framework.api.operations.SearchApiOp
>> : instan
>>
>>
>> Le mar. 20 janv. 2026 à 10:54, Lorenzo Di Cola <[email protected]> a
>> écrit :
>> >
>> > Hello,
>> > This error is coming from ConnId Framework, not from Syncope itself, and
>> > it is raised after your connector has returned an object, when the
>> > framework tries to apply the search filter.
>> > The filter is the ConnId search filter that Syncope passes to the
>> > connector when it performs a search or get operation.
>> > The filter is not configured statically. It is dynamically built by
>> > Syncope from:
>> >
>> > The operation being executed, for example: read, search, etc.
>> > The mapping of the external resource
>> > The attribute used as ConnId Name, for example __NAME__, __UID__
>> >
>> > Maybe the main question here is the last one, why the mapping is wrong for
>> > the filter. Please take care about your Syncope mapping configuration and
>> > how you're using the Connid __NAME__ and __UID__.
>> >
>> > HTH
>> > Best regards,
>> > Lorenzo
>> >
>> > Il giorno sab 17 gen 2026 alle ore 17:49 Stéphane Popoff
>> > <[email protected]> ha scritto:
>> >>
>> >> Hi,
>> >>
>> >> When requesting a record on a Rest connector that respond with data:
>> >> {"appName":"appAdmin","key":null,"login":"appAdmin","status":"ACTIVE","projects":["projet1","projet2"],"uid":"appAdmin"}
>> >>
>> >> I found in Syncope log this exception:
>> >> Caused by: java.lang.IllegalStateException: Object {Uid=Attribute:
>> >> {Name=__UID__, Value=[appAdmin]}, ObjectClass=ObjectClass:
>> >> __ACCOUNT__, Attributes=[Attribute: {Name=projects, Value=[projet1,
>> >> projet2]}, Attribute: {Name=appName, Value=[appAdmin]}, Attribute:
>> >> {Name=__NAME__, Value=[appAdmin]}, Attribute: {Name=__UID__,
>> >> Value=[appAdmin]}], Name=Attribute: {Name=__NAME__, Value=[appAdmin]}}
>> >> was returned by the connector but failed to pass the framework filter.
>> >> This seems like wrong implementation of the filter in the connector.
>> >> at
>> >> org.identityconnectors.framework.impl.api.local.operations.FilteredResultsHandler.handle(FilteredResultsHandler.java:82)
>> >> at
>> >> org.identityconnectors.framework.impl.api.local.operations.SearchImpl$AttributesToGetSearchResultsHandler.handle(SearchImpl.java:275)
>> >> at
>> >> org.identityconnectors.framework.impl.api.local.operations.SearchImpl$1.handle(SearchImpl.java:145)
>> >> at
>> >> org.identityconnectors.framework.impl.api.SearchResultsHandlerLoggingProxy.handle(SearchResultsHandlerLoggingProxy.java:75)
>> >> at
>> >> net.tirasa.connid.commons.scripted.AbstractScriptedConnector.processResults(AbstractScriptedConnector.java:800)
>> >> at
>> >> net.tirasa.connid.commons.scripted.AbstractScriptedConnector.executeQuery(AbstractScriptedConnector.java:616)
>> >> ... 14 more
>> >>
>> >> My questions is about the connector filter:
>> >> - What is attended by the filter ?
>> >> - Where to find the configuration of that filter ?
>> >> - Why is the external attribute appName, mapped on the internal name
>> >> attribute is wrong for the filter ?
>> >>
>> >> Best regards,
>> >>
>> >> Stéphane POPOFF
>> >
>> >
>> >
>> > --
>> >
>> > --
>> > Lorenzo Di Cola
>> >
>> > Software Engineer @ Tirasa S.r.l.
>> > Viale Vittoria Colonna, 97 - 65127 Pescara
>> > Tel +39 0859116307 / FAX +39 0859111173
>> > http://www.tirasa.net
>> >
>> > Apache Syncope Committer
>> >
>> > Syncope PMC Member at The Apache Software Foundation
>> >
>> > http://people.apache.org/phonebook.html?uid=loredicola
>
>
>
> --
>
> --
> Lorenzo Di Cola
>
> Software Engineer @ Tirasa S.r.l.
> Viale Vittoria Colonna, 97 - 65127 Pescara
> Tel +39 0859116307 / FAX +39 0859111173
> http://www.tirasa.net
>
> Apache Syncope Committer
>
> Syncope PMC Member at The Apache Software Foundation
>
> http://people.apache.org/phonebook.html?uid=loredicola