diff --git a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/api/Repository.java b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/api/Repository.java index 25c72f21fd69..af4f803c91c6 100644 --- a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/api/Repository.java +++ b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/api/Repository.java @@ -41,5 +41,5 @@ public interface Repository { * Get whether remote management is enabled. * @return True if remote management is enabled, false otherwise. */ - boolean isRemoteEnabled(); + boolean isRemoteManagementEnabled(); } diff --git a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/RepositoryImpl.java b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/RepositoryImpl.java index 5c82bc7606a2..002c04780501 100644 --- a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/RepositoryImpl.java +++ b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/RepositoryImpl.java @@ -43,7 +43,7 @@ public class RepositoryImpl implements Repository { private static final String nodeId = generateNodeId(); private static String balHome; private static String balVersion; - private static boolean isRemoteEnabled = false; + private static boolean isRemoteManagementEnabled = false; @Override public List getArtifacts() { @@ -73,8 +73,8 @@ public Node getNode() { } @Override - public boolean isRemoteEnabled() { - return isRemoteEnabled; + public boolean isRemoteManagementEnabled() { + return isRemoteManagementEnabled; } private Artifact createArtifact(ObjectValue service, ObjectValue listener) { @@ -92,7 +92,7 @@ private Artifact createArtifact(ObjectValue service, ObjectValue listener) { } public static void addServiceListener(BObject listener, BObject service, Object attachPoint) { - if (!isRemoteEnabled) { + if (!isRemoteManagementEnabled) { return; } BServiceType serviceType = (BServiceType) service.getType(); @@ -101,10 +101,11 @@ public static void addServiceListener(BObject listener, BObject service, Object listenerServiceMap.put((ObjectValue) listener, (ObjectValue) service); } - public static void addBallerinaRuntimeInformation(String balHome, String balVersion, boolean isRemoteEnabled) { + public static void addBallerinaRuntimeInformation(String balHome, String balVersion, + boolean isRemoteManagementEnabled) { RepositoryImpl.balHome = balHome; RepositoryImpl.balVersion = balVersion; - RepositoryImpl.isRemoteEnabled = isRemoteEnabled; + RepositoryImpl.isRemoteManagementEnabled = isRemoteManagementEnabled; } private static String generateNodeId() { diff --git a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/transactions/TransactionConstants.java b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/transactions/TransactionConstants.java index 345b8f82cac1..f7ee5d9e9d8a 100644 --- a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/transactions/TransactionConstants.java +++ b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/transactions/TransactionConstants.java @@ -70,4 +70,6 @@ public class TransactionConstants { public static final String ANN_NAME_TRX_PARTICIPANT_CONFIG = "Participant"; public static final String TIMESTAMP_OBJECT_VALUE_FIELD = "timeValue"; + public static final int DEFAULT_TRX_AUTO_COMMIT_TIMEOUT = 120; + public static final int DEFAULT_TRX_CLEANUP_TIMEOUT = 600; } diff --git a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/transactions/TransactionResourceManager.java b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/transactions/TransactionResourceManager.java index b12e8a342b95..da7c241b5116 100644 --- a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/transactions/TransactionResourceManager.java +++ b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/transactions/TransactionResourceManager.java @@ -59,6 +59,8 @@ import javax.transaction.xa.Xid; import static io.ballerina.runtime.api.constants.RuntimeConstants.BALLERINA_BUILTIN_PKG_PREFIX; +import static io.ballerina.runtime.transactions.TransactionConstants.DEFAULT_TRX_AUTO_COMMIT_TIMEOUT; +import static io.ballerina.runtime.transactions.TransactionConstants.DEFAULT_TRX_CLEANUP_TIMEOUT; import static io.ballerina.runtime.transactions.TransactionConstants.TRANSACTION_PACKAGE_ID; import static io.ballerina.runtime.transactions.TransactionConstants.TRANSACTION_PACKAGE_NAME; import static io.ballerina.runtime.transactions.TransactionConstants.TRANSACTION_PACKAGE_VERSION; @@ -85,6 +87,8 @@ public class TransactionResourceManager { private static final String ATOMIKOS_LOG_BASE_PROPERTY = "com.atomikos.icatch.log_base_dir"; private static final String ATOMIKOS_LOG_NAME_PROPERTY = "com.atomikos.icatch.log_base_name"; private static final String ATOMIKOS_REGISTERED_PROPERTY = "com.atomikos.icatch.registered"; + public static final String TRANSACTION_AUTO_COMMIT_TIMEOUT_KEY = "transactionAutoCommitTimeout"; + public static final String TRANSACTION_CLEANUP_TIMEOUT_KEY = "transactionCleanupTimeout"; private static final Logger log = LoggerFactory.getLogger(TransactionResourceManager.class); private Map> resourceRegistry; @@ -187,6 +191,56 @@ private String getTransactionLogDirectory() { } } + /** + * This method gets the user specified config for the transaction auto commit timeout. Default is 120. + * + * @return int transaction auto commit timeout value + */ + public static int getTransactionAutoCommitTimeout() { + VariableKey transactionAutoCommitTimeoutKey = new VariableKey(TRANSACTION_PACKAGE_ID, + TRANSACTION_AUTO_COMMIT_TIMEOUT_KEY, PredefinedTypes.TYPE_INT, false); + if (!ConfigMap.containsKey(transactionAutoCommitTimeoutKey)) { + return DEFAULT_TRX_AUTO_COMMIT_TIMEOUT; + } else { + Object configValue = ConfigMap.get(transactionAutoCommitTimeoutKey); + if (configValue == null) { + return DEFAULT_TRX_AUTO_COMMIT_TIMEOUT; + } + return parseTimeoutValue(configValue, DEFAULT_TRX_AUTO_COMMIT_TIMEOUT); + } + } + + /** + * This method gets the user specified config for cleaning up dead transactions. Default is 600. + * + * @return int transaction cleanup after value + */ + public static int getTransactionCleanupTimeout() { + VariableKey transactionCleanupTimeoutKey = new VariableKey(TRANSACTION_PACKAGE_ID, + TRANSACTION_CLEANUP_TIMEOUT_KEY, + PredefinedTypes.TYPE_INT, false); + if (!ConfigMap.containsKey(transactionCleanupTimeoutKey)) { + return DEFAULT_TRX_CLEANUP_TIMEOUT; + } else { + Object configValue = ConfigMap.get(transactionCleanupTimeoutKey); + if (configValue == null) { + return DEFAULT_TRX_CLEANUP_TIMEOUT; + } + return parseTimeoutValue(configValue, DEFAULT_TRX_CLEANUP_TIMEOUT); + } + } + + private static int parseTimeoutValue(Object configValue, int defaultValue) { + if (!(configValue instanceof Number number)) { + return defaultValue; + } + int timeoutValue = number.intValue(); + if (timeoutValue <= 0) { + return defaultValue; + } + return timeoutValue; + } + /** * This method will register connection resources with a particular transaction. * diff --git a/bvm/ballerina-runtime/src/main/resources/META-INF/native-image/org.ballerinalang/ballerina-runtime/resource-config.json b/bvm/ballerina-runtime/src/main/resources/META-INF/native-image/org.ballerinalang/ballerina-runtime/resource-config.json index f6ce63367bfd..4b5e81b83ac8 100644 --- a/bvm/ballerina-runtime/src/main/resources/META-INF/native-image/org.ballerinalang/ballerina-runtime/resource-config.json +++ b/bvm/ballerina-runtime/src/main/resources/META-INF/native-image/org.ballerinalang/ballerina-runtime/resource-config.json @@ -3,6 +3,9 @@ "includes": [ { "pattern": "\\QMETA-INF/axiom.xml\\E" + }, + { + "pattern": "resources/.*" } ] }, diff --git a/cli/ballerina-cli/src/main/java/io/ballerina/cli/task/RunNativeImageTestTask.java b/cli/ballerina-cli/src/main/java/io/ballerina/cli/task/RunNativeImageTestTask.java index c0498ec6ece5..1562eadd0659 100644 --- a/cli/ballerina-cli/src/main/java/io/ballerina/cli/task/RunNativeImageTestTask.java +++ b/cli/ballerina-cli/src/main/java/io/ballerina/cli/task/RunNativeImageTestTask.java @@ -65,7 +65,6 @@ import static io.ballerina.cli.utils.TestUtils.generateTesterinaReports; import static io.ballerina.projects.util.ProjectConstants.BIN_DIR_NAME; import static io.ballerina.projects.util.ProjectConstants.TESTS_CACHE_DIR_NAME; -import static io.ballerina.projects.util.ProjectUtils.getResourcesPath; import static org.ballerinalang.test.runtime.util.TesterinaConstants.CACHE_DIR; import static org.ballerinalang.test.runtime.util.TesterinaConstants.DOT; import static org.ballerinalang.test.runtime.util.TesterinaConstants.TESTERINA_TEST_SUITE; @@ -370,9 +369,6 @@ private int runTestSuiteWithNativeImage(Package currentPackage, Target target, nativeArgs.add("-H:Path=" + NativeUtils.convertWinPathToUnixFormat(NativeUtils .addQuotationMarkToString(nativeTargetPath.toString()))); - // Add resources - nativeArgs.add("-H:IncludeResources=" + getResourcesPath()); - // native-image configs nativeArgs.add("-H:ReflectionConfigurationFiles=" + NativeUtils .convertWinPathToUnixFormat(NativeUtils.addQuotationMarkToString( diff --git a/cli/ballerina-cli/src/main/resources/cli-help/ballerina-openapi.help b/cli/ballerina-cli/src/main/resources/cli-help/ballerina-openapi.help index 736df2e1061f..de61e7e7cf49 100755 --- a/cli/ballerina-cli/src/main/resources/cli-help/ballerina-openapi.help +++ b/cli/ballerina-cli/src/main/resources/cli-help/ballerina-openapi.help @@ -13,7 +13,8 @@ SYNOPSIS [--operations ] [-n | --nullable] [--license] [--with-tests] [--client-methods] [--without-data-binding] - [--status-code-binding] + [--status-code-binding] [--mock] [--with-service-contract] + [--single-file] [--use-sanitized-oas] bal openapi [-i | --input] [--json] [-s | --service] @@ -93,6 +94,22 @@ OPTIONS This option can be used in the client generation to generate the client methods with status code response binding. + --mock + This option can be used in the client generation to generate a mock + client for the given OpenAPI contract. + + --with-service-contract + This option can be used to generate the service contract type for the + given OpenAPI contract. + + --single-file + This option can be used to generate the Ballerina service or client + with related types and utility functions in a single file. + + --use-sanitized-oas + This is an experimental feature. This option enables service/client code + generation by modifying the given OAS to follow the Ballerina language + best practices. EXAMPLES Generate a Ballerina mock service using a `hello.yaml` OpenAPI contract. $ bal openapi -i hello.yaml --mode service diff --git a/compiler/ballerina-lang/src/main/java/io/ballerina/projects/JBallerinaBackend.java b/compiler/ballerina-lang/src/main/java/io/ballerina/projects/JBallerinaBackend.java index 0e2298176b45..852de179bbe7 100644 --- a/compiler/ballerina-lang/src/main/java/io/ballerina/projects/JBallerinaBackend.java +++ b/compiler/ballerina-lang/src/main/java/io/ballerina/projects/JBallerinaBackend.java @@ -79,7 +79,6 @@ import static io.ballerina.projects.util.ProjectConstants.DOT; import static io.ballerina.projects.util.ProjectConstants.RESOURCE_DIR_NAME; import static io.ballerina.projects.util.ProjectUtils.getConflictingResourcesMsg; -import static io.ballerina.projects.util.ProjectUtils.getResourcesPath; import static io.ballerina.projects.util.ProjectUtils.getThinJarFileName; import static org.wso2.ballerinalang.compiler.bir.codegen.JvmConstants.CLASS_FILE_SUFFIX; @@ -724,7 +723,6 @@ private Path emitGraalExecutable(Path executableFilePath, List emitR executableFilePath.toString(), "-H:Name=" + nativeImageName, "-H:Path=" + executableFilePath.getParent(), - "-H:IncludeResources=" + getResourcesPath(), "--no-fallback")); } diff --git a/gradle.properties b/gradle.properties index 970f7c0b032d..e09886d825dd 100644 --- a/gradle.properties +++ b/gradle.properties @@ -19,7 +19,7 @@ apacheCommonsAxiomImplVersion=1.4.0 apacheCommonsAxiomDomVersion=1.4.0 apacheCommonsAxiomC14nVersion=1.2.22 apacheCommonsCompressVersion=1.26.2 -apacheCommonsLang3Version=3.12.0 +apacheCommonsLang3Version=3.14.0 apacheCommonsTextVersion=1.10.0 apacheGeronimoStaxVersion=1.0.1 apacheMavenPluginAnnotationsVersion=3.6.0 @@ -53,7 +53,7 @@ fasterxmlWoodstoxCoreVersion=6.5.0 codehausWoodstoxStax2ApiVersion=4.2.1 commonsBeanutilsVersion=1.9.4 commonsCodecVersion=1.14 -commonsIoVersion=2.12.0 +commonsIoVersion=2.15.1 commonsLoggingVersion=1.1.1 commonsCollectionsVersion=3.2.2 drongoldTaskTreeVersion=1.3.1 @@ -135,9 +135,9 @@ sonarqubeGradlePluginVersion=4.0.0.2929 sonarcloudVersion=3.4.0.2513 spullaraMustacheCompilerVersion=0.8.9 squareupOkioVersion=3.4.0 -swaggerModelsVersion=2.1.13 -swaggerParserVersion=2.0.30 -swaggerParserV2Version=2.0.30 +swaggerModelsVersion=2.2.22 +swaggerParserVersion=2.1.22 +swaggerParserV2Version=2.1.22 testngVersion=7.7.0 tongfeiProgressbarVersion=0.7.4 underCouchDownloadVersion=4.0.4 diff --git a/langlib/lang.transaction/src/main/ballerina/transaction.bal b/langlib/lang.transaction/src/main/ballerina/transaction.bal index 0e8bd367b713..ab62be24e215 100644 --- a/langlib/lang.transaction/src/main/ballerina/transaction.bal +++ b/langlib/lang.transaction/src/main/ballerina/transaction.bal @@ -20,6 +20,10 @@ import ballerina/jballerina.java; configurable boolean managerEnabled = false; # Config to specify transaction log directory. configurable string logBase = "transaction_log_dir"; +# Config to specify the timeout for auto commit. +configurable int transactionAutoCommitTimeout = 120; +# Config to specify the timeout for cleaning up dead transactions. +configurable int transactionCleanupTimeout = 600; //TODO: remove this in Beta2 and use an anonymous record instead # Internally used record to hold information about a transaction. diff --git a/tests/jballerina-unit-test/src/test/java/org/ballerinalang/nativeimpl/jvm/runtime/api/tests/Values.java b/tests/jballerina-unit-test/src/test/java/org/ballerinalang/nativeimpl/jvm/runtime/api/tests/Values.java index 594f83f0a4fe..fd2725a3f154 100644 --- a/tests/jballerina-unit-test/src/test/java/org/ballerinalang/nativeimpl/jvm/runtime/api/tests/Values.java +++ b/tests/jballerina-unit-test/src/test/java/org/ballerinalang/nativeimpl/jvm/runtime/api/tests/Values.java @@ -550,8 +550,8 @@ public static BString getBallerinaNode(Environment env) { return StringUtils.fromString("balNode-" + node.nodeId); } - public static void validateIsRemoteEnabled(Environment env) { + public static void validateIsRemoteManagementEnabled(Environment env) { Repository repository = env.getRepository(); - Assert.assertTrue(repository.isRemoteEnabled()); + Assert.assertTrue(repository.isRemoteManagementEnabled()); } } diff --git a/tests/jballerina-unit-test/src/test/resources/test-src/runtime/api/runtime_mgt/main.bal b/tests/jballerina-unit-test/src/test/resources/test-src/runtime/api/runtime_mgt/main.bal index 0f560aa48778..5ecce5f20149 100644 --- a/tests/jballerina-unit-test/src/test/resources/test-src/runtime/api/runtime_mgt/main.bal +++ b/tests/jballerina-unit-test/src/test/resources/test-src/runtime/api/runtime_mgt/main.bal @@ -38,7 +38,7 @@ function testListenerFunctionality() { test:assertTrue(result == ()); test:assertEquals(counter, 3); validateArtifactCount(); - validateIsRemoteEnabled(); + validateIsRemoteManagementEnabled(); } public service class Service { @@ -80,6 +80,6 @@ function validateArtifactCount() = @java:Method { 'class: "org.ballerinalang.nativeimpl.jvm.runtime.api.tests.Values" } external; -function validateIsRemoteEnabled() = @java:Method { +function validateIsRemoteManagementEnabled() = @java:Method { 'class: "org.ballerinalang.nativeimpl.jvm.runtime.api.tests.Values" } external;