/** * Copyright 2018 Nikita Koksharov * * 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 * * http://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 com.fr.third.org.redisson; import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.List; import java.util.Map; import java.util.Map.Entry; import com.fr.third.org.redisson.api.RBucket; import com.fr.third.org.redisson.api.RBuckets; import com.fr.third.org.redisson.api.RFuture; import com.fr.third.org.redisson.client.codec.Codec; import com.fr.third.org.redisson.client.codec.DelegateDecoderCodec; import com.fr.third.org.redisson.client.protocol.RedisCommand; import com.fr.third.org.redisson.client.protocol.RedisCommands; import com.fr.third.org.redisson.misc.RedissonPromise; import com.fr.third.org.redisson.api.RBucket; import com.fr.third.org.redisson.api.RBuckets; import com.fr.third.org.redisson.api.RFuture; import com.fr.third.org.redisson.client.codec.Codec; import com.fr.third.org.redisson.client.codec.DelegateDecoderCodec; import com.fr.third.org.redisson.client.protocol.RedisCommand; import com.fr.third.org.redisson.client.protocol.RedisCommands; import com.fr.third.org.redisson.command.CommandExecutor; import com.fr.third.org.redisson.connection.decoder.MapGetAllDecoder; import com.fr.third.org.redisson.misc.RedissonPromise; /** * * @author Nikita Koksharov * */ public class RedissonBuckets implements RBuckets { private final Codec codec; private final CommandExecutor commandExecutor; private final Redisson redisson; public RedissonBuckets(Redisson redisson, CommandExecutor commandExecutor) { this(redisson, commandExecutor.getConnectionManager().getCodec(), commandExecutor); } public RedissonBuckets(Redisson redisson, Codec codec, CommandExecutor commandExecutor) { super(); this.codec = codec; this.commandExecutor = commandExecutor; this.redisson = redisson; } @Override public List> find(String pattern) { Collection keys = commandExecutor.get(commandExecutor., String>readAllAsync(RedisCommands.KEYS, pattern)); List> buckets = new ArrayList>(keys.size()); for (String key : keys) { if(key == null) { continue; } buckets.add(redisson.getBucket(key, codec)); } return buckets; } @Override public Map get(String... keys) { RFuture> future = getAsync(keys); return commandExecutor.get(future); } @Override public boolean trySet(Map buckets) { RFuture future = trySetAsync(buckets); return commandExecutor.get(future); } @Override public void set(Map buckets) { commandExecutor.get(setAsync(buckets)); } @Override public RFuture> getAsync(String... keys) { if (keys.length == 0) { Map emptyMap = Collections.emptyMap(); return RedissonPromise.>newSucceededFuture(emptyMap); } RedisCommand> command = new RedisCommand>("MGET", new MapGetAllDecoder(Arrays.asList(keys), 0)); return commandExecutor.readAsync(keys[0], new DelegateDecoderCodec(codec), command, keys); } @Override public RFuture trySetAsync(Map buckets) { if (buckets.isEmpty()) { return RedissonPromise.newSucceededFuture(false); } List params = new ArrayList(buckets.size()); for (Entry entry : buckets.entrySet()) { params.add(entry.getKey()); try { params.add(codec.getValueEncoder().encode(entry.getValue())); } catch (IOException e) { throw new IllegalArgumentException(e); } } return commandExecutor.writeAsync(params.get(0).toString(), RedisCommands.MSETNX, params.toArray()); } @Override public RFuture setAsync(Map buckets) { if (buckets.isEmpty()) { return RedissonPromise.newSucceededFuture(null); } List params = new ArrayList(buckets.size()); for (Entry entry : buckets.entrySet()) { params.add(entry.getKey()); try { params.add(codec.getValueEncoder().encode(entry.getValue())); } catch (IOException e) { throw new IllegalArgumentException(e); } } return commandExecutor.writeAsync(params.get(0).toString(), RedisCommands.MSET, params.toArray()); } }