diff --git a/compiler/ballerina-lang/src/main/java/io/ballerina/projects/internal/environment/EnvironmentPackageCache.java b/compiler/ballerina-lang/src/main/java/io/ballerina/projects/internal/environment/EnvironmentPackageCache.java index 14634773018a..819dbc4c9912 100644 --- a/compiler/ballerina-lang/src/main/java/io/ballerina/projects/internal/environment/EnvironmentPackageCache.java +++ b/compiler/ballerina-lang/src/main/java/io/ballerina/projects/internal/environment/EnvironmentPackageCache.java @@ -22,15 +22,20 @@ */ public class EnvironmentPackageCache implements WritablePackageCache { - private final Map projects = new HashMap<>(); + private final Map projectsById = new HashMap<>(); + private final Map>> + projectsByOrgNameVersion = new HashMap<>(); public void cache(Package pkg) { - projects.put(pkg.packageId(), pkg.project()); + projectsById.put(pkg.packageId(), pkg.project()); + projectsByOrgNameVersion.computeIfAbsent(pkg.packageOrg(), k -> new HashMap<>()) + .computeIfAbsent(pkg.packageName(), k -> new HashMap<>()) + .put(pkg.packageVersion(), pkg.project()); } @Override public Optional getPackage(PackageId packageId) { - Project project = projects.get(packageId); + Project project = projectsById.get(packageId); if (project == null) { return Optional.empty(); } @@ -40,7 +45,7 @@ public Optional getPackage(PackageId packageId) { @Override public Package getPackageOrThrow(PackageId packageId) { - Project project = projects.get(packageId); + Project project = projectsById.get(packageId); if (project == null) { throw new IllegalStateException("Cannot find a Package for the given PackageId: " + packageId); } @@ -51,23 +56,15 @@ public Package getPackageOrThrow(PackageId packageId) { public Optional getPackage(PackageOrg packageOrg, PackageName packageName, PackageVersion version) { - // Do we have a need to improve this logic? - for (Project project : projects.values()) { - PackageDescriptor pkgDesc = project.currentPackage().descriptor(); - if (pkgDesc.org().equals(packageOrg) && pkgDesc.name().equals(packageName) && - pkgDesc.version().equals(version)) { - return Optional.of(project.currentPackage()); - } - } - return Optional.empty(); + return Optional.ofNullable(projectsByOrgNameVersion.getOrDefault(packageOrg, new HashMap<>()) + .getOrDefault(packageName, new HashMap<>()) + .get(version)).map(Project::currentPackage); } @Override public List getPackages(PackageOrg packageOrg, PackageName packageName) { - // Do we have a need to improve this logic? - // TODO Optimize this logic List foundList = new ArrayList<>(); - for (Project project : projects.values()) { + for (Project project : projectsById.values()) { PackageManifest pkgDesc = project.currentPackage().manifest(); if (pkgDesc.org().equals(packageOrg) && pkgDesc.name().equals(packageName)) { @@ -79,6 +76,14 @@ public List getPackages(PackageOrg packageOrg, PackageName packageName) @Override public void removePackage(PackageId packageId) { - projects.remove(packageId); + Optional project = Optional.ofNullable(projectsById.get(packageId)); + if (project.isEmpty()) { + return; + } + PackageDescriptor pkgDesc = project.get().currentPackage().descriptor(); + projectsByOrgNameVersion.get(pkgDesc.org()) + .get(pkgDesc.name()) + .remove(pkgDesc.version()); + projectsById.remove(packageId); } }