/*
* Copyright (c) MuleSoft, Inc. All rights reserved. http://www.mulesoft.com
* The software in this package is published under the terms of the CPAL v1.0
* license, a copy of which has been included with this distribution in the
* LICENSE.txt file.
*/
package org.mule.runtime.module.extension.internal.loader.enricher;
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.mule.runtime.module.extension.internal.loader.enricher.EnricherTestUtils.getNamedObject;
import static org.mule.runtime.module.extension.internal.util.MuleExtensionUtils.loadExtension;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.mule.runtime.api.connection.ConnectionException;
import org.mule.runtime.api.connection.ConnectionProvider;
import org.mule.runtime.api.connection.ConnectionValidationResult;
import org.mule.runtime.api.exception.MuleException;
import org.mule.runtime.api.message.Attributes;
import org.mule.runtime.api.meta.model.ExtensionModel;
import org.mule.runtime.api.meta.model.display.LayoutModel;
import org.mule.runtime.api.meta.model.parameter.ParameterModel;
import org.mule.runtime.api.meta.model.parameter.ParameterizedModel;
import org.mule.runtime.extension.api.annotation.Alias;
import org.mule.runtime.extension.api.annotation.Configuration;
import org.mule.runtime.extension.api.annotation.Configurations;
import org.mule.runtime.extension.api.annotation.Extension;
import org.mule.runtime.extension.api.annotation.Operations;
import org.mule.runtime.extension.api.annotation.Sources;
import org.mule.runtime.extension.api.annotation.connectivity.ConnectionProviders;
import org.mule.runtime.extension.api.annotation.execution.OnError;
import org.mule.runtime.extension.api.annotation.execution.OnSuccess;
import org.mule.runtime.extension.api.annotation.param.Parameter;
import org.mule.runtime.extension.api.annotation.param.display.Placement;
import org.mule.runtime.extension.api.runtime.source.Source;
import org.mule.runtime.extension.api.runtime.source.SourceCallback;
import org.mule.tck.size.SmallTest;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
@RunWith(Parameterized.class)
@SmallTest
public class ParameterLayoutOrderDeclarationEnricherTestCase {
@Parameterized.Parameter(0)
public ParameterizedModel parameterizedModel;
@Parameterized.Parameter(1)
public String name;
@Parameterized.Parameters(name = "{1}")
public static List<Object[]> parameters() {
ExtensionModel extensionModel = loadExtension(OrderedExtension.class);
List<Object[]> objects = new ArrayList<>();
objects.add(new Object[] {extensionModel.getOperationModel("implicitOrder").get(), "Operation - Implicit Order"});
objects.add(new Object[] {extensionModel.getOperationModel("explicitOrder").get(), "Operation - Explicit Order"});
objects.add(new Object[] {extensionModel.getOperationModel("mixedOrder").get(), "Operation - Mixed Order"});
objects.add(new Object[] {extensionModel.getConfigurationModel("ImplicitConfigOrder").get(), "Config - Implicit Order"});
objects.add(new Object[] {extensionModel.getConfigurationModel("ExplicitConfigOrder").get(), "Config - Explicit Order"});
objects.add(new Object[] {extensionModel.getConfigurationModel("MixedConfigOrder").get(), "Config - Mixed Order"});
objects.add(new Object[] {extensionModel.getConfigurationModel("InheritsConfigOrder").get(), "Config - Inherited Order"});
objects.add(new Object[] {extensionModel.getConnectionProviderModel("implicit-connection").get(),
"Conn Provider - Implicit Order"});
objects.add(new Object[] {extensionModel.getConnectionProviderModel("explicit-connection").get(),
"Conn Provider - Explicit Order"});
objects
.add(new Object[] {extensionModel.getConnectionProviderModel("mixed-connection").get(), "Conn Provider - Mixed Order"});
objects.add(new Object[] {extensionModel.getSourceModel("ImplicitSourceOrder").get(), "Source - Implicit Order"});
objects.add(new Object[] {extensionModel.getSourceModel("ExplicitSourceOrder").get(), "Source - Explicit Order"});
objects.add(new Object[] {extensionModel.getSourceModel("MixedSourceOrder").get(), "Source - Mixed Order"});
objects.add(new Object[] {extensionModel.getSourceModel("ExplicitSourceOrderWithCallbacks").get(),
"Source - With Callbacks Explicit Order"});
objects.add(new Object[] {extensionModel.getSourceModel("MixedSourceOrderWithCallbacks").get(),
"Source - With Callbacks Mixed Order"});
return objects;
}
@Test
public void assertParametersOrder() {
assertParameterOrder(parameterizedModel, "paramOne", 1);
assertParameterOrder(parameterizedModel, "paramTwo", 2);
assertParameterOrder(parameterizedModel, "paramThree", 3);
}
private void assertParameterOrder(ParameterizedModel parameterizedModel, String parameterName, int position) {
ParameterModel paramOne = getNamedObject(parameterizedModel.getAllParameterModels(), parameterName);
Optional<LayoutModel> layoutModel = paramOne.getLayoutModel();
assertThat(layoutModel.isPresent(), is(true));
LayoutModel layoutModel1 = layoutModel.get();
assertThat(layoutModel1.getOrder().orElse(null), is(position));
}
@Operations(OrderedOperations.class)
@Extension(name = "OrderedExtension")
@Configurations({ImplicitConfigOrder.class, ExplicitConfigOrder.class, MixedConfigOrder.class, InheritsConfigOrder.class})
@ConnectionProviders({ImplicitConnProvider.class, ExplicitConnProvider.class, MixedConnProvider.class})
@Sources({ImplicitSourceOrder.class, ExplicitSourceOrder.class, MixedSourceOrder.class, ExplicitSourceOrderWithCallbacks.class,
MixedSourceOrderWithCallbacks.class})
public static class OrderedExtension {
}
public static class OrderedOperations {
public void implicitOrder(String paramOne, String paramTwo, String paramThree) {
}
public void explicitOrder(@Placement(order = 1) String paramOne, @Placement(order = 2) String paramTwo,
@Placement(order = 3) String paramThree) {
}
public void mixedOrder(String paramTwo, @Placement(order = 1) String paramOne, String paramThree) {
}
}
@Configuration(name = "ImplicitConfigOrder")
public static class ImplicitConfigOrder {
@Parameter
String paramOne;
@Parameter
String paramTwo;
@Parameter
String paramThree;
}
@Configuration(name = "ExplicitConfigOrder")
public static class ExplicitConfigOrder {
@Parameter
@Placement(order = 1)
String paramOne;
@Parameter
@Placement(order = 2)
String paramTwo;
@Parameter
@Placement(order = 3)
String paramThree;
}
@Configuration(name = "MixedConfigOrder")
public static class MixedConfigOrder {
@Parameter
@Placement(order = 2)
String paramTwo;
@Parameter
String paramOne;
@Parameter
String paramThree;
}
@Configuration(name = "InheritsConfigOrder")
public static class InheritsConfigOrder extends AbstractConfig {
@Parameter
String paramOne;
@Parameter
String paramThree;
}
private static abstract class AbstractConfig {
@Parameter
@Placement(order = 2)
String paramTwo;
}
@Alias("implicit")
public static class ImplicitConnProvider implements ConnectionProvider<Object> {
@Parameter
String paramOne;
@Parameter
String paramTwo;
@Parameter
String paramThree;
@Override
public Object connect() throws ConnectionException {
return null;
}
@Override
public void disconnect(Object connection) {
}
@Override
public ConnectionValidationResult validate(Object connection) {
return null;
}
}
@Alias("explicit")
public static class ExplicitConnProvider implements ConnectionProvider<Object> {
@Parameter
@Placement(order = 1)
String paramOne;
@Parameter
@Placement(order = 2)
String paramTwo;
@Parameter
@Placement(order = 3)
String paramThree;
@Override
public Object connect() throws ConnectionException {
return null;
}
@Override
public void disconnect(Object connection) {
}
@Override
public ConnectionValidationResult validate(Object connection) {
return null;
}
}
@Alias("mixed")
public static class MixedConnProvider implements ConnectionProvider<Object> {
@Parameter
@Placement(order = 2)
String paramTwo;
@Parameter
String paramOne;
@Parameter
String paramThree;
@Override
public Object connect() throws ConnectionException {
return null;
}
@Override
public void disconnect(Object connection) {
}
@Override
public ConnectionValidationResult validate(Object connection) {
return null;
}
}
public static class ImplicitSourceOrder extends Source<String, Attributes> {
@Parameter
String paramOne;
@Parameter
String paramTwo;
@Parameter
String paramThree;
@Override
public void onStart(SourceCallback<String, Attributes> sourceCallback) throws MuleException {
}
@Override
public void onStop() {
}
}
public static class ExplicitSourceOrder extends Source<String, Attributes> {
@Parameter
@Placement(order = 1)
String paramOne;
@Parameter
@Placement(order = 2)
String paramTwo;
@Parameter
@Placement(order = 3)
String paramThree;
@Override
public void onStart(SourceCallback sourceCallback) throws MuleException {
}
@Override
public void onStop() {
}
}
public static class MixedSourceOrder extends Source<String, Attributes> {
@Parameter
@Placement(order = 2)
String paramTwo;
@Parameter
String paramOne;
@Parameter
String paramThree;
@Override
public void onStart(SourceCallback sourceCallback) throws MuleException {
}
@Override
public void onStop() {
}
}
public static class ExplicitSourceOrderWithCallbacks extends Source<String, Attributes> {
@Parameter
@Placement(order = 2)
String paramTwo;
@Override
public void onStart(SourceCallback sourceCallback) throws MuleException {
}
@Override
public void onStop() {
}
@OnSuccess
public void onSuccess(@Placement(order = 1) String paramOne) {
}
@OnError
public void onError(@Placement(order = 3) String paramThree) {
}
}
public static class MixedSourceOrderWithCallbacks extends Source<String, Attributes> {
@Parameter
String paramOne;
@Override
public void onStart(SourceCallback sourceCallback) throws MuleException {
}
@Override
public void onStop() {
}
@OnSuccess
public void onSuccess(@Placement(order = 3) String paramThree) {
}
@OnError
public void onError(String paramTwo) {
}
}
}