package io.lumify.web.routes.admin; import com.google.inject.Inject; import io.lumify.core.config.Configuration; import io.lumify.core.model.ontology.OntologyRepository; 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.miniweb.HandlerChain; import io.lumify.web.BaseRequestHandler; import org.apache.commons.io.IOUtils; import org.json.JSONObject; import org.securegraph.Authorizations; import org.securegraph.util.FilterIterable; import org.semanticweb.owlapi.model.IRI; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.Part; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.util.List; import static org.securegraph.util.IterableUtils.toList; public class AdminUploadOntology extends BaseRequestHandler { private static final LumifyLogger LOGGER = LumifyLoggerFactory.getLogger(AdminUploadOntology.class); private final OntologyRepository ontologyRepository; @Inject public AdminUploadOntology( final OntologyRepository ontologyRepository, final UserRepository userRepository, final WorkspaceRepository workspaceRepository, final Configuration configuration) { super(userRepository, workspaceRepository, configuration); this.ontologyRepository = ontologyRepository; } @Override public void handle(HttpServletRequest request, HttpServletResponse response, HandlerChain chain) throws Exception { String documentIRIString = getOptionalParameter(request, "documentIRI"); List<Part> files = toList(getFiles(request)); if (files.size() != 1) { throw new RuntimeException("Wrong number of uploaded files. Expected 1 got " + files.size()); } Part file = files.get(0); File tempFile = File.createTempFile("ontologyUpload", ".bin"); writeToTempFile(file, tempFile); if (documentIRIString == null || documentIRIString.length() == 0) { documentIRIString = ontologyRepository.guessDocumentIRIFromPackage(tempFile); } IRI documentIRI = IRI.create(documentIRIString); User user = getUser(request); Authorizations authorizations = getAuthorizations(request, user); LOGGER.info("adding ontology: %s", documentIRI.toString()); ontologyRepository.writePackage(tempFile, documentIRI, authorizations); ontologyRepository.clearCache(); tempFile.delete(); respondWithSuccessJson(response); } private Iterable<Part> getFiles(HttpServletRequest request) throws IOException, ServletException { return new FilterIterable<Part>(request.getParts()) { @Override protected boolean isIncluded(Part part) { return part.getName().equals("file"); } }; } private void writeToTempFile(Part file, File tempFile) throws IOException { InputStream in = file.getInputStream(); try { FileOutputStream out = new FileOutputStream(tempFile); try { IOUtils.copy(in, out); } finally { out.close(); } } finally { in.close(); } } }