[ https://issues.apache.org/jira/browse/TINKERPOP-1438?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15926722#comment-15926722 ]
ASF GitHub Bot commented on TINKERPOP-1438: ------------------------------------------- Github user pluradj commented on a diff in the pull request: https://github.com/apache/tinkerpop/pull/569#discussion_r106248061 --- Diff: gremlin-server/src/main/java/org/apache/tinkerpop/gremlin/server/util/BasicGraphManager.java --- @@ -0,0 +1,186 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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.apache.tinkerpop.gremlin.server.util; + +import org.apache.tinkerpop.gremlin.process.traversal.TraversalSource; +import org.apache.tinkerpop.gremlin.server.GraphManager; +import org.apache.tinkerpop.gremlin.server.GremlinServer; +import org.apache.tinkerpop.gremlin.server.Settings; +import org.apache.tinkerpop.gremlin.structure.Graph; +import org.apache.tinkerpop.gremlin.structure.Transaction; +import org.apache.tinkerpop.gremlin.structure.util.GraphFactory; +import org.apache.tinkerpop.gremlin.util.iterator.IteratorUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import javax.script.Bindings; +import javax.script.SimpleBindings; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; +import java.util.function.Predicate; +import java.util.function.Supplier; + +/** + * Holder for {@link Graph} and {@link TraversalSource} instances configured for the server to be passed to script + * engine bindings. The {@link Graph} instances are read from the {@link Settings} for Gremlin Server as defined in + * the configuration file. The {@link TraversalSource} instances are rebound to the {@code GraphManager} once + * initialization scripts construct them. + */ +public final class BasicGraphManager implements GraphManager { + private static final Logger logger = LoggerFactory.getLogger(GremlinServer.class); + + private final Map<String, Graph> graphs = new ConcurrentHashMap<>(); + private final Map<String, TraversalSource> traversalSources = new ConcurrentHashMap<>(); + + /** + * Create a new instance using the {@link Settings} from Gremlin Server. + */ + public BasicGraphManager(final Settings settings) { + settings.graphs.entrySet().forEach(e -> { + try { + final Graph newGraph = GraphFactory.open(e.getValue()); + graphs.put(e.getKey(), newGraph); + logger.info("Graph [{}] was successfully configured via [{}].", e.getKey(), e.getValue()); + } catch (RuntimeException re) { + logger.warn(String.format("Graph [%s] configured at [%s] could not be instantiated and will not be available in Gremlin Server. GraphFactory message: %s", + e.getKey(), e.getValue(), re.getMessage()), re); + if (re.getCause() != null) logger.debug("GraphFactory exception", re.getCause()); + } + }); + } + + /** + * Get a list of the {@link Graph} instances and their binding names as defined in the Gremlin Server + * configuration file. + * + * @return a {@link Map} where the key is the name of the {@link Graph} and the value is the {@link Graph} itself + */ + public Map<String, Graph> getGraphs() { + return graphs; + } + + public Graph getGraph(String gName) { + return graphs.get(gName); + } + + public void addGraph(String gName, Graph g) { + graphs.put(gName, g); + } + + /** + * Get a list of the {@link TraversalSource} instances and their binding names as defined by Gremlin Server + * initialization scripts. + * + * @return a {@link Map} where the key is the name of the {@link TraversalSource} and the value is the + * {@link TraversalSource} itself + */ + public Map<String, TraversalSource> getTraversalSources() { + return traversalSources; + } + + public TraversalSource getTraversalSource(String tsName) { + return traversalSources.get(tsName); + } + + public void addTraversalSource(String tsName, TraversalSource ts) { + traversalSources.put(tsName, ts); + } + + /** + * Get the {@link Graph} and {@link TraversalSource} list as a set of bindings. + */ + public Bindings getAsBindings() { + final Bindings bindings = new SimpleBindings(); + graphs.forEach(bindings::put); + traversalSources.forEach(bindings::put); + return bindings; + } + + /** + * Rollback transactions across all {@link Graph} objects. + */ + public void rollbackAll() { + graphs.entrySet().forEach(e -> { + final Graph graph = e.getValue(); + if (graph.features().graph().supportsTransactions() && graph.tx().isOpen()) + graph.tx().rollback(); + }); + } + + /** + * Selectively rollback transactions on the specified graphs or the graphs of traversal sources. + */ + public void rollback(final Set<String> graphSourceNamesToCloseTxOn) { + closeTx(graphSourceNamesToCloseTxOn, Transaction.Status.ROLLBACK); + } + + /** + * Commit transactions across all {@link Graph} objects. + */ + public void commitAll() { + graphs.entrySet().forEach(e -> { + final Graph graph = e.getValue(); + if (graph.features().graph().supportsTransactions() && graph.tx().isOpen()) + graph.tx().commit(); + }); + } + + /** + * Selectively commit transactions on the specified graphs or the graphs of traversal sources. + */ + public void commit(final Set<String> graphSourceNamesToCloseTxOn) { + closeTx(graphSourceNamesToCloseTxOn, Transaction.Status.COMMIT); + } + + /** + * Basic graphManager has basic openGraph function. --- End diff -- javadoc should mention that the `Supplier` is not actually used in this default implementation class. > Consider GraphManager as an interface > ------------------------------------- > > Key: TINKERPOP-1438 > URL: https://issues.apache.org/jira/browse/TINKERPOP-1438 > Project: TinkerPop > Issue Type: Improvement > Components: server > Affects Versions: 3.2.2 > Reporter: stephen mallette > Priority: Minor > Labels: breaking > > If {{GraphManager}} were an interface it would make embedding Gremlin Server > easier as {{Graph}} instances could be more easily supplied by the host > application. In doing this, It also might be good to force a > {{TraversalSource}} to be referred to by both the {{Graph}} name and > {{TraversalSource}} name. -- This message was sent by Atlassian JIRA (v6.3.15#6346)