List of usage examples for org.apache.lucene.util SetOnce get
public final T get()
From source file:org.elasticsearch.common.xcontent.XContentParserUtilsTests.java
License:Apache License
public void testParseTypedKeysObject() throws IOException { final String delimiter = randomFrom("#", ":", "/", "-", "_", "|", "_delim_"); final XContentType xContentType = randomFrom(XContentType.values()); final ObjectParser<SetOnce<Boolean>, Void> BOOLPARSER = new ObjectParser<>("bool", () -> new SetOnce<>()); BOOLPARSER.declareBoolean(SetOnce::set, new ParseField("field")); final ObjectParser<SetOnce<Long>, Void> LONGPARSER = new ObjectParser<>("long", () -> new SetOnce<>()); LONGPARSER.declareLong(SetOnce::set, new ParseField("field")); List<NamedXContentRegistry.Entry> namedXContents = new ArrayList<>(); namedXContents.add(new NamedXContentRegistry.Entry(Boolean.class, new ParseField("bool"), p -> BOOLPARSER.parse(p, null).get())); namedXContents.add(new NamedXContentRegistry.Entry(Long.class, new ParseField("long"), p -> LONGPARSER.parse(p, null).get())); final NamedXContentRegistry namedXContentRegistry = new NamedXContentRegistry(namedXContents); BytesReference bytes = toXContent(/*from ww w .j a v a 2 s. com*/ (builder, params) -> builder.startObject("name").field("field", 0).endObject(), xContentType, randomBoolean()); try (XContentParser parser = xContentType.xContent().createParser(namedXContentRegistry, bytes)) { ensureExpectedToken(XContentParser.Token.START_OBJECT, parser.nextToken(), parser::getTokenLocation); ensureExpectedToken(XContentParser.Token.FIELD_NAME, parser.nextToken(), parser::getTokenLocation); ensureExpectedToken(XContentParser.Token.START_OBJECT, parser.nextToken(), parser::getTokenLocation); SetOnce<Boolean> booleanConsumer = new SetOnce<>(); parseTypedKeysObject(parser, delimiter, Boolean.class, booleanConsumer::set); // because of the missing type to identify the parser, we expect no return value, but also no exception assertNull(booleanConsumer.get()); ensureExpectedToken(XContentParser.Token.END_OBJECT, parser.currentToken(), parser::getTokenLocation); ensureExpectedToken(XContentParser.Token.END_OBJECT, parser.nextToken(), parser::getTokenLocation); assertNull(parser.nextToken()); } bytes = toXContent((builder, params) -> builder.startObject("type" + delimiter + "name").field("bool", true) .endObject(), xContentType, randomBoolean()); try (XContentParser parser = xContentType.xContent().createParser(namedXContentRegistry, bytes)) { ensureExpectedToken(XContentParser.Token.START_OBJECT, parser.nextToken(), parser::getTokenLocation); ensureExpectedToken(XContentParser.Token.FIELD_NAME, parser.nextToken(), parser::getTokenLocation); ensureExpectedToken(XContentParser.Token.START_OBJECT, parser.nextToken(), parser::getTokenLocation); NamedXContentRegistry.UnknownNamedObjectException e = expectThrows( NamedXContentRegistry.UnknownNamedObjectException.class, () -> parseTypedKeysObject(parser, delimiter, Boolean.class, a -> { })); assertEquals("Unknown Boolean [type]", e.getMessage()); assertEquals("type", e.getName()); assertEquals("java.lang.Boolean", e.getCategoryClass()); } final long longValue = randomLong(); final boolean boolValue = randomBoolean(); bytes = toXContent((builder, params) -> { builder.startObject("long" + delimiter + "l").field("field", longValue).endObject(); builder.startObject("bool" + delimiter + "l").field("field", boolValue).endObject(); return builder; }, xContentType, randomBoolean()); try (XContentParser parser = xContentType.xContent().createParser(namedXContentRegistry, bytes)) { ensureExpectedToken(XContentParser.Token.START_OBJECT, parser.nextToken(), parser::getTokenLocation); ensureExpectedToken(XContentParser.Token.FIELD_NAME, parser.nextToken(), parser::getTokenLocation); ensureExpectedToken(XContentParser.Token.START_OBJECT, parser.nextToken(), parser::getTokenLocation); SetOnce<Long> parsedLong = new SetOnce<>(); parseTypedKeysObject(parser, delimiter, Long.class, parsedLong::set); assertNotNull(parsedLong); assertEquals(longValue, parsedLong.get().longValue()); ensureExpectedToken(XContentParser.Token.FIELD_NAME, parser.nextToken(), parser::getTokenLocation); ensureExpectedToken(XContentParser.Token.START_OBJECT, parser.nextToken(), parser::getTokenLocation); SetOnce<Boolean> parsedBoolean = new SetOnce<>(); parseTypedKeysObject(parser, delimiter, Boolean.class, parsedBoolean::set); assertNotNull(parsedBoolean); assertEquals(boolValue, parsedBoolean.get()); ensureExpectedToken(XContentParser.Token.END_OBJECT, parser.nextToken(), parser::getTokenLocation); } }
From source file:org.elasticsearch.ingest.PipelineExecutionServiceTests.java
License:Apache License
public void testExecuteIndexPipelineExistsButFailedParsing() { when(store.get("_id")) .thenReturn(new Pipeline("_id", "stub", null, new CompoundProcessor(new AbstractProcessor("mock") { @Override/*from w w w. j a va 2 s . com*/ public void execute(IngestDocument ingestDocument) { throw new IllegalStateException("error"); } @Override public String getType() { return null; } }))); SetOnce<Boolean> failed = new SetOnce<>(); IndexRequest indexRequest = new IndexRequest("_index", "_type", "_id").source(Collections.emptyMap()) .setPipeline("_id"); Consumer<Exception> failureHandler = (e) -> { assertThat(e.getCause().getClass(), equalTo(IllegalArgumentException.class)); assertThat(e.getCause().getCause().getClass(), equalTo(IllegalStateException.class)); assertThat(e.getCause().getCause().getMessage(), equalTo("error")); failed.set(true); }; Consumer<Boolean> completionHandler = (e) -> failed.set(false); executionService.executeIndexRequest(indexRequest, failureHandler, completionHandler); assertTrue(failed.get()); }
From source file:org.elasticsearch.repositories.blobstore.ESBlobStoreRepositoryIntegTestCase.java
License:Apache License
public void testIndicesDeletedFromRepository() throws Exception { Client client = client();//w w w. j a v a 2s. c o m logger.info("--> creating repository"); final String repoName = "test-repo"; createAndCheckTestRepository(repoName); createIndex("test-idx-1", "test-idx-2", "test-idx-3"); ensureGreen(); logger.info("--> indexing some data"); for (int i = 0; i < 20; i++) { index("test-idx-1", "doc", Integer.toString(i), "foo", "bar" + i); index("test-idx-2", "doc", Integer.toString(i), "foo", "baz" + i); index("test-idx-3", "doc", Integer.toString(i), "foo", "baz" + i); } refresh(); logger.info("--> take a snapshot"); CreateSnapshotResponse createSnapshotResponse = client.admin().cluster() .prepareCreateSnapshot(repoName, "test-snap").setWaitForCompletion(true).get(); assertEquals(createSnapshotResponse.getSnapshotInfo().successfulShards(), createSnapshotResponse.getSnapshotInfo().totalShards()); logger.info("--> indexing more data"); for (int i = 20; i < 40; i++) { index("test-idx-1", "doc", Integer.toString(i), "foo", "bar" + i); index("test-idx-2", "doc", Integer.toString(i), "foo", "baz" + i); index("test-idx-3", "doc", Integer.toString(i), "foo", "baz" + i); } logger.info("--> take another snapshot with only 2 of the 3 indices"); createSnapshotResponse = client.admin().cluster().prepareCreateSnapshot(repoName, "test-snap2") .setWaitForCompletion(true).setIndices("test-idx-1", "test-idx-2").get(); assertEquals(createSnapshotResponse.getSnapshotInfo().successfulShards(), createSnapshotResponse.getSnapshotInfo().totalShards()); logger.info("--> delete a snapshot"); assertAcked(client().admin().cluster().prepareDeleteSnapshot(repoName, "test-snap").get()); logger.info("--> verify index folder deleted from blob container"); RepositoriesService repositoriesSvc = internalCluster().getInstance(RepositoriesService.class, internalCluster().getMasterName()); ThreadPool threadPool = internalCluster().getInstance(ThreadPool.class, internalCluster().getMasterName()); BlobStoreRepository repository = (BlobStoreRepository) repositoriesSvc.repository(repoName); final SetOnce<BlobContainer> indicesBlobContainer = new SetOnce<>(); final SetOnce<RepositoryData> repositoryData = new SetOnce<>(); final CountDownLatch latch = new CountDownLatch(1); threadPool.executor(ThreadPool.Names.SNAPSHOT).execute(() -> { indicesBlobContainer.set(repository.blobStore().blobContainer(repository.basePath().add("indices"))); repositoryData.set(repository.getRepositoryData()); latch.countDown(); }); latch.await(); for (IndexId indexId : repositoryData.get().getIndices().values()) { if (indexId.getName().equals("test-idx-3")) { assertFalse(indicesBlobContainer.get().blobExists(indexId.getId())); // deleted index } } }
From source file:org.elasticsearch.repositories.s3.S3BlobContainer.java
License:Apache License
/** * Uploads a blob using multipart upload requests. *///from w w w .ja va2 s . c om void executeMultipartUpload(final S3BlobStore blobStore, final String blobName, final InputStream input, final long blobSize) throws IOException { if (blobSize > MAX_FILE_SIZE_USING_MULTIPART.getBytes()) { throw new IllegalArgumentException("Multipart upload request size [" + blobSize + "] can't be larger than " + MAX_FILE_SIZE_USING_MULTIPART); } if (blobSize < MIN_PART_SIZE_USING_MULTIPART.getBytes()) { throw new IllegalArgumentException("Multipart upload request size [" + blobSize + "] can't be smaller than " + MIN_PART_SIZE_USING_MULTIPART); } final long partSize = blobStore.bufferSizeInBytes(); final Tuple<Long, Long> multiparts = numberOfMultiparts(blobSize, partSize); if (multiparts.v1() > Integer.MAX_VALUE) { throw new IllegalArgumentException( "Too many multipart upload requests, maybe try a larger buffer size?"); } final int nbParts = multiparts.v1().intValue(); final long lastPartSize = multiparts.v2(); assert blobSize == (nbParts - 1) * partSize + lastPartSize : "blobSize does not match multipart sizes"; final SetOnce<String> uploadId = new SetOnce<>(); final String bucketName = blobStore.bucket(); boolean success = false; try { final InitiateMultipartUploadRequest initRequest = new InitiateMultipartUploadRequest(bucketName, blobName); initRequest.setStorageClass(blobStore.getStorageClass()); initRequest.setCannedACL(blobStore.getCannedACL()); if (blobStore.serverSideEncryption()) { final ObjectMetadata md = new ObjectMetadata(); md.setSSEAlgorithm(ObjectMetadata.AES_256_SERVER_SIDE_ENCRYPTION); initRequest.setObjectMetadata(md); } uploadId.set(blobStore.client().initiateMultipartUpload(initRequest).getUploadId()); if (Strings.isEmpty(uploadId.get())) { throw new IOException("Failed to initialize multipart upload " + blobName); } final List<PartETag> parts = new ArrayList<>(); long bytesCount = 0; for (int i = 1; i <= nbParts; i++) { final UploadPartRequest uploadRequest = new UploadPartRequest(); uploadRequest.setBucketName(bucketName); uploadRequest.setKey(blobName); uploadRequest.setUploadId(uploadId.get()); uploadRequest.setPartNumber(i); uploadRequest.setInputStream(input); if (i < nbParts) { uploadRequest.setPartSize(partSize); uploadRequest.setLastPart(false); } else { uploadRequest.setPartSize(lastPartSize); uploadRequest.setLastPart(true); } bytesCount += uploadRequest.getPartSize(); final UploadPartResult uploadResponse = blobStore.client().uploadPart(uploadRequest); parts.add(uploadResponse.getPartETag()); } if (bytesCount != blobSize) { throw new IOException("Failed to execute multipart upload for [" + blobName + "], expected " + blobSize + "bytes sent but got " + bytesCount); } CompleteMultipartUploadRequest complRequest = new CompleteMultipartUploadRequest(bucketName, blobName, uploadId.get(), parts); blobStore.client().completeMultipartUpload(complRequest); success = true; } catch (AmazonClientException e) { throw new IOException("Unable to upload object [" + blobName + "] using multipart upload", e); } finally { if (success == false && Strings.hasLength(uploadId.get())) { final AbortMultipartUploadRequest abortRequest = new AbortMultipartUploadRequest(bucketName, blobName, uploadId.get()); blobStore.client().abortMultipartUpload(abortRequest); } } }
From source file:org.elasticsearch.search.aggregations.Aggregations.java
License:Apache License
public static Aggregations fromXContent(XContentParser parser) throws IOException { final List<Aggregation> aggregations = new ArrayList<>(); XContentParser.Token token;//w w w. j ava2 s . co m while ((token = parser.nextToken()) != XContentParser.Token.END_OBJECT) { if (token == XContentParser.Token.START_OBJECT) { SetOnce<Aggregation> typedAgg = new SetOnce<>(); String currentField = parser.currentName(); parseTypedKeysObject(parser, Aggregation.TYPED_KEYS_DELIMITER, Aggregation.class, typedAgg::set); if (typedAgg.get() != null) { aggregations.add(typedAgg.get()); } else { throw new ParsingException(parser.getTokenLocation(), String.format(Locale.ROOT, "Could not parse aggregation keyed as [%s]", currentField)); } } } return new Aggregations(aggregations); }
From source file:org.elasticsearch.test.InternalAggregationTestCase.java
License:Apache License
@SuppressWarnings("unchecked") protected <P extends ParsedAggregation> P parseAndAssert(final InternalAggregation aggregation, final boolean shuffled, final boolean addRandomFields) throws IOException { final ToXContent.Params params = new ToXContent.MapParams( singletonMap(RestSearchAction.TYPED_KEYS_PARAM, "true")); final XContentType xContentType = randomFrom(XContentType.values()); final boolean humanReadable = randomBoolean(); final BytesReference originalBytes; if (shuffled) { originalBytes = toShuffledXContent(aggregation, xContentType, params, humanReadable); } else {/* w ww .j a v a 2 s . c o m*/ originalBytes = toXContent(aggregation, xContentType, params, humanReadable); } BytesReference mutated; if (addRandomFields) { /* * - we don't add to the root object because it should only contain * the named aggregation to test - we don't want to insert into the * "meta" object, because we pass on everything we find there * * - we don't want to directly insert anything random into "buckets" * objects, they are used with "keyed" aggregations and contain * named bucket objects. Any new named object on this level should * also be a bucket and be parsed as such. */ Predicate<String> basicExcludes = path -> path.isEmpty() || path.endsWith(Aggregation.CommonFields.META.getPreferredName()) || path.endsWith(Aggregation.CommonFields.BUCKETS.getPreferredName()); Predicate<String> excludes = basicExcludes.or(excludePathsFromXContentInsertion()); mutated = insertRandomFields(xContentType, originalBytes, excludes, random()); } else { mutated = originalBytes; } SetOnce<Aggregation> parsedAggregation = new SetOnce<>(); try (XContentParser parser = createParser(xContentType.xContent(), mutated)) { assertEquals(XContentParser.Token.START_OBJECT, parser.nextToken()); assertEquals(XContentParser.Token.FIELD_NAME, parser.nextToken()); assertEquals(XContentParser.Token.START_OBJECT, parser.nextToken()); XContentParserUtils.parseTypedKeysObject(parser, Aggregation.TYPED_KEYS_DELIMITER, Aggregation.class, parsedAggregation::set); assertEquals(XContentParser.Token.END_OBJECT, parser.currentToken()); assertEquals(XContentParser.Token.END_OBJECT, parser.nextToken()); assertNull(parser.nextToken()); Aggregation agg = parsedAggregation.get(); assertEquals(aggregation.getName(), agg.getName()); assertEquals(aggregation.getMetaData(), agg.getMetaData()); assertTrue(agg instanceof ParsedAggregation); assertEquals(aggregation.getType(), agg.getType()); BytesReference parsedBytes = toXContent(agg, xContentType, params, humanReadable); assertToXContentEquivalent(originalBytes, parsedBytes, xContentType); return (P) agg; } }
From source file:org.elasticsearch.xpack.security.action.filter.SecurityActionFilterTests.java
License:Open Source License
public void testApplyAsSystemUser() throws Exception { ActionRequest request = mock(ActionRequest.class); ActionListener listener = mock(ActionListener.class); User user = new User("username", "r1", "r2"); Authentication authentication = new Authentication(user, new RealmRef("test", "test", "foo"), null); SetOnce<Authentication> authenticationSetOnce = new SetOnce<>(); ActionFilterChain chain = (task, action, request1, listener1) -> { authenticationSetOnce.set(threadContext.getTransient(AuthenticationField.AUTHENTICATION_KEY)); };//from w ww . j a v a 2 s .com Task task = mock(Task.class); final boolean hasExistingAuthentication = randomBoolean(); final String action = "internal:foo"; if (hasExistingAuthentication) { threadContext.putTransient(AuthenticationField.AUTHENTICATION_KEY, authentication); threadContext.putHeader(AuthenticationField.AUTHENTICATION_KEY, "foo"); threadContext.putTransient(AuthorizationService.ORIGINATING_ACTION_KEY, "indices:foo"); } else { assertNull(threadContext.getTransient(AuthenticationField.AUTHENTICATION_KEY)); } doAnswer((i) -> { ActionListener callback = (ActionListener) i.getArguments()[3]; callback.onResponse(threadContext.getTransient(AuthenticationField.AUTHENTICATION_KEY)); return Void.TYPE; }).when(authcService).authenticate(eq(action), eq(request), eq(SystemUser.INSTANCE), any(ActionListener.class)); filter.apply(task, action, request, listener, chain); if (hasExistingAuthentication) { assertEquals(authentication, threadContext.getTransient(AuthenticationField.AUTHENTICATION_KEY)); } else { assertNull(threadContext.getTransient(AuthenticationField.AUTHENTICATION_KEY)); } assertNotNull(authenticationSetOnce.get()); assertNotEquals(authentication, authenticationSetOnce.get()); assertEquals(SystemUser.INSTANCE, authenticationSetOnce.get().getUser()); }
From source file:org.elasticsearch.xpack.security.audit.index.IndexAuditTrailTests.java
License:Open Source License
private SearchHit getIndexedAuditMessage(Message message) throws InterruptedException { assertNotNull("no audit message was enqueued", message); final String indexName = IndexNameResolver.resolve(IndexAuditTrailField.INDEX_NAME_PREFIX, message.timestamp, rollover); ensureYellowAndNoInitializingShards(indexName); GetSettingsResponse settingsResponse = getClient().admin().indices().prepareGetSettings(indexName).get(); assertThat(settingsResponse.getSetting(indexName, "index.number_of_shards"), is(Integer.toString(numShards))); assertThat(settingsResponse.getSetting(indexName, "index.number_of_replicas"), is(Integer.toString(numReplicas))); final SetOnce<SearchResponse> searchResponseSetOnce = new SetOnce<>(); final boolean found = awaitBusy(() -> { try {/*www .ja va 2 s . c o m*/ SearchResponse searchResponse = getClient().prepareSearch(indexName) .setTypes(IndexAuditTrail.DOC_TYPE).get(); if (searchResponse.getHits().getTotalHits() > 0L) { searchResponseSetOnce.set(searchResponse); return true; } } catch (Exception e) { logger.debug("caught exception while executing search", e); } return false; }); assertThat("no audit document exists!", found, is(true)); SearchResponse response = searchResponseSetOnce.get(); assertNotNull(response); assertEquals(1, response.getHits().getTotalHits()); return response.getHits().getHits()[0]; }
From source file:org.elasticsearch.xpack.security.authc.AuthenticationServiceTests.java
License:Open Source License
public void testAutheticateTransportContextAndHeader() throws Exception { User user1 = new User("username", "r1", "r2"); when(firstRealm.token(threadContext)).thenReturn(token); when(firstRealm.supports(token)).thenReturn(true); mockAuthenticate(firstRealm, token, user1); final AtomicBoolean completed = new AtomicBoolean(false); final SetOnce<Authentication> authRef = new SetOnce<>(); final SetOnce<String> authHeaderRef = new SetOnce<>(); try (ThreadContext.StoredContext ignore = threadContext.stashContext()) { service.authenticate("_action", message, SystemUser.INSTANCE, ActionListener.wrap(authentication -> { assertThat(authentication, notNullValue()); assertThat(authentication.getUser(), sameInstance(user1)); assertThreadContextContainsAuthentication(authentication); authRef.set(authentication); authHeaderRef.set(threadContext.getHeader(AuthenticationField.AUTHENTICATION_KEY)); setCompletedToTrue(completed); }, this::logAndFail)); }/*from w w w. j a va 2 s.c om*/ assertTrue(completed.compareAndSet(true, false)); reset(firstRealm); // checking authentication from the context InternalMessage message1 = new InternalMessage(); ThreadPool threadPool1 = new TestThreadPool("testAutheticateTransportContextAndHeader1"); try { ThreadContext threadContext1 = threadPool1.getThreadContext(); service = new AuthenticationService(Settings.EMPTY, realms, auditTrail, new DefaultAuthenticationFailureHandler(), threadPool1, new AnonymousUser(Settings.EMPTY), tokenService); threadContext1.putTransient(AuthenticationField.AUTHENTICATION_KEY, authRef.get()); threadContext1.putHeader(AuthenticationField.AUTHENTICATION_KEY, authHeaderRef.get()); service.authenticate("_action", message1, SystemUser.INSTANCE, ActionListener.wrap(ctxAuth -> { assertThat(ctxAuth, sameInstance(authRef.get())); assertThat(threadContext1.getHeader(AuthenticationField.AUTHENTICATION_KEY), sameInstance(authHeaderRef.get())); setCompletedToTrue(completed); }, this::logAndFail)); assertTrue(completed.compareAndSet(true, false)); verifyZeroInteractions(firstRealm); reset(firstRealm); } finally { terminate(threadPool1); } // checking authentication from the user header ThreadPool threadPool2 = new TestThreadPool("testAutheticateTransportContextAndHeader2"); try { ThreadContext threadContext2 = threadPool2.getThreadContext(); final String header; try (ThreadContext.StoredContext ignore = threadContext2.stashContext()) { service = new AuthenticationService(Settings.EMPTY, realms, auditTrail, new DefaultAuthenticationFailureHandler(), threadPool2, new AnonymousUser(Settings.EMPTY), tokenService); threadContext2.putHeader(AuthenticationField.AUTHENTICATION_KEY, authHeaderRef.get()); BytesStreamOutput output = new BytesStreamOutput(); threadContext2.writeTo(output); StreamInput input = output.bytes().streamInput(); threadContext2 = new ThreadContext(Settings.EMPTY); threadContext2.readHeaders(input); header = threadContext2.getHeader(AuthenticationField.AUTHENTICATION_KEY); } threadPool2.getThreadContext().putHeader(AuthenticationField.AUTHENTICATION_KEY, header); service = new AuthenticationService(Settings.EMPTY, realms, auditTrail, new DefaultAuthenticationFailureHandler(), threadPool2, new AnonymousUser(Settings.EMPTY), tokenService); service.authenticate("_action", new InternalMessage(), SystemUser.INSTANCE, ActionListener.wrap(result -> { assertThat(result, notNullValue()); assertThat(result.getUser(), equalTo(user1)); setCompletedToTrue(completed); }, this::logAndFail)); assertTrue(completed.get()); verifyZeroInteractions(firstRealm); } finally { terminate(threadPool2); } }
From source file:org.elasticsearch.xpack.security.authc.support.CachingUsernamePasswordRealm.java
License:Open Source License
private void authenticateWithCache(UsernamePasswordToken token, ActionListener<AuthenticationResult> listener) { try {// w w w. j a va 2s . co m final SetOnce<User> authenticatedUser = new SetOnce<>(); final AtomicBoolean createdAndStartedFuture = new AtomicBoolean(false); final ListenableFuture<Tuple<AuthenticationResult, UserWithHash>> future = cache .computeIfAbsent(token.principal(), k -> { final ListenableFuture<Tuple<AuthenticationResult, UserWithHash>> created = new ListenableFuture<>(); if (createdAndStartedFuture.compareAndSet(false, true) == false) { throw new IllegalStateException("something else already started this. how?"); } return created; }); if (createdAndStartedFuture.get()) { doAuthenticate(token, ActionListener.wrap(result -> { if (result.isAuthenticated()) { final User user = result.getUser(); authenticatedUser.set(user); final UserWithHash userWithHash = new UserWithHash(user, token.credentials(), cacheHasher); future.onResponse(new Tuple<>(result, userWithHash)); } else { future.onResponse(new Tuple<>(result, null)); } }, future::onFailure)); } future.addListener(ActionListener.wrap(tuple -> { if (tuple != null) { final UserWithHash userWithHash = tuple.v2(); final boolean performedAuthentication = createdAndStartedFuture.get() && userWithHash != null && tuple.v2().user == authenticatedUser.get(); handleResult(future, createdAndStartedFuture.get(), performedAuthentication, token, tuple, listener); } else { handleFailure(future, createdAndStartedFuture.get(), token, new IllegalStateException("unknown error authenticating"), listener); } }, e -> handleFailure(future, createdAndStartedFuture.get(), token, e, listener)), threadPool.executor(ThreadPool.Names.GENERIC)); } catch (ExecutionException e) { listener.onResponse(AuthenticationResult.unsuccessful("", e)); } }