@StateMachine
protected static interface CustomerLifecycleMeta {
@StateSet
static interface States {
@Initial
@Function(transition = CustomerLifecycleMeta.Transitions.Activate.class, value = { Active.class })
static interface Draft {}
@Functions({ @Function(transition = CustomerLifecycleMeta.Transitions.Suspend.class, value = Suspended.class),
@Function(transition = CustomerLifecycleMeta.Transitions.Cancel.class, value = Canceled.class) })
static interface Active {}
@Function(transition = CustomerLifecycleMeta.Transitions.Resume.class, value = Active.class)
static interface Suspended {}
@End
static interface Canceled {}
}
@TransitionSet
static interface Transitions {
static interface Activate {}
static interface Suspend {}
static interface Resume {}
static interface Cancel {}
}
}
@StateMachine
protected static interface InternetServiceLifecycleMeta {
@StateSet
static interface States {
@Initial
@Function(transition = InternetServiceLifecycleMeta.Transitions.Start.class, value = { InternetServiceLifecycleMeta.States.InService.class })
@ValidWhile(on = { CustomerLifecycleMeta.States.Active.class }, relation = InternetServiceLifecycleMeta.Relations.CustomerRelation.class)
static interface New {}
@Function(transition = InternetServiceLifecycleMeta.Transitions.End.class, value = { InternetServiceLifecycleMeta.States.Ended.class })
// @InboundWhile(on = { CustomerLifecycleMeta.States.Active.class },
// relation =
// InternetServiceLifecycleMeta.Relations.CustomerRelation.class)
static interface InService {}
@End
static interface Ended {}
}
@TransitionSet
static interface Transitions {
static interface Start {}
static interface End {}
}
@RelationSet
static interface Relations {
@RelateTo(value = CustomerLifecycleMeta.class)
static interface CustomerRelation {}
}
}
@StateMachine
protected static interface ServiceProviderLifecycle {
@StateSet
static interface States {
@Initial
@Function(transition = Transitions.Shutdown.class, value = Closed.class)
static interface ServiceAvailable {}
@End
static interface Closed {}
}
@TransitionSet
static interface Transitions {
static interface Shutdown {}
}
}
@StateMachine
protected static interface InternetTVServiceLifecycle extends InternetServiceLifecycleMeta {
@StateSet
static interface States extends InternetServiceLifecycleMeta.States {
@ValidWhile(relation = TVProvider.class, on = ServiceAvailable.class)
static interface New extends InternetServiceLifecycleMeta.States.New {}
}
@RelationSet
static interface Relations extends InternetServiceLifecycleMeta.Relations {
@RelateTo(InternetTVProviderLifecycle.class)
static interface TVProvider {}
}
}
@StateMachine
protected static interface InternetTVProviderLifecycle extends ServiceProviderLifecycle {}
@LifecycleMeta(CustomerLifecycleMeta.class)
public static class Customer extends ReactiveObject {
protected Customer() {
initialState(Draft.class.getSimpleName());
}
@Transition
public void activate() {}
@Transition
public void suspend() {}
@Transition
public void resume() {}
@Transition
public void cancel() {}
}
@LifecycleMeta(InternetServiceLifecycleMeta.class)
public class InternetServiceOrder extends ReactiveObject {
private Date startDate;
private Date endDate;
@Relation(InternetServiceLifecycleMeta.Relations.CustomerRelation.class)
private Customer customer;
private String type;
public InternetServiceOrder() {
initialState(InternetServiceLifecycleMeta.States.New.class.getSimpleName());
}
public InternetServiceOrder(Date startDate, Date endDate, Customer customer, String type) {
super();
this.startDate = startDate;
this.endDate = endDate;
this.customer = customer;
this.type = type;
initialState(InternetServiceLifecycleMeta.States.New.class.getSimpleName());
}
@Transition
public void start() {}
@Transition
public void end() {}
public void setStartDate(Date startDate) {
this.startDate = startDate;
}
public void setEndDate(Date endDate) {
this.endDate = endDate;
}
public void setCustomer(Customer customer) {
this.customer = customer;
}
public void setType(String type) {
this.type = type;
}
public Date getStartDate() {
return startDate;
}
public Date getEndDate() {
return endDate;
}
public Customer getCustomer() {
return customer;
}
public String getType() {
return type;
}
}
@LifecycleMeta(InternetServiceLifecycleMeta.class)
public static class BaseService<T extends BaseServiceProvider> extends ReactiveObject {
private Customer customer;
public BaseService(Customer customer) {
initialState(InternetServiceLifecycleMeta.States.New.class.getSimpleName());
this.customer = customer;
}
private T provider;
public T getProvider() {
return provider;
}
public void setProvider(T provider) {
this.provider = provider;
}
@Relation(InternetServiceLifecycleMeta.Relations.CustomerRelation.class)
public Customer getCustomer() {
return customer;
}
public void setCustomer(Customer customer) {
this.customer = customer;
}
@Transition
void start() {}
@Transition
void end() {}
}
@LifecycleMeta(ServiceProviderLifecycle.class)
public static class BaseServiceProvider extends ReactiveObject {
public BaseServiceProvider() {
initialState(ServiceProviderLifecycle.States.ServiceAvailable.class.getSimpleName());
}
@Transition
void shutdown() {}
}
@LifecycleMeta(InternetTVServiceLifecycle.class)
public static class InternetTVService extends BaseService<InternetTVServiceProvider> {
public InternetTVService(Customer customer) {
super(customer);
}
@Relation(InternetTVServiceLifecycle.Relations.TVProvider.class)
public InternetTVServiceProvider getProvider() {
return super.getProvider();
}
}
@LifecycleMeta(InternetTVProviderLifecycle.class)
public static class InternetTVServiceProvider extends BaseServiceProvider {}
@Test
public void test_inherited_valid_while_relation_validation() {
final InternetTVServiceProvider provider = new InternetTVServiceProvider();
assertEquals(InternetTVProviderLifecycle.States.ServiceAvailable.class.getSimpleName(), provider.getState());
Customer customer = new Customer();
customer.activate();
assertEquals(CustomerLifecycleMeta.States.Active.class.getSimpleName(), customer.getState());
final InternetTVService service = new InternetTVService(customer);
service.setProvider(provider);
service.start();
assertEquals(InternetServiceLifecycleMeta.States.InService.class.getSimpleName(), service.getState());
}
@Test(expected = LifecycleException.class)
public void test_inherited_valid_while_relation_validation_negative_with_self_valid_while() throws LifecycleException {
final InternetTVServiceProvider provider = new InternetTVServiceProvider();
assertEquals(InternetTVProviderLifecycle.States.ServiceAvailable.class.getSimpleName(), provider.getState());
provider.shutdown();
assertEquals(InternetTVProviderLifecycle.States.Closed.class.getSimpleName(), provider.getState());
final Customer customer = new Customer();
customer.activate();
assertEquals(CustomerLifecycleMeta.States.Active.class.getSimpleName(), customer.getState());
final InternetTVService service = new InternetTVService(customer);
service.setProvider(provider);
try {
service.start();
} catch (LifecycleException e) {
assertInvalidStateErrorByValidWhile(e, provider, service, VOIPProviderLifecycleMeta.States.ServiceAvailable.class);
}
}