SpacePermissionDao: Could not instantiate class SpacePermissionDTOLight

Hi friends!

My case:
I need to get all spaces admins

Old method (SpaceManager) not good for me:

  1. Deprecated SpaceManager methods
  2. Too much time to get all spaces admins in big instance (cause of realization)

So, as alternative i trying to use SpacePermissionDao, and method spacePermissionDao.findPermissionsForSpacesAndTypes

First issue, it’s not available in Java Spring Configuration:

@Bean
public SpacePermissionDao spacePermissionDao() {
    return importOsgiService(SpacePermissionDao.class);
}

throw ServiceUnavailableException:

org.eclipse.gemini.blueprint.service.ServiceUnavailableException: service matching filter=[(objectClass=com.atlassian.confluence.security.persistence.dao.SpacePermissionDao)] unavailable

workaround with ContainerManager:

@Bean
public SpacePermissionDao spacePermissionDao() {
    return (SpacePermissionDao) ContainerManager.getComponent("spacePermissionDao");
}

My code:

List<SpacePermissionDTOLight> allPermissions = this.spacePermissionDao.findPermissionsForSpacesAndTypes(
        spacesIds, Collections.singleton(SpacePermission.ADMINISTER_SPACE_PERMISSION)
);

ADMINISTER_SPACE_PERMISSION = SETSPACEPERMISSIONS (just as in db)

But here we have another exception:

Caused by: org.hibernate.QueryException: could not instantiate class [com.atlassian.confluence.security.persistence.dao.hibernate.SpacePermissionDTOLight] from tuple
	at org.hibernate.transform.AliasToBeanConstructorResultTransformer.transformTuple(AliasToBeanConstructorResultTransformer.java:41)
	at org.hibernate.hql.internal.HolderInstantiator.instantiate(HolderInstantiator.java:85)
	at org.hibernate.loader.hql.QueryLoader.getResultList(QueryLoader.java:470)
	at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2507)
	at org.hibernate.loader.Loader.list(Loader.java:2502)
	at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:502)
	at org.hibernate.hql.internal.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:392)
	at org.hibernate.engine.query.spi.HQLQueryPlan.performList(HQLQueryPlan.java:216)
	at org.hibernate.internal.SessionImpl.list(SessionImpl.java:1490)
	at org.hibernate.query.internal.AbstractProducedQuery.doList(AbstractProducedQuery.java:1445)
	at org.hibernate.query.internal.AbstractProducedQuery.list(AbstractProducedQuery.java:1414)
	... 675 more
Caused by: java.lang.reflect.InvocationTargetException
	at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
	at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
	at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
	at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:490)
	at org.hibernate.transform.AliasToBeanConstructorResultTransformer.transformTuple(AliasToBeanConstructorResultTransformer.java:37)
	... 685 more
Caused by: java.lang.IllegalArgumentException: No enum constant com.atlassian.confluence.security.denormalisedpermissions.impl.space.domain.SpacePermissionType.SETSPACEPERMISSIONS

reason - realization of method findPermissionsForSpacesAndTypes:

...
Query<SpacePermissionDTOLight> query = session.createQuery("select new com.atlassian.confluence.security.persistence.dao.hibernate.SpacePermissionDTOLight(sp.id, sp.userSubject.key, sp.group, sp.type, sp.allUsersSubject, sp.space.id) from SpacePermission sp where space.id in (:spaceIdList) and sp.type in (:typeList)");
...

SpacePermissionDTOLight properties and constructor:

public class SpacePermissionDTOLight {
    private Long id;
    private UserKey userKey;
    private String groupName;
    private SpacePermissionType type;
    private String permAllUserSubject;
    private Long spaceId;

    public SpacePermissionDTOLight(Long id, UserKey userKey, String groupName, String type, String permAllUserSubject, Long spaceId) {
        this.id = id;
        this.userKey = userKey;
        this.groupName = groupName;
        this.type = SpacePermissionType.valueOf(type);
        this.permAllUserSubject = permAllUserSubject;
        this.spaceId = spaceId;
    }
    ...
}

and enum SpacePermissionType which is used have NO value for permtype from database table spacepermissions.

public enum SpacePermissionType {
    VIEWSPACE("DenormalisedSpaceViewPermission", "DENORMALISED_SPACE_VIEW_PERMISSIONS"),
    EDITSPACE("DenormalisedSpaceEditPermission", "DENORMALISED_SPACE_EDIT_PERMISSIONS");
    ...
}

I don’t want duplicate official Java API methods, but here i see mistake in it (if i understand all right).
Can you provide information about handful workaround to achieve my goal and about fixes of this mistake?