Scope triggers by @Qualifier bean name and infer source state from switch expressions.
Extract stateMachineId from @Qualifier on sendEvent receivers, route named beans via @EnableStateMachine before String/String type widening, and extend sourceState detection to SwitchExpression arrow cases. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -2,7 +2,9 @@ package click.kamil.springstatemachineexporter.analysis.enricher.routing;
|
|||||||
|
|
||||||
import click.kamil.springstatemachineexporter.analysis.model.CallChain;
|
import click.kamil.springstatemachineexporter.analysis.model.CallChain;
|
||||||
import click.kamil.springstatemachineexporter.analysis.resolver.StateMachineTypeResolver;
|
import click.kamil.springstatemachineexporter.analysis.resolver.StateMachineTypeResolver;
|
||||||
|
import click.kamil.springstatemachineexporter.ast.common.AstUtils;
|
||||||
import click.kamil.springstatemachineexporter.ast.common.CodebaseContext;
|
import click.kamil.springstatemachineexporter.ast.common.CodebaseContext;
|
||||||
|
import org.eclipse.jdt.core.dom.Annotation;
|
||||||
import org.eclipse.jdt.core.dom.TypeDeclaration;
|
import org.eclipse.jdt.core.dom.TypeDeclaration;
|
||||||
|
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
@@ -12,8 +14,21 @@ public class HeuristicBeanResolutionEngine implements BeanResolutionEngine {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean isRoutedToCorrectMachine(CallChain chain, String currentMachineName, CodebaseContext context) {
|
public boolean isRoutedToCorrectMachine(CallChain chain, String currentMachineName, CodebaseContext context) {
|
||||||
|
String explicitTarget = chain.getContextMachineId();
|
||||||
|
if (explicitTarget == null && chain.getTriggerPoint() != null) {
|
||||||
|
explicitTarget = chain.getTriggerPoint().getStateMachineId();
|
||||||
|
}
|
||||||
|
if (explicitTarget != null && !explicitTarget.isEmpty() && context != null && currentMachineName != null) {
|
||||||
|
Boolean namedTarget = resolveNamedBeanTarget(explicitTarget, currentMachineName, context);
|
||||||
|
if (namedTarget != null) {
|
||||||
|
return namedTarget;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
boolean hasExplicitBeanTarget = explicitTarget != null && !explicitTarget.isEmpty();
|
||||||
|
|
||||||
// Precise FQN Type argument match from JDT bindings at sendEvent site
|
// Precise FQN Type argument match from JDT bindings at sendEvent site
|
||||||
if (chain.getTriggerPoint() != null && context != null && currentMachineName != null) {
|
if (!hasExplicitBeanTarget && chain.getTriggerPoint() != null && context != null && currentMachineName != null) {
|
||||||
String triggerEventFqn = chain.getTriggerPoint().getEventTypeFqn();
|
String triggerEventFqn = chain.getTriggerPoint().getEventTypeFqn();
|
||||||
String triggerStateFqn = chain.getTriggerPoint().getStateTypeFqn();
|
String triggerStateFqn = chain.getTriggerPoint().getStateTypeFqn();
|
||||||
if (triggerEventFqn != null || triggerStateFqn != null) {
|
if (triggerEventFqn != null || triggerStateFqn != null) {
|
||||||
@@ -54,7 +69,7 @@ public class HeuristicBeanResolutionEngine implements BeanResolutionEngine {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
String targetVar = chain.getContextMachineId();
|
String targetVar = hasExplicitBeanTarget ? explicitTarget : chain.getContextMachineId();
|
||||||
if (targetVar == null && chain.getTriggerPoint() != null) {
|
if (targetVar == null && chain.getTriggerPoint() != null) {
|
||||||
targetVar = chain.getTriggerPoint().getStateMachineId();
|
targetVar = chain.getTriggerPoint().getStateMachineId();
|
||||||
}
|
}
|
||||||
@@ -129,6 +144,67 @@ public class HeuristicBeanResolutionEngine implements BeanResolutionEngine {
|
|||||||
return context == null || isSingleStateMachine(context);
|
return context == null || isSingleStateMachine(context);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private Boolean resolveNamedBeanTarget(String beanName, String currentMachineName, CodebaseContext context) {
|
||||||
|
String normalized = stripAnnotationQuotes(beanName);
|
||||||
|
if (normalized == null || normalized.isEmpty()) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
String matchingConfig = null;
|
||||||
|
for (TypeDeclaration configType : context.findEntryPointClasses(java.util.List.of("EnableStateMachine"))) {
|
||||||
|
String configFqn = context.getFqn(configType);
|
||||||
|
String configuredName = extractEnableStateMachineName(configType);
|
||||||
|
if (configuredName == null || configuredName.isEmpty()) {
|
||||||
|
configuredName = defaultBeanName(configType.getName().getIdentifier());
|
||||||
|
}
|
||||||
|
if (normalized.equals(configuredName)) {
|
||||||
|
matchingConfig = configFqn;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (matchingConfig == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return currentMachineName.equals(matchingConfig);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static String extractEnableStateMachineName(TypeDeclaration configType) {
|
||||||
|
for (Object modifierObj : configType.modifiers()) {
|
||||||
|
if (!(modifierObj instanceof Annotation annotation)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (!annotation.getTypeName().toString().endsWith("EnableStateMachine")) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
String name = AstUtils.extractAnnotationMember(annotation, "name");
|
||||||
|
if (name != null && !name.isBlank()) {
|
||||||
|
return stripAnnotationQuotes(name);
|
||||||
|
}
|
||||||
|
String value = AstUtils.extractAnnotationMember(annotation, "value");
|
||||||
|
if (value != null && !value.isBlank()) {
|
||||||
|
return stripAnnotationQuotes(value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static String defaultBeanName(String simpleClassName) {
|
||||||
|
if (simpleClassName == null || simpleClassName.isEmpty()) {
|
||||||
|
return simpleClassName;
|
||||||
|
}
|
||||||
|
return Character.toLowerCase(simpleClassName.charAt(0)) + simpleClassName.substring(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static String stripAnnotationQuotes(String raw) {
|
||||||
|
if (raw == null || raw.isBlank()) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
String trimmed = raw.trim();
|
||||||
|
if (trimmed.length() >= 2 && trimmed.startsWith("\"") && trimmed.endsWith("\"")) {
|
||||||
|
return trimmed.substring(1, trimmed.length() - 1);
|
||||||
|
}
|
||||||
|
return trimmed;
|
||||||
|
}
|
||||||
|
|
||||||
private int countStateMachines(CodebaseContext context) {
|
private int countStateMachines(CodebaseContext context) {
|
||||||
if (context == null) {
|
if (context == null) {
|
||||||
return 0;
|
return 0;
|
||||||
|
|||||||
@@ -97,6 +97,7 @@ public class GenericEventDetector {
|
|||||||
if (sourceState == null) {
|
if (sourceState == null) {
|
||||||
sourceState = extractSourceStateFromArguments(node);
|
sourceState = extractSourceStateFromArguments(node);
|
||||||
}
|
}
|
||||||
|
String stateMachineId = extractStateMachineId(node);
|
||||||
String[] smTypes = resolveStateMachineTypeArgumentsForExpression(emr.getExpression(), node);
|
String[] smTypes = resolveStateMachineTypeArgumentsForExpression(emr.getExpression(), node);
|
||||||
|
|
||||||
boolean external = false;
|
boolean external = false;
|
||||||
@@ -110,6 +111,7 @@ public class GenericEventDetector {
|
|||||||
triggers.add(TriggerPoint.builder()
|
triggers.add(TriggerPoint.builder()
|
||||||
.event(eventValue)
|
.event(eventValue)
|
||||||
.sourceState(sourceState)
|
.sourceState(sourceState)
|
||||||
|
.stateMachineId(stateMachineId)
|
||||||
.className(context.getFqn(type))
|
.className(context.getFqn(type))
|
||||||
.methodName(method != null ? method.getName().getIdentifier() : "initializer")
|
.methodName(method != null ? method.getName().getIdentifier() : "initializer")
|
||||||
.sourceFile(context.getRelativePath(context.getFqn(type)))
|
.sourceFile(context.getRelativePath(context.getFqn(type)))
|
||||||
@@ -311,6 +313,7 @@ public class GenericEventDetector {
|
|||||||
if (sourceState == null && node instanceof MethodInvocation mi) {
|
if (sourceState == null && node instanceof MethodInvocation mi) {
|
||||||
sourceState = extractSourceStateFromArguments(mi);
|
sourceState = extractSourceStateFromArguments(mi);
|
||||||
}
|
}
|
||||||
|
String stateMachineId = extractStateMachineId(node);
|
||||||
String[] smTypes = resolveStateMachineTypeArguments(node);
|
String[] smTypes = resolveStateMachineTypeArguments(node);
|
||||||
|
|
||||||
boolean external = false;
|
boolean external = false;
|
||||||
@@ -330,6 +333,7 @@ public class GenericEventDetector {
|
|||||||
results.add(TriggerPoint.builder()
|
results.add(TriggerPoint.builder()
|
||||||
.event(part.trim())
|
.event(part.trim())
|
||||||
.sourceState(sourceState)
|
.sourceState(sourceState)
|
||||||
|
.stateMachineId(stateMachineId)
|
||||||
.className(context.getFqn(type))
|
.className(context.getFqn(type))
|
||||||
.methodName(method != null ? method.getName().getIdentifier() : "initializer")
|
.methodName(method != null ? method.getName().getIdentifier() : "initializer")
|
||||||
.sourceFile(context.getRelativePath(context.getFqn(type)))
|
.sourceFile(context.getRelativePath(context.getFqn(type)))
|
||||||
@@ -345,6 +349,7 @@ public class GenericEventDetector {
|
|||||||
results.add(TriggerPoint.builder()
|
results.add(TriggerPoint.builder()
|
||||||
.event(eventValue)
|
.event(eventValue)
|
||||||
.sourceState(sourceState)
|
.sourceState(sourceState)
|
||||||
|
.stateMachineId(stateMachineId)
|
||||||
.className(context.getFqn(type))
|
.className(context.getFqn(type))
|
||||||
.methodName(method != null ? method.getName().getIdentifier() : "initializer")
|
.methodName(method != null ? method.getName().getIdentifier() : "initializer")
|
||||||
.sourceFile(context.getRelativePath(context.getFqn(type)))
|
.sourceFile(context.getRelativePath(context.getFqn(type)))
|
||||||
@@ -383,6 +388,21 @@ public class GenericEventDetector {
|
|||||||
String state = extractStateFromSiblings(current, switchStmt.statements());
|
String state = extractStateFromSiblings(current, switchStmt.statements());
|
||||||
if (state != null) return state;
|
if (state != null) return state;
|
||||||
}
|
}
|
||||||
|
} else if (parent instanceof SwitchExpression switchExpr) {
|
||||||
|
if (!isRoutingParameter(switchExpr.getExpression())) {
|
||||||
|
String state = extractStateFromSiblings(current, switchExpr.statements());
|
||||||
|
if (state != null) return state;
|
||||||
|
}
|
||||||
|
} else if (parent instanceof SwitchCase switchCase && !switchCase.isDefault()) {
|
||||||
|
Expression selector = resolveSwitchSelector(switchCase);
|
||||||
|
if (selector != null && !isRoutingParameter(selector) && !switchCase.expressions().isEmpty()) {
|
||||||
|
Expression caseExpr = (Expression) switchCase.expressions().get(0);
|
||||||
|
String resolved = resolveProvableStateLiteral(caseExpr);
|
||||||
|
if (resolved != null) {
|
||||||
|
return resolved;
|
||||||
|
}
|
||||||
|
return getSimpleNameString(caseExpr);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
current = parent;
|
current = parent;
|
||||||
@@ -390,6 +410,151 @@ public class GenericEventDetector {
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private Expression resolveSwitchSelector(SwitchCase switchCase) {
|
||||||
|
ASTNode switchParent = switchCase.getParent();
|
||||||
|
if (switchParent instanceof SwitchStatement switchStatement) {
|
||||||
|
return switchStatement.getExpression();
|
||||||
|
}
|
||||||
|
if (switchParent instanceof SwitchExpression switchExpression) {
|
||||||
|
return switchExpression.getExpression();
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
private String extractStateMachineId(MethodInvocation node) {
|
||||||
|
if (!TRIGGER_METHOD_NAMES.contains(node.getName().getIdentifier())) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
Expression receiver = node.getExpression();
|
||||||
|
while (receiver instanceof MethodInvocation methodInvocation) {
|
||||||
|
receiver = methodInvocation.getExpression();
|
||||||
|
}
|
||||||
|
if (receiver == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
AbstractTypeDeclaration enclosing = findEnclosingAbstractType(node);
|
||||||
|
if (enclosing == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return resolveQualifierForReceiver(receiver, enclosing);
|
||||||
|
}
|
||||||
|
|
||||||
|
private String resolveQualifierForReceiver(Expression receiver, AbstractTypeDeclaration enclosing) {
|
||||||
|
String fieldName = null;
|
||||||
|
if (receiver instanceof SimpleName simpleName) {
|
||||||
|
fieldName = simpleName.getIdentifier();
|
||||||
|
IBinding binding = simpleName.resolveBinding();
|
||||||
|
if (binding instanceof IVariableBinding variableBinding) {
|
||||||
|
String fromBinding = extractQualifierFromBinding(variableBinding);
|
||||||
|
if (fromBinding != null) {
|
||||||
|
return fromBinding;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else if (receiver instanceof FieldAccess fieldAccess) {
|
||||||
|
fieldName = fieldAccess.getName().getIdentifier();
|
||||||
|
}
|
||||||
|
if (fieldName == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return findQualifierOnField(enclosing, fieldName);
|
||||||
|
}
|
||||||
|
|
||||||
|
private String findQualifierOnField(AbstractTypeDeclaration enclosing, String fieldName) {
|
||||||
|
for (FieldDeclaration fieldDeclaration : getFieldDeclarations(enclosing)) {
|
||||||
|
for (Object fragmentObj : fieldDeclaration.fragments()) {
|
||||||
|
if (fragmentObj instanceof VariableDeclarationFragment fragment
|
||||||
|
&& fragment.getName().getIdentifier().equals(fieldName)) {
|
||||||
|
String qualifier = extractQualifierAnnotation(fieldDeclaration.modifiers());
|
||||||
|
if (qualifier != null) {
|
||||||
|
return qualifier;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
private String extractQualifierFromBinding(IVariableBinding binding) {
|
||||||
|
if (binding == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
String qualifier = readQualifierFromAnnotations(binding.getAnnotations());
|
||||||
|
if (qualifier != null) {
|
||||||
|
return qualifier;
|
||||||
|
}
|
||||||
|
if (binding.isField() && binding.getDeclaringClass() != null) {
|
||||||
|
for (IMethodBinding method : binding.getDeclaringClass().getDeclaredMethods()) {
|
||||||
|
if (!method.isConstructor()) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
for (int i = 0; i < method.getParameterTypes().length; i++) {
|
||||||
|
if (method.getParameterTypes()[i].isEqualTo(binding.getType().getErasure())
|
||||||
|
&& binding.getName().equals(method.getParameterNames()[i])) {
|
||||||
|
String paramQualifier = readQualifierFromAnnotations(method.getParameterAnnotations(i));
|
||||||
|
if (paramQualifier != null) {
|
||||||
|
return paramQualifier;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
private String readQualifierFromAnnotations(IAnnotationBinding[] annotations) {
|
||||||
|
if (annotations == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
for (IAnnotationBinding annotation : annotations) {
|
||||||
|
if (annotation.getAnnotationType() == null
|
||||||
|
|| !"org.springframework.beans.factory.annotation.Qualifier"
|
||||||
|
.equals(annotation.getAnnotationType().getQualifiedName())) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
for (IMemberValuePairBinding pair : annotation.getDeclaredMemberValuePairs()) {
|
||||||
|
Object value = pair.getValue();
|
||||||
|
if (value instanceof String stringValue) {
|
||||||
|
return stringValue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
private String extractQualifierAnnotation(List<?> modifiers) {
|
||||||
|
if (modifiers == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
for (Object modifierObj : modifiers) {
|
||||||
|
if (!(modifierObj instanceof Annotation annotation)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
String typeName = annotation.getTypeName().toString();
|
||||||
|
if (!typeName.endsWith("Qualifier")) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
String value = click.kamil.springstatemachineexporter.ast.common.AstUtils.extractAnnotationMember(
|
||||||
|
annotation, "value");
|
||||||
|
if (value == null || value.isBlank()) {
|
||||||
|
value = click.kamil.springstatemachineexporter.ast.common.AstUtils.extractAnnotationMember(
|
||||||
|
annotation, "name");
|
||||||
|
}
|
||||||
|
return stripAnnotationQuotes(value);
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static String stripAnnotationQuotes(String raw) {
|
||||||
|
if (raw == null || raw.isBlank()) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
String trimmed = raw.trim();
|
||||||
|
if (trimmed.length() >= 2 && trimmed.startsWith("\"") && trimmed.endsWith("\"")) {
|
||||||
|
return trimmed.substring(1, trimmed.length() - 1);
|
||||||
|
}
|
||||||
|
return trimmed;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Infers source state from a literal second argument to sendEvent(event, sourceState) when provable from AST.
|
* Infers source state from a literal second argument to sendEvent(event, sourceState) when provable from AST.
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -168,6 +168,35 @@ public class HeuristicBeanResolutionEngineTest {
|
|||||||
"Ambiguous shared gateway should not attach to every machine");
|
"Ambiguous shared gateway should not attach to every machine");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void shouldResolveTriggerStateMachineIdAgainstEnableStateMachineName(@TempDir Path tempDir) throws Exception {
|
||||||
|
Files.writeString(tempDir.resolve("PaymentConfig.java"), """
|
||||||
|
package com.example;
|
||||||
|
@org.springframework.statemachine.config.EnableStateMachine(name = "paymentStateMachine")
|
||||||
|
public class PaymentStateMachineConfig
|
||||||
|
extends org.springframework.statemachine.config.StateMachineConfigurerAdapter<String, String> {}
|
||||||
|
""");
|
||||||
|
Files.writeString(tempDir.resolve("OrderConfig.java"), """
|
||||||
|
package com.example;
|
||||||
|
@org.springframework.statemachine.config.EnableStateMachine(name = "orderStateMachine")
|
||||||
|
public class OrderStateMachineConfig
|
||||||
|
extends org.springframework.statemachine.config.StateMachineConfigurerAdapter<String, String> {}
|
||||||
|
""");
|
||||||
|
|
||||||
|
CodebaseContext context = new CodebaseContext();
|
||||||
|
context.scan(tempDir);
|
||||||
|
|
||||||
|
CallChain chain = CallChain.builder()
|
||||||
|
.triggerPoint(TriggerPoint.builder()
|
||||||
|
.stateMachineId("paymentStateMachine")
|
||||||
|
.build())
|
||||||
|
.methodChain(List.of("com.example.PaymentService.capture()"))
|
||||||
|
.build();
|
||||||
|
|
||||||
|
assertTrue(engine.isRoutedToCorrectMachine(chain, "com.example.PaymentStateMachineConfig", context));
|
||||||
|
assertFalse(engine.isRoutedToCorrectMachine(chain, "com.example.OrderStateMachineConfig", context));
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
void shouldAcceptTriggerWhenSpringErasureDiffersFromStringMachineTypes(@TempDir Path tempDir) throws Exception {
|
void shouldAcceptTriggerWhenSpringErasureDiffersFromStringMachineTypes(@TempDir Path tempDir) throws Exception {
|
||||||
Files.writeString(tempDir.resolve("InheritanceStateMachineConfig.java"), """
|
Files.writeString(tempDir.resolve("InheritanceStateMachineConfig.java"), """
|
||||||
|
|||||||
@@ -130,6 +130,43 @@ class GenericEventDetectorControlFlowTest {
|
|||||||
assertThat(shipTrigger.getSourceState()).isEqualTo("PAID");
|
assertThat(shipTrigger.getSourceState()).isEqualTo("PAID");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void shouldDetectStateFromSwitchExpressionArrowSyntax(@TempDir Path tempDir) throws IOException {
|
||||||
|
String source = """
|
||||||
|
package com.example;
|
||||||
|
public class OrderService {
|
||||||
|
private StateMachine sm;
|
||||||
|
public void processOrder(OrderState state) {
|
||||||
|
switch (state) {
|
||||||
|
case PENDING -> sm.sendEvent(OrderEvent.PAY);
|
||||||
|
case PAID -> sm.sendEvent(OrderEvent.SHIP);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class StateMachine {
|
||||||
|
public void sendEvent(OrderEvent e) {}
|
||||||
|
}
|
||||||
|
|
||||||
|
enum OrderState { PENDING, PAID }
|
||||||
|
enum OrderEvent { PAY, SHIP }
|
||||||
|
""";
|
||||||
|
Files.writeString(tempDir.resolve("OrderService.java"), source);
|
||||||
|
|
||||||
|
CodebaseContext context = new CodebaseContext();
|
||||||
|
context.scan(tempDir);
|
||||||
|
|
||||||
|
GenericEventDetector detector = new GenericEventDetector(context, new ConstantResolver(), Collections.emptyList());
|
||||||
|
List<TriggerPoint> triggers = detector.detect(
|
||||||
|
(org.eclipse.jdt.core.dom.CompilationUnit) context.getTypeDeclaration("com.example.OrderService").getRoot());
|
||||||
|
|
||||||
|
assertThat(triggers).hasSize(2);
|
||||||
|
assertThat(triggers.stream().filter(t -> t.getEvent().equals("OrderEvent.PAY")).findFirst().orElseThrow()
|
||||||
|
.getSourceState()).isEqualTo("PENDING");
|
||||||
|
assertThat(triggers.stream().filter(t -> t.getEvent().equals("OrderEvent.SHIP")).findFirst().orElseThrow()
|
||||||
|
.getSourceState()).isEqualTo("PAID");
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
void shouldNotTreatMachineTypeDiscriminatorAsSourceState(@TempDir Path tempDir) throws IOException {
|
void shouldNotTreatMachineTypeDiscriminatorAsSourceState(@TempDir Path tempDir) throws IOException {
|
||||||
String source = """
|
String source = """
|
||||||
|
|||||||
@@ -77,6 +77,37 @@ class GenericEventDetectorFireTest {
|
|||||||
assertThat(triggers.get(0).getSourceState()).isEqualTo("PAID");
|
assertThat(triggers.get(0).getSourceState()).isEqualTo("PAID");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void shouldInferStateMachineIdFromQualifierOnSendEventReceiver(@TempDir Path tempDir) throws Exception {
|
||||||
|
String source = """
|
||||||
|
package com.example;
|
||||||
|
enum OrderEvent { PAY }
|
||||||
|
class OrderService {
|
||||||
|
@org.springframework.beans.factory.annotation.Qualifier("paymentStateMachine")
|
||||||
|
private final StateMachine stateMachine;
|
||||||
|
OrderService(StateMachine stateMachine) { this.stateMachine = stateMachine; }
|
||||||
|
public void pay() {
|
||||||
|
stateMachine.sendEvent(OrderEvent.PAY);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
class StateMachine {
|
||||||
|
public void sendEvent(OrderEvent event) {}
|
||||||
|
}
|
||||||
|
""";
|
||||||
|
Files.writeString(tempDir.resolve("OrderService.java"), source);
|
||||||
|
|
||||||
|
CodebaseContext context = new CodebaseContext();
|
||||||
|
context.setResolveBindings(true);
|
||||||
|
context.scan(tempDir);
|
||||||
|
|
||||||
|
GenericEventDetector detector = new GenericEventDetector(context, context.getConstantResolver(), List.of());
|
||||||
|
org.eclipse.jdt.core.dom.TypeDeclaration td = context.getTypeDeclaration("com.example.OrderService");
|
||||||
|
List<TriggerPoint> triggers = detector.detect((org.eclipse.jdt.core.dom.CompilationUnit) td.getRoot());
|
||||||
|
|
||||||
|
assertThat(triggers).hasSize(1);
|
||||||
|
assertThat(triggers.get(0).getStateMachineId()).isEqualTo("paymentStateMachine");
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
void shouldNotInferSourceStateFromVariableOnlyIfCondition(@TempDir Path tempDir) throws Exception {
|
void shouldNotInferSourceStateFromVariableOnlyIfCondition(@TempDir Path tempDir) throws Exception {
|
||||||
String source = """
|
String source = """
|
||||||
|
|||||||
@@ -149,45 +149,6 @@
|
|||||||
"external" : false,
|
"external" : false,
|
||||||
"constraint" : null,
|
"constraint" : null,
|
||||||
"ambiguous" : false
|
"ambiguous" : false
|
||||||
}, {
|
|
||||||
"event" : "java.lang.String.FALLBACK_EVENT",
|
|
||||||
"className" : "click.kamil.examples.statemachine.extended.service.FallbackQuirkService",
|
|
||||||
"methodName" : "doQuirk",
|
|
||||||
"sourceFile" : "src/main/java/click/kamil/examples/statemachine/extended/service/FallbackQuirkService.java",
|
|
||||||
"sourceModule" : null,
|
|
||||||
"stateMachineId" : null,
|
|
||||||
"sourceState" : null,
|
|
||||||
"lineNumber" : 17,
|
|
||||||
"polymorphicEvents" : null,
|
|
||||||
"external" : false,
|
|
||||||
"constraint" : null,
|
|
||||||
"ambiguous" : false
|
|
||||||
}, {
|
|
||||||
"event" : "java.lang.String.PROFILED_EVENT",
|
|
||||||
"className" : "click.kamil.examples.statemachine.extended.service.ProfiledQuirkService",
|
|
||||||
"methodName" : "doQuirk",
|
|
||||||
"sourceFile" : "src/main/java/click/kamil/examples/statemachine/extended/service/ProfiledQuirkService.java",
|
|
||||||
"sourceModule" : null,
|
|
||||||
"stateMachineId" : null,
|
|
||||||
"sourceState" : null,
|
|
||||||
"lineNumber" : 19,
|
|
||||||
"polymorphicEvents" : null,
|
|
||||||
"external" : false,
|
|
||||||
"constraint" : null,
|
|
||||||
"ambiguous" : false
|
|
||||||
}, {
|
|
||||||
"event" : "java.lang.String.PRIMARY_EVENT",
|
|
||||||
"className" : "click.kamil.examples.statemachine.extended.service.PrimaryQuirkService",
|
|
||||||
"methodName" : "doQuirk",
|
|
||||||
"sourceFile" : "src/main/java/click/kamil/examples/statemachine/extended/service/PrimaryQuirkService.java",
|
|
||||||
"sourceModule" : null,
|
|
||||||
"stateMachineId" : null,
|
|
||||||
"sourceState" : null,
|
|
||||||
"lineNumber" : 19,
|
|
||||||
"polymorphicEvents" : null,
|
|
||||||
"external" : false,
|
|
||||||
"constraint" : null,
|
|
||||||
"ambiguous" : false
|
|
||||||
}, {
|
}, {
|
||||||
"event" : "java.lang.String.SUBMIT_EVENT",
|
"event" : "java.lang.String.SUBMIT_EVENT",
|
||||||
"className" : "click.kamil.examples.statemachine.extended.service.OrderService",
|
"className" : "click.kamil.examples.statemachine.extended.service.OrderService",
|
||||||
@@ -227,58 +188,6 @@
|
|||||||
"external" : false,
|
"external" : false,
|
||||||
"constraint" : null,
|
"constraint" : null,
|
||||||
"ambiguous" : false
|
"ambiguous" : false
|
||||||
}, {
|
|
||||||
"event" : "java.lang.String.QUALIFIER_EVENT",
|
|
||||||
"className" : "click.kamil.examples.statemachine.extended.service.QualifierQuirkService",
|
|
||||||
"methodName" : "doQuirk",
|
|
||||||
"sourceFile" : "src/main/java/click/kamil/examples/statemachine/extended/service/QualifierQuirkService.java",
|
|
||||||
"sourceModule" : null,
|
|
||||||
"stateMachineId" : null,
|
|
||||||
"sourceState" : null,
|
|
||||||
"lineNumber" : 17,
|
|
||||||
"polymorphicEvents" : null,
|
|
||||||
"external" : false,
|
|
||||||
"constraint" : null,
|
|
||||||
"ambiguous" : false
|
|
||||||
}, {
|
|
||||||
"event" : "java.lang.String.NAMED_EVENT",
|
|
||||||
"className" : "click.kamil.examples.statemachine.extended.service.NamedQuirkService",
|
|
||||||
"methodName" : "doQuirk",
|
|
||||||
"sourceFile" : "src/main/java/click/kamil/examples/statemachine/extended/service/NamedQuirkService.java",
|
|
||||||
"sourceModule" : null,
|
|
||||||
"stateMachineId" : null,
|
|
||||||
"sourceState" : null,
|
|
||||||
"lineNumber" : 17,
|
|
||||||
"polymorphicEvents" : null,
|
|
||||||
"external" : false,
|
|
||||||
"constraint" : null,
|
|
||||||
"ambiguous" : false
|
|
||||||
}, {
|
|
||||||
"event" : "java.lang.String.AUTHORIZE",
|
|
||||||
"className" : "click.kamil.examples.statemachine.extended.service.PaymentServiceImpl",
|
|
||||||
"methodName" : "processPayment",
|
|
||||||
"sourceFile" : "src/main/java/click/kamil/examples/statemachine/extended/service/PaymentServiceImpl.java",
|
|
||||||
"sourceModule" : null,
|
|
||||||
"stateMachineId" : null,
|
|
||||||
"sourceState" : null,
|
|
||||||
"lineNumber" : 22,
|
|
||||||
"polymorphicEvents" : null,
|
|
||||||
"external" : false,
|
|
||||||
"constraint" : null,
|
|
||||||
"ambiguous" : false
|
|
||||||
}, {
|
|
||||||
"event" : "java.lang.String.CAPTURE",
|
|
||||||
"className" : "click.kamil.examples.statemachine.extended.service.PaymentServiceImpl",
|
|
||||||
"methodName" : "capturePayment",
|
|
||||||
"sourceFile" : "src/main/java/click/kamil/examples/statemachine/extended/service/PaymentServiceImpl.java",
|
|
||||||
"sourceModule" : null,
|
|
||||||
"stateMachineId" : null,
|
|
||||||
"sourceState" : null,
|
|
||||||
"lineNumber" : 35,
|
|
||||||
"polymorphicEvents" : null,
|
|
||||||
"external" : false,
|
|
||||||
"constraint" : null,
|
|
||||||
"ambiguous" : false
|
|
||||||
}, {
|
}, {
|
||||||
"event" : "[LIFECYCLE:RESTORE]",
|
"event" : "[LIFECYCLE:RESTORE]",
|
||||||
"className" : "click.kamil.examples.statemachine.extended.service.PaymentServiceImpl",
|
"className" : "click.kamil.examples.statemachine.extended.service.PaymentServiceImpl",
|
||||||
@@ -339,21 +248,6 @@
|
|||||||
"verb" : "POST"
|
"verb" : "POST"
|
||||||
},
|
},
|
||||||
"parameters" : [ ]
|
"parameters" : [ ]
|
||||||
}, {
|
|
||||||
"type" : "REST",
|
|
||||||
"name" : "POST /api/orders/resume",
|
|
||||||
"className" : "click.kamil.examples.statemachine.extended.web.OrderController",
|
|
||||||
"methodName" : "resumeOrder",
|
|
||||||
"sourceFile" : "src/main/java/click/kamil/examples/statemachine/extended/web/OrderController.java",
|
|
||||||
"metadata" : {
|
|
||||||
"path" : "/api/orders/resume",
|
|
||||||
"verb" : "POST"
|
|
||||||
},
|
|
||||||
"parameters" : [ {
|
|
||||||
"name" : "orderId",
|
|
||||||
"type" : "String",
|
|
||||||
"annotations" : [ ]
|
|
||||||
} ]
|
|
||||||
}, {
|
}, {
|
||||||
"type" : "REST",
|
"type" : "REST",
|
||||||
"name" : "POST /api/orders/reactive",
|
"name" : "POST /api/orders/reactive",
|
||||||
@@ -379,83 +273,6 @@
|
|||||||
"interceptorType" : "Spring MVC Interceptor"
|
"interceptorType" : "Spring MVC Interceptor"
|
||||||
},
|
},
|
||||||
"parameters" : [ ]
|
"parameters" : [ ]
|
||||||
}, {
|
|
||||||
"type" : "REST",
|
|
||||||
"name" : "GET /test-setter",
|
|
||||||
"className" : "click.kamil.examples.statemachine.extended.web.SetterInjectionController",
|
|
||||||
"methodName" : "testSetter",
|
|
||||||
"sourceFile" : "src/main/java/click/kamil/examples/statemachine/extended/web/SetterInjectionController.java",
|
|
||||||
"metadata" : {
|
|
||||||
"path" : "/test-setter",
|
|
||||||
"verb" : "GET"
|
|
||||||
},
|
|
||||||
"parameters" : [ ]
|
|
||||||
}, {
|
|
||||||
"type" : "REST",
|
|
||||||
"name" : "POST /api/quirk/primary",
|
|
||||||
"className" : "click.kamil.examples.statemachine.extended.web.QuirkController",
|
|
||||||
"methodName" : "testPrimary",
|
|
||||||
"sourceFile" : "src/main/java/click/kamil/examples/statemachine/extended/web/QuirkController.java",
|
|
||||||
"metadata" : {
|
|
||||||
"path" : "/api/quirk/primary",
|
|
||||||
"verb" : "POST"
|
|
||||||
},
|
|
||||||
"parameters" : [ ]
|
|
||||||
}, {
|
|
||||||
"type" : "REST",
|
|
||||||
"name" : "POST /api/quirk/named",
|
|
||||||
"className" : "click.kamil.examples.statemachine.extended.web.QuirkController",
|
|
||||||
"methodName" : "testNamed",
|
|
||||||
"sourceFile" : "src/main/java/click/kamil/examples/statemachine/extended/web/QuirkController.java",
|
|
||||||
"metadata" : {
|
|
||||||
"path" : "/api/quirk/named",
|
|
||||||
"verb" : "POST"
|
|
||||||
},
|
|
||||||
"parameters" : [ ]
|
|
||||||
}, {
|
|
||||||
"type" : "REST",
|
|
||||||
"name" : "POST /api/quirk/qualifier",
|
|
||||||
"className" : "click.kamil.examples.statemachine.extended.web.QuirkController",
|
|
||||||
"methodName" : "testQualifier",
|
|
||||||
"sourceFile" : "src/main/java/click/kamil/examples/statemachine/extended/web/QuirkController.java",
|
|
||||||
"metadata" : {
|
|
||||||
"path" : "/api/quirk/qualifier",
|
|
||||||
"verb" : "POST"
|
|
||||||
},
|
|
||||||
"parameters" : [ ]
|
|
||||||
}, {
|
|
||||||
"type" : "REST",
|
|
||||||
"name" : "POST /api/quirk/fallback",
|
|
||||||
"className" : "click.kamil.examples.statemachine.extended.web.QuirkController",
|
|
||||||
"methodName" : "testFallback",
|
|
||||||
"sourceFile" : "src/main/java/click/kamil/examples/statemachine/extended/web/QuirkController.java",
|
|
||||||
"metadata" : {
|
|
||||||
"path" : "/api/quirk/fallback",
|
|
||||||
"verb" : "POST"
|
|
||||||
},
|
|
||||||
"parameters" : [ ]
|
|
||||||
}, {
|
|
||||||
"type" : "REST",
|
|
||||||
"name" : "GET /test-concrete",
|
|
||||||
"className" : "click.kamil.examples.statemachine.extended.web.ConcreteReturnTypeController",
|
|
||||||
"methodName" : "testConcrete",
|
|
||||||
"sourceFile" : "src/main/java/click/kamil/examples/statemachine/extended/web/ConcreteReturnTypeController.java",
|
|
||||||
"metadata" : {
|
|
||||||
"path" : "/test-concrete",
|
|
||||||
"verb" : "GET"
|
|
||||||
},
|
|
||||||
"parameters" : [ ]
|
|
||||||
}, {
|
|
||||||
"type" : "REST",
|
|
||||||
"name" : "GET /test-field",
|
|
||||||
"className" : "click.kamil.examples.statemachine.extended.web.FieldInjectionController",
|
|
||||||
"methodName" : "testField",
|
|
||||||
"sourceFile" : "src/main/java/click/kamil/examples/statemachine/extended/web/FieldInjectionController.java",
|
|
||||||
"metadata" : {
|
|
||||||
"path" : "/test-field",
|
|
||||||
"verb" : "GET"
|
|
||||||
},
|
|
||||||
"parameters" : [ ]
|
|
||||||
}, {
|
}, {
|
||||||
"type" : "REST",
|
"type" : "REST",
|
||||||
"name" : "GET /api/base/{id}",
|
"name" : "GET /api/base/{id}",
|
||||||
@@ -592,41 +409,6 @@
|
|||||||
"event" : "String.FINISH"
|
"event" : "String.FINISH"
|
||||||
} ],
|
} ],
|
||||||
"linkResolution" : "RESOLVED"
|
"linkResolution" : "RESOLVED"
|
||||||
}, {
|
|
||||||
"entryPoint" : {
|
|
||||||
"type" : "REST",
|
|
||||||
"name" : "POST /api/orders/resume",
|
|
||||||
"className" : "click.kamil.examples.statemachine.extended.web.OrderController",
|
|
||||||
"methodName" : "resumeOrder",
|
|
||||||
"sourceFile" : "src/main/java/click/kamil/examples/statemachine/extended/web/OrderController.java",
|
|
||||||
"metadata" : {
|
|
||||||
"path" : "/api/orders/resume",
|
|
||||||
"verb" : "POST"
|
|
||||||
},
|
|
||||||
"parameters" : [ {
|
|
||||||
"name" : "orderId",
|
|
||||||
"type" : "String",
|
|
||||||
"annotations" : [ ]
|
|
||||||
} ]
|
|
||||||
},
|
|
||||||
"methodChain" : [ "click.kamil.examples.statemachine.extended.web.OrderController.resumeOrder", "click.kamil.examples.statemachine.extended.service.OrderService.resumeOrder" ],
|
|
||||||
"triggerPoint" : {
|
|
||||||
"event" : "[LIFECYCLE:RESTORE]",
|
|
||||||
"className" : "click.kamil.examples.statemachine.extended.service.OrderService",
|
|
||||||
"methodName" : "resumeOrder",
|
|
||||||
"sourceFile" : null,
|
|
||||||
"sourceModule" : null,
|
|
||||||
"stateMachineId" : null,
|
|
||||||
"sourceState" : null,
|
|
||||||
"lineNumber" : 29,
|
|
||||||
"polymorphicEvents" : null,
|
|
||||||
"external" : false,
|
|
||||||
"constraint" : null,
|
|
||||||
"ambiguous" : false
|
|
||||||
},
|
|
||||||
"contextMachineId" : "orderId",
|
|
||||||
"matchedTransitions" : null,
|
|
||||||
"linkResolution" : null
|
|
||||||
}, {
|
}, {
|
||||||
"entryPoint" : {
|
"entryPoint" : {
|
||||||
"type" : "REST",
|
"type" : "REST",
|
||||||
@@ -700,328 +482,6 @@
|
|||||||
"event" : "String.AUDIT_EVENT"
|
"event" : "String.AUDIT_EVENT"
|
||||||
} ],
|
} ],
|
||||||
"linkResolution" : "RESOLVED"
|
"linkResolution" : "RESOLVED"
|
||||||
}, {
|
|
||||||
"entryPoint" : {
|
|
||||||
"type" : "REST",
|
|
||||||
"name" : "GET /test-setter",
|
|
||||||
"className" : "click.kamil.examples.statemachine.extended.web.SetterInjectionController",
|
|
||||||
"methodName" : "testSetter",
|
|
||||||
"sourceFile" : "src/main/java/click/kamil/examples/statemachine/extended/web/SetterInjectionController.java",
|
|
||||||
"metadata" : {
|
|
||||||
"path" : "/test-setter",
|
|
||||||
"verb" : "GET"
|
|
||||||
},
|
|
||||||
"parameters" : [ ]
|
|
||||||
},
|
|
||||||
"methodChain" : [ "click.kamil.examples.statemachine.extended.web.SetterInjectionController.testSetter", "click.kamil.examples.statemachine.extended.service.NamedQuirkService.doQuirk" ],
|
|
||||||
"triggerPoint" : {
|
|
||||||
"event" : "java.lang.String.NAMED_EVENT",
|
|
||||||
"className" : "click.kamil.examples.statemachine.extended.service.NamedQuirkService",
|
|
||||||
"methodName" : "doQuirk",
|
|
||||||
"sourceFile" : "src/main/java/click/kamil/examples/statemachine/extended/service/NamedQuirkService.java",
|
|
||||||
"sourceModule" : null,
|
|
||||||
"stateMachineId" : null,
|
|
||||||
"sourceState" : null,
|
|
||||||
"lineNumber" : 17,
|
|
||||||
"polymorphicEvents" : [ ],
|
|
||||||
"external" : false,
|
|
||||||
"constraint" : null,
|
|
||||||
"ambiguous" : false
|
|
||||||
},
|
|
||||||
"contextMachineId" : null,
|
|
||||||
"matchedTransitions" : null,
|
|
||||||
"linkResolution" : "NO_MATCH"
|
|
||||||
}, {
|
|
||||||
"entryPoint" : {
|
|
||||||
"type" : "REST",
|
|
||||||
"name" : "POST /api/quirk/primary",
|
|
||||||
"className" : "click.kamil.examples.statemachine.extended.web.QuirkController",
|
|
||||||
"methodName" : "testPrimary",
|
|
||||||
"sourceFile" : "src/main/java/click/kamil/examples/statemachine/extended/web/QuirkController.java",
|
|
||||||
"metadata" : {
|
|
||||||
"path" : "/api/quirk/primary",
|
|
||||||
"verb" : "POST"
|
|
||||||
},
|
|
||||||
"parameters" : [ ]
|
|
||||||
},
|
|
||||||
"methodChain" : [ "click.kamil.examples.statemachine.extended.web.QuirkController.testPrimary", "click.kamil.examples.statemachine.extended.service.PrimaryQuirkService.doQuirk" ],
|
|
||||||
"triggerPoint" : {
|
|
||||||
"event" : "java.lang.String.PRIMARY_EVENT",
|
|
||||||
"className" : "click.kamil.examples.statemachine.extended.service.PrimaryQuirkService",
|
|
||||||
"methodName" : "doQuirk",
|
|
||||||
"sourceFile" : "src/main/java/click/kamil/examples/statemachine/extended/service/PrimaryQuirkService.java",
|
|
||||||
"sourceModule" : null,
|
|
||||||
"stateMachineId" : null,
|
|
||||||
"sourceState" : null,
|
|
||||||
"lineNumber" : 19,
|
|
||||||
"polymorphicEvents" : [ ],
|
|
||||||
"external" : false,
|
|
||||||
"constraint" : null,
|
|
||||||
"ambiguous" : false
|
|
||||||
},
|
|
||||||
"contextMachineId" : null,
|
|
||||||
"matchedTransitions" : null,
|
|
||||||
"linkResolution" : "NO_MATCH"
|
|
||||||
}, {
|
|
||||||
"entryPoint" : {
|
|
||||||
"type" : "REST",
|
|
||||||
"name" : "POST /api/quirk/named",
|
|
||||||
"className" : "click.kamil.examples.statemachine.extended.web.QuirkController",
|
|
||||||
"methodName" : "testNamed",
|
|
||||||
"sourceFile" : "src/main/java/click/kamil/examples/statemachine/extended/web/QuirkController.java",
|
|
||||||
"metadata" : {
|
|
||||||
"path" : "/api/quirk/named",
|
|
||||||
"verb" : "POST"
|
|
||||||
},
|
|
||||||
"parameters" : [ ]
|
|
||||||
},
|
|
||||||
"methodChain" : [ "click.kamil.examples.statemachine.extended.web.QuirkController.testNamed", "click.kamil.examples.statemachine.extended.service.NamedQuirkService.doQuirk" ],
|
|
||||||
"triggerPoint" : {
|
|
||||||
"event" : "java.lang.String.NAMED_EVENT",
|
|
||||||
"className" : "click.kamil.examples.statemachine.extended.service.NamedQuirkService",
|
|
||||||
"methodName" : "doQuirk",
|
|
||||||
"sourceFile" : "src/main/java/click/kamil/examples/statemachine/extended/service/NamedQuirkService.java",
|
|
||||||
"sourceModule" : null,
|
|
||||||
"stateMachineId" : null,
|
|
||||||
"sourceState" : null,
|
|
||||||
"lineNumber" : 17,
|
|
||||||
"polymorphicEvents" : [ ],
|
|
||||||
"external" : false,
|
|
||||||
"constraint" : null,
|
|
||||||
"ambiguous" : false
|
|
||||||
},
|
|
||||||
"contextMachineId" : null,
|
|
||||||
"matchedTransitions" : null,
|
|
||||||
"linkResolution" : "NO_MATCH"
|
|
||||||
}, {
|
|
||||||
"entryPoint" : {
|
|
||||||
"type" : "REST",
|
|
||||||
"name" : "POST /api/quirk/qualifier",
|
|
||||||
"className" : "click.kamil.examples.statemachine.extended.web.QuirkController",
|
|
||||||
"methodName" : "testQualifier",
|
|
||||||
"sourceFile" : "src/main/java/click/kamil/examples/statemachine/extended/web/QuirkController.java",
|
|
||||||
"metadata" : {
|
|
||||||
"path" : "/api/quirk/qualifier",
|
|
||||||
"verb" : "POST"
|
|
||||||
},
|
|
||||||
"parameters" : [ ]
|
|
||||||
},
|
|
||||||
"methodChain" : [ "click.kamil.examples.statemachine.extended.web.QuirkController.testQualifier", "click.kamil.examples.statemachine.extended.service.QualifierQuirkService.doQuirk" ],
|
|
||||||
"triggerPoint" : {
|
|
||||||
"event" : "java.lang.String.QUALIFIER_EVENT",
|
|
||||||
"className" : "click.kamil.examples.statemachine.extended.service.QualifierQuirkService",
|
|
||||||
"methodName" : "doQuirk",
|
|
||||||
"sourceFile" : "src/main/java/click/kamil/examples/statemachine/extended/service/QualifierQuirkService.java",
|
|
||||||
"sourceModule" : null,
|
|
||||||
"stateMachineId" : null,
|
|
||||||
"sourceState" : null,
|
|
||||||
"lineNumber" : 17,
|
|
||||||
"polymorphicEvents" : [ ],
|
|
||||||
"external" : false,
|
|
||||||
"constraint" : null,
|
|
||||||
"ambiguous" : false
|
|
||||||
},
|
|
||||||
"contextMachineId" : null,
|
|
||||||
"matchedTransitions" : null,
|
|
||||||
"linkResolution" : "NO_MATCH"
|
|
||||||
}, {
|
|
||||||
"entryPoint" : {
|
|
||||||
"type" : "REST",
|
|
||||||
"name" : "POST /api/quirk/fallback",
|
|
||||||
"className" : "click.kamil.examples.statemachine.extended.web.QuirkController",
|
|
||||||
"methodName" : "testFallback",
|
|
||||||
"sourceFile" : "src/main/java/click/kamil/examples/statemachine/extended/web/QuirkController.java",
|
|
||||||
"metadata" : {
|
|
||||||
"path" : "/api/quirk/fallback",
|
|
||||||
"verb" : "POST"
|
|
||||||
},
|
|
||||||
"parameters" : [ ]
|
|
||||||
},
|
|
||||||
"methodChain" : [ "click.kamil.examples.statemachine.extended.web.QuirkController.testFallback", "click.kamil.examples.statemachine.extended.service.PrimaryQuirkService.doQuirk" ],
|
|
||||||
"triggerPoint" : {
|
|
||||||
"event" : "java.lang.String.PRIMARY_EVENT",
|
|
||||||
"className" : "click.kamil.examples.statemachine.extended.service.PrimaryQuirkService",
|
|
||||||
"methodName" : "doQuirk",
|
|
||||||
"sourceFile" : "src/main/java/click/kamil/examples/statemachine/extended/service/PrimaryQuirkService.java",
|
|
||||||
"sourceModule" : null,
|
|
||||||
"stateMachineId" : null,
|
|
||||||
"sourceState" : null,
|
|
||||||
"lineNumber" : 19,
|
|
||||||
"polymorphicEvents" : [ ],
|
|
||||||
"external" : false,
|
|
||||||
"constraint" : null,
|
|
||||||
"ambiguous" : false
|
|
||||||
},
|
|
||||||
"contextMachineId" : null,
|
|
||||||
"matchedTransitions" : null,
|
|
||||||
"linkResolution" : "NO_MATCH"
|
|
||||||
}, {
|
|
||||||
"entryPoint" : {
|
|
||||||
"type" : "REST",
|
|
||||||
"name" : "GET /test-concrete",
|
|
||||||
"className" : "click.kamil.examples.statemachine.extended.web.ConcreteReturnTypeController",
|
|
||||||
"methodName" : "testConcrete",
|
|
||||||
"sourceFile" : "src/main/java/click/kamil/examples/statemachine/extended/web/ConcreteReturnTypeController.java",
|
|
||||||
"metadata" : {
|
|
||||||
"path" : "/test-concrete",
|
|
||||||
"verb" : "GET"
|
|
||||||
},
|
|
||||||
"parameters" : [ ]
|
|
||||||
},
|
|
||||||
"methodChain" : [ "click.kamil.examples.statemachine.extended.web.ConcreteReturnTypeController.testConcrete", "click.kamil.examples.statemachine.extended.service.QualifierQuirkService.doQuirk" ],
|
|
||||||
"triggerPoint" : {
|
|
||||||
"event" : "java.lang.String.QUALIFIER_EVENT",
|
|
||||||
"className" : "click.kamil.examples.statemachine.extended.service.QualifierQuirkService",
|
|
||||||
"methodName" : "doQuirk",
|
|
||||||
"sourceFile" : "src/main/java/click/kamil/examples/statemachine/extended/service/QualifierQuirkService.java",
|
|
||||||
"sourceModule" : null,
|
|
||||||
"stateMachineId" : null,
|
|
||||||
"sourceState" : null,
|
|
||||||
"lineNumber" : 17,
|
|
||||||
"polymorphicEvents" : [ ],
|
|
||||||
"external" : false,
|
|
||||||
"constraint" : null,
|
|
||||||
"ambiguous" : false
|
|
||||||
},
|
|
||||||
"contextMachineId" : null,
|
|
||||||
"matchedTransitions" : null,
|
|
||||||
"linkResolution" : "NO_MATCH"
|
|
||||||
}, {
|
|
||||||
"entryPoint" : {
|
|
||||||
"type" : "REST",
|
|
||||||
"name" : "GET /test-field",
|
|
||||||
"className" : "click.kamil.examples.statemachine.extended.web.FieldInjectionController",
|
|
||||||
"methodName" : "testField",
|
|
||||||
"sourceFile" : "src/main/java/click/kamil/examples/statemachine/extended/web/FieldInjectionController.java",
|
|
||||||
"metadata" : {
|
|
||||||
"path" : "/test-field",
|
|
||||||
"verb" : "GET"
|
|
||||||
},
|
|
||||||
"parameters" : [ ]
|
|
||||||
},
|
|
||||||
"methodChain" : [ "click.kamil.examples.statemachine.extended.web.FieldInjectionController.testField", "click.kamil.examples.statemachine.extended.service.NamedQuirkService.doQuirk" ],
|
|
||||||
"triggerPoint" : {
|
|
||||||
"event" : "java.lang.String.NAMED_EVENT",
|
|
||||||
"className" : "click.kamil.examples.statemachine.extended.service.NamedQuirkService",
|
|
||||||
"methodName" : "doQuirk",
|
|
||||||
"sourceFile" : "src/main/java/click/kamil/examples/statemachine/extended/service/NamedQuirkService.java",
|
|
||||||
"sourceModule" : null,
|
|
||||||
"stateMachineId" : null,
|
|
||||||
"sourceState" : null,
|
|
||||||
"lineNumber" : 17,
|
|
||||||
"polymorphicEvents" : [ ],
|
|
||||||
"external" : false,
|
|
||||||
"constraint" : null,
|
|
||||||
"ambiguous" : false
|
|
||||||
},
|
|
||||||
"contextMachineId" : null,
|
|
||||||
"matchedTransitions" : null,
|
|
||||||
"linkResolution" : "NO_MATCH"
|
|
||||||
}, {
|
|
||||||
"entryPoint" : {
|
|
||||||
"type" : "REST",
|
|
||||||
"name" : "GET /api/base/{id}",
|
|
||||||
"className" : "click.kamil.examples.statemachine.extended.web.PaymentController",
|
|
||||||
"methodName" : "processBaseEndpoint",
|
|
||||||
"sourceFile" : "src/main/java/click/kamil/examples/statemachine/extended/web/PaymentController.java",
|
|
||||||
"metadata" : {
|
|
||||||
"path" : "/api/base/{id}",
|
|
||||||
"verb" : "GET"
|
|
||||||
},
|
|
||||||
"parameters" : [ {
|
|
||||||
"name" : "id",
|
|
||||||
"type" : "String",
|
|
||||||
"annotations" : [ "PathVariable" ]
|
|
||||||
} ]
|
|
||||||
},
|
|
||||||
"methodChain" : [ "click.kamil.examples.statemachine.extended.web.PaymentController.processBaseEndpoint", "click.kamil.examples.statemachine.extended.service.PaymentServiceImpl.processPayment" ],
|
|
||||||
"triggerPoint" : {
|
|
||||||
"event" : "java.lang.String.AUTHORIZE",
|
|
||||||
"className" : "click.kamil.examples.statemachine.extended.service.PaymentServiceImpl",
|
|
||||||
"methodName" : "processPayment",
|
|
||||||
"sourceFile" : "src/main/java/click/kamil/examples/statemachine/extended/service/PaymentServiceImpl.java",
|
|
||||||
"sourceModule" : null,
|
|
||||||
"stateMachineId" : null,
|
|
||||||
"sourceState" : null,
|
|
||||||
"lineNumber" : 22,
|
|
||||||
"polymorphicEvents" : [ ],
|
|
||||||
"external" : false,
|
|
||||||
"constraint" : null,
|
|
||||||
"ambiguous" : false
|
|
||||||
},
|
|
||||||
"contextMachineId" : null,
|
|
||||||
"matchedTransitions" : null,
|
|
||||||
"linkResolution" : "NO_MATCH"
|
|
||||||
}, {
|
|
||||||
"entryPoint" : {
|
|
||||||
"type" : "REST",
|
|
||||||
"name" : "POST /api/payment/{id}/capture",
|
|
||||||
"className" : "click.kamil.examples.statemachine.extended.web.PaymentController",
|
|
||||||
"methodName" : "capturePaymentEndpoint",
|
|
||||||
"sourceFile" : "src/main/java/click/kamil/examples/statemachine/extended/web/PaymentController.java",
|
|
||||||
"metadata" : {
|
|
||||||
"path" : "/api/payment/{id}/capture",
|
|
||||||
"verb" : "POST"
|
|
||||||
},
|
|
||||||
"parameters" : [ {
|
|
||||||
"name" : "id",
|
|
||||||
"type" : "String",
|
|
||||||
"annotations" : [ "PathVariable" ]
|
|
||||||
} ]
|
|
||||||
},
|
|
||||||
"methodChain" : [ "click.kamil.examples.statemachine.extended.web.PaymentController.capturePaymentEndpoint", "click.kamil.examples.statemachine.extended.service.PaymentServiceImpl.capturePayment" ],
|
|
||||||
"triggerPoint" : {
|
|
||||||
"event" : "java.lang.String.CAPTURE",
|
|
||||||
"className" : "click.kamil.examples.statemachine.extended.service.PaymentServiceImpl",
|
|
||||||
"methodName" : "capturePayment",
|
|
||||||
"sourceFile" : "src/main/java/click/kamil/examples/statemachine/extended/service/PaymentServiceImpl.java",
|
|
||||||
"sourceModule" : null,
|
|
||||||
"stateMachineId" : null,
|
|
||||||
"sourceState" : null,
|
|
||||||
"lineNumber" : 35,
|
|
||||||
"polymorphicEvents" : [ ],
|
|
||||||
"external" : false,
|
|
||||||
"constraint" : null,
|
|
||||||
"ambiguous" : false
|
|
||||||
},
|
|
||||||
"contextMachineId" : "paymentId",
|
|
||||||
"matchedTransitions" : null,
|
|
||||||
"linkResolution" : "NO_MATCH"
|
|
||||||
}, {
|
|
||||||
"entryPoint" : {
|
|
||||||
"type" : "REST",
|
|
||||||
"name" : "POST /api/payment/{id}/capture",
|
|
||||||
"className" : "click.kamil.examples.statemachine.extended.web.PaymentController",
|
|
||||||
"methodName" : "capturePaymentEndpoint",
|
|
||||||
"sourceFile" : "src/main/java/click/kamil/examples/statemachine/extended/web/PaymentController.java",
|
|
||||||
"metadata" : {
|
|
||||||
"path" : "/api/payment/{id}/capture",
|
|
||||||
"verb" : "POST"
|
|
||||||
},
|
|
||||||
"parameters" : [ {
|
|
||||||
"name" : "id",
|
|
||||||
"type" : "String",
|
|
||||||
"annotations" : [ "PathVariable" ]
|
|
||||||
} ]
|
|
||||||
},
|
|
||||||
"methodChain" : [ "click.kamil.examples.statemachine.extended.web.PaymentController.capturePaymentEndpoint", "click.kamil.examples.statemachine.extended.service.PaymentServiceImpl.capturePayment" ],
|
|
||||||
"triggerPoint" : {
|
|
||||||
"event" : "[LIFECYCLE:RESTORE]",
|
|
||||||
"className" : "click.kamil.examples.statemachine.extended.service.PaymentServiceImpl",
|
|
||||||
"methodName" : "capturePayment",
|
|
||||||
"sourceFile" : null,
|
|
||||||
"sourceModule" : null,
|
|
||||||
"stateMachineId" : null,
|
|
||||||
"sourceState" : null,
|
|
||||||
"lineNumber" : 28,
|
|
||||||
"polymorphicEvents" : null,
|
|
||||||
"external" : false,
|
|
||||||
"constraint" : null,
|
|
||||||
"ambiguous" : false
|
|
||||||
},
|
|
||||||
"contextMachineId" : "paymentId",
|
|
||||||
"matchedTransitions" : null,
|
|
||||||
"linkResolution" : null
|
|
||||||
} ],
|
} ],
|
||||||
"properties" : {
|
"properties" : {
|
||||||
"default" : {
|
"default" : {
|
||||||
|
|||||||
@@ -149,45 +149,6 @@
|
|||||||
"external" : false,
|
"external" : false,
|
||||||
"constraint" : null,
|
"constraint" : null,
|
||||||
"ambiguous" : false
|
"ambiguous" : false
|
||||||
}, {
|
|
||||||
"event" : "java.lang.String.FALLBACK_EVENT",
|
|
||||||
"className" : "click.kamil.examples.statemachine.extended.service.FallbackQuirkService",
|
|
||||||
"methodName" : "doQuirk",
|
|
||||||
"sourceFile" : "src/main/java/click/kamil/examples/statemachine/extended/service/FallbackQuirkService.java",
|
|
||||||
"sourceModule" : null,
|
|
||||||
"stateMachineId" : null,
|
|
||||||
"sourceState" : null,
|
|
||||||
"lineNumber" : 17,
|
|
||||||
"polymorphicEvents" : null,
|
|
||||||
"external" : false,
|
|
||||||
"constraint" : null,
|
|
||||||
"ambiguous" : false
|
|
||||||
}, {
|
|
||||||
"event" : "java.lang.String.PROFILED_EVENT",
|
|
||||||
"className" : "click.kamil.examples.statemachine.extended.service.ProfiledQuirkService",
|
|
||||||
"methodName" : "doQuirk",
|
|
||||||
"sourceFile" : "src/main/java/click/kamil/examples/statemachine/extended/service/ProfiledQuirkService.java",
|
|
||||||
"sourceModule" : null,
|
|
||||||
"stateMachineId" : null,
|
|
||||||
"sourceState" : null,
|
|
||||||
"lineNumber" : 19,
|
|
||||||
"polymorphicEvents" : null,
|
|
||||||
"external" : false,
|
|
||||||
"constraint" : null,
|
|
||||||
"ambiguous" : false
|
|
||||||
}, {
|
|
||||||
"event" : "java.lang.String.PRIMARY_EVENT",
|
|
||||||
"className" : "click.kamil.examples.statemachine.extended.service.PrimaryQuirkService",
|
|
||||||
"methodName" : "doQuirk",
|
|
||||||
"sourceFile" : "src/main/java/click/kamil/examples/statemachine/extended/service/PrimaryQuirkService.java",
|
|
||||||
"sourceModule" : null,
|
|
||||||
"stateMachineId" : null,
|
|
||||||
"sourceState" : null,
|
|
||||||
"lineNumber" : 19,
|
|
||||||
"polymorphicEvents" : null,
|
|
||||||
"external" : false,
|
|
||||||
"constraint" : null,
|
|
||||||
"ambiguous" : false
|
|
||||||
}, {
|
}, {
|
||||||
"event" : "java.lang.String.SUBMIT_EVENT",
|
"event" : "java.lang.String.SUBMIT_EVENT",
|
||||||
"className" : "click.kamil.examples.statemachine.extended.service.OrderService",
|
"className" : "click.kamil.examples.statemachine.extended.service.OrderService",
|
||||||
@@ -227,58 +188,6 @@
|
|||||||
"external" : false,
|
"external" : false,
|
||||||
"constraint" : null,
|
"constraint" : null,
|
||||||
"ambiguous" : false
|
"ambiguous" : false
|
||||||
}, {
|
|
||||||
"event" : "java.lang.String.QUALIFIER_EVENT",
|
|
||||||
"className" : "click.kamil.examples.statemachine.extended.service.QualifierQuirkService",
|
|
||||||
"methodName" : "doQuirk",
|
|
||||||
"sourceFile" : "src/main/java/click/kamil/examples/statemachine/extended/service/QualifierQuirkService.java",
|
|
||||||
"sourceModule" : null,
|
|
||||||
"stateMachineId" : null,
|
|
||||||
"sourceState" : null,
|
|
||||||
"lineNumber" : 17,
|
|
||||||
"polymorphicEvents" : null,
|
|
||||||
"external" : false,
|
|
||||||
"constraint" : null,
|
|
||||||
"ambiguous" : false
|
|
||||||
}, {
|
|
||||||
"event" : "java.lang.String.NAMED_EVENT",
|
|
||||||
"className" : "click.kamil.examples.statemachine.extended.service.NamedQuirkService",
|
|
||||||
"methodName" : "doQuirk",
|
|
||||||
"sourceFile" : "src/main/java/click/kamil/examples/statemachine/extended/service/NamedQuirkService.java",
|
|
||||||
"sourceModule" : null,
|
|
||||||
"stateMachineId" : null,
|
|
||||||
"sourceState" : null,
|
|
||||||
"lineNumber" : 17,
|
|
||||||
"polymorphicEvents" : null,
|
|
||||||
"external" : false,
|
|
||||||
"constraint" : null,
|
|
||||||
"ambiguous" : false
|
|
||||||
}, {
|
|
||||||
"event" : "java.lang.String.AUTHORIZE",
|
|
||||||
"className" : "click.kamil.examples.statemachine.extended.service.PaymentServiceImpl",
|
|
||||||
"methodName" : "processPayment",
|
|
||||||
"sourceFile" : "src/main/java/click/kamil/examples/statemachine/extended/service/PaymentServiceImpl.java",
|
|
||||||
"sourceModule" : null,
|
|
||||||
"stateMachineId" : null,
|
|
||||||
"sourceState" : null,
|
|
||||||
"lineNumber" : 22,
|
|
||||||
"polymorphicEvents" : null,
|
|
||||||
"external" : false,
|
|
||||||
"constraint" : null,
|
|
||||||
"ambiguous" : false
|
|
||||||
}, {
|
|
||||||
"event" : "java.lang.String.CAPTURE",
|
|
||||||
"className" : "click.kamil.examples.statemachine.extended.service.PaymentServiceImpl",
|
|
||||||
"methodName" : "capturePayment",
|
|
||||||
"sourceFile" : "src/main/java/click/kamil/examples/statemachine/extended/service/PaymentServiceImpl.java",
|
|
||||||
"sourceModule" : null,
|
|
||||||
"stateMachineId" : null,
|
|
||||||
"sourceState" : null,
|
|
||||||
"lineNumber" : 35,
|
|
||||||
"polymorphicEvents" : null,
|
|
||||||
"external" : false,
|
|
||||||
"constraint" : null,
|
|
||||||
"ambiguous" : false
|
|
||||||
}, {
|
}, {
|
||||||
"event" : "[LIFECYCLE:RESTORE]",
|
"event" : "[LIFECYCLE:RESTORE]",
|
||||||
"className" : "click.kamil.examples.statemachine.extended.service.PaymentServiceImpl",
|
"className" : "click.kamil.examples.statemachine.extended.service.PaymentServiceImpl",
|
||||||
@@ -339,21 +248,6 @@
|
|||||||
"verb" : "POST"
|
"verb" : "POST"
|
||||||
},
|
},
|
||||||
"parameters" : [ ]
|
"parameters" : [ ]
|
||||||
}, {
|
|
||||||
"type" : "REST",
|
|
||||||
"name" : "POST /api/orders/resume",
|
|
||||||
"className" : "click.kamil.examples.statemachine.extended.web.OrderController",
|
|
||||||
"methodName" : "resumeOrder",
|
|
||||||
"sourceFile" : "src/main/java/click/kamil/examples/statemachine/extended/web/OrderController.java",
|
|
||||||
"metadata" : {
|
|
||||||
"path" : "/api/orders/resume",
|
|
||||||
"verb" : "POST"
|
|
||||||
},
|
|
||||||
"parameters" : [ {
|
|
||||||
"name" : "orderId",
|
|
||||||
"type" : "String",
|
|
||||||
"annotations" : [ ]
|
|
||||||
} ]
|
|
||||||
}, {
|
}, {
|
||||||
"type" : "REST",
|
"type" : "REST",
|
||||||
"name" : "POST /api/orders/reactive",
|
"name" : "POST /api/orders/reactive",
|
||||||
@@ -379,83 +273,6 @@
|
|||||||
"interceptorType" : "Spring MVC Interceptor"
|
"interceptorType" : "Spring MVC Interceptor"
|
||||||
},
|
},
|
||||||
"parameters" : [ ]
|
"parameters" : [ ]
|
||||||
}, {
|
|
||||||
"type" : "REST",
|
|
||||||
"name" : "GET /test-setter",
|
|
||||||
"className" : "click.kamil.examples.statemachine.extended.web.SetterInjectionController",
|
|
||||||
"methodName" : "testSetter",
|
|
||||||
"sourceFile" : "src/main/java/click/kamil/examples/statemachine/extended/web/SetterInjectionController.java",
|
|
||||||
"metadata" : {
|
|
||||||
"path" : "/test-setter",
|
|
||||||
"verb" : "GET"
|
|
||||||
},
|
|
||||||
"parameters" : [ ]
|
|
||||||
}, {
|
|
||||||
"type" : "REST",
|
|
||||||
"name" : "POST /api/quirk/primary",
|
|
||||||
"className" : "click.kamil.examples.statemachine.extended.web.QuirkController",
|
|
||||||
"methodName" : "testPrimary",
|
|
||||||
"sourceFile" : "src/main/java/click/kamil/examples/statemachine/extended/web/QuirkController.java",
|
|
||||||
"metadata" : {
|
|
||||||
"path" : "/api/quirk/primary",
|
|
||||||
"verb" : "POST"
|
|
||||||
},
|
|
||||||
"parameters" : [ ]
|
|
||||||
}, {
|
|
||||||
"type" : "REST",
|
|
||||||
"name" : "POST /api/quirk/named",
|
|
||||||
"className" : "click.kamil.examples.statemachine.extended.web.QuirkController",
|
|
||||||
"methodName" : "testNamed",
|
|
||||||
"sourceFile" : "src/main/java/click/kamil/examples/statemachine/extended/web/QuirkController.java",
|
|
||||||
"metadata" : {
|
|
||||||
"path" : "/api/quirk/named",
|
|
||||||
"verb" : "POST"
|
|
||||||
},
|
|
||||||
"parameters" : [ ]
|
|
||||||
}, {
|
|
||||||
"type" : "REST",
|
|
||||||
"name" : "POST /api/quirk/qualifier",
|
|
||||||
"className" : "click.kamil.examples.statemachine.extended.web.QuirkController",
|
|
||||||
"methodName" : "testQualifier",
|
|
||||||
"sourceFile" : "src/main/java/click/kamil/examples/statemachine/extended/web/QuirkController.java",
|
|
||||||
"metadata" : {
|
|
||||||
"path" : "/api/quirk/qualifier",
|
|
||||||
"verb" : "POST"
|
|
||||||
},
|
|
||||||
"parameters" : [ ]
|
|
||||||
}, {
|
|
||||||
"type" : "REST",
|
|
||||||
"name" : "POST /api/quirk/fallback",
|
|
||||||
"className" : "click.kamil.examples.statemachine.extended.web.QuirkController",
|
|
||||||
"methodName" : "testFallback",
|
|
||||||
"sourceFile" : "src/main/java/click/kamil/examples/statemachine/extended/web/QuirkController.java",
|
|
||||||
"metadata" : {
|
|
||||||
"path" : "/api/quirk/fallback",
|
|
||||||
"verb" : "POST"
|
|
||||||
},
|
|
||||||
"parameters" : [ ]
|
|
||||||
}, {
|
|
||||||
"type" : "REST",
|
|
||||||
"name" : "GET /test-concrete",
|
|
||||||
"className" : "click.kamil.examples.statemachine.extended.web.ConcreteReturnTypeController",
|
|
||||||
"methodName" : "testConcrete",
|
|
||||||
"sourceFile" : "src/main/java/click/kamil/examples/statemachine/extended/web/ConcreteReturnTypeController.java",
|
|
||||||
"metadata" : {
|
|
||||||
"path" : "/test-concrete",
|
|
||||||
"verb" : "GET"
|
|
||||||
},
|
|
||||||
"parameters" : [ ]
|
|
||||||
}, {
|
|
||||||
"type" : "REST",
|
|
||||||
"name" : "GET /test-field",
|
|
||||||
"className" : "click.kamil.examples.statemachine.extended.web.FieldInjectionController",
|
|
||||||
"methodName" : "testField",
|
|
||||||
"sourceFile" : "src/main/java/click/kamil/examples/statemachine/extended/web/FieldInjectionController.java",
|
|
||||||
"metadata" : {
|
|
||||||
"path" : "/test-field",
|
|
||||||
"verb" : "GET"
|
|
||||||
},
|
|
||||||
"parameters" : [ ]
|
|
||||||
}, {
|
}, {
|
||||||
"type" : "REST",
|
"type" : "REST",
|
||||||
"name" : "GET /api/base/{id}",
|
"name" : "GET /api/base/{id}",
|
||||||
@@ -592,41 +409,6 @@
|
|||||||
"event" : "String.FINISH"
|
"event" : "String.FINISH"
|
||||||
} ],
|
} ],
|
||||||
"linkResolution" : "RESOLVED"
|
"linkResolution" : "RESOLVED"
|
||||||
}, {
|
|
||||||
"entryPoint" : {
|
|
||||||
"type" : "REST",
|
|
||||||
"name" : "POST /api/orders/resume",
|
|
||||||
"className" : "click.kamil.examples.statemachine.extended.web.OrderController",
|
|
||||||
"methodName" : "resumeOrder",
|
|
||||||
"sourceFile" : "src/main/java/click/kamil/examples/statemachine/extended/web/OrderController.java",
|
|
||||||
"metadata" : {
|
|
||||||
"path" : "/api/orders/resume",
|
|
||||||
"verb" : "POST"
|
|
||||||
},
|
|
||||||
"parameters" : [ {
|
|
||||||
"name" : "orderId",
|
|
||||||
"type" : "String",
|
|
||||||
"annotations" : [ ]
|
|
||||||
} ]
|
|
||||||
},
|
|
||||||
"methodChain" : [ "click.kamil.examples.statemachine.extended.web.OrderController.resumeOrder", "click.kamil.examples.statemachine.extended.service.OrderService.resumeOrder" ],
|
|
||||||
"triggerPoint" : {
|
|
||||||
"event" : "[LIFECYCLE:RESTORE]",
|
|
||||||
"className" : "click.kamil.examples.statemachine.extended.service.OrderService",
|
|
||||||
"methodName" : "resumeOrder",
|
|
||||||
"sourceFile" : null,
|
|
||||||
"sourceModule" : null,
|
|
||||||
"stateMachineId" : null,
|
|
||||||
"sourceState" : null,
|
|
||||||
"lineNumber" : 29,
|
|
||||||
"polymorphicEvents" : null,
|
|
||||||
"external" : false,
|
|
||||||
"constraint" : null,
|
|
||||||
"ambiguous" : false
|
|
||||||
},
|
|
||||||
"contextMachineId" : "orderId",
|
|
||||||
"matchedTransitions" : null,
|
|
||||||
"linkResolution" : null
|
|
||||||
}, {
|
}, {
|
||||||
"entryPoint" : {
|
"entryPoint" : {
|
||||||
"type" : "REST",
|
"type" : "REST",
|
||||||
@@ -700,328 +482,6 @@
|
|||||||
"event" : "String.AUDIT_EVENT"
|
"event" : "String.AUDIT_EVENT"
|
||||||
} ],
|
} ],
|
||||||
"linkResolution" : "RESOLVED"
|
"linkResolution" : "RESOLVED"
|
||||||
}, {
|
|
||||||
"entryPoint" : {
|
|
||||||
"type" : "REST",
|
|
||||||
"name" : "GET /test-setter",
|
|
||||||
"className" : "click.kamil.examples.statemachine.extended.web.SetterInjectionController",
|
|
||||||
"methodName" : "testSetter",
|
|
||||||
"sourceFile" : "src/main/java/click/kamil/examples/statemachine/extended/web/SetterInjectionController.java",
|
|
||||||
"metadata" : {
|
|
||||||
"path" : "/test-setter",
|
|
||||||
"verb" : "GET"
|
|
||||||
},
|
|
||||||
"parameters" : [ ]
|
|
||||||
},
|
|
||||||
"methodChain" : [ "click.kamil.examples.statemachine.extended.web.SetterInjectionController.testSetter", "click.kamil.examples.statemachine.extended.service.NamedQuirkService.doQuirk" ],
|
|
||||||
"triggerPoint" : {
|
|
||||||
"event" : "java.lang.String.NAMED_EVENT",
|
|
||||||
"className" : "click.kamil.examples.statemachine.extended.service.NamedQuirkService",
|
|
||||||
"methodName" : "doQuirk",
|
|
||||||
"sourceFile" : "src/main/java/click/kamil/examples/statemachine/extended/service/NamedQuirkService.java",
|
|
||||||
"sourceModule" : null,
|
|
||||||
"stateMachineId" : null,
|
|
||||||
"sourceState" : null,
|
|
||||||
"lineNumber" : 17,
|
|
||||||
"polymorphicEvents" : [ ],
|
|
||||||
"external" : false,
|
|
||||||
"constraint" : null,
|
|
||||||
"ambiguous" : false
|
|
||||||
},
|
|
||||||
"contextMachineId" : null,
|
|
||||||
"matchedTransitions" : null,
|
|
||||||
"linkResolution" : "NO_MATCH"
|
|
||||||
}, {
|
|
||||||
"entryPoint" : {
|
|
||||||
"type" : "REST",
|
|
||||||
"name" : "POST /api/quirk/primary",
|
|
||||||
"className" : "click.kamil.examples.statemachine.extended.web.QuirkController",
|
|
||||||
"methodName" : "testPrimary",
|
|
||||||
"sourceFile" : "src/main/java/click/kamil/examples/statemachine/extended/web/QuirkController.java",
|
|
||||||
"metadata" : {
|
|
||||||
"path" : "/api/quirk/primary",
|
|
||||||
"verb" : "POST"
|
|
||||||
},
|
|
||||||
"parameters" : [ ]
|
|
||||||
},
|
|
||||||
"methodChain" : [ "click.kamil.examples.statemachine.extended.web.QuirkController.testPrimary", "click.kamil.examples.statemachine.extended.service.PrimaryQuirkService.doQuirk" ],
|
|
||||||
"triggerPoint" : {
|
|
||||||
"event" : "java.lang.String.PRIMARY_EVENT",
|
|
||||||
"className" : "click.kamil.examples.statemachine.extended.service.PrimaryQuirkService",
|
|
||||||
"methodName" : "doQuirk",
|
|
||||||
"sourceFile" : "src/main/java/click/kamil/examples/statemachine/extended/service/PrimaryQuirkService.java",
|
|
||||||
"sourceModule" : null,
|
|
||||||
"stateMachineId" : null,
|
|
||||||
"sourceState" : null,
|
|
||||||
"lineNumber" : 19,
|
|
||||||
"polymorphicEvents" : [ ],
|
|
||||||
"external" : false,
|
|
||||||
"constraint" : null,
|
|
||||||
"ambiguous" : false
|
|
||||||
},
|
|
||||||
"contextMachineId" : null,
|
|
||||||
"matchedTransitions" : null,
|
|
||||||
"linkResolution" : "NO_MATCH"
|
|
||||||
}, {
|
|
||||||
"entryPoint" : {
|
|
||||||
"type" : "REST",
|
|
||||||
"name" : "POST /api/quirk/named",
|
|
||||||
"className" : "click.kamil.examples.statemachine.extended.web.QuirkController",
|
|
||||||
"methodName" : "testNamed",
|
|
||||||
"sourceFile" : "src/main/java/click/kamil/examples/statemachine/extended/web/QuirkController.java",
|
|
||||||
"metadata" : {
|
|
||||||
"path" : "/api/quirk/named",
|
|
||||||
"verb" : "POST"
|
|
||||||
},
|
|
||||||
"parameters" : [ ]
|
|
||||||
},
|
|
||||||
"methodChain" : [ "click.kamil.examples.statemachine.extended.web.QuirkController.testNamed", "click.kamil.examples.statemachine.extended.service.NamedQuirkService.doQuirk" ],
|
|
||||||
"triggerPoint" : {
|
|
||||||
"event" : "java.lang.String.NAMED_EVENT",
|
|
||||||
"className" : "click.kamil.examples.statemachine.extended.service.NamedQuirkService",
|
|
||||||
"methodName" : "doQuirk",
|
|
||||||
"sourceFile" : "src/main/java/click/kamil/examples/statemachine/extended/service/NamedQuirkService.java",
|
|
||||||
"sourceModule" : null,
|
|
||||||
"stateMachineId" : null,
|
|
||||||
"sourceState" : null,
|
|
||||||
"lineNumber" : 17,
|
|
||||||
"polymorphicEvents" : [ ],
|
|
||||||
"external" : false,
|
|
||||||
"constraint" : null,
|
|
||||||
"ambiguous" : false
|
|
||||||
},
|
|
||||||
"contextMachineId" : null,
|
|
||||||
"matchedTransitions" : null,
|
|
||||||
"linkResolution" : "NO_MATCH"
|
|
||||||
}, {
|
|
||||||
"entryPoint" : {
|
|
||||||
"type" : "REST",
|
|
||||||
"name" : "POST /api/quirk/qualifier",
|
|
||||||
"className" : "click.kamil.examples.statemachine.extended.web.QuirkController",
|
|
||||||
"methodName" : "testQualifier",
|
|
||||||
"sourceFile" : "src/main/java/click/kamil/examples/statemachine/extended/web/QuirkController.java",
|
|
||||||
"metadata" : {
|
|
||||||
"path" : "/api/quirk/qualifier",
|
|
||||||
"verb" : "POST"
|
|
||||||
},
|
|
||||||
"parameters" : [ ]
|
|
||||||
},
|
|
||||||
"methodChain" : [ "click.kamil.examples.statemachine.extended.web.QuirkController.testQualifier", "click.kamil.examples.statemachine.extended.service.QualifierQuirkService.doQuirk" ],
|
|
||||||
"triggerPoint" : {
|
|
||||||
"event" : "java.lang.String.QUALIFIER_EVENT",
|
|
||||||
"className" : "click.kamil.examples.statemachine.extended.service.QualifierQuirkService",
|
|
||||||
"methodName" : "doQuirk",
|
|
||||||
"sourceFile" : "src/main/java/click/kamil/examples/statemachine/extended/service/QualifierQuirkService.java",
|
|
||||||
"sourceModule" : null,
|
|
||||||
"stateMachineId" : null,
|
|
||||||
"sourceState" : null,
|
|
||||||
"lineNumber" : 17,
|
|
||||||
"polymorphicEvents" : [ ],
|
|
||||||
"external" : false,
|
|
||||||
"constraint" : null,
|
|
||||||
"ambiguous" : false
|
|
||||||
},
|
|
||||||
"contextMachineId" : null,
|
|
||||||
"matchedTransitions" : null,
|
|
||||||
"linkResolution" : "NO_MATCH"
|
|
||||||
}, {
|
|
||||||
"entryPoint" : {
|
|
||||||
"type" : "REST",
|
|
||||||
"name" : "POST /api/quirk/fallback",
|
|
||||||
"className" : "click.kamil.examples.statemachine.extended.web.QuirkController",
|
|
||||||
"methodName" : "testFallback",
|
|
||||||
"sourceFile" : "src/main/java/click/kamil/examples/statemachine/extended/web/QuirkController.java",
|
|
||||||
"metadata" : {
|
|
||||||
"path" : "/api/quirk/fallback",
|
|
||||||
"verb" : "POST"
|
|
||||||
},
|
|
||||||
"parameters" : [ ]
|
|
||||||
},
|
|
||||||
"methodChain" : [ "click.kamil.examples.statemachine.extended.web.QuirkController.testFallback", "click.kamil.examples.statemachine.extended.service.PrimaryQuirkService.doQuirk" ],
|
|
||||||
"triggerPoint" : {
|
|
||||||
"event" : "java.lang.String.PRIMARY_EVENT",
|
|
||||||
"className" : "click.kamil.examples.statemachine.extended.service.PrimaryQuirkService",
|
|
||||||
"methodName" : "doQuirk",
|
|
||||||
"sourceFile" : "src/main/java/click/kamil/examples/statemachine/extended/service/PrimaryQuirkService.java",
|
|
||||||
"sourceModule" : null,
|
|
||||||
"stateMachineId" : null,
|
|
||||||
"sourceState" : null,
|
|
||||||
"lineNumber" : 19,
|
|
||||||
"polymorphicEvents" : [ ],
|
|
||||||
"external" : false,
|
|
||||||
"constraint" : null,
|
|
||||||
"ambiguous" : false
|
|
||||||
},
|
|
||||||
"contextMachineId" : null,
|
|
||||||
"matchedTransitions" : null,
|
|
||||||
"linkResolution" : "NO_MATCH"
|
|
||||||
}, {
|
|
||||||
"entryPoint" : {
|
|
||||||
"type" : "REST",
|
|
||||||
"name" : "GET /test-concrete",
|
|
||||||
"className" : "click.kamil.examples.statemachine.extended.web.ConcreteReturnTypeController",
|
|
||||||
"methodName" : "testConcrete",
|
|
||||||
"sourceFile" : "src/main/java/click/kamil/examples/statemachine/extended/web/ConcreteReturnTypeController.java",
|
|
||||||
"metadata" : {
|
|
||||||
"path" : "/test-concrete",
|
|
||||||
"verb" : "GET"
|
|
||||||
},
|
|
||||||
"parameters" : [ ]
|
|
||||||
},
|
|
||||||
"methodChain" : [ "click.kamil.examples.statemachine.extended.web.ConcreteReturnTypeController.testConcrete", "click.kamil.examples.statemachine.extended.service.QualifierQuirkService.doQuirk" ],
|
|
||||||
"triggerPoint" : {
|
|
||||||
"event" : "java.lang.String.QUALIFIER_EVENT",
|
|
||||||
"className" : "click.kamil.examples.statemachine.extended.service.QualifierQuirkService",
|
|
||||||
"methodName" : "doQuirk",
|
|
||||||
"sourceFile" : "src/main/java/click/kamil/examples/statemachine/extended/service/QualifierQuirkService.java",
|
|
||||||
"sourceModule" : null,
|
|
||||||
"stateMachineId" : null,
|
|
||||||
"sourceState" : null,
|
|
||||||
"lineNumber" : 17,
|
|
||||||
"polymorphicEvents" : [ ],
|
|
||||||
"external" : false,
|
|
||||||
"constraint" : null,
|
|
||||||
"ambiguous" : false
|
|
||||||
},
|
|
||||||
"contextMachineId" : null,
|
|
||||||
"matchedTransitions" : null,
|
|
||||||
"linkResolution" : "NO_MATCH"
|
|
||||||
}, {
|
|
||||||
"entryPoint" : {
|
|
||||||
"type" : "REST",
|
|
||||||
"name" : "GET /test-field",
|
|
||||||
"className" : "click.kamil.examples.statemachine.extended.web.FieldInjectionController",
|
|
||||||
"methodName" : "testField",
|
|
||||||
"sourceFile" : "src/main/java/click/kamil/examples/statemachine/extended/web/FieldInjectionController.java",
|
|
||||||
"metadata" : {
|
|
||||||
"path" : "/test-field",
|
|
||||||
"verb" : "GET"
|
|
||||||
},
|
|
||||||
"parameters" : [ ]
|
|
||||||
},
|
|
||||||
"methodChain" : [ "click.kamil.examples.statemachine.extended.web.FieldInjectionController.testField", "click.kamil.examples.statemachine.extended.service.NamedQuirkService.doQuirk" ],
|
|
||||||
"triggerPoint" : {
|
|
||||||
"event" : "java.lang.String.NAMED_EVENT",
|
|
||||||
"className" : "click.kamil.examples.statemachine.extended.service.NamedQuirkService",
|
|
||||||
"methodName" : "doQuirk",
|
|
||||||
"sourceFile" : "src/main/java/click/kamil/examples/statemachine/extended/service/NamedQuirkService.java",
|
|
||||||
"sourceModule" : null,
|
|
||||||
"stateMachineId" : null,
|
|
||||||
"sourceState" : null,
|
|
||||||
"lineNumber" : 17,
|
|
||||||
"polymorphicEvents" : [ ],
|
|
||||||
"external" : false,
|
|
||||||
"constraint" : null,
|
|
||||||
"ambiguous" : false
|
|
||||||
},
|
|
||||||
"contextMachineId" : null,
|
|
||||||
"matchedTransitions" : null,
|
|
||||||
"linkResolution" : "NO_MATCH"
|
|
||||||
}, {
|
|
||||||
"entryPoint" : {
|
|
||||||
"type" : "REST",
|
|
||||||
"name" : "GET /api/base/{id}",
|
|
||||||
"className" : "click.kamil.examples.statemachine.extended.web.PaymentController",
|
|
||||||
"methodName" : "processBaseEndpoint",
|
|
||||||
"sourceFile" : "src/main/java/click/kamil/examples/statemachine/extended/web/PaymentController.java",
|
|
||||||
"metadata" : {
|
|
||||||
"path" : "/api/base/{id}",
|
|
||||||
"verb" : "GET"
|
|
||||||
},
|
|
||||||
"parameters" : [ {
|
|
||||||
"name" : "id",
|
|
||||||
"type" : "String",
|
|
||||||
"annotations" : [ "PathVariable" ]
|
|
||||||
} ]
|
|
||||||
},
|
|
||||||
"methodChain" : [ "click.kamil.examples.statemachine.extended.web.PaymentController.processBaseEndpoint", "click.kamil.examples.statemachine.extended.service.PaymentServiceImpl.processPayment" ],
|
|
||||||
"triggerPoint" : {
|
|
||||||
"event" : "java.lang.String.AUTHORIZE",
|
|
||||||
"className" : "click.kamil.examples.statemachine.extended.service.PaymentServiceImpl",
|
|
||||||
"methodName" : "processPayment",
|
|
||||||
"sourceFile" : "src/main/java/click/kamil/examples/statemachine/extended/service/PaymentServiceImpl.java",
|
|
||||||
"sourceModule" : null,
|
|
||||||
"stateMachineId" : null,
|
|
||||||
"sourceState" : null,
|
|
||||||
"lineNumber" : 22,
|
|
||||||
"polymorphicEvents" : [ ],
|
|
||||||
"external" : false,
|
|
||||||
"constraint" : null,
|
|
||||||
"ambiguous" : false
|
|
||||||
},
|
|
||||||
"contextMachineId" : null,
|
|
||||||
"matchedTransitions" : null,
|
|
||||||
"linkResolution" : "NO_MATCH"
|
|
||||||
}, {
|
|
||||||
"entryPoint" : {
|
|
||||||
"type" : "REST",
|
|
||||||
"name" : "POST /api/payment/{id}/capture",
|
|
||||||
"className" : "click.kamil.examples.statemachine.extended.web.PaymentController",
|
|
||||||
"methodName" : "capturePaymentEndpoint",
|
|
||||||
"sourceFile" : "src/main/java/click/kamil/examples/statemachine/extended/web/PaymentController.java",
|
|
||||||
"metadata" : {
|
|
||||||
"path" : "/api/payment/{id}/capture",
|
|
||||||
"verb" : "POST"
|
|
||||||
},
|
|
||||||
"parameters" : [ {
|
|
||||||
"name" : "id",
|
|
||||||
"type" : "String",
|
|
||||||
"annotations" : [ "PathVariable" ]
|
|
||||||
} ]
|
|
||||||
},
|
|
||||||
"methodChain" : [ "click.kamil.examples.statemachine.extended.web.PaymentController.capturePaymentEndpoint", "click.kamil.examples.statemachine.extended.service.PaymentServiceImpl.capturePayment" ],
|
|
||||||
"triggerPoint" : {
|
|
||||||
"event" : "java.lang.String.CAPTURE",
|
|
||||||
"className" : "click.kamil.examples.statemachine.extended.service.PaymentServiceImpl",
|
|
||||||
"methodName" : "capturePayment",
|
|
||||||
"sourceFile" : "src/main/java/click/kamil/examples/statemachine/extended/service/PaymentServiceImpl.java",
|
|
||||||
"sourceModule" : null,
|
|
||||||
"stateMachineId" : null,
|
|
||||||
"sourceState" : null,
|
|
||||||
"lineNumber" : 35,
|
|
||||||
"polymorphicEvents" : [ ],
|
|
||||||
"external" : false,
|
|
||||||
"constraint" : null,
|
|
||||||
"ambiguous" : false
|
|
||||||
},
|
|
||||||
"contextMachineId" : "paymentId",
|
|
||||||
"matchedTransitions" : null,
|
|
||||||
"linkResolution" : "NO_MATCH"
|
|
||||||
}, {
|
|
||||||
"entryPoint" : {
|
|
||||||
"type" : "REST",
|
|
||||||
"name" : "POST /api/payment/{id}/capture",
|
|
||||||
"className" : "click.kamil.examples.statemachine.extended.web.PaymentController",
|
|
||||||
"methodName" : "capturePaymentEndpoint",
|
|
||||||
"sourceFile" : "src/main/java/click/kamil/examples/statemachine/extended/web/PaymentController.java",
|
|
||||||
"metadata" : {
|
|
||||||
"path" : "/api/payment/{id}/capture",
|
|
||||||
"verb" : "POST"
|
|
||||||
},
|
|
||||||
"parameters" : [ {
|
|
||||||
"name" : "id",
|
|
||||||
"type" : "String",
|
|
||||||
"annotations" : [ "PathVariable" ]
|
|
||||||
} ]
|
|
||||||
},
|
|
||||||
"methodChain" : [ "click.kamil.examples.statemachine.extended.web.PaymentController.capturePaymentEndpoint", "click.kamil.examples.statemachine.extended.service.PaymentServiceImpl.capturePayment" ],
|
|
||||||
"triggerPoint" : {
|
|
||||||
"event" : "[LIFECYCLE:RESTORE]",
|
|
||||||
"className" : "click.kamil.examples.statemachine.extended.service.PaymentServiceImpl",
|
|
||||||
"methodName" : "capturePayment",
|
|
||||||
"sourceFile" : null,
|
|
||||||
"sourceModule" : null,
|
|
||||||
"stateMachineId" : null,
|
|
||||||
"sourceState" : null,
|
|
||||||
"lineNumber" : 28,
|
|
||||||
"polymorphicEvents" : null,
|
|
||||||
"external" : false,
|
|
||||||
"constraint" : null,
|
|
||||||
"ambiguous" : false
|
|
||||||
},
|
|
||||||
"contextMachineId" : "paymentId",
|
|
||||||
"matchedTransitions" : null,
|
|
||||||
"linkResolution" : null
|
|
||||||
} ],
|
} ],
|
||||||
"properties" : {
|
"properties" : {
|
||||||
"default" : {
|
"default" : {
|
||||||
|
|||||||
Reference in New Issue
Block a user