package org.jboss.windup.graph.service;
import java.nio.file.Paths;
import com.tinkerpop.blueprints.Vertex;
import com.tinkerpop.frames.structures.FramedVertexIterable;
import org.jboss.windup.graph.GraphContext;
import org.jboss.windup.graph.TitanUtil;
import org.jboss.windup.graph.model.WindupVertexFrame;
import org.jboss.windup.graph.model.resource.FileModel;
import org.jboss.windup.util.ExecutionStatistics;
import com.thinkaurelius.titan.core.attribute.Text;
import com.thinkaurelius.titan.util.datastructures.IterablesUtil;
public class FileService extends GraphService<FileModel>
{
public FileService(GraphContext context)
{
super(context, FileModel.class);
}
public FileModel createByFilePath(String filePath)
{
return createByFilePath(null, filePath);
}
public FileModel createByFilePath(FileModel parentFile, String filePath)
{
ExecutionStatistics.get().begin("FileService.createByFilePath(parentFile, filePath)");
// always search by absolute path
String absolutePath = Paths.get(filePath).normalize().toAbsolutePath().toString();
FileModel entry = findByPath(absolutePath);
if (entry == null)
{
entry = this.create();
entry.setFilePath(absolutePath);
entry.setParentFile(parentFile);
}
ExecutionStatistics.get().end("FileService.createByFilePath(parentFile, filePath)");
return entry;
}
public FileModel findByPath(String filePath)
{
// make the path absolute (as we only store absolute paths)
filePath = Paths.get(filePath).toAbsolutePath().toString();
return getUniqueByProperty(FileModel.FILE_PATH, filePath);
}
public Iterable<FileModel> findByFilenameRegex(String filenameRegex)
{
filenameRegex = TitanUtil.titanifyRegex(filenameRegex);
Iterable<Vertex> vertices = getGraphContext().getFramed().query()
.has(FileModel.FILE_NAME, Text.REGEX, filenameRegex)
.has(WindupVertexFrame.TYPE_PROP, FileModel.TYPE).vertices();
return new FramedVertexIterable<>(getGraphContext().getFramed(), vertices, FileModel.class);
}
public Iterable<FileModel> findArchiveEntryWithExtension(String... values)
{
// build regex
if (values.length == 0)
{
return IterablesUtil.emptyIterable();
}
final String regex;
if (values.length == 1)
{
regex = ".+\\." + values[0] + "$";
}
else
{
StringBuilder builder = new StringBuilder();
builder.append("\\b(");
for (String value : values)
{
builder.append("|");
builder.append(value);
}
builder.append(")\\b");
regex = ".+\\." + builder.toString() + "$";
}
return getGraphContext().getQuery().type(FileModel.class)
.has("filePath", Text.REGEX, regex).vertices(FileModel.class);
}
}