@Override public RequestMessage createObject(final Map<String, Object> data) { final Map<String, Object> args = (Map<String, Object>) data.get(SerTokens.TOKEN_ARGS); RequestMessage.Builder builder = RequestMessage.build(data.get(SerTokens.TOKEN_OP).toString()) .overrideRequestId(UUID.fromString(data.get(SerTokens.TOKEN_REQUEST).toString())); if (data.containsKey(SerTokens.TOKEN_PROCESSOR)) builder = builder.processor(data.get(SerTokens.TOKEN_PROCESSOR).toString()); if (args != null) { for (Map.Entry<String, Object> kv : args.entrySet()) { builder = builder.addArg(kv.getKey(), kv.getValue()); } } return builder.create(); } }
@Override public RequestMessage.Builder buildMessage(final RequestMessage.Builder builder) { if (close.isDone()) throw new IllegalStateException("Client is closed"); if (!aliases.isEmpty()) builder.addArg(Tokens.ARGS_ALIASES, aliases); return client.buildMessage(builder); }
@Override public CompletableFuture<ResultSet> submitAsync(final RequestMessage msg) { final RequestMessage.Builder builder = RequestMessage.from(msg); // only add aliases which aren't already present. if they are present then they represent request level // overrides which should be mucked with if (!aliases.isEmpty()) { final Map original = (Map) msg.getArgs().getOrDefault(Tokens.ARGS_ALIASES, Collections.emptyMap()); aliases.forEach((k,v) -> { if (!original.containsKey(k)) builder.addArg(Tokens.ARGS_ALIASES, aliases); }); } return super.submitAsync(builder.create()); }
public default void submit(final String gremlin, final Consumer<ResponseMessage> callback) throws Exception { submit(RequestMessage.build(Tokens.OPS_EVAL).addArg(Tokens.ARGS_GREMLIN, gremlin).create(), callback); }
@Override public CompletableFuture<ResultSet> submitAsync(final RequestMessage msg) { final RequestMessage.Builder builder = RequestMessage.from(msg); // only add aliases which aren't already present. if they are present then they represent request level // overrides which should be mucked with if (!aliases.isEmpty()) { final Map original = (Map) msg.getArgs().getOrDefault(Tokens.ARGS_ALIASES, Collections.emptyMap()); aliases.forEach((k,v) -> { if (!original.containsKey(k)) builder.addArg(Tokens.ARGS_ALIASES, aliases); }); } return super.submitAsync(builder.create()); }
@Override public CompletableFuture<ResultSet> submitAsync(final Bytecode bytecode) { try { return submitAsync(buildMessage(RequestMessage.build(Tokens.OPS_BYTECODE) .processor("traversal").addArg(Tokens.ARGS_GREMLIN, bytecode)).create()); } catch (Exception ex) { throw new RuntimeException(ex); } }
/** * Adds the {@link Tokens#ARGS_SESSION} value to every {@link RequestMessage}. */ @Override public RequestMessage.Builder buildMessage(final RequestMessage.Builder builder) { builder.processor("session"); builder.addArg(Tokens.ARGS_SESSION, sessionId); builder.addArg(Tokens.ARGS_MANAGE_TRANSACTION, manageTransactions); return builder; }
private static RequestMessage.Builder buildRequest(String query, Map<String, ?> parameters) { RequestMessage.Builder request = RequestMessage.build(Tokens.OPS_EVAL) .processor(CYPHER_OP_PROCESSOR_NAME) .add(Tokens.ARGS_GREMLIN, query); if (parameters != null && !parameters.isEmpty()) { request.addArg(Tokens.ARGS_BINDINGS, parameters); } return request; } }
@Override public RequestMessage.Builder buildMessage(final RequestMessage.Builder builder) { if (close.isDone()) throw new IllegalStateException("Client is closed"); if (!aliases.isEmpty()) builder.addArg(Tokens.ARGS_ALIASES, aliases); return client.buildMessage(builder); }
final boolean forceClose = client.getSettings().getSession().get().isForceClosed(); final RequestMessage closeMessage = client.buildMessage( RequestMessage.build(Tokens.OPS_CLOSE).addArg(Tokens.ARGS_FORCE, forceClose)).create();
messageBuilder.addArg(Tokens.ARGS_SASL_MECHANISM, getMechanism()); messageBuilder.addArg(Tokens.ARGS_SASL, saslClient.get().hasInitialResponse() ? BASE64_ENCODER.encodeToString(evaluateChallenge(subject, saslClient, NULL_CHALLENGE)) : null); } else { BASE64_ENCODER.encodeToString((byte[]) response.getResult().getData()); messageBuilder.addArg(Tokens.ARGS_SASL, BASE64_ENCODER.encodeToString( evaluateChallenge(subject, saslClient, BASE64_DECODER.decode(base64sasl))));
@Override public Set<String> keys() { // wait for the read to complete (i.e. iteration on the server) before allowing the caller to get the // side-effect. calling prior to this will result in the side-effect not being found. of course, the // bad part here is that the method blocks indefinitely waiting for the result, but it prevents the // test failure problems that happen on slower systems. in practice, it's unlikely that a user would // try to get a side-effect prior to iteration, but since the API allows it, this at least prevents // the error. ready.join(); if (closed && !retrievedAllKeys) throw new IllegalStateException("Traversal has been closed - side-effect keys cannot be retrieved"); if (!retrievedAllKeys) { // specify the ARGS_HOST so that the LoadBalancingStrategy is subverted and the connection is forced // from the specified host (i.e. the host from the previous request as that host will hold the side-effects) final RequestMessage msg = RequestMessage.build(Tokens.OPS_KEYS) .addArg(Tokens.ARGS_SIDE_EFFECT, serverSideEffect) .addArg(Tokens.ARGS_HOST, host) .processor("traversal").create(); try { if (keys.equals(Collections.emptySet())) keys = new HashSet<>(); client.submitAsync(msg).get().all().get().forEach(r -> keys.add(r.getString())); // only need to retrieve all keys once retrievedAllKeys = true; } catch (Exception ex) { final Throwable root = ExceptionUtils.getRootCause(ex); throw new RuntimeException("Could not get keys", null == root ? ex : root); } } return keys; }
/** * The asynchronous version of {@link #submit(String, RequestOptions)}} where the returned future will complete when the * write of the request completes. * * @param gremlin the gremlin script to execute * @param options the options to supply for this request */ public CompletableFuture<ResultSet> submitAsync(final String gremlin, final RequestOptions options) { final int batchSize = options.getBatchSize().orElse(cluster.connectionPoolSettings().resultIterationBatchSize); // need to call buildMessage() right away to get client specific configurations, that way request specific // ones can override as needed final RequestMessage.Builder request = buildMessage(RequestMessage.build(Tokens.OPS_EVAL)) .add(Tokens.ARGS_GREMLIN, gremlin) .add(Tokens.ARGS_BATCH_SIZE, batchSize); // apply settings if they were made available options.getTimeout().ifPresent(timeout -> request.add(Tokens.ARGS_SCRIPT_EVAL_TIMEOUT, timeout)); options.getParameters().ifPresent(params -> request.addArg(Tokens.ARGS_BINDINGS, params)); options.getAliases().ifPresent(aliases -> request.addArg(Tokens.ARGS_ALIASES, aliases)); return submitAsync(request.create()); }
@Override public void close() throws Exception { if (!closed) { final RequestMessage msg = RequestMessage.build(Tokens.OPS_CLOSE) .addArg(Tokens.ARGS_SIDE_EFFECT, serverSideEffect) .addArg(Tokens.ARGS_HOST, host) .processor("traversal").create(); try { client.submitAsync(msg).get(); closed = true; } catch (Exception ex) { final Throwable root = ExceptionUtils.getRootCause(ex); throw new RuntimeException("Error on closing side effects", null == root ? ex : root); } } }
public CompletableFuture<List<ResponseMessage>> submitAsync(final RequestMessage requestMessage) throws Exception; }
public default void submit(final String gremlin, final Consumer<ResponseMessage> callback) throws Exception { submit(RequestMessage.build(Tokens.OPS_EVAL).addArg(Tokens.ARGS_GREMLIN, gremlin).create(), callback); }
public List<ResponseMessage> submit(final RequestMessage requestMessage) throws Exception;
/** * Adds the {@link Tokens#ARGS_SESSION} value to every {@link RequestMessage}. */ @Override public RequestMessage.Builder buildMessage(final RequestMessage.Builder builder) { builder.processor("session"); builder.addArg(Tokens.ARGS_SESSION, sessionId); builder.addArg(Tokens.ARGS_MANAGE_TRANSACTION, manageTransactions); return builder; }
@Override public CompletableFuture<ResultSet> submitAsync(final Bytecode bytecode) { try { return submitAsync(buildMessage(RequestMessage.build(Tokens.OPS_BYTECODE) .processor("traversal").addArg(Tokens.ARGS_GREMLIN, bytecode)).create()); } catch (Exception ex) { throw new RuntimeException(ex); } }