package io.lumify.web.importExportWorkspaces;
import io.lumify.miniweb.HandlerChain;
import io.lumify.core.config.Configuration;
import io.lumify.core.exception.LumifyException;
import io.lumify.core.model.user.UserRepository;
import io.lumify.core.model.workspace.WorkspaceRepository;
import io.lumify.core.user.User;
import io.lumify.core.util.LumifyLogger;
import io.lumify.core.util.LumifyLoggerFactory;
import io.lumify.securegraph.model.user.SecureGraphUserRepository;
import io.lumify.securegraph.model.workspace.SecureGraphWorkspaceRepository;
import io.lumify.web.BaseRequestHandler;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.securegraph.Authorizations;
import org.securegraph.Graph;
import org.securegraph.Vertex;
import org.securegraph.tools.GraphRestore;
import javax.inject.Inject;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part;
import java.io.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Import extends BaseRequestHandler {
private static final LumifyLogger LOGGER = LumifyLoggerFactory.getLogger(Import.class);
private final SecureGraphWorkspaceRepository workspaceRepository;
private final Graph graph;
@Inject
public Import(
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 {
if (!ServletFileUpload.isMultipartContent(request)) {
LOGGER.warn("Could not process request without multi-part content");
respondWithBadRequest(response, "file", "Could not process request without multi-part content");
return;
}
User user = getUser(request);
Vertex userVertex = ((SecureGraphUserRepository) getUserRepository()).findByIdUserVertex(user.getUserId());
GraphRestore graphRestore = new GraphRestore();
for (Part part : request.getParts()) {
if (part.getName().equals("workspace")) {
File outFile = File.createTempFile("lumifyWorkspaceImport", "lumifyworkspace");
copyPartToFile(part, outFile);
String workspaceId = getWorkspaceId(outFile);
Authorizations authorizations = getUserRepository().getAuthorizations(user, UserRepository.VISIBILITY_STRING, WorkspaceRepository.VISIBILITY_STRING, workspaceId);
InputStream in = new FileInputStream(outFile);
try {
graphRestore.restore(graph, in, authorizations);
Vertex workspaceVertex = this.workspaceRepository.getVertex(workspaceId, user);
this.workspaceRepository.addWorkspaceToUser(workspaceVertex, userVertex, authorizations);
} finally {
graph.flush();
in.close();
}
}
}
respondWithPlaintext(response, "Workspace Imported");
}
private String getWorkspaceId(File file) throws IOException {
BufferedReader in = new BufferedReader(new FileReader(file));
String workspaceLine = in.readLine();
Matcher m = Pattern.compile(".*\"id\":\"(.*?)\".*").matcher(workspaceLine);
if (!m.matches()) {
throw new LumifyException("Could not find Workspace id in line: " + workspaceLine);
}
return m.group(1);
}
}