io.github.factoryfx.server.Microservice Maven / Gradle / Ivy
package io.github.factoryfx.server;
import java.util.Collection;
import io.github.factoryfx.factory.merge.DataMerger;
import io.github.factoryfx.factory.merge.MergeDiffInfo;
import io.github.factoryfx.factory.storage.*;
import io.github.factoryfx.factory.FactoryBase;
import io.github.factoryfx.factory.FactoryManager;
import io.github.factoryfx.factory.RootFactoryWrapper;
import io.github.factoryfx.factory.log.FactoryUpdateLog;
/**
* starting point for factoryfx application
*
* @param Root
* @param Summary Data for factory history
*/
public class Microservice,S> {
private final FactoryManager factoryManager;
private final DataStorage dataStorage;
private final ChangeSummaryCreator changeSummaryCreator;
public Microservice(FactoryManager factoryManager, DataStorage dataStorage, ChangeSummaryCreator changeSummaryCreator) {
this.factoryManager = factoryManager;
this.dataStorage = dataStorage;
this.changeSummaryCreator = changeSummaryCreator;
}
public MergeDiffInfo getDiffToPreviousVersion(StoredDataMetadata storedDataMetadata) {
R historyCurrent = getHistoryFactory(storedDataMetadata.mergerVersionId);
R historyCommon = getHistoryFactory(storedDataMetadata.baseVersionId);
R historyUpdate = getHistoryFactory(storedDataMetadata.id);
return new DataMerger<>(historyCurrent,historyCommon,historyUpdate).createMergeResult((permission)->true).executeMerge();
}
public FactoryUpdateLog revertTo(StoredDataMetadata storedDataMetadata, String user) {
R historyFactory = getHistoryFactory(storedDataMetadata.id);
DataAndId currentFactory = dataStorage.getCurrentData();
return updateCurrentFactory(new DataUpdate<>(
historyFactory,
user,
"revert to: "+storedDataMetadata.id,
currentFactory.id)
);
}
public FactoryUpdateLog updateCurrentFactory(DataUpdate update) {
R commonVersion = dataStorage.getHistoryData(update.baseVersionId);
FactoryUpdateLog factoryLog = factoryManager.update(commonVersion,update.root, update.permissionChecker);
if (!factoryLog.failedUpdate() && factoryLog.successfullyMerged()){
S changeSummary=null;
if (factoryLog.mergeDiffInfo!=null && changeSummaryCreator!=null){
changeSummary=changeSummaryCreator.createChangeSummary(factoryLog.mergeDiffInfo);
}
R copy = factoryManager.getCurrentFactory().utility().copy();
DataUpdate updateAfterMerge = new DataUpdate<>(
copy,
update.user,
update.comment,
update.baseVersionId
);
dataStorage.updateCurrentData(updateAfterMerge,changeSummary);
}
return factoryLog;
}
public MergeDiffInfo simulateUpdateCurrentFactory(DataUpdate possibleUpdate){
R commonVersion = dataStorage.getHistoryData(possibleUpdate.baseVersionId);
return factoryManager.simulateUpdate(commonVersion , possibleUpdate.root, possibleUpdate.permissionChecker);
}
/**
* prepare a new factory which could be used to update data. mainly give it the correct baseVersionId
* @return new possible factory update with prepared ids/metadata
* */
public DataUpdate prepareNewFactory() {
if (!factoryManager.isStarted()){
throw new IllegalStateException("Microservice is not started");
}
return prepareNewFactory("","");
}
/**
* prepare a new factory which could be used to update data. mainly give it the correct baseVersionId
* @param user use
* @param comment comment
* @return new possible factory update with prepared ids/metadata
*/
public DataUpdate prepareNewFactory(String user, String comment) {
DataAndId currentFactory = dataStorage.getCurrentData();//TODO optimise we need just the id
return new DataUpdate<>(
factoryManager.getCurrentFactory().utility().copy(),
user,
comment,
currentFactory.id);
}
public R getHistoryFactory(String id) {
return dataStorage.getHistoryData(id);
}
public Collection> getHistoryFactoryList() {
return dataStorage.getHistoryDataList();
}
public L start() {
final DataAndId currentFactory = dataStorage.getCurrentData();
currentFactory.root.internal().setMicroservice(this);//also mind ExceptionResponseAction#reset
return factoryManager.start(new RootFactoryWrapper<>(currentFactory.root));
}
public void stop() {
factoryManager.stop();
}
public L getRootLiveObject(){
return factoryManager.getCurrentFactory().internal().getLiveObject();
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy