Skip to content

Commit

Permalink
Merge pull request #41209 from gayaldassanayake/java17-migration
Browse files Browse the repository at this point in the history
Migrate `bal tool` and `compiler plugin` to java17
  • Loading branch information
gayaldassanayake authored Aug 17, 2023
2 parents e38dc2b + e87e53d commit cc94e5e
Show file tree
Hide file tree
Showing 20 changed files with 76 additions and 56 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -599,16 +599,16 @@ public static void writeDependenciesToml(Path projectPath, DependencyGraphJson t
Files.writeString(depsTomlPath, pkgDesc.toString(), StandardOpenOption.APPEND);
}

private static Path getPlatformSpecificBalaPath(String orgName, String templatePkgName, String version,
public static Path getPlatformSpecificBalaPath(String orgName, String pkgName, String version,
Path balaCache) {
Path balaPath = balaCache.resolve(
ProjectUtils.getRelativeBalaPath(orgName, templatePkgName, version, null));
ProjectUtils.getRelativeBalaPath(orgName, pkgName, version, null));
//First we will check for a bala that match any platform
platform = ANY_PLATFORM;
if (!Files.exists(balaPath)) {
for (JvmTarget supportedPlatform : JvmTarget.values()) {
balaPath = balaCache.resolve(
ProjectUtils.getRelativeBalaPath(orgName, templatePkgName, version, supportedPlatform.code()));
ProjectUtils.getRelativeBalaPath(orgName, pkgName, version, supportedPlatform.code()));
if (Files.exists(balaPath)) {
platform = supportedPlatform.code();
break;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,9 @@
import picocli.CommandLine;

import java.io.PrintStream;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

import static io.ballerina.cli.cmd.Constants.SEARCH_COMMAND;
import static io.ballerina.cli.utils.PrintUtils.printPackages;
Expand Down Expand Up @@ -144,13 +146,14 @@ private void searchInCentral(String query) {
settings.getProxy().password(),
getAccessTokenOfCLI(settings));
boolean foundSearch = false;
for (JvmTarget jvmTarget : JvmTarget.values()) {
PackageSearchResult packageSearchResult = client.searchPackage(query,
jvmTarget.code(), RepoUtils.getBallerinaVersion());
if (packageSearchResult.getCount() > 0) {
printPackages(packageSearchResult.getPackages(), RepoUtils.getTerminalWidth());
foundSearch = true;
}
String supportedPlatform = Arrays.stream(JvmTarget.values())
.map(target -> target.code())
.collect(Collectors.joining(","));
PackageSearchResult packageSearchResult = client.searchPackage(query,
supportedPlatform, RepoUtils.getBallerinaVersion());
if (packageSearchResult.getCount() > 0) {
printPackages(packageSearchResult.getPackages(), RepoUtils.getTerminalWidth());
foundSearch = true;
}
if (!foundSearch) {
outStream.println("no modules found");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
import io.ballerina.cli.utils.PrintUtils;
import io.ballerina.projects.BalToolsManifest;
import io.ballerina.projects.BalToolsToml;
import io.ballerina.projects.JvmTarget;
import io.ballerina.projects.ProjectException;
import io.ballerina.projects.SemanticVersion;
import io.ballerina.projects.Settings;
Expand All @@ -46,10 +47,12 @@
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.stream.Collectors;
import java.util.stream.Stream;

import static io.ballerina.cli.cmd.Constants.TOOL_COMMAND;
Expand All @@ -63,7 +66,6 @@
import static io.ballerina.projects.util.ProjectUtils.getAccessTokenOfCLI;
import static io.ballerina.projects.util.ProjectUtils.initializeProxy;
import static io.ballerina.projects.util.ProjectUtils.validateToolName;
import static org.wso2.ballerinalang.programfile.ProgramFileConstants.ANY_PLATFORM;

/**
* This class represents the "bal tool" command.
Expand Down Expand Up @@ -410,8 +412,9 @@ public void pullToolAndUpdateBalToolsToml(String toolIdArg, String versionArg) {
.resolve(REPOSITORIES_DIR).resolve(CENTRAL_REPOSITORY_CACHE_NAME)
.resolve(ProjectConstants.BALA_DIR_NAME);

// TODO: make supportedPlatform = "java11,java17" once central is fixed
String supportedPlatform = "java11";
String supportedPlatform = Arrays.stream(JvmTarget.values())
.map(JvmTarget::code)
.collect(Collectors.joining(","));
try {
if (isToolAvailableLocally(toolId, version)) {
outStream.println("tool " + toolId + ":" + version + " is already available locally.");
Expand Down Expand Up @@ -566,8 +569,9 @@ private void searchToolsInCentral(String keyword) {
initializeProxy(settings.getProxy()), settings.getProxy().username(),
settings.getProxy().password(), getAccessTokenOfCLI(settings));
boolean foundTools = false;
// TODO: make supportedPlatform = "java11,java17" once central is fixed
String supportedPlatform = "java11";
String supportedPlatform = Arrays.stream(JvmTarget.values())
.map(JvmTarget::code)
.collect(Collectors.joining(","));
ToolSearchResult toolSearchResult = client.searchTool(keyword, supportedPlatform,
RepoUtils.getBallerinaVersion());
List<Tool> tools = toolSearchResult.getTools();
Expand Down Expand Up @@ -635,11 +639,10 @@ private boolean checkToolDistCompatibility() {
}

private SemanticVersion getToolDistVersionFromCentralCache() {
// TODO: ANY_PLATFORM should be updated to java* after we fix #41015
Path balaPath = ProjectUtils.createAndGetHomeReposPath()
Path centralBalaDirPath = ProjectUtils.createAndGetHomeReposPath()
.resolve(REPOSITORIES_DIR).resolve(CENTRAL_REPOSITORY_CACHE_NAME)
.resolve(ProjectConstants.BALA_DIR_NAME).resolve(org).resolve(name).resolve(version)
.resolve(ANY_PLATFORM);
.resolve(ProjectConstants.BALA_DIR_NAME);
Path balaPath = CommandUtil.getPlatformSpecificBalaPath(org, name, version, centralBalaDirPath);
PackageJson packageJson = BalaFiles.readPackageJson(balaPath);
return SemanticVersion.from(packageJson.getBallerinaVersion());
}
Expand Down Expand Up @@ -677,10 +680,11 @@ private void updateToolToLatestVersion() {
.resolve(REPOSITORIES_DIR).resolve(CENTRAL_REPOSITORY_CACHE_NAME)
.resolve(ProjectConstants.BALA_DIR_NAME);

// TODO: make supportedPlatform = "java11,java17" once central is fixed
String supportedPlatform = "java11";
String supportedPlatform = Arrays.stream(JvmTarget.values())
.map(JvmTarget::code)
.collect(Collectors.joining(","));
try {
version = getLatestVersionForUpdateCommand(tool.get());
version = getLatestVersionForUpdateCommand(supportedPlatform, tool.get());
if (tool.get().version().equals(version)) {
outStream.println("tool '" + toolId + "' is already up-to-date.");
CommandUtil.exitError(this.exitWhenFinish);
Expand All @@ -702,7 +706,8 @@ private void updateToolToLatestVersion() {
}
}

private String getLatestVersionForUpdateCommand(BalToolsManifest.Tool tool) throws CentralClientException {
private String getLatestVersionForUpdateCommand(String supportedPlatforms, BalToolsManifest.Tool tool)
throws CentralClientException {
Settings settings;
try {
settings = RepoUtils.readSettings();
Expand All @@ -715,7 +720,7 @@ private String getLatestVersionForUpdateCommand(BalToolsManifest.Tool tool) thro
CentralAPIClient client = new CentralAPIClient(RepoUtils.getRemoteRepoURL(),
initializeProxy(settings.getProxy()), settings.getProxy().username(),
settings.getProxy().password(), getAccessTokenOfCLI(settings));
List<String> versions = client.getPackageVersions(tool.org(), tool.name(), ANY_PLATFORM,
List<String> versions = client.getPackageVersions(tool.org(), tool.name(), supportedPlatforms,
RepoUtils.getBallerinaVersion());
return getLatestVersion(versions, tool.version());
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -87,7 +87,6 @@
import static io.ballerina.projects.util.ProjectConstants.CONFIG_DIR;
import static io.ballerina.projects.util.ProjectConstants.HOME_REPO_DEFAULT_DIRNAME;
import static io.ballerina.projects.util.ProjectConstants.REPOSITORIES_DIR;
import static org.wso2.ballerinalang.programfile.ProgramFileConstants.ANY_PLATFORM;

/**
* This class contains utility functions needed for Bal Tool tasks in the Main class.
Expand Down Expand Up @@ -171,26 +170,27 @@ private static List<File> getToolCommandJarAndDependencyJars(String commandName)
return balToolsManifest.tools().values().stream()
.flatMap(map -> map.values().stream())
.filter(BalToolsManifest.Tool::active)
.map(tool1 -> findJarFiles(centralBalaDirPath.resolve(
Path.of(tool1.org(), tool1.name(), tool1.version(), ANY_PLATFORM, TOOL, LIBS))
.map(tool1 -> findJarFiles(CommandUtil.getPlatformSpecificBalaPath(
tool1.org(), tool1.name(), tool1.version(), centralBalaDirPath).resolve(TOOL).resolve(LIBS)
.toFile()))
.flatMap(List::stream)
.collect(Collectors.toList());
}

Optional<BalToolsManifest.Tool> tool = balToolsManifest.getActiveTool(commandName);
if (tool.isPresent()) {
if (!isToolDistCompatibilityWithCurrentDist(tool.get())) {
String errMsg = "tool '" + tool.get().id() + ":" + tool.get().version() +
Optional<BalToolsManifest.Tool> toolOpt = balToolsManifest.getActiveTool(commandName);
if (toolOpt.isPresent()) {
BalToolsManifest.Tool tool = toolOpt.get();
if (!isToolDistCompatibilityWithCurrentDist(tool)) {
String errMsg = "tool '" + tool.id() + ":" + tool.version() +
"' is not compatible with the current Ballerina distribution '" +
RepoUtils.getBallerinaShortVersion() +
"'. Use 'bal tool search' to select a version compatible with the " +
"current Ballerina distribution.";
throw LauncherUtils.createLauncherException(errMsg);
}
File libsDir = centralBalaDirPath.resolve(
Path.of(tool.get().org(), tool.get().name(), tool.get().version(),
ANY_PLATFORM, TOOL, LIBS)).toFile();
Path platformPath = CommandUtil.getPlatformSpecificBalaPath(
tool.org(), tool.name(), tool.version(), centralBalaDirPath);
File libsDir = platformPath.resolve(Path.of(TOOL, LIBS)).toFile();
return findJarFiles(libsDir);
}
throw LauncherUtils.createUsageExceptionWithHelp("unknown command '" + commandName + "'");
Expand All @@ -203,11 +203,10 @@ private static boolean isToolDistCompatibilityWithCurrentDist(BalToolsManifest.T
}

private static SemanticVersion getToolDistVersionFromCentralCache(BalToolsManifest.Tool tool) {
Path balaPath = ProjectUtils.createAndGetHomeReposPath()
.resolve(REPOSITORIES_DIR).resolve(CENTRAL_REPOSITORY_CACHE_NAME)
.resolve(ProjectConstants.BALA_DIR_NAME)
.resolve(tool.org()).resolve(tool.name()).resolve(tool.version())
.resolve(ANY_PLATFORM);
Path centralBalaDirPath = ProjectUtils.createAndGetHomeReposPath().resolve(
Path.of(REPOSITORIES_DIR, CENTRAL_REPOSITORY_CACHE_NAME, ProjectConstants.BALA_DIR_NAME));
Path balaPath = CommandUtil.getPlatformSpecificBalaPath(
tool.org(), tool.name(), tool.version(), centralBalaDirPath);
PackageJson packageJson = BalaFiles.readPackageJson(balaPath);
return SemanticVersion.from(packageJson.getBallerinaVersion());
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -579,7 +579,7 @@ public void testNewCommandWithTool() throws IOException {
Assert.assertEquals(packBuildLog.replaceAll("\r", ""), getOutput("pack-tool-template.txt"));
Assert.assertTrue(
packageDir.resolve("target").resolve("bala")
.resolve("testuserorg-tool_sample-any-0.1.0.bala").toFile().exists());
.resolve("testuserorg-tool_sample-java17-0.1.0.bala").toFile().exists());
}

@Test(description = "Test new command with invalid project name", dataProvider = "invalidProjectNames")
Expand Down Expand Up @@ -668,7 +668,7 @@ public void testNewCommandWithToolTemplateCentral() throws IOException {
Assert.assertEquals(packBuildLog.replaceAll("\r", ""), getOutput("pack-central-tool.txt"));
Assert.assertTrue(
packageDir.resolve("target").resolve("bala")
.resolve("testorg-sample_tool_template-any-1.0.0.bala").toFile().exists());
.resolve("testorg-sample_tool_template-java17-1.0.0.bala").toFile().exists());
}

@Test(description = "Test new command with central template in the local cache")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,6 @@
"ballerina_version": "2201.6.0-SNAPSHOT",
"implementation_vendor": "WSO2",
"language_spec_version": "2022R4",
"platform": "any",
"platform": "java17",
"template": true
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,4 +2,4 @@ Compiling source
testorg/sample_tool_template:1.0.0

Creating bala
target/bala/testorg-sample_tool_template-any-1.0.0.bala
target/bala/testorg-sample_tool_template-java17-1.0.0.bala
Original file line number Diff line number Diff line change
Expand Up @@ -2,4 +2,4 @@ Compiling source
testuserorg/tool_sample:0.1.0

Creating bala
target/bala/testuserorg-tool_sample-any-0.1.0.bala
target/bala/testuserorg-tool_sample-java17-0.1.0.bala
Original file line number Diff line number Diff line change
Expand Up @@ -2,4 +2,4 @@ Compiling source
testorg/sample_tool_template:1.0.0

Creating bala
target\bala\testorg-sample_tool_template-any-1.0.0.bala
target\bala\testorg-sample_tool_template-java17-1.0.0.bala
Original file line number Diff line number Diff line change
Expand Up @@ -2,4 +2,4 @@ Compiling source
testuserorg/tool_sample:0.1.0

Creating bala
target\bala\testuserorg-tool_sample-any-0.1.0.bala
target\bala\testuserorg-tool_sample-java17-0.1.0.bala
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,7 @@
import static java.net.HttpURLConnection.HTTP_UNAVAILABLE;
import static org.ballerinalang.central.client.CentralClientConstants.ACCEPT;
import static org.ballerinalang.central.client.CentralClientConstants.ACCEPT_ENCODING;
import static org.ballerinalang.central.client.CentralClientConstants.ANY_PLATFORM;
import static org.ballerinalang.central.client.CentralClientConstants.APPLICATION_JSON;
import static org.ballerinalang.central.client.CentralClientConstants.APPLICATION_OCTET_STREAM;
import static org.ballerinalang.central.client.CentralClientConstants.AUTHORIZATION;
Expand All @@ -87,6 +88,7 @@
import static org.ballerinalang.central.client.CentralClientConstants.LOCATION;
import static org.ballerinalang.central.client.CentralClientConstants.ORGANIZATION;
import static org.ballerinalang.central.client.CentralClientConstants.PKG_NAME;
import static org.ballerinalang.central.client.CentralClientConstants.PLATFORM;
import static org.ballerinalang.central.client.CentralClientConstants.USER_AGENT;
import static org.ballerinalang.central.client.CentralClientConstants.VERSION;
import static org.ballerinalang.central.client.Utils.ProgressRequestBody;
Expand Down Expand Up @@ -649,6 +651,7 @@ public String[] pullTool(String toolId, String version, Path balaCacheDirPath, S
Optional<String> pkgName = Optional.empty();
Optional<String> latestVersion = Optional.empty();
Optional<String> balaUrl = Optional.empty();
Optional<String> platform = Optional.empty();
if (body.isPresent()) {
Optional<MediaType> contentType = Optional.ofNullable(body.get().contentType());
if (contentType.isPresent() && isApplicationJsonContentType(contentType.get().toString())) {
Expand All @@ -657,13 +660,14 @@ public String[] pullTool(String toolId, String version, Path balaCacheDirPath, S
pkgName = Optional.ofNullable(jsonContent.get(PKG_NAME).getAsString());
latestVersion = Optional.ofNullable(jsonContent.get(VERSION).getAsString());
balaUrl = Optional.ofNullable(jsonContent.get(BALA_URL).getAsString());
platform = Optional.of(jsonContent.get(PLATFORM).getAsString())
.or(() -> Optional.of(ANY_PLATFORM));
}
}

if (balaUrl.isPresent() && org.isPresent() && latestVersion.isPresent()
&& pkgName.isPresent()) {
String balaFileName = "attachment; filename=" + org.get() + "-" + pkgName.get() + "-any-"
+ latestVersion.get() + ".bala";
if (balaUrl.isPresent() && org.isPresent() && latestVersion.isPresent() && pkgName.isPresent()) {
String balaFileName = "attachment; filename=" + org.get() + "-" + pkgName.get()
+ "-" + platform.get() + "-" + latestVersion.get() + ".bala";
Request downloadBalaRequest = getNewRequest(supportedPlatform, ballerinaVersion)
.get()
.url(balaUrl.get())
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,8 @@ private CentralClientConstants() {
static final String ORGANIZATION = "organization";
static final String VERSION = "version";
static final String BALA_URL = "balaURL";
static final String PLATFORM = "platform";
static final String ANY_PLATFORM = "any";
static final String PKG_NAME = "name";
static final String IS_DEPRECATED = "isdeprecated";
static final String DEPRECATE_MESSAGE = "deprecatemessage";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -61,9 +61,9 @@ public class JBallerinaBalaWriter extends BalaWriter {
public JBallerinaBalaWriter(JBallerinaBackend backend) {
this.backend = backend;
this.packageContext = backend.packageContext();
this.target = getTargetPlatform(packageContext.getResolution()).code();
this.compilerPluginToml = readCompilerPluginToml();
this.balToolToml = readBalToolToml();
this.target = getTargetPlatform(packageContext.getResolution()).code();
}


Expand Down Expand Up @@ -243,6 +243,11 @@ private CompilerBackend.TargetPlatform getTargetPlatform(PackageResolution pkgRe
return this.backend.targetPlatform();
}

// 3) Check if the package has a BalTool.toml or a CompilerPlugin.toml
if (this.balToolToml.isPresent() || this.compilerPluginToml.isPresent()) {
return this.backend.targetPlatform();
}

return AnyTarget.ANY;
}

Expand Down
Loading

0 comments on commit cc94e5e

Please sign in to comment.