Example usage for org.springframework.core.io.buffer DataBufferUtils join

List of usage examples for org.springframework.core.io.buffer DataBufferUtils join

Introduction

In this page you can find the example usage for org.springframework.core.io.buffer DataBufferUtils join.

Prototype

public static Mono<DataBuffer> join(Publisher<DataBuffer> dataBuffers) 

Source Link

Document

Return a new DataBuffer composed from joining together the given dataBuffers elements.

Usage

From source file:org.springframework.cloud.gateway.handler.predicate.ReadBodyPredicateFactory.java

@Override
@SuppressWarnings("unchecked")
public AsyncPredicate<ServerWebExchange> applyAsync(Config config) {
    return exchange -> {
        Class inClass = config.getInClass();

        Object cachedBody = exchange.getAttribute(CACHE_REQUEST_BODY_OBJECT_KEY);
        Mono<?> modifiedBody;/*from  ww w .j a v  a2s  .  c  o m*/
        // We can only read the body from the request once, once that happens if we
        // try to read the body again an exception will be thrown. The below if/else
        // caches the body object as a request attribute in the ServerWebExchange
        // so if this filter is run more than once (due to more than one route
        // using it) we do not try to read the request body multiple times
        if (cachedBody != null) {
            try {
                boolean test = config.predicate.test(cachedBody);
                exchange.getAttributes().put(TEST_ATTRIBUTE, test);
                return Mono.just(test);
            } catch (ClassCastException e) {
                if (LOGGER.isDebugEnabled()) {
                    LOGGER.debug("Predicate test failed because class in predicate "
                            + "does not match the cached body object", e);
                }
            }
            return Mono.just(false);
        } else {
            // Join all the DataBuffers so we have a single DataBuffer for the body
            return DataBufferUtils.join(exchange.getRequest().getBody()).flatMap(dataBuffer -> {
                // Update the retain counts so we can read the body twice,
                // once to parse into an object
                // that we can test the predicate against and a second time
                // when the HTTP client sends
                // the request downstream
                // Note: if we end up reading the body twice we will run into
                // a problem, but as of right
                // now there is no good use case for doing this
                DataBufferUtils.retain(dataBuffer);
                // Make a slice for each read so each read has its own
                // read/write indexes
                Flux<DataBuffer> cachedFlux = Flux
                        .defer(() -> Flux.just(dataBuffer.slice(0, dataBuffer.readableByteCount())));

                ServerHttpRequest mutatedRequest = new ServerHttpRequestDecorator(exchange.getRequest()) {
                    @Override
                    public Flux<DataBuffer> getBody() {
                        return cachedFlux;
                    }
                };
                return ServerRequest.create(exchange.mutate().request(mutatedRequest).build(), messageReaders)
                        .bodyToMono(inClass).doOnNext(objectValue -> {
                            exchange.getAttributes().put(CACHE_REQUEST_BODY_OBJECT_KEY, objectValue);
                            exchange.getAttributes().put(CACHED_REQUEST_BODY_KEY, cachedFlux);
                        }).map(objectValue -> config.predicate.test(objectValue));
            });

        }
    };
}

From source file:org.springframework.web.reactive.resource.AppCacheManifestTransformer.java

@Override
public Mono<Resource> transform(ServerWebExchange exchange, Resource inputResource,
        ResourceTransformerChain chain) {

    return chain.transform(exchange, inputResource).flatMap(outputResource -> {
        String name = outputResource.getFilename();
        if (!this.fileExtension.equals(StringUtils.getFilenameExtension(name))) {
            return Mono.just(outputResource);
        }/*  w w w . j av a 2  s. c o  m*/
        DataBufferFactory bufferFactory = exchange.getResponse().bufferFactory();
        Flux<DataBuffer> flux = DataBufferUtils.read(outputResource, bufferFactory, StreamUtils.BUFFER_SIZE);
        return DataBufferUtils.join(flux).flatMap(dataBuffer -> {
            CharBuffer charBuffer = DEFAULT_CHARSET.decode(dataBuffer.asByteBuffer());
            DataBufferUtils.release(dataBuffer);
            String content = charBuffer.toString();
            return transform(content, outputResource, chain, exchange);
        });
    });
}

From source file:org.springframework.web.reactive.resource.CssLinkResourceTransformer.java

@Override
public Mono<Resource> transform(ServerWebExchange exchange, Resource inputResource,
        ResourceTransformerChain transformerChain) {

    return transformerChain.transform(exchange, inputResource).flatMap(ouptputResource -> {
        String filename = ouptputResource.getFilename();
        if (!"css".equals(StringUtils.getFilenameExtension(filename))
                || inputResource instanceof GzipResourceResolver.GzippedResource) {
            return Mono.just(ouptputResource);
        }/*from  w  w  w. j av  a 2s. c o  m*/

        if (logger.isTraceEnabled()) {
            logger.trace("Transforming resource: " + ouptputResource);
        }

        DataBufferFactory bufferFactory = exchange.getResponse().bufferFactory();
        Flux<DataBuffer> flux = DataBufferUtils.read(ouptputResource, bufferFactory, StreamUtils.BUFFER_SIZE);
        return DataBufferUtils.join(flux).flatMap(dataBuffer -> {
            CharBuffer charBuffer = DEFAULT_CHARSET.decode(dataBuffer.asByteBuffer());
            DataBufferUtils.release(dataBuffer);
            String cssContent = charBuffer.toString();
            return transformContent(cssContent, ouptputResource, transformerChain, exchange);
        });
    });
}