/* * Copyright 2016 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.springframework.statemachine.data.jpa; import static org.hamcrest.CoreMatchers.is; import static org.junit.Assert.assertThat; import java.util.Arrays; import java.util.HashSet; import java.util.List; import java.util.Set; import org.junit.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.context.annotation.AnnotationConfigApplicationContext; import org.springframework.context.annotation.Configuration; import org.springframework.statemachine.data.AbstractRepositoryTests; import org.springframework.statemachine.data.RepositoryState; import org.springframework.statemachine.data.RepositoryTransition; import org.springframework.statemachine.data.StateRepository; import org.springframework.statemachine.data.TransitionRepository; import org.springframework.statemachine.transition.TransitionKind; /** * JPA repository config tests. * * @author Janne Valkealahti */ public class JpaRepositoryTests extends AbstractRepositoryTests { @Test public void testRepository1() { context.register(TestConfig.class); context.refresh(); JpaStateRepository statesRepository = context.getBean(JpaStateRepository.class); JpaRepositoryState stateS1 = new JpaRepositoryState("S1"); JpaRepositoryState stateS2 = new JpaRepositoryState("S2"); assertThat(statesRepository.count(), is(0l)); statesRepository.save(stateS1); statesRepository.save(stateS2); assertThat(statesRepository.count(), is(2l)); JpaTransitionRepository transitionsRepository = context.getBean(JpaTransitionRepository.class); JpaRepositoryTransition transition = new JpaRepositoryTransition(stateS1, stateS2, "E1"); transition.setKind(TransitionKind.EXTERNAL); transitionsRepository.save(transition); assertThat(statesRepository.count(), is(2l)); JpaRepositoryTransition transition2 = transitionsRepository.findAll().iterator().next(); assertThat(transition2.getSource().getState(), is("S1")); assertThat(transition2.getTarget().getState(), is("S2")); assertThat(transition2.getEvent(), is("E1")); assertThat(transition2.getKind(), is(TransitionKind.EXTERNAL)); context.close(); } @Test public void testRepository2() { context.register(TestConfig.class); context.refresh(); @SuppressWarnings("unchecked") StateRepository<JpaRepositoryState> statesRepository1 = context.getBean(StateRepository.class); JpaRepositoryState state1 = new JpaRepositoryState("S1"); statesRepository1.save(state1); JpaRepositoryState state2 = new JpaRepositoryState("S2"); statesRepository1.save(state2); @SuppressWarnings("unchecked") StateRepository<? extends RepositoryState> statesRepository2 = context.getBean(StateRepository.class); Iterable<? extends RepositoryState> findAll = statesRepository2.findAll(); assertThat(findAll.iterator().next().getState(), is("S1")); @SuppressWarnings("unchecked") TransitionRepository<RepositoryTransition> transitionsRepository = context.getBean(TransitionRepository.class); RepositoryTransition transition = new JpaRepositoryTransition(state1, state2, "E1"); transitionsRepository.save(transition); RepositoryTransition transition2 = transitionsRepository.findAll().iterator().next(); assertThat(transition2.getSource().getState(), is("S1")); assertThat(transition2.getTarget().getState(), is("S2")); assertThat(transition2.getEvent(), is("E1")); context.close(); } @Test public void testRepository3() { context.register(TestConfig.class); context.refresh(); JpaStateRepository statesRepository = context.getBean(JpaStateRepository.class); JpaRepositoryState state1 = new JpaRepositoryState("machine1", "S1", true); statesRepository.save(state1); JpaRepositoryState state2 = new JpaRepositoryState("machine2", "S2", false); statesRepository.save(state2); JpaRepositoryState state3 = new JpaRepositoryState("machine1", "S3", true); statesRepository.save(state3); JpaRepositoryState state4 = new JpaRepositoryState("machine2", "S4", false); statesRepository.save(state4); List<JpaRepositoryState> findByMachineId1 = statesRepository.findByMachineId("machine1"); List<JpaRepositoryState> findByMachineId2 = statesRepository.findByMachineId("machine2"); assertThat(findByMachineId1.size(), is(2)); assertThat(findByMachineId2.size(), is(2)); assertThat(findByMachineId1.get(0).getMachineId(), is("machine1")); assertThat(findByMachineId2.get(0).getMachineId(), is("machine2")); JpaTransitionRepository transitionsRepository = context.getBean(JpaTransitionRepository.class); JpaRepositoryTransition transition1 = new JpaRepositoryTransition("machine1", state1, state2, "E1"); JpaRepositoryTransition transition2 = new JpaRepositoryTransition("machine2", state3, state4, "E2"); transitionsRepository.save(transition1); transitionsRepository.save(transition2); List<JpaRepositoryTransition> findByMachineId3 = transitionsRepository.findByMachineId("machine1"); List<JpaRepositoryTransition> findByMachineId4 = transitionsRepository.findByMachineId("machine2"); assertThat(findByMachineId3.size(), is(1)); assertThat(findByMachineId4.size(), is(1)); assertThat(findByMachineId3.get(0).getMachineId(), is("machine1")); assertThat(findByMachineId4.get(0).getMachineId(), is("machine2")); context.close(); } @Test public void testRepository4() { context.register(TestConfig.class); context.refresh(); JpaActionRepository actionsRepository = context.getBean(JpaActionRepository.class); JpaRepositoryAction action1 = new JpaRepositoryAction(); action1.setSpel("spel1"); action1.setName("action1"); actionsRepository.save(action1); assertThat(actionsRepository.count(), is(1l)); JpaRepositoryAction action11 = actionsRepository.findAll().iterator().next(); assertThat(action1.getSpel(), is(action11.getSpel())); assertThat(action1.getName(), is(action11.getName())); } @Test public void testRepository5() { context.register(TestConfig.class); context.refresh(); JpaStateRepository statesRepository = context.getBean(JpaStateRepository.class); JpaRepositoryState stateS1 = new JpaRepositoryState("S1"); JpaRepositoryState stateS2 = new JpaRepositoryState("S2"); statesRepository.save(stateS1); statesRepository.save(stateS2); JpaActionRepository actionsRepository = context.getBean(JpaActionRepository.class); JpaTransitionRepository transitionsRepository = context.getBean(JpaTransitionRepository.class); JpaRepositoryTransition transition = new JpaRepositoryTransition(stateS1, stateS2, "E1"); JpaActionRepository actionRepository = context.getBean(JpaActionRepository.class); JpaRepositoryAction action1 = new JpaRepositoryAction(); action1.setName("action1"); actionRepository.save(action1); Set<JpaRepositoryAction> actions = new HashSet<>(Arrays.asList(action1)); transition.setActions(actions); transitionsRepository.save(transition); JpaRepositoryTransition transition2 = transitionsRepository.findAll().iterator().next(); assertThat(transition2.getSource().getState(), is("S1")); assertThat(transition2.getTarget().getState(), is("S2")); assertThat(transition2.getEvent(), is("E1")); assertThat(actionsRepository.count(), is(1l)); JpaRepositoryAction action11 = actionsRepository.findAll().iterator().next(); assertThat(action1.getName(), is(action11.getName())); assertThat(transition2.getActions().size(), is(1)); } @Test public void testRepository6() { context.register(TestConfig.class); context.refresh(); JpaActionRepository actionsRepository = context.getBean(JpaActionRepository.class); JpaStateRepository statesRepository = context.getBean(JpaStateRepository.class); JpaTransitionRepository transitionsRepository = context.getBean(JpaTransitionRepository.class); JpaRepositoryAction action1 = new JpaRepositoryAction(); action1.setName("action1"); actionsRepository.save(action1); assertThat(actionsRepository.count(), is(1l)); JpaRepositoryAction action2 = new JpaRepositoryAction(); action2.setName("action2"); actionsRepository.save(action2); assertThat(actionsRepository.count(), is(2l)); JpaRepositoryState stateS1 = new JpaRepositoryState("S1"); stateS1.setEntryActions(new HashSet<>(Arrays.asList(action1, action2))); stateS1.setExitActions(new HashSet<>(Arrays.asList(action1, action2))); JpaRepositoryState stateS2 = new JpaRepositoryState("S2"); stateS2.setParentState(stateS1); stateS2.setStateActions(new HashSet<>(Arrays.asList(action1, action2))); JpaRepositoryState stateS3 = new JpaRepositoryState("S3"); stateS3.setParentState(stateS1); stateS3.setExitActions(new HashSet<>(Arrays.asList(action1, action2))); statesRepository.save(stateS1); statesRepository.save(stateS2); statesRepository.save(stateS3); JpaRepositoryTransition transition1 = new JpaRepositoryTransition(stateS1, stateS2, "E1"); transition1.setActions(new HashSet<>(Arrays.asList(action1, action2))); transitionsRepository.save(transition1); assertThat(transitionsRepository.count(), is(1l)); JpaRepositoryTransition transition2 = new JpaRepositoryTransition(stateS2, stateS3, "E2"); transition2.setActions(new HashSet<>(Arrays.asList(action1, action2))); transitionsRepository.save(transition2); assertThat(transitionsRepository.count(), is(2l)); } @Override protected AnnotationConfigApplicationContext buildContext() { return new AnnotationConfigApplicationContext(); } @Override protected Class<?>[] getRegisteredClasses() { return new Class<?>[] { TestConfig.class }; } @Test public void testAutowire() { context.register(TestConfig.class, WireConfig.class); context.refresh(); } @EnableAutoConfiguration static class TestConfig { } @Configuration static class WireConfig { @Autowired StateRepository<JpaRepositoryState> statesRepository1; @Autowired TransitionRepository<JpaRepositoryTransition> statesRepository11; @SuppressWarnings("rawtypes") @Autowired StateRepository statesRepository2; @Autowired JpaStateRepository statesRepository3; @Autowired StateRepository<? extends RepositoryState> statesRepository4; } }