All Downloads are FREE. Search and download functionalities are using the official Maven repository.

reactor.util.context.CoreContext Maven / Gradle / Ivy

Go to download

Easy Redis Java client and Real-Time Data Platform. Valkey compatible. Sync/Async/RxJava3/Reactive API. Client side caching. Over 50 Redis based Java objects and services: JCache API, Apache Tomcat, Hibernate, Spring, Set, Multimap, SortedSet, Map, List, Queue, Deque, Semaphore, Lock, AtomicLong, Map Reduce, Bloom filter, Scheduler, RPC

The newest version!
/*
 * Copyright (c) 2019-2021 VMware Inc. or its affiliates, All Rights Reserved.
 *
 * Licensed 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
 *
 *   https://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 reactor.util.context;

import java.util.Map;

/**
 * Abstract base to optimize interactions between reactor core {@link Context} implementations.
 *
 * @author Simon Baslé
 */
interface CoreContext extends Context {

	@Override
	default boolean isEmpty() {
		// Overridden in Context0#isEmpty
		return false;
	}
	
	@Override
	default Context putAll(ContextView other) {
		if (other.isEmpty()) return this;

		if (other instanceof CoreContext) {
			CoreContext coreContext = (CoreContext) other;
			return coreContext.putAllInto(this);
		}

		ContextN newContext = new ContextN(this.size() + other.size());
		this.unsafePutAllInto(newContext);
		other.stream().sequential().forEach(newContext);
		if (newContext.size() <= 5) {
			// make it return Context{1-5}
			return Context.of((Map) newContext);
		}
		return newContext;
	}

	/**
	 * Let this Context add its internal values to the given base Context, avoiding creating
	 * intermediate holders for key-value pairs as much as possible.
	 *
	 * @param base the {@link Context} in which we're putting all our values
	 * @return a new context containing all the base values merged with all our values
	 */
	Context putAllInto(Context base);

	/**
	 * Let this Context add its internal values to the given ContextN, mutating it,
	 * but avoiding creating intermediate holders for key-value pairs as much as possible.
	 *
	 * @param other the {@link ContextN} we're mutating by putting all our values into
	 */
	void unsafePutAllInto(ContextN other);

}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy