Created
August 2, 2018 20:50
-
-
Save MarkyC/dca54f61628f1597266a16522acee983 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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