package org.gcube.data.access.storagehub.handlers; import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; import javax.jcr.Node; import javax.jcr.RepositoryException; import org.apache.jackrabbit.api.JackrabbitSession; import org.gcube.common.storagehub.model.acls.ACL; import org.gcube.common.storagehub.model.acls.AccessType; import org.gcube.common.storagehub.model.exceptions.StorageHubException; import org.gcube.common.storagehub.model.exporter.DumpData; import org.gcube.common.storagehub.model.exporter.GroupData; import org.gcube.common.storagehub.model.exporter.UserData; import org.gcube.common.storagehub.model.items.Item; import org.gcube.data.access.storagehub.handlers.vres.VREManager; import org.gcube.data.access.storagehub.services.delegates.ACLManagerDelegate; import org.gcube.data.access.storagehub.services.delegates.GroupManagerDelegate; import org.gcube.data.access.storagehub.services.delegates.UserManagerDelegate; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import jakarta.inject.Inject; import jakarta.inject.Singleton; @Singleton public class DataHandler { public static final Logger logger = LoggerFactory.getLogger(DataHandler.class); @Inject UserManagerDelegate userHandler; @Inject GroupManagerDelegate groupHandler; @Inject ACLManagerDelegate aclHandler; @Inject VREManager vreManager; public DumpData exportData(JackrabbitSession session) throws RepositoryException,StorageHubException { DumpData data = new DumpData(); List usersData = userHandler.getAllUsers(session).stream().map(u -> new UserData(u.getUserName())) .collect(Collectors.toList()); data.setUsers(usersData); List groups = groupHandler.getGroups(session); List groupsData = new ArrayList(groups.size()); for (String group : groups) { Item vreFolderItem = vreManager.getVRE(group).getVreFolder(); String owner = vreFolderItem.getOwner(); List acls = aclHandler.get(vreFolderItem, session); AccessType accessType = AccessType.READ_ONLY; List otherAccess = new ArrayList(acls.size() - 1); for (ACL acl : acls) if (acl.getPricipal().equals(group)) accessType = acl.getAccessTypes().get(0); else otherAccess.add(acl); List members = groupHandler.getUsersBelongingToGroup(session, group); groupsData.add(new GroupData(group, owner, members, accessType, otherAccess)); } data.setGroups(groupsData); return data; } public void importData(JackrabbitSession session, DumpData data) { data.getUsers().forEach(u -> { try { userHandler.createUser(session, u.getUserName(), "pwd"); } catch (RepositoryException | StorageHubException e) { logger.warn("error importing user {} ", u.getUserName(), e); } }); data.getGroups().forEach(g -> { try { groupHandler.createGroup(session, g.getName(), g.getAccessType(), g.getFolderOwner(), true); for (String member : g.getMembers()) try { groupHandler.addUserToGroup(session, member, g.getName()); }catch(Throwable t ) { logger.warn("error adding user {} to group {}", member, g.getName(), t); } Item vreFolderItem = vreManager.getVRE(g.getName()).getVreFolder(); for (ACL acl : g.getAcls()) { aclHandler.update(acl.getPricipal(), (Node)vreFolderItem.getRelatedNode(), acl.getAccessTypes().get(0), session); } } catch (Throwable e) { logger.warn("error importing group {} ", g.getName(), e); } }); } }