Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Refine the map_java_to_class implementation #1552 #1554

Merged
merged 1 commit into from
Jan 21, 2025
Merged
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
27 changes: 17 additions & 10 deletions scanpipe/pipes/d2d.py
Original file line number Diff line number Diff line change
Expand Up @@ -192,15 +192,25 @@ def map_java_to_class(project, logger=None):
to_resources = project_files.to_codebase().has_no_relation()

to_resources_dot_class = to_resources.filter(extension=".class")
resource_count = to_resources_dot_class.count()
if logger:
logger(f"Mapping {resource_count:,d} .class resources to .java")
from_resources_dot_java = (
from_resources.filter(extension=".java")
# The "java_package" extra_data value is set during the `find_java_packages`,
# it is required to build the index.
.filter(extra_data__java_package__isnull=False)
)
to_resource_count = to_resources_dot_class.count()
from_resource_count = from_resources_dot_java.count()

from_resources_dot_java = from_resources.filter(extension=".java")
if not from_resources_dot_java.exists():
if not from_resource_count:
logger("No .java resources to map.")
return

if logger:
logger(
f"Mapping {to_resource_count:,d} .class resources to "
f"{from_resource_count:,d} .java"
)

# build an index using from-side Java fully qualified class file names
# built from the "java_package" and file name
indexables = get_indexable_qualified_java_paths(from_resources_dot_java)
Expand All @@ -209,7 +219,7 @@ def map_java_to_class(project, logger=None):
from_classes_index = pathmap.build_index(indexables, with_subpaths=False)

resource_iterator = to_resources_dot_class.iterator(chunk_size=2000)
progress = LoopProgress(resource_count, logger)
progress = LoopProgress(to_resource_count, logger)

for to_resource in progress.iter(resource_iterator):
_map_java_to_class_resource(to_resource, from_resources, from_classes_index)
Expand All @@ -228,11 +238,8 @@ def get_indexable_qualified_java_paths_from_values(resource_values):
(123, "org/apache/commons/LoggerImpl.java")
"""
for resource_id, resource_name, resource_extra_data in resource_values:
java_package = resource_extra_data and resource_extra_data.get("java_package")
if not java_package:
continue
fully_qualified = jvm.get_fully_qualified_java_path(
java_package,
java_package=resource_extra_data.get("java_package"),
filename=resource_name,
)
yield resource_id, fully_qualified
Expand Down
4 changes: 2 additions & 2 deletions scanpipe/tests/pipes/test_d2d.py
Original file line number Diff line number Diff line change
Expand Up @@ -365,7 +365,7 @@ def test_scanpipe_pipes_d2d_map_java_to_class(self):
buffer = io.StringIO()
d2d.map_java_to_class(self.project1, logger=buffer.write)

expected = "Mapping 3 .class resources to .java"
expected = "Mapping 3 .class resources to 2 .java"
self.assertIn(expected, buffer.getvalue())

self.assertEqual(2, self.project1.codebaserelations.count())
Expand All @@ -390,7 +390,7 @@ def test_scanpipe_pipes_d2d_map_java_to_class_no_java(self):
make_resource_file(self.project1, path="to/Abstract.class")
buffer = io.StringIO()
d2d.map_java_to_class(self.project1, logger=buffer.write)
expected = "Mapping 1 .class resources to .java" "No .java resources to map."
expected = "No .java resources to map."
self.assertIn(expected, buffer.getvalue())

def test_scanpipe_pipes_d2d_map_jar_to_source(self):
Expand Down