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

Reply via email to