All Downloads are FREE. Search and download functionalities are using the official Maven repository.
Please wait. This can take some minutes ...
Many resources are needed to download a project. Please understand that we have to compensate our server costs. Thank you in advance.
Project price only 1 $
You can buy this project and download/modify it how often you want.
org.springframework.data.redis.connection.stream.StreamInfo Maven / Gradle / Ivy
/*
* Copyright 2020-2022 the original author or authors.
*
* 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 org.springframework.data.redis.connection.stream;
import java.time.Duration;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.stream.Stream;
import org.springframework.data.redis.connection.convert.Converters;
import org.springframework.lang.Nullable;
/**
* @author Christoph Strobl
* @author Mark Paluch
* @since 2.3
*/
public class StreamInfo {
public static class XInfoObject {
protected static final Map> DEFAULT_TYPE_HINTS;
static {
Map> defaults = new HashMap<>(2);
defaults.put("root", Map.class);
defaults.put("root.*", String.class);
DEFAULT_TYPE_HINTS = Collections.unmodifiableMap(defaults);
}
private Map raw;
private XInfoObject(List raw, Map> typeHints) {
this((Map) Converters.parse(raw, "root", typeHints));
}
private XInfoObject(Map raw) {
this.raw = raw;
}
@Nullable
T get(String entry, Class type) {
Object value = raw.get(entry);
return value == null ? null : type.cast(value);
}
@Nullable
T getAndMap(String entry, Class type, Function f) {
I value = get(entry, type);
return value == null ? null : f.apply(value);
}
public Map getRaw() {
return raw;
}
@Override
public String toString() {
return "XInfoStream" + raw;
}
}
/**
* Value object holding general information about a {@literal Redis Stream}.
*
* @author Christoph Strobl
*/
public static class XInfoStream extends XInfoObject {
private static final Map> typeHints;
static {
typeHints = new HashMap<>(DEFAULT_TYPE_HINTS);
typeHints.put("root.first-entry", Map.class);
typeHints.put("root.first-entry.*", Map.class);
typeHints.put("root.first-entry.*.*", Object.class);
typeHints.put("root.last-entry", Map.class);
typeHints.put("root.last-entry.*", Map.class);
typeHints.put("root.last-entry.*.*", Object.class);
}
private XInfoStream(List raw) {
super(raw, typeHints);
}
/**
* Factory method to create a new instance of {@link XInfoStream}.
*
* @param source the raw value source.
* @return
*/
public static XInfoStream fromList(List source) {
return new XInfoStream(source);
}
/**
* Total number of element in the stream. Corresponds to {@literal length}.
*
* @return
*/
public Long streamLength() {
return get("length", Long.class);
}
/**
* The streams radix tree key size. Corresponds to {@literal radix-tree-keys}.
*
* @return
*/
public Long radixTreeKeySize() {
return get("radix-tree-keys", Long.class);
}
/**
* Total number of element radix tree nodes. Corresponds to {@literal radix-tree-nodes}.
*
* @return
*/
public Long radixTreeNodesSize() {
return get("radix-tree-nodes", Long.class);
}
/**
* The number of associated {@literal consumer groups}. Corresponds to {@literal groups}.
*
* @return
*/
public Long groupCount() {
return get("groups", Long.class);
}
/**
* The last generated id. May not be the same as {@link #lastEntryId()}. Corresponds to
* {@literal last-generated-id}.
*
* @return
*/
public String lastGeneratedId() {
return get("last-generated-id", String.class);
}
/**
* The id of the streams first entry. Corresponds to {@literal first-entry 1)}.
*
* @return
*/
public String firstEntryId() {
return getAndMap("first-entry", Map.class, it -> it.keySet().iterator().next().toString());
}
/**
* The streams first entry. Corresponds to {@literal first-entry}.
*
* @return
*/
public Map getFirstEntry() {
return getAndMap("first-entry", Map.class, Collections::unmodifiableMap);
}
/**
* The id of the streams last entry. Corresponds to {@literal last-entry 1)}.
*
* @return
*/
public String lastEntryId() {
return getAndMap("last-entry", Map.class, it -> it.keySet().iterator().next().toString());
}
/**
* The streams first entry. Corresponds to {@literal last-entry}.
*
* @return
*/
public Map getLastEntry() {
return getAndMap("last-entry", Map.class, Collections::unmodifiableMap);
}
}
/**
* Value object holding general information about {@literal consumer groups} associated with a
* {@literal Redis Stream}.
*
* @author Christoph Strobl
*/
public static class XInfoGroups {
private final List groupInfoList;
private XInfoGroups(List raw) {
groupInfoList = new ArrayList<>();
for (Object entry : raw) {
groupInfoList.add(new XInfoGroup((List) entry));
}
}
/**
* Factory method to create a new instance of {@link XInfoGroups}.
*
* @param source the raw value source.
* @return
*/
public static XInfoGroups fromList(List source) {
return new XInfoGroups(source);
}
/**
* Total number of associated {@literal consumer groups}.
*
* @return zero if none available.
*/
public int groupCount() {
return size();
}
/**
* Returns the number of {@link XInfoGroup} available.
*
* @return zero if none available.
* @see #groupCount()
*/
public int size() {
return groupInfoList.size();
}
/**
* @return {@literal true} if no groups associated.
*/
public boolean isEmpty() {
return groupInfoList.isEmpty();
}
/**
* Returns an iterator over the {@link XInfoGroup} elements.
*
* @return
*/
public Iterator iterator() {
return groupInfoList.iterator();
}
/**
* Returns the {@link XInfoGroup} element at the given {@literal index}.
*
* @return the element at the specified position.
* @throws IndexOutOfBoundsException if the index is out of range.
*/
public XInfoGroup get(int index) {
return groupInfoList.get(index);
}
/**
* Returns a sequential {@code Stream} of {@link XInfoGroup}.
*
* @return
*/
public Stream stream() {
return groupInfoList.stream();
}
/**
* Performs the given {@literal action} on every available {@link XInfoGroup} of this {@link XInfoGroups}.
*
* @param action
*/
public void forEach(Consumer action) {
groupInfoList.forEach(action);
}
@Override
public String toString() {
return "XInfoGroups" + groupInfoList;
}
}
public static class XInfoGroup extends XInfoObject {
private XInfoGroup(List raw) {
super(raw, DEFAULT_TYPE_HINTS);
}
public static XInfoGroup fromList(List raw) {
return new XInfoGroup(raw);
}
/**
* The {@literal consumer group} name. Corresponds to {@literal name}.
*
* @return
*/
public String groupName() {
return get("name", String.class);
}
/**
* The total number of consumers in the {@literal consumer group}. Corresponds to {@literal consumers}.
*
* @return
*/
public Long consumerCount() {
return get("consumers", Long.class);
}
/**
* The total number of pending messages in the {@literal consumer group}. Corresponds to {@literal pending}.
*
* @return
*/
public Long pendingCount() {
return get("pending", Long.class);
}
/**
* The id of the last delivered message. Corresponds to {@literal last-delivered-id}.
*
* @return
*/
public String lastDeliveredId() {
return get("last-delivered-id", String.class);
}
}
public static class XInfoConsumers {
private final List consumerInfoList;
public XInfoConsumers(String groupName, List raw) {
consumerInfoList = new ArrayList<>();
for (Object entry : raw) {
consumerInfoList.add(new XInfoConsumer(groupName, (List) entry));
}
}
public static XInfoConsumers fromList(String groupName, List source) {
return new XInfoConsumers(groupName, source);
}
/**
* Total number of {@literal consumers} in the {@literal consumer group}.
*
* @return zero if none available.
*/
public int getConsumerCount() {
return consumerInfoList.size();
}
/**
* Returns the number of {@link XInfoConsumer} available.
*
* @return zero if none available.
* @see #getConsumerCount()
*/
public int size() {
return consumerInfoList.size();
}
/**
* @return {@literal true} if no groups associated.
*/
public boolean isEmpty() {
return consumerInfoList.isEmpty();
}
/**
* Returns an iterator over the {@link XInfoConsumer} elements.
*
* @return
*/
public Iterator iterator() {
return consumerInfoList.iterator();
}
/**
* Returns the {@link XInfoConsumer} element at the given {@literal index}.
*
* @return the element at the specified position.
* @throws IndexOutOfBoundsException if the index is out of range.
*/
public XInfoConsumer get(int index) {
return consumerInfoList.get(index);
}
/**
* Returns a sequential {@code Stream} of {@link XInfoConsumer}.
*
* @return
*/
public Stream stream() {
return consumerInfoList.stream();
}
/**
* Performs the given {@literal action} on every available {@link XInfoConsumer} of this {@link XInfoConsumers}.
*
* @param action
*/
public void forEach(Consumer action) {
consumerInfoList.forEach(action);
}
@Override
public String toString() {
return "XInfoConsumers" + consumerInfoList;
}
}
public static class XInfoConsumer extends XInfoObject {
private final String groupName;
public XInfoConsumer(String groupName, List raw) {
super(raw, DEFAULT_TYPE_HINTS);
this.groupName = groupName;
}
/**
* The {@literal consumer group} name.
*
* @return
*/
public String groupName() {
return groupName;
}
/**
* The {@literal consumer} name. Corresponds to {@literal name}.
*
* @return
*/
public String consumerName() {
return get("name", String.class);
}
/**
* The idle time (in millis). Corresponds to {@literal idle}.
*
* @return
*/
public Long idleTimeMs() {
return get("idle", Long.class);
}
/**
* The idle time. Corresponds to {@literal idle}.
*
* @return
*/
public Duration idleTime() {
return Duration.ofMillis(idleTimeMs());
}
/**
* The number of pending messages. Corresponds to {@literal pending}.
*
* @return
*/
public Long pendingCount() {
return get("pending", Long.class);
}
}
}