Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions doc/user_guide.md
Original file line number Diff line number Diff line change
Expand Up @@ -763,6 +763,7 @@ recognized file types:
* C (`.c`, `.h`)
* C++ (`.C`, `.cpp`, `.c++`, `.cc`, `.H`, `.hpp`, `.h++`, `.hh`)
* C# (`.c#`, `cs`)
* Doxygen (`.dox`)
* Database related (`.sql`, `.pls`)
* Configuration files (`.cfg`, `.conf`, `.ini`)
* [Go](https://golang.org/) (`.go`)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,115 +1,116 @@
package org.itsallcode.openfasttrace.importer.tag;

import java.util.*;
import java.util.stream.Stream;

import org.itsallcode.openfasttrace.api.importer.*;
import org.itsallcode.openfasttrace.api.importer.input.InputFile;
import org.itsallcode.openfasttrace.api.importer.tag.config.PathConfig;

/**
* {@link ImporterFactory} for tags in source code files.
*/
// [impl->dsn~import.full-coverage-tag~1]
public class TagImporterFactory extends ImporterFactory
{
private static final String DEFAULT_FILE_REGEX = "(?i).*\\.java";
private static final List<String> SUPPORTED_DEFAULT_EXTENSIONS = Arrays.asList( //
"ads", "adb", // Ada
"bat", // Windows batch files
"c", "C", "cc", "cpp", "c++", "h", "H", "h++", "hh", "hpp", // C/C++
"c#", "cs", // C#
"cfg", "conf", "ini", // configuration files
"feature", // Gherkin feature files
"go", // Go
"groovy", // Groovy
"json", "htm", "html", "xhtml", "xml", "yaml", "yml", // markup languages
"fxml", "java", // Java
"clj", "kt", "kts", "scala", // JVM languages
"js", "mjs", "cjs", "ejs", // JavaScript
"ts", // TypeScript
"lua", // Lua
"m", "mm", // Objective C
"php", // PHP
"proto", // Protocol Buffers
"pl", "pm", // Perl
"proto", // Protobuf
"py", // Python
"robot", // Robot Framework
"pu", "puml", "plantuml", // PlantUML
"r", // R Language
"rs", // Rust
"sh", "bash", "zsh", // Shell programming
"sv", "v", "inc", // SystemVerilog
"swift", // Swift
"toml", // Tom's Obvious Minimal Language : a config file format
"tf", "tfvars", // Terraform
"sql", "pls" // Database related
);

/**
* Create a new {@link TagImporterFactory}.
*/
public TagImporterFactory()
{
// empty by intention
}

@Override
public int getPriority() {
return 10000;
}


@Override
public boolean supportsFile(final InputFile path)
{
return supportsDefaultFile(path) || supportsConfiguredFile(path);
}

private boolean supportsConfiguredFile(final InputFile path)
{
return findConfig(path).isPresent();
}

boolean supportsDefaultFile(final InputFile file)
{
final String path = file.getPath();
final int lastDotPosition = path.lastIndexOf(".");
if (lastDotPosition > 0)
{
final String extension = path.substring(lastDotPosition + 1);
return SUPPORTED_DEFAULT_EXTENSIONS.contains(extension);
}
else
{
return false;
}
}

private Optional<PathConfig> findConfig(final InputFile file)
{
return getPathConfigs() //
.filter(config -> config.matches(file)) //
.findFirst();
}

@Override
public Importer createImporter(final InputFile path, final ImportEventListener listener)
{
if (!supportsFile(path))
{
throw new ImporterException("File '" + path
+ "' cannot be imported because it does not match any supported file patterns: "
+ DEFAULT_FILE_REGEX + " and " + getPathConfigs().toList());
}
final Optional<PathConfig> config = findConfig(path);
return TagImporter.create(config.orElse(null), path, listener);
}

private Stream<PathConfig> getPathConfigs()
{
final ImportSettings settings = getContext().getImportSettings();
return settings == null ? Stream.empty() : settings.getPathConfigs().stream();
}
}
package org.itsallcode.openfasttrace.importer.tag;

import java.util.*;
import java.util.stream.Stream;

import org.itsallcode.openfasttrace.api.importer.*;
import org.itsallcode.openfasttrace.api.importer.input.InputFile;
import org.itsallcode.openfasttrace.api.importer.tag.config.PathConfig;

/**
* {@link ImporterFactory} for tags in source code files.
*/
// [impl->dsn~import.full-coverage-tag~1]
public class TagImporterFactory extends ImporterFactory
{
private static final String DEFAULT_FILE_REGEX = "(?i).*\\.java";
private static final List<String> SUPPORTED_DEFAULT_EXTENSIONS = Arrays.asList( //
"ads", "adb", // Ada
"bat", // Windows batch files
"c", "C", "cc", "cpp", "c++", "h", "H", "h++", "hh", "hpp", // C/C++
"dox", // Doxygen
"c#", "cs", // C#
"cfg", "conf", "ini", // configuration files
"feature", // Gherkin feature files
"go", // Go
"groovy", // Groovy
"json", "htm", "html", "xhtml", "xml", "yaml", "yml", // markup languages
"fxml", "java", // Java
"clj", "kt", "kts", "scala", // JVM languages
"js", "mjs", "cjs", "ejs", // JavaScript
"ts", // TypeScript
"lua", // Lua
"m", "mm", // Objective C
"php", // PHP
"proto", // Protocol Buffers
"pl", "pm", // Perl
"proto", // Protobuf
"py", // Python
"robot", // Robot Framework
"pu", "puml", "plantuml", // PlantUML
"r", // R Language
"rs", // Rust
"sh", "bash", "zsh", // Shell programming
"sv", "v", "inc", // SystemVerilog
"swift", // Swift
"toml", // Tom's Obvious Minimal Language : a config file format
"tf", "tfvars", // Terraform
"sql", "pls" // Database related
);

/**
* Create a new {@link TagImporterFactory}.
*/
public TagImporterFactory()
{
// empty by intention
}

@Override
public int getPriority() {
return 10000;
}


@Override
public boolean supportsFile(final InputFile path)
{
return supportsDefaultFile(path) || supportsConfiguredFile(path);
}

private boolean supportsConfiguredFile(final InputFile path)
{
return findConfig(path).isPresent();
}

boolean supportsDefaultFile(final InputFile file)
{
final String path = file.getPath();
final int lastDotPosition = path.lastIndexOf(".");
if (lastDotPosition > 0)
{
final String extension = path.substring(lastDotPosition + 1);
return SUPPORTED_DEFAULT_EXTENSIONS.contains(extension);
}
else
{
return false;
}
}

private Optional<PathConfig> findConfig(final InputFile file)
{
return getPathConfigs() //
.filter(config -> config.matches(file)) //
.findFirst();
}

@Override
public Importer createImporter(final InputFile path, final ImportEventListener listener)
{
if (!supportsFile(path))
{
throw new ImporterException("File '" + path
+ "' cannot be imported because it does not match any supported file patterns: "
+ DEFAULT_FILE_REGEX + " and " + getPathConfigs().toList());
}
final Optional<PathConfig> config = findConfig(path);
return TagImporter.create(config.orElse(null), path, listener);
}

private Stream<PathConfig> getPathConfigs()
{
final ImportSettings settings = getContext().getImportSettings();
return settings == null ? Stream.empty() : settings.getPathConfigs().stream();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ protected List<String> getSupportedFilenames()
{
return asList("file.java", "FILE.java", "file.md.java", "file.ads", "file.adb", "foo.bash", "foo.bar.bash",
"foo.bat", "foo.java", "foo.c", "foo.C", "foo.c++", "foo.c#", "foo.cc", "foo.cfg",
"foo.conf", "foo.cpp", "foo.cs", "foo.feature", "foo.fxml", "foo.go",
"foo.conf", "foo.cpp", "foo.dox", "foo.cs", "foo.feature", "foo.fxml", "foo.go",
"foo.groovy", "foo.h", "foo.H", "foo.hh", "foo.h++",
"foo.htm", "foo.html", "foo.ini", "foo.js", "foo.kt", "foo.kts", "foo.mjs", "foo.cjs", "foo.ejs",
"foo.ts", "foo.json",
Expand Down