package io.lumify.web.importExportWorkspaces; import io.lumify.miniweb.HandlerChain; import io.lumify.core.config.Configuration; import io.lumify.core.model.user.UserRepository; import io.lumify.core.model.workspace.Workspace; import io.lumify.core.model.workspace.WorkspaceEntity; import io.lumify.core.model.workspace.WorkspaceRepository; import io.lumify.core.user.User; import io.lumify.securegraph.model.workspace.SecureGraphWorkspaceRepository; import io.lumify.web.BaseRequestHandler; import org.securegraph.Authorizations; import org.securegraph.Edge; import org.securegraph.Graph; import org.securegraph.Vertex; import org.securegraph.tools.GraphBackup; import org.securegraph.util.ConvertingIterable; import javax.inject.Inject; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.OutputStream; import java.util.ArrayList; import java.util.List; import static org.securegraph.util.IterableUtils.toList; public class Export extends BaseRequestHandler { private final SecureGraphWorkspaceRepository workspaceRepository; private final Graph graph; @Inject public Export( UserRepository userRepository, Configuration configuration, WorkspaceRepository workspaceRepository, Graph graph) { super(userRepository, workspaceRepository, configuration); this.workspaceRepository = (SecureGraphWorkspaceRepository) workspaceRepository; this.graph = graph; } @Override public void handle(HttpServletRequest request, HttpServletResponse response, HandlerChain chain) throws Exception { String workspaceId = getRequiredParameter(request, "workspaceId"); User user = getUser(request); Workspace workspace = this.workspaceRepository.findById(workspaceId, user); if (workspace == null) { respondWithNotFound(response); return; } Authorizations authorizations = getUserRepository().getAuthorizations(user, UserRepository.VISIBILITY_STRING, WorkspaceRepository.VISIBILITY_STRING, workspace.getWorkspaceId()); List<String> workspaceEntityIds = toList(getWorkspaceEntityIds(user, workspace)); // create this array so that we get the relationships from workspace to entities ArrayList<String> workspaceEntityIdsAndWorkspaceId = new ArrayList<String>(workspaceEntityIds); workspaceEntityIdsAndWorkspaceId.add(workspace.getWorkspaceId()); Vertex workspaceVertex = this.workspaceRepository.getVertex(workspace.getWorkspaceId(), user); Iterable<Vertex> vertices = graph.getVertices(workspaceEntityIds, authorizations); Iterable<Edge> edges = graph.getEdges(graph.findRelatedEdges(workspaceEntityIdsAndWorkspaceId, authorizations), authorizations); response.addHeader("Content-Disposition", "attachment; filename=" + workspace.getDisplayTitle() + ".lumifyWorkspace"); OutputStream out = response.getOutputStream(); try { GraphBackup graphBackup = new GraphBackup(); graphBackup.saveVertex(workspaceVertex, out); graphBackup.save(vertices, edges, out); } finally { out.close(); } } private Iterable<String> getWorkspaceEntityIds(final User user, final Workspace workspace) { return new ConvertingIterable<WorkspaceEntity, String>(this.workspaceRepository.findEntities(workspace, user)) { @Override protected String convert(WorkspaceEntity o) { return o.getEntityVertexId(); } }; } }