Hi friends!
My case:
I need to get all spaces admins
Old method (SpaceManager) not good for me:
- Deprecated SpaceManager methods
- 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?