Example usage for org.apache.lucene.util SetOnce get

List of usage examples for org.apache.lucene.util SetOnce get

Introduction

In this page you can find the example usage for org.apache.lucene.util SetOnce get.

Prototype

public final T get() 

Source Link

Document

Returns the object set by #set(Object) .

Usage

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));
    }
}