Диаграммы последовательностей работы коннектора SOAP#

Данный документ содержит диаграммы последовательностей (PlantUML), описывающие алгоритмы работы коннектора SOAP (IDMC Connector).

Тестирование подключения (test)#

@startuml
title Диаграмма последовательности: Тестирование подключения

participant "IDM Framework" as Framework
participant "SoapConnector" as Connector
participant "SoapConfiguration" as Config
participant "AccountObjectHandler" as AccountH
participant "AccountClient" as Client
participant "SOAP Server" as Server

Framework -> Connector: test()
activate Connector

Connector -> Config: validate()
activate Config
Config --> Connector: OK
deactivate Config

Connector -> AccountH: test()
activate AccountH

AccountH -> AccountH: getSchemaResourceTypes()
AccountH -> AccountH: проверить наличие полей схемы

AccountH -> Client: complexTest()
activate Client

alt interactionType == "http"
    Client -> Server: POST {accountUrl}\n{testRq XML}
    Server --> Client: SOAP Response
else interactionType == "wsdl"
    Client -> Server: SOAP call (test method)
    Server --> Client: SOAP Response
end

Client --> AccountH: OK
deactivate Client

AccountH --> Connector: OK
deactivate AccountH
Connector --> Framework: OK
deactivate Connector
@enduml

Поиск объектов (executeQuery) - Account#

@startuml
title Диаграмма последовательности: Поиск аккаунтов (executeQuery)

participant "IDM Framework" as Framework
participant "SoapConnector" as Connector
participant "AccountObjectHandler" as AccountH
participant "AccountClient" as Client
participant "SOAP Server" as Server
participant "ResultsHandler" as Handler

Framework -> Connector: executeQuery(objectClass, filter, handler, options)
activate Connector

Connector -> AccountH: executeQuery(objectClass, filter, handler, options)
activate AccountH

AccountH -> AccountH: extractUidFromFilter(filter)
alt uid != null
    AccountH -> Client: getAccountListById(uid)
    activate Client
    Client -> Server: POST {accountUrl}\n{getDataByIdRq с uid}
    Server --> Client: SOAP Response с аккаунтом
    Client --> AccountH: List<CustomGenericAccountInfo>
    deactivate Client
else uid == null
    AccountH -> Client: getAccountList()
    activate Client
    Client -> Server: POST {accountUrl}\n{getDataRq}
    Server --> Client: SOAP Response со всеми аккаунтами
    Client --> AccountH: List<CustomGenericAccountInfo>
    deactivate Client
end

loop для каждого CustomGenericAccountInfo
    AccountH -> AccountH: createConnectorObject(attributes, objectClass, uniqueAttr)
    AccountH -> AccountH: извлечь UID значение
    AccountH -> AccountH: создать ConnectorObject с атрибутами
    AccountH -> Handler: handle(connectorObject)
    alt handler возвращает false
        AccountH -> AccountH: прервать цикл
    end
end

AccountH --> Connector: OK
deactivate AccountH
Connector --> Framework: OK
deactivate Connector
@enduml

Создание аккаунта (create)#

@startuml
title Диаграмма последовательности: Создание аккаунта (create)

participant "IDM Framework" as Framework
participant "SoapConnector" as Connector
participant "AccountObjectHandler" as AccountH
participant "SoapConfiguration" as Config
participant "AccountClient" as Client
participant "SOAP Server" as Server

Framework -> Connector: create(objectClass, attributes, options)
activate Connector

Connector -> AccountH: create(objectClass, attributes, options)
activate AccountH

AccountH -> Config: checkSupportedOperation(CREATE)
activate Config
Config --> AccountH: OK (если HTTP mode и XML задан)
deactivate Config

AccountH -> AccountH: заменить Name на uniqueAttribute
AccountH -> AccountH: findCreateUniqueValue(attributes)
AccountH -> AccountH: создать CustomGenericAccountInfo из атрибутов

alt sendAllAttributes == true
    AccountH -> AccountH: addAllAttributesFromScheme()
    AccountH -> AccountH: добавить пустые значения для отсутствующих атрибутов
end

alt sendStatusAttribute == false
    AccountH -> AccountH: удалить атрибут статуса из finalAccountInfo
end

alt checkBeforeCreate == true
    AccountH -> Client: getAccountListById(uniqueValue)
    activate Client
    Client -> Server: поиск аккаунта по UID
    Server --> Client: ответ
    Client --> AccountH: List<AccountInfo>
    deactivate Client
    
    alt аккаунт найден
        AccountH -> AccountH: throw AlreadyExistsException
    end
end

AccountH -> Client: createAccount(finalAccountInfo)
activate Client
Client -> Server: POST {accountUrl}\n{createRq XML}
Server --> Client: SOAP Response (созданный аккаунт)
Client --> AccountH: OK
deactivate Client

AccountH -> AccountH: new Uid(uniqueValue)
AccountH --> Connector: Uid
deactivate AccountH
Connector --> Framework: Uid
deactivate Connector
@enduml

Обновление аккаунта через Delta (updateDelta)#

@startuml
title Диаграмма последовательности: Обновление аккаунта (updateDelta)

participant "IDM Framework" as Framework
participant "SoapConnector" as Connector
participant "AccountObjectHandler" as AccountH
participant "AccountClient" as Client
participant "SOAP Server" as Server

Framework -> Connector: updateDelta(objectClass, uid, modifications, options)
activate Connector

Connector -> AccountH: updateDelta(objectClass, uid, modifications, options)
activate AccountH

AccountH -> AccountH: checkSupportedOperation(UPDATE)

alt getBeforeUpdate == true
    AccountH -> Client: getAccountListById(uid)
    activate Client
    Client -> Server: POST {accountUrl}\n{getDataByIdRq}
    Server --> Client: SOAP Response
    Client --> AccountH: List<AccountInfo>
    deactivate Client
    
    alt аккаунт не найден
        AccountH -> AccountH: throw UnknownUidException
    end
else
    AccountH -> AccountH: создать пустой CustomGenericAccountInfo
end

AccountH -> AccountH: создать finalAccountInfo из modifications
loop для каждого AttributeDelta
    alt valuesToReplace != null
        AccountH -> AccountH: REPLACE атрибут
    else valuesToRemove != null
        AccountH -> AccountH: REMOVE значения
    else valuesToAdd != null
        AccountH -> AccountH: ADD значения
    end
end

alt sendAllAttributes == true
    AccountH -> AccountH: addAllAttributesFromScheme()
end

AccountH -> AccountH: processModifyAccount(finalAccountInfo, uid, modifications)

activate AccountH
note right of AccountH
    1. Проверить атрибут статуса
    2. Если статус = enabled, сначала restoreAccount()
    3. Вызвать modifyAccount()
    4. Если статус = disabled, затем suspendAccount()
end note

alt статус == enabled
    AccountH -> Client: restoreAccount(accountId)
    activate Client
    Client -> Server: POST restore request
    Server --> Client: OK
    Client --> AccountH: OK
    deactivate Client
end

AccountH -> Client: modifyAccount(finalAccountInfo)
activate Client
Client -> Server: POST {accountUrl}\n{updateRq XML}
Server --> Client: SOAP Response
Client --> AccountH: OK
deactivate Client

alt статус == disabled
    AccountH -> Client: suspendAccount(accountId)
    activate Client
    Client -> Server: POST suspend request
    Server --> Client: OK
    Client --> AccountH: OK
    deactivate Client
end

deactivate AccountH

AccountH --> Connector: empty Set<AttributeDelta>
deactivate AccountH
Connector --> Framework: OK
deactivate Connector
@enduml

Удаление аккаунта (delete)#

@startuml
title Диаграмма последовательности: Удаление аккаунта (delete)

participant "IDM Framework" as Framework
participant "SoapConnector" as Connector
participant "AccountObjectHandler" as AccountH
participant "AccountClient" as Client
participant "SOAP Server" as Server

Framework -> Connector: delete(objectClass, uid, options)
activate Connector

Connector -> AccountH: delete(objectClass, uid, options)
activate AccountH

AccountH -> AccountH: checkSupportedOperation(DELETE)

AccountH -> Client: getAccountListById(uid)
activate Client
Client -> Server: POST {accountUrl}\n{getDataByIdRq}
Server --> Client: SOAP Response
Client --> AccountH: List<AccountInfo>
deactivate Client

alt аккаунт не найден
    AccountH -> AccountH: throw UnknownUidException
end

AccountH -> AccountH: getDeleteAccountIdAttribute(accountInfo, uid)
alt deleteAccountIdAttribute задан
    AccountH -> AccountH: извлечь значение атрибута
else
    AccountH -> AccountH: использовать uid по умолчанию
end

AccountH -> Client: deleteAccount(accountId)
activate Client
Client -> Server: POST {accountUrl}\n{deleteRq XML}
Server --> Client: SOAP Response
Client --> AccountH: OK
deactivate Client

AccountH --> Connector: OK
deactivate AccountH
Connector --> Framework: OK
deactivate Connector
@enduml

Поиск справочных данных (executeQuery - SupportingData)#

@startuml
title Диаграмма последовательности: Поиск справочных данных

participant "IDM Framework" as Framework
participant "SoapConnector" as Connector
participant "SupportingDataObjectHandler" as DataH
participant "SupportingDataClient" as Client
participant "SOAP Server" as Server
participant "ResultsHandler" as Handler

Framework -> Connector: executeQuery(objectClass, filter, handler, options)
activate Connector

Connector -> DataH: executeQuery(objectClass, filter, handler, options)
activate DataH

DataH -> DataH: extractUidFromFilter(filter)

DataH -> Client: getSupportingData(objectClass)
activate Client
Client -> Server: POST {dataSupportingUrl}\n{supportingDataRq}
Server --> Client: SOAP Response с данными
Client --> DataH: List<CustomGenericSupportingDataObject>
deactivate Client

loop для каждого CustomGenericSupportingDataObject
    alt objectClass == "Role"
        DataH -> DataH: createConnectorObject(attributes, Role, roleUniqueIdentifier)
    else objectClass == "FosNode"
        DataH -> DataH: createConnectorObject(attributes, FosNode, fosnodeUniqueIdentifier)
    else custom dictionary
        DataH -> DataH: создать ConnectorObject с uniqueAttr из схемы
    end
    
    alt uid == null или filter.accept(connectorObject)
        DataH -> Handler: handle(connectorObject)
        alt handler возвращает false
            DataH -> DataH: прервать цикл
        end
    end
end

DataH --> Connector: OK
deactivate DataH
Connector --> Framework: OK
deactivate Connector
@enduml

Синхронизация (sync) - полная#

@startuml
title Диаграмма последовательности: Синхронизация (sync)

participant "IDM Framework" as Framework
participant "SoapConnector" as Connector
participant "ObjectHandler" as Handler
participant "RecordsCache" as Cache
participant "Client" as Client
participant "Server" as Server
participant "SyncResultsHandler" as SyncHandler

Framework -> Connector: sync(objectClass, syncToken, syncHandler, options)
activate Connector

Connector -> Handler: sync(objectClass, syncToken, syncHandler, options)
activate Handler

Handler -> Handler: tokenLongValue = (Long) syncToken.getValue()

alt tokenLongValue == null
    Handler -> Handler: createNewSync(objectClass)
    activate Handler
    Handler -> Client: getAllAccounts() или getSupportingData()
    Client -> Server: запрос всех записей
    Server --> Client: все записи
    Client --> Handler: List<Records>
    Handler -> Cache: put(token, records)
    Handler -> SyncHandler: handleResult(new SyncToken)
    Handler --> Connector: OK
    deactivate Handler
else
    Handler -> Handler: doSync(objectClass, tokenLongValue, syncHandler)
    
    Handler -> Handler: newToken = System.currentTimeMillis()
    Handler -> Client: getAllAccounts() или getSupportingData()
    Client -> Server: запрос всех записей
    Server --> Client: новые записи (newData)
    Client --> Handler: List<Records>
    
    Handler -> Cache: get(tokenLongValue)
    Cache --> Handler: старые записи (oldData)
    
    Handler -> Handler: преобразовать в Map<String, ConnectorObject>
    
    loop для каждой записи в newData
        alt запись не в oldData
            Handler -> Handler: создать SyncDelta(CREATE)
            Handler -> SyncHandler: handle(delta)
        else запись изменена
            Handler -> Handler: создать SyncDelta(UPDATE)
            Handler -> SyncHandler: handle(delta)
        end
        Handler -> Handler: oldUsedOids.add(uid)
    end
    
    loop для каждой записи в oldData
        alt запись не в oldUsedOids
            Handler -> Handler: создать SyncDelta(DELETE)
            Handler -> SyncHandler: handle(delta)
        end
    end
end

Handler --> Connector: OK
deactivate Handler
Connector --> Framework: OK
deactivate Connector
@enduml

Обработка статусов аккаунта (блокировка/разблокировка)#

@startuml
title Диаграмма последовательности: Обработка статуса аккаунта при обновлении

participant "AccountObjectHandler" as Handler
participant "SoapConfiguration" as Config
participant "AccountClient" as Client
participant "SOAP Server" as Server

Handler -> Handler: processModifyAccount(accountInfo, uid, modifications)

Handler -> Handler: найти атрибут статуса в modifications
Handler -> Config: getStatusAttribute()
Config --> Handler: имя атрибута статуса

Handler -> Handler: получить значение статуса

alt статус == enabledValue (из statusAttributeEnabledValues)
    Handler -> Client: restoreAccount(accountId)
    activate Client
    Client -> Server: POST restore request
    Server --> Client: OK
    Client --> Handler: OK
    deactivate Client
end

Handler -> Client: modifyAccount(accountInfo)
activate Client
Client -> Server: POST update request
Server --> Client: OK
Client --> Handler: OK
deactivate Client

alt статус == disabledValue (из statusAttributeDisabledValues)
    Handler -> Client: suspendAccount(accountId)
    activate Client
    Client -> Server: POST suspend request
    Server --> Client: OK
    Client --> Handler: OK
    deactivate Client
end
@enduml