X-Git-Url: https://gerrit.simantics.org/r/gitweb?p=simantics%2Fplatform.git;a=blobdiff_plain;f=bundles%2Forg.simantics.browsing.ui.common%2Fsrc%2Forg%2Fsimantics%2Fbrowsing%2Fui%2Fcommon%2Fstate%2FIdentifiedStatePersistor.java;fp=bundles%2Forg.simantics.browsing.ui.common%2Fsrc%2Forg%2Fsimantics%2Fbrowsing%2Fui%2Fcommon%2Fstate%2FIdentifiedStatePersistor.java;h=0a417bd389c32ca8b2368888c3fb3ebef06fe2dc;hp=0000000000000000000000000000000000000000;hb=97e8b055b8ad16f1d799c81898fee075780a5a83;hpb=72d52b5910e1ed0141b6768ef700e7321ac05553 diff --git a/bundles/org.simantics.browsing.ui.common/src/org/simantics/browsing/ui/common/state/IdentifiedStatePersistor.java b/bundles/org.simantics.browsing.ui.common/src/org/simantics/browsing/ui/common/state/IdentifiedStatePersistor.java new file mode 100644 index 000000000..0a417bd38 --- /dev/null +++ b/bundles/org.simantics.browsing.ui.common/src/org/simantics/browsing/ui/common/state/IdentifiedStatePersistor.java @@ -0,0 +1,106 @@ +package org.simantics.browsing.ui.common.state; + +import java.io.File; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + +import org.simantics.browsing.ui.ExplorerState; +import org.simantics.browsing.ui.NodeContext; +import org.simantics.browsing.ui.StatePersistor; +import org.simantics.databoard.util.StringUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * @author Tuukka Lehtonen + */ +public class IdentifiedStatePersistor implements StatePersistor { + + private static final Logger LOGGER = LoggerFactory.getLogger(IdentifiedStatePersistor.class); + + protected final String id; + + public IdentifiedStatePersistor(String id) { + this.id = id; + } + + @Override + public ExplorerState deserialize(File stateLocation, NodeContext root) { + return stateLocation == null ? ExplorerState.EMPTY + : deserialize(getMementoPath(stateLocation, root)); + } + + @Override + public void serialize(File stateLocation, NodeContext root, ExplorerState state) { + if (stateLocation == null || root == null) + return; + try { + GraphExplorerStateBean bean = toStateBean(state, root); + Path memento = getMementoPath(stateLocation, root); + if (bean != null && memento != null) + Files.write(memento, bean.serialize()); + } catch (Throwable t) { + LOGGER.error("Failed to serialize ExplorerState " + state, t); + } + } + + protected ExplorerState deserialize(Path path) { + if (path == null || !Files.exists(path)) + return ExplorerState.EMPTY; + try { + GraphExplorerStateBean stateBean = new GraphExplorerStateBean(); + stateBean.deserialize( Files.readAllBytes(path) ); + return toState(stateBean); + } catch (Throwable t) { + LOGGER.error("Failed to deserialize ExplorerState from " + path, t); + return ExplorerState.EMPTY; + } + } + + protected NodeContext[] toNodeContexts(GraphExplorerStateNodeBean[] beans) throws Exception { + return NodeContext.NONE; + } + + protected List toNodeContextList(GraphExplorerStateNodeBean[] beans) throws Exception { + return beans.length == 0 ? Collections.emptyList() + : Arrays.asList(toNodeContexts(beans)); + } + + protected GraphExplorerStateNodeBean[] toNodeBeans(NodeContext[] contexts) { + return GraphExplorerStateNodeBean.NONE; + } + + protected ExplorerState toState(GraphExplorerStateBean stateBean) throws Exception { + return new ExplorerState( + toNodeContexts(stateBean.topNodePath), + stateBean.topNodePathChildIndexes, + toNodeContextList(stateBean.expandedNodes), + stateBean.columnWidths); + } + + /** + * @param state + * the {@link ExplorerState} to transform into a + * {@link GraphExplorerStateBean} + * @param root + * the input root node context that was used to initialize the + * explorer state + * @return + */ + protected GraphExplorerStateBean toStateBean(ExplorerState state, NodeContext root) { + GraphExplorerStateBean ib = new GraphExplorerStateBean(); + ib.topNodePath = toNodeBeans(state.topNodePath); + ib.topNodePathChildIndexes = state.topNodePathChildIndex; + ib.expandedNodes = toNodeBeans(state.expandedNodes.toArray(NodeContext.NONE)); + ib.columnWidths = state.columnWidths; + return ib; + } + + protected Path getMementoPath(File stateLocation, NodeContext root) { + return stateLocation.toPath().resolve(StringUtil.escapeToFileName(id) + ".ge"); + } + +} \ No newline at end of file