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

Clone of PR https://github.com/mulesoft/mule-migration-assistant/pull/567 #609 #610

Merged
merged 2 commits into from
Mar 14, 2022
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
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,8 @@ public class TransformMigrationTestCase extends AbstractEndToEndTestCase {
@Parameters(name = "{0}")
public static Object[] params() {
return new Object[] {
"ee_transform/ee_transform_01"
"ee_transform/ee_transform_01",
"ee_transform/ee_transform_keep_parentheses"
};
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
<?xml version="1.0" encoding="UTF-8"?>

<mule xmlns:dw="http://www.mulesoft.org/schema/mule/ee/dw"
xmlns="http://www.mulesoft.org/schema/mule/core"
xmlns:doc="http://www.mulesoft.org/schema/mule/documentation"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.mulesoft.org/schema/mule/core http://www.mulesoft.org/schema/mule/core/current/mule.xsd
http://www.mulesoft.org/schema/mule/ee/dw http://www.mulesoft.org/schema/mule/ee/dw/current/dw.xsd">
<flow name="ee-transform-Flow">
<set-variable variableName="var1" value="#[{&quot;customerData&quot;: [{&quot;data&quot;: &quot;data1&quot;, &quot;value&quot;: &quot;value1&quot;}, {&quot;data&quot;: &quot;data2&quot;, &quot;value&quot;: &quot;value2&quot;}], &quot;groupData&quot;: [{&quot;name&quot;: &quot;data1&quot;, &quot;value&quot;: &quot;value1&quot;}, {&quot;name&quot;: &quot;data3&quot;, &quot;value&quot;: &quot;value3&quot;}]}" doc:name="Variable"/>
<dw:transform-message doc:name="Transform Message">
<dw:set-payload>
<![CDATA[%dw 1.0
%output application/json
---
{
Customer: {
customAttribute: flowVars.var1.customerData map ((data01 , indexOfData01) -> {
(flowVars.var1.groupData filter ($.name == data01.data and $.value == data01.value) map ((data02, indexOfPayload02) -> {
data: data02.name
}))
}) filter ($ != {})
}
}
]]>
</dw:set-payload>
</dw:transform-message>
<logger/>
</flow>
</mule>
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<modelVersion>4.0.0</modelVersion>
<groupId>org.mule.migrated</groupId>
<artifactId>ee_transform_keep_parentheses</artifactId>
<version>1.0.0-M4-SNAPSHOT</version>
<packaging>mule-application</packaging>
<description>Application migrated with MMA</description>
<dependencies>
<dependency>
<groupId>com.mulesoft.mule.modules</groupId>
<artifactId>mule-compatibility-module</artifactId>
<version>1.4.0</version>
<classifier>mule-plugin</classifier>
</dependency>
</dependencies>
<repositories>
<repository>
<id>mulesoft-releases</id>
<name>MuleSoft Releases Repository</name>
<url>https://repository.mulesoft.org/releases/</url>
</repository>
<repository>
<id>anypoint-exchange</id>
<name>Anypoint Exchange</name>
<url>https://maven.anypoint.mulesoft.com/api/v1/maven</url>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<snapshots>
<enabled>true</enabled>
</snapshots>
<id>mulesoft-releases</id>
<name>MuleSoft Releases Repository</name>
<url>https://repository.mulesoft.org/releases/</url>
</pluginRepository>
</pluginRepositories>
<build>
<plugins>
<plugin>
<groupId>org.mule.tools.maven</groupId>
<artifactId>mule-maven-plugin</artifactId>
<version>3.2.1</version>
<extensions>true</extensions>
<configuration />
</plugin>
</plugins>
</build>
</project>
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
{
"projectType": "MULE_THREE_APPLICATION",
"projectName": "input",
"connectorsMigrated": [],
"numberOfMuleComponents": 5,
"numberOfMuleComponentsMigrated": 5,
"componentDetails": {
"mule": {
"success": 1,
"failure": 0
},
"logger": {
"success": 1,
"failure": 0
},
"flow": {
"success": 1,
"failure": 0
},
"set-variable": {
"success": 1,
"failure": 0
},
"ee:transform": {
"success": 1,
"failure": 0
}
},
"numberOfMELExpressions": 0,
"numberOfMELExpressionsMigrated": 0,
"numberOfMELExpressionLines": 0,
"numberOfMELExpressionLinesMigrated": 0,
"numberOfDWTransformations": 1,
"numberOfDWTransformationsMigrated": 1,
"numberOfDWTransformationLines": 12,
"numberOfDWTransformationLinesMigrated": 12,
"detailedMessages": []
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
<?xml version="1.0" encoding="UTF-8"?>
<mule xmlns="http://www.mulesoft.org/schema/mule/core" xmlns:doc="http://www.mulesoft.org/schema/mule/documentation" xmlns:ee="http://www.mulesoft.org/schema/mule/ee/core" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.mulesoft.org/schema/mule/ee/core http://www.mulesoft.org/schema/mule/ee/core/current/mule-ee.xsd http://www.mulesoft.org/schema/mule/core http://www.mulesoft.org/schema/mule/core/current/mule.xsd">

<flow name="ee-transform-Flow">
<set-variable variableName="var1" value="#[{&quot;customerData&quot;: [{&quot;data&quot;: &quot;data1&quot;, &quot;value&quot;: &quot;value1&quot;}, {&quot;data&quot;: &quot;data2&quot;, &quot;value&quot;: &quot;value2&quot;}], &quot;groupData&quot;: [{&quot;name&quot;: &quot;data1&quot;, &quot;value&quot;: &quot;value1&quot;}, {&quot;name&quot;: &quot;data3&quot;, &quot;value&quot;: &quot;value3&quot;}]}" doc:name="Variable" />

<ee:transform doc:name="Transform Message">
<ee:message>
<ee:set-payload><![CDATA[%dw 2.0
output application/json
---
{
Customer: {
customAttribute: vars.var1.customerData map ((data01, indexOfData01) -> {
(vars.var1.groupData filter ($.name == data01.data and $.value == data01.value) map ((data02, indexOfPayload02) -> {
data: data02.name
}))
}) filter (not $ == {})
}
}]]></ee:set-payload>
</ee:message>
</ee:transform>

<logger />

</flow>

</mule>
Original file line number Diff line number Diff line change
Expand Up @@ -64,8 +64,8 @@ output application/java
<ee:transform>
<ee:variables>
<ee:set-variable variableName="soap.header">%dw 2.0
output application/xml
ns ns0 http://mulesoft.org/tshirt-service
output application/xml
---
{
ns0#APIUsageInformation: {
Expand All @@ -83,14 +83,14 @@ ns ns0 http://mulesoft.org/tshirt-service

<ee:transform>
<ee:message>
<ee:set-payload><![CDATA[%dw 2.0
output application/java
import migration::Soapkit
---
{
body: Soapkit::soapBody(payload),
headers: Soapkit::soapHeaders(vars),
attachments: Soapkit::soapAttachments(vars)
<ee:set-payload><![CDATA[%dw 2.0
output application/java
import migration::Soapkit
---
{
body: Soapkit::soapBody(payload),
headers: Soapkit::soapHeaders(vars),
attachments: Soapkit::soapAttachments(vars)
}]]></ee:set-payload>
</ee:message>
</ee:transform>
Expand All @@ -102,14 +102,14 @@ import migration::Soapkit

<ee:transform>
<ee:message>
<ee:set-payload><![CDATA[%dw 2.0
output application/java
import migration::Soapkit
---
{
body: Soapkit::soapBody(payload),
headers: Soapkit::soapHeaders(vars),
attachments: Soapkit::soapAttachments(vars)
<ee:set-payload><![CDATA[%dw 2.0
output application/java
import migration::Soapkit
---
{
body: Soapkit::soapBody(payload),
headers: Soapkit::soapHeaders(vars),
attachments: Soapkit::soapAttachments(vars)
}]]></ee:set-payload>
</ee:message>
</ee:transform>
Expand All @@ -121,14 +121,14 @@ import migration::Soapkit

<ee:transform>
<ee:message>
<ee:set-payload><![CDATA[%dw 2.0
output application/java
import migration::Soapkit
---
{
body: Soapkit::soapBody(payload),
headers: Soapkit::soapHeaders(vars),
attachments: Soapkit::soapAttachments(vars)
<ee:set-payload><![CDATA[%dw 2.0
output application/java
import migration::Soapkit
---
{
body: Soapkit::soapBody(payload),
headers: Soapkit::soapHeaders(vars),
attachments: Soapkit::soapAttachments(vars)
}]]></ee:set-payload>
</ee:message>
</ee:transform>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ import org.mule.weave.v2.parser.ast.header.directives.{VersionDirective, Version
import org.mule.weave.v2.parser.ast.structure.schema.{SchemaNode, SchemaPropertyNode}
import org.mule.weave.v2.parser.ast.types.TypeReferenceNode
import org.mule.weave.v2.parser.ast.variables.{NameIdentifier, VariableReferenceNode}
import org.mule.weave.v2.parser.location.UnknownLocation
import org.mule.weave.v2.parser.{ast => dw}
import org.mule.weave.v2.parser.ast.{AstNode => AstNodeV2}

Expand Down Expand Up @@ -170,15 +171,15 @@ object Migrator {
val rRes = toDataweaveAst(right)
val variableReferenceNode = VariableReferenceNode(NameIdentifier("Java::isInstanceOf"))
val metadata = lRes.metadata.children ++ rRes.metadata.children
val classNameNode = dw.structure.StringNode(rRes.getGeneratedCode(HeaderNode(Seq())).replaceFirst("---\nvars\\.", "")).annotate(QuotedStringAnnotation('''))
val classNameNode = dw.structure.StringNode(rRes.getGeneratedCode(HeaderNode(Seq())).replaceFirst("(---\n){0,1}vars\\.", "")).annotate(QuotedStringAnnotation('''))
new MigrationResult(dw.functions.FunctionCallNode(variableReferenceNode, FunctionCallParametersNode(Seq(lRes.dwAstNode, classNameNode))), DefaultMigrationMetadata(JavaModuleRequired() +: metadata))
}

private def toExceptionFunction(functionName: String, parametersNode: MelExpressionNode, strictMatch: Boolean) = {
val parameters = toDataweaveAst(parametersNode)
val metadata = parameters.metadata.children
val variableReferenceNode = VariableReferenceNode(NameIdentifier("Java::isCausedBy"))
val classNameNode = dw.structure.StringNode(parameters.getGeneratedCode(HeaderNode(Seq())).replaceFirst("---\nvars\\.", "")).annotate(QuotedStringAnnotation('''))
val classNameNode = dw.structure.StringNode(parameters.getGeneratedCode(HeaderNode(Seq())).replaceFirst("(---\n){0,1}vars\\.", "")).annotate(QuotedStringAnnotation('''))
val errorCauseNode = dw.structure.StringNode("error.cause")
val strictMatchNode = dw.structure.BooleanNode(strictMatch.toString)
new MigrationResult(dw.functions.FunctionCallNode(variableReferenceNode, FunctionCallParametersNode(Seq(errorCauseNode, classNameNode, strictMatchNode))),DefaultMigrationMetadata(JavaModuleRequired() +: metadata))
Expand Down Expand Up @@ -249,7 +250,7 @@ object Migrator {

private def toDataweaveEnclosedExpressionNode(expression: MelExpressionNode): MigrationResult = {
val result = toDataweaveAst(expression)
new MigrationResult(result.dwAstNode.annotate(EnclosedMarkAnnotation()), DefaultMigrationMetadata(result.metadata.children))
new MigrationResult(result.dwAstNode.annotate(EnclosedMarkAnnotation(UnknownLocation)), DefaultMigrationMetadata(result.metadata.children))
}

private def toDataweaveConstructorNode(canonicalName: CanonicalNameNode, arguments: Seq[MelExpressionNode]): MigrationResult = {
Expand Down Expand Up @@ -296,7 +297,7 @@ object Migrator {
val objectNode = dw.structure.ArrayNode(Seq())
val classValue = dw.structure.StringNode(canonicalName.name)
//class: "java.util.ArrayList"
val schemaProperty = SchemaPropertyNode(NameIdentifier(CLASS_PROPERTY_NAME), classValue)
val schemaProperty = SchemaPropertyNode(NameIdentifier(CLASS_PROPERTY_NAME), classValue, None)
val arrayTypeRef = TypeReferenceNode(NameIdentifier("Array"), None, Some(SchemaNode(Seq(schemaProperty))))
new MigrationResult(dw.operators.BinaryOpNode(AsOpId, objectNode, arrayTypeRef))
}
Expand All @@ -305,7 +306,7 @@ object Migrator {
val objectNode = dw.structure.ObjectNode(Seq())
val classValue = dw.structure.StringNode(canonicalName.name)
//class: "java.util.HashMap"
val schemaProperty = SchemaPropertyNode(NameIdentifier(CLASS_PROPERTY_NAME), classValue)
val schemaProperty = SchemaPropertyNode(NameIdentifier(CLASS_PROPERTY_NAME), classValue, None)
val objectTypeRef = TypeReferenceNode(NameIdentifier("Object"), None, Some(SchemaNode(Seq(schemaProperty))))
new MigrationResult(dw.operators.BinaryOpNode(AsOpId, objectNode, objectTypeRef))
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -187,4 +187,12 @@ class MigratorTest extends FlatSpec with Matchers {
it should "fail with dw function with no inline script" in {
Migrator.migrate("dw(flowVars.test)").metadata.children.head shouldBe NonMigratable("expressions.methodInvocation")
}

it should "migrate mel expression with isInstanceOf function" in {
Migrator.migrate("a instanceof org.mule.SomeClass").getGeneratedCode() shouldBe "%dw 2.0\n---\nJava::isInstanceOf(vars.a, 'org.mule.SomeClass')"
}

it should "migrate mel expression with isCausedBy function" in {
Migrator.migrate("exception.causedBy(org.mule.RuntimeException)").getGeneratedCode() shouldBe "%dw 2.0\n---\nJava::isCausedBy(error.cause, 'org.mule.RuntimeException', false)"
}
}
4 changes: 2 additions & 2 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -113,8 +113,8 @@
<munit.version>2.2.1</munit.version>

<mule.api.version>1.1.5</mule.api.version>
<migrant.version>2.1.10</migrant.version>
<parser.version>2.1.3</parser.version>
<migrant.version>2.4.0</migrant.version>
<parser.version>2.4.0</parser.version>

<!-- Properties -->
<lib-dir>${basedir}/lib</lib-dir>
Expand Down