package io.lumify.javaCodeIngest;
import io.lumify.core.ingest.graphProperty.GraphPropertyWorkData;
import io.lumify.core.ingest.graphProperty.GraphPropertyWorker;
import io.lumify.core.model.properties.LumifyProperties;
import org.securegraph.*;
import org.securegraph.property.StreamingPropertyValue;
import java.io.InputStream;
import java.util.List;
import java.util.jar.JarEntry;
import java.util.jar.JarInputStream;
import static org.securegraph.util.IterableUtils.toList;
public class JarFileGraphPropertyWorker extends GraphPropertyWorker {
@Override
public void execute(InputStream in, GraphPropertyWorkData data) throws Exception {
LumifyProperties.CONCEPT_TYPE.setProperty(data.getElement(), Ontology.CONCEPT_TYPE_JAR_FILE, data.getProperty().getVisibility(), getAuthorizations());
LumifyProperties.MIME_TYPE.setProperty(data.getElement(), "application/java-archive", data.getProperty().getVisibility(), getAuthorizations());
List<Vertex> existingFileVerticies = toList(((Vertex) data.getElement()).getVertices(Direction.BOTH, Ontology.EDGE_LABEL_JAR_CONTAINS, getAuthorizations()));
JarInputStream jarInputStream = new JarInputStream(in);
JarEntry jarEntry;
while ((jarEntry = jarInputStream.getNextJarEntry()) != null) {
if (jarEntry.isDirectory()) {
continue;
}
if (fileAlreadyExists(existingFileVerticies, jarEntry.getName())) {
continue;
}
StreamingPropertyValue rawValue = new StreamingPropertyValue(jarInputStream, byte[].class);
rawValue.searchIndex(false);
Vertex jarEntryVertex = createFileVertex(jarEntry, rawValue, data);
createJarContainsFileEdge(jarEntryVertex, data);
getGraph().flush();
getWorkQueueRepository().pushGraphPropertyQueue(jarEntryVertex, LumifyProperties.RAW.getProperty(jarEntryVertex));
}
}
private boolean fileAlreadyExists(List<Vertex> existingFileVerticies, String fileName) {
for (Vertex v : existingFileVerticies) {
String existingFileName = LumifyProperties.FILE_NAME.getPropertyValue(v);
if (existingFileName == null) {
return false;
}
if (existingFileName.equals(fileName)) {
return true;
}
}
return false;
}
private void createJarContainsFileEdge(Vertex jarEntryVertex, GraphPropertyWorkData data) {
EdgeBuilder jarContainsEdgeBuilder = getGraph().prepareEdge((Vertex) data.getElement(), jarEntryVertex, Ontology.EDGE_LABEL_JAR_CONTAINS, data.getProperty().getVisibility());
jarContainsEdgeBuilder.save(getAuthorizations());
}
private Vertex createFileVertex(JarEntry jarEntry, StreamingPropertyValue rawValue, GraphPropertyWorkData data) {
VertexBuilder jarEntryVertexBuilder = getGraph().prepareVertex(data.getProperty().getVisibility());
LumifyProperties.TITLE.setProperty(jarEntryVertexBuilder, jarEntry.getName(), data.getProperty().getVisibility());
LumifyProperties.CONCEPT_TYPE.setProperty(jarEntryVertexBuilder, Ontology.CONCEPT_TYPE_CLASS_FILE, data.getProperty().getVisibility());
LumifyProperties.MIME_TYPE.setProperty(jarEntryVertexBuilder, "application/octet-stream", data.getProperty().getVisibility());
LumifyProperties.FILE_NAME.setProperty(jarEntryVertexBuilder, jarEntry.getName(), data.getProperty().getVisibility());
LumifyProperties.RAW.setProperty(jarEntryVertexBuilder, rawValue, data.getProperty().getVisibility());
return jarEntryVertexBuilder.save(getAuthorizations());
}
@Override
public boolean isHandled(Element element, Property property) {
if (property == null) {
return false;
}
if (!property.getName().equals(LumifyProperties.RAW.getPropertyName())) {
return false;
}
String fileName = LumifyProperties.FILE_NAME.getPropertyValue(element);
if (fileName == null || !fileName.endsWith(".jar")) {
return false;
}
return true;
}
}