107 lines
3.5 KiB
Java
107 lines
3.5 KiB
Java
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<UserData> usersData = userHandler.getAllUsers(session).stream().map(u -> new UserData(u.getUserName()))
|
|
.collect(Collectors.toList());
|
|
data.setUsers(usersData);
|
|
|
|
List<String> groups = groupHandler.getGroups(session);
|
|
|
|
List<GroupData> groupsData = new ArrayList<GroupData>(groups.size());
|
|
for (String group : groups) {
|
|
Item vreFolderItem = vreManager.getVRE(group).getVreFolder();
|
|
String owner = vreFolderItem.getOwner();
|
|
List<ACL> acls = aclHandler.get(vreFolderItem, session);
|
|
|
|
AccessType accessType = AccessType.READ_ONLY;
|
|
List<ACL> otherAccess = new ArrayList<ACL>(acls.size() - 1);
|
|
for (ACL acl : acls)
|
|
if (acl.getPricipal().equals(group))
|
|
accessType = acl.getAccessTypes().get(0);
|
|
else
|
|
otherAccess.add(acl);
|
|
|
|
List<String> 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);
|
|
}
|
|
});
|
|
}
|
|
|
|
}
|