Skip to content

Instantly share code, notes, and snippets.

@MarkyC
Created August 2, 2018 20:50
Show Gist options
  • Save MarkyC/dca54f61628f1597266a16522acee983 to your computer and use it in GitHub Desktop.
Save MarkyC/dca54f61628f1597266a16522acee983 to your computer and use it in GitHub Desktop.
package com.bell.arc.rerateorchestrator.service;
import com.bell.arc.rerateorchestrator.model.dto.request.RerateUsageRequestWrapper;
import com.bell.arc.rerateorchestrator.model.dto.request.StateHistory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class StateMachine {
static RerateUsageRequestWrapper wrapper = new RerateUsageRequestWrapper();
static {
wrapper.setStateHistory(new StateHistory());
}
public State getStateHandler(String state) {
return null; // use the getBean approach or something
}
public void execute(State s) {
String result = s.doWork(wrapper);
String nextState = s.nextState(result);
if (wrapper.getStateHistory().getStateList().size() > 100 /* TODO: This could be smarter and take account of last update timestamp */) {
throw new RuntimeException("infinite loop");
}
if (s.saveToAudit()) {
// save to audit DB
}
if (s.saveToLocal()) {
// save to local DB
}
if (s.saveToRedis()) {
// save to Redis
}
execute(getStateHandler(nextState));
}
abstract static class State {
private static final Logger LOG = LoggerFactory.getLogger(State.class);
public abstract boolean isReady(RerateUsageRequestWrapper w);
public abstract String doWork(RerateUsageRequestWrapper w);
public abstract String nextState(String result);
public abstract String getName();
public abstract boolean saveToAudit();
public abstract boolean saveToRedis();
public abstract boolean saveToLocal();
public static State create(String name, String result, String nextState, boolean a, boolean r, boolean l) {
return new State() {
@Override
public String doWork(RerateUsageRequestWrapper w) {
LOG.info("doing work");
return result;
}
@Override
public String nextState(String result) {
return nextState;
}
@Override
public String getName() {
return name;
}
@Override
public boolean saveToAudit() {
return a;
}
@Override
public boolean saveToRedis() {
return r;
}
@Override
public boolean saveToLocal() {
return l;
}
}
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment