/* * 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 demo.ordershipping; import java.util.HashMap; import java.util.List; import java.util.Map; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.messaging.MessageHeaders; import org.springframework.messaging.support.MessageBuilder; import org.springframework.statemachine.StateMachine; import org.springframework.statemachine.config.StateMachineFactory; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.util.ObjectUtils; import org.springframework.util.StringUtils; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; @Controller public class StateMachineController { private final static String[] CUSTOMERS = new String[] { "customer1", "customer2", "customer3" }; private final static String[] ORDERS = new String[] { "order1", "order2", "order3" }; private final static String[] EVENTS = new String[] { "PLACE_ORDER", "RECEIVE_PAYMENT" }; private final static String[] GUIDES = new String[] { "makeProdPlan", "produce", "payment" }; @Autowired private StateMachineFactory<String, String> stateMachineFactory; @Autowired private StateMachineLogListener listener; private final Map<String, StateMachine<String, String>> machines = new HashMap<>(); @RequestMapping("/") public String home() { return "redirect:/state"; } @RequestMapping("/state") public String feedAndGetStates( @RequestParam(value = "action", required = false) String action, @RequestParam(value = "customer", required = false) String customer, @RequestParam(value = "order", required = false) String order, @RequestParam(value = "event", required = false) String event, @RequestParam(value = "guide", required = false) List<String> guides, Model model) throws Exception { StateMachine<String, String> stateMachine = null; if (StringUtils.hasText(customer) && StringUtils.hasText(order)) { stateMachine = getMachine(customer + ":" + order); } if (stateMachine != null && StringUtils.hasText(event) && ObjectUtils.nullSafeEquals(action, "event")) { Map<String , Object> headers = new HashMap<>(); if (ObjectUtils.nullSafeEquals(event, EVENTS[0])) { headers.put("customer", customer); headers.put("order", order); } if (guides != null) { if (guides.contains("makeProdPlan")) { headers.put("makeProdPlan", true); } if (guides.contains("produce")) { headers.put("produce", true); } if (guides.contains("payment")) { headers.put("payment", true); } } stateMachine.sendEvent(MessageBuilder.createMessage(event, new MessageHeaders(headers))); } model.addAttribute("allIds", machines.keySet()); model.addAttribute("allCustomers", CUSTOMERS); model.addAttribute("allOrders", ORDERS); model.addAttribute("allTypes", EVENTS); model.addAttribute("allGuides", GUIDES); model.addAttribute("machines", machines.values()); model.addAttribute("messages", createMessages(listener.getMessages())); return "states"; } private synchronized StateMachine<String, String> getMachine(String id) { StateMachine<String,String> machine = machines.get(id); if (machine == null) { machine = stateMachineFactory.getStateMachine(id); machines.put(id, machine); } return machine; } private String createMessages(List<String> messages) { StringBuilder buf = new StringBuilder(); for (String message : messages) { buf.append(message); buf.append("\n"); } return buf.toString(); } }