Preliminary support for Spring Data persist
- Add new repository model for storing StateMachineContext via a new StateMachineRepository. - New StateMachineRuntimePersister interface to abstract needed functionality to do a runtime machine persistence. - As runtime persistence, as of now, is done via interceptors, define JpaRepositoryStateMachinePersist and JpaPersistingStateMachineInterceptor to define StateMachineRuntimePersister logic. - Add new datajpapersist sample demonstrating new concepts. - Keep tests related to jpa as there's not redis/mongo integration implemented in this first iteration. - As this is going to be WIP until features around this issues are completed, docs, etc are not yet added. Also, interfaces and impls are subject to change during a process. - Relates to #423 - Relates to #426 - Relates to #427
This commit is contained in:
@@ -0,0 +1,46 @@
|
||||
/*
|
||||
* Copyright 2017 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;
|
||||
|
||||
/**
|
||||
* Generic base class representing state machine entity.
|
||||
*
|
||||
* @author Janne Valkealahti
|
||||
*
|
||||
*/
|
||||
public abstract class RepositoryStateMachine extends BaseRepositoryEntity {
|
||||
|
||||
/**
|
||||
* Gets the machine id.
|
||||
*
|
||||
* @return the machine id
|
||||
*/
|
||||
public abstract String getMachineId();
|
||||
|
||||
/**
|
||||
* Gets the state.
|
||||
*
|
||||
* @return the state
|
||||
*/
|
||||
public abstract String getState();
|
||||
|
||||
/**
|
||||
* Gets the state machine context.
|
||||
*
|
||||
* @return the state machine context
|
||||
*/
|
||||
public abstract byte[] getStateMachineContext();
|
||||
}
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2016 the original author or authors.
|
||||
* Copyright 2016-2017 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.
|
||||
@@ -30,7 +30,6 @@ import org.springframework.statemachine.action.Action;
|
||||
import org.springframework.statemachine.action.SpelExpressionAction;
|
||||
import org.springframework.statemachine.config.model.AbstractStateMachineModelFactory;
|
||||
import org.springframework.statemachine.config.model.ChoiceData;
|
||||
import org.springframework.statemachine.config.model.ConfigurationData;
|
||||
import org.springframework.statemachine.config.model.DefaultStateMachineModel;
|
||||
import org.springframework.statemachine.config.model.EntryData;
|
||||
import org.springframework.statemachine.config.model.ExitData;
|
||||
@@ -80,8 +79,6 @@ public class RepositoryStateMachineModelFactory extends AbstractStateMachineMode
|
||||
|
||||
@Override
|
||||
public StateMachineModel<String, String> build(String machineId) {
|
||||
ConfigurationData<String, String> configurationData = new ConfigurationData<>();
|
||||
|
||||
Collection<StateData<String, String>> stateDatas = new ArrayList<>();
|
||||
for (RepositoryState s : stateRepository.findByMachineId(machineId == null ? "" : machineId)) {
|
||||
|
||||
@@ -284,8 +281,7 @@ public class RepositoryStateMachineModelFactory extends AbstractStateMachineMode
|
||||
TransitionsData<String, String> transitionsData = new TransitionsData<>(transitionData, choicesCopy, junctionsCopy, forks, joins,
|
||||
entrys, exits, historys);
|
||||
|
||||
StateMachineModel<String, String> stateMachineModel = new DefaultStateMachineModel<>(configurationData, statesData, transitionsData);
|
||||
return stateMachineModel;
|
||||
return new DefaultStateMachineModel<>(null, statesData, transitionsData);
|
||||
}
|
||||
|
||||
private Guard<String, String> resolveGuard(RepositoryTransition t) {
|
||||
|
||||
@@ -0,0 +1,71 @@
|
||||
/*
|
||||
* Copyright 2017 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;
|
||||
|
||||
import org.apache.commons.logging.Log;
|
||||
import org.apache.commons.logging.LogFactory;
|
||||
import org.springframework.statemachine.StateMachineContext;
|
||||
import org.springframework.statemachine.StateMachinePersist;
|
||||
import org.springframework.statemachine.kryo.KryoSerialisationService;
|
||||
|
||||
/**
|
||||
* Base implementation of a {@link StateMachinePersist} using Spring Data Repositories.
|
||||
*
|
||||
* @author Janne Valkealahti
|
||||
*
|
||||
* @param <S> the type of state
|
||||
* @param <E> the type of event
|
||||
* @param <M> the type of entity
|
||||
*/
|
||||
public abstract class RepositoryStateMachinePersist<M extends RepositoryStateMachine, S, E> implements StateMachinePersist<S, E, Object> {
|
||||
|
||||
private final Log log = LogFactory.getLog(RepositoryStateMachinePersist.class);
|
||||
private final KryoSerialisationService serialisationService = new KryoSerialisationService();
|
||||
|
||||
@Override
|
||||
public void write(StateMachineContext<S, E> context, Object contextObj) throws Exception {
|
||||
if (log.isDebugEnabled()) {
|
||||
log.debug("Persisting context " + context + " using contextObj " + contextObj);
|
||||
}
|
||||
M build = build(context, serialisationService.serializeStateMachineContext(context));
|
||||
getRepository().save(build);
|
||||
}
|
||||
|
||||
@Override
|
||||
public StateMachineContext<S, E> read(Object contextObj) throws Exception {
|
||||
M repositoryStateMachine = getRepository().findOne(contextObj.toString());
|
||||
if (repositoryStateMachine != null) {
|
||||
return serialisationService.deserializeStateMachineContext(repositoryStateMachine.getStateMachineContext());
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the repository.
|
||||
*
|
||||
* @return the repository
|
||||
*/
|
||||
protected abstract StateMachineRepository<M> getRepository();
|
||||
|
||||
/**
|
||||
* Builds the generic {@link RepositoryStateMachine} entity.
|
||||
*
|
||||
* @param context the context
|
||||
* @param serialisedContext the serialised context
|
||||
* @return the repository state machine entity
|
||||
*/
|
||||
protected abstract M build(StateMachineContext<S, E> context, byte[] serialisedContext);
|
||||
}
|
||||
@@ -0,0 +1,30 @@
|
||||
/*
|
||||
* Copyright 2017 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;
|
||||
|
||||
import org.springframework.data.repository.CrudRepository;
|
||||
import org.springframework.data.repository.NoRepositoryBean;
|
||||
import org.springframework.data.repository.Repository;
|
||||
|
||||
/**
|
||||
* Generic {@link Repository} interface for states machines.
|
||||
*
|
||||
* @author Janne Valkealahti
|
||||
*
|
||||
*/
|
||||
@NoRepositoryBean
|
||||
public interface StateMachineRepository<M extends RepositoryStateMachine> extends CrudRepository<M, String> {
|
||||
}
|
||||
Reference in New Issue
Block a user