/* * 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.op.control; import io.netty.channel.ChannelHandlerContext; import org.apache.tinkerpop.gremlin.driver.Tokens; import org.apache.tinkerpop.gremlin.driver.message.RequestMessage; import org.apache.tinkerpop.gremlin.driver.message.ResponseMessage; import org.apache.tinkerpop.gremlin.driver.message.ResponseStatusCode; import org.apache.tinkerpop.gremlin.groovy.engine.GremlinExecutor; import org.apache.tinkerpop.gremlin.groovy.engine.ScriptEngines; import org.apache.tinkerpop.gremlin.server.Context; import org.apache.tinkerpop.gremlin.util.Gremlin; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; /** * @author Stephen Mallette (http://stephen.genoprime.com) * @deprecated As for release 3.2.2, not replaced as this feature was never really published as official. */ @Deprecated class ControlOps { private static final Logger logger = LoggerFactory.getLogger(ControlOps.class); public static void versionOp(final Context context) { final ChannelHandlerContext ctx = context.getChannelHandlerContext(); final RequestMessage msg = context.getRequestMessage(); context.getChannelHandlerContext().writeAndFlush(ResponseMessage.build(msg).code(ResponseStatusCode.SUCCESS).result(Gremlin.version()), ctx.voidPromise()); } /** * Modify the imports on the {@code ScriptEngine}. */ public static void importOp(final Context context) { final RequestMessage msg = context.getRequestMessage(); final List<String> l = (List<String>) msg.getArgs().get(Tokens.ARGS_IMPORTS); context.getGremlinExecutor().getScriptEngines().addImports(new HashSet<>(l)); } /** * List the dependencies, imports, or variables in the {@code ScriptEngine}. */ public static void showOp(final Context context) { final ChannelHandlerContext ctx = context.getChannelHandlerContext(); final RequestMessage msg = context.getRequestMessage(); final String infoType = msg.<String>optionalArgs(Tokens.ARGS_INFO_TYPE).get(); final GremlinExecutor executor = context.getGremlinExecutor(); final ScriptEngines scriptEngines = executor.getScriptEngines(); final Object infoToShow; if (infoType.equals(Tokens.ARGS_INFO_TYPE_DEPDENENCIES)) infoToShow = scriptEngines.dependencies(); else if (infoType.equals(Tokens.ARGS_INFO_TYPE_IMPORTS)) infoToShow = scriptEngines.imports(); else { // this shouldn't happen if validations are working properly. will bomb and log as error to server logs // thus killing the connection throw new RuntimeException(String.format("Validation for the show operation is not properly checking the %s", Tokens.ARGS_INFO_TYPE)); } try { context.getChannelHandlerContext().writeAndFlush(ResponseMessage.build(msg).code(ResponseStatusCode.SUCCESS).result(infoToShow).create(), ctx.voidPromise()); } catch (Exception ex) { logger.warn("The result [{}] in the request {} could not be serialized and returned.", infoToShow, context.getRequestMessage(), ex); } } /** * Resets the {@code ScriptEngine} thus forcing a reload of scripts and classes. */ public static void resetOp(final Context context) { final ChannelHandlerContext ctx = context.getChannelHandlerContext(); final RequestMessage msg = context.getRequestMessage(); context.getGremlinExecutor().getScriptEngines().reset(); context.getChannelHandlerContext().writeAndFlush(ResponseMessage.build(msg).code(ResponseStatusCode.SUCCESS).create(), ctx.voidPromise()); } /** * Pull in maven based dependencies and load Gremlin plugins. */ public static void useOp(final Context context) { final ChannelHandlerContext ctx = context.getChannelHandlerContext(); final RequestMessage msg = context.getRequestMessage(); final List<Map<String, String>> usings = (List<Map<String, String>>) msg.getArgs().get(Tokens.ARGS_COORDINATES); usings.forEach(c -> { final String group = c.get(Tokens.ARGS_COORDINATES_GROUP); final String artifact = c.get(Tokens.ARGS_COORDINATES_ARTIFACT); final String version = c.get(Tokens.ARGS_COORDINATES_VERSION); logger.info("Loading plugin [group={},artifact={},version={}]", group, artifact, version); context.getGremlinExecutor().getScriptEngines().use(group, artifact, version); final Map<String, String> coords = new HashMap<String, String>() {{ put("group", group); put("artifact", artifact); put("version", version); }}; context.getChannelHandlerContext().writeAndFlush(ResponseMessage.build(msg).code(ResponseStatusCode.SUCCESS).result(coords).create(), ctx.voidPromise()); }); } }