package org.jboss.windup.graph.service;
import java.util.StringTokenizer;
import com.thinkaurelius.titan.core.attribute.Text;
import com.tinkerpop.blueprints.Vertex;
import com.tinkerpop.frames.structures.FramedVertexIterable;
import com.tinkerpop.gremlin.java.GremlinPipeline;
import org.apache.commons.io.FilenameUtils;
import org.jboss.windup.graph.GraphContext;
import org.jboss.windup.graph.model.ArchiveModel;
import org.jboss.windup.graph.model.WindupVertexFrame;
import org.jboss.windup.graph.model.resource.FileModel;
/**
* Provides methods for searching, creating, and deleting ArchiveModel Vertices.
*
* @author <a href="mailto:jesse.sightler@gmail.com">Jesse Sightler</a>
*
*/
public class ArchiveService extends GraphService<ArchiveModel>
{
public ArchiveService(GraphContext context)
{
super(context, ArchiveModel.class);
}
/**
* Finds all {@link ArchiveModel}s with the given sha1 hash.
*/
public Iterable<ArchiveModel> findBySHA1(String sha1)
{
GremlinPipeline<Vertex, Vertex> query = new GremlinPipeline<>(getGraphContext().getGraph());
query.V();
query.has(FileModel.SHA1_HASH, sha1);
query.has(WindupVertexFrame.TYPE_PROP, Text.CONTAINS, ArchiveModel.TYPE);
return new FramedVertexIterable<>(getGraphContext().getFramed(), query, ArchiveModel.class);
}
/**
* Finds the file at the provided path within the archive.
*
* Eg, getChildFile(ArchiveModel, "/META-INF/MANIFEST.MF") will return a {@link FileModel} if a file named
* /META-INF/MANIFEST.MF exists within the archive
*
* @return Returns the located {@link FileModel} or null if no file with this path could be located
*/
public FileModel getChildFile(ArchiveModel archiveModel, String filePath)
{
filePath = FilenameUtils.separatorsToUnix(filePath);
StringTokenizer stk = new StringTokenizer(filePath, "/");
FileModel currentFileModel = archiveModel;
while (stk.hasMoreTokens() && currentFileModel != null)
{
String pathElement = stk.nextToken();
currentFileModel = findFileModel(currentFileModel, pathElement);
}
return currentFileModel;
}
private FileModel findFileModel(FileModel fm, String pathElement)
{
FileModel result = null;
for (FileModel child : fm.getFilesInDirectory())
{
if (child.getFileName().equals(pathElement))
{
result = child;
break;
}
}
return result;
}
}