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.
/**
* 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 org.redisson.transaction;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import java.util.concurrent.TimeUnit;
import org.redisson.RedissonMultiLock;
import org.redisson.RedissonObject;
import org.redisson.RedissonSet;
import org.redisson.api.RCollectionAsync;
import org.redisson.api.RFuture;
import org.redisson.api.RLock;
import org.redisson.api.RObject;
import org.redisson.api.RSet;
import org.redisson.api.SortOrder;
import org.redisson.client.RedisClient;
import org.redisson.client.protocol.decoder.ListScanResult;
import org.redisson.command.CommandAsyncExecutor;
import org.redisson.misc.Hash;
import org.redisson.misc.HashValue;
import org.redisson.misc.RPromise;
import org.redisson.misc.RedissonPromise;
import org.redisson.transaction.operation.DeleteOperation;
import org.redisson.transaction.operation.TouchOperation;
import org.redisson.transaction.operation.TransactionalOperation;
import org.redisson.transaction.operation.UnlinkOperation;
import org.redisson.transaction.operation.set.MoveOperation;
import io.netty.buffer.ByteBuf;
import io.netty.util.concurrent.Future;
import io.netty.util.concurrent.FutureListener;
/**
*
* @author Nikita Koksharov
*
* @param value type
*/
public abstract class BaseTransactionalSet extends BaseTransactionalObject {
static final Object NULL = new Object();
private final long timeout;
final Map state = new HashMap();
final List operations;
final RCollectionAsync set;
final RObject object;
final String name;
final CommandAsyncExecutor commandExecutor;
Boolean deleted;
public BaseTransactionalSet(CommandAsyncExecutor commandExecutor, long timeout, List operations, RCollectionAsync set) {
this.commandExecutor = commandExecutor;
this.timeout = timeout;
this.operations = operations;
this.set = set;
this.object = (RObject) set;
this.name = object.getName();
}
private HashValue toHash(Object value) {
ByteBuf state = ((RedissonObject)set).encode(value);
try {
return new HashValue(Hash.hash128(state));
} finally {
state.release();
}
}
public RFuture isExistsAsync() {
if (deleted != null) {
return RedissonPromise.newSucceededFuture(!deleted);
}
return set.isExistsAsync();
}
public RFuture unlinkAsync(CommandAsyncExecutor commandExecutor) {
return deleteAsync(commandExecutor, new UnlinkOperation(name));
}
public RFuture touchAsync(CommandAsyncExecutor commandExecutor) {
final RPromise result = new RedissonPromise();
if (deleted != null && deleted) {
operations.add(new TouchOperation(name));
result.trySuccess(false);
return result;
}
set.isExistsAsync().addListener(new FutureListener() {
@Override
public void operationComplete(Future future) throws Exception {
if (!future.isSuccess()) {
result.tryFailure(future.cause());
return;
}
operations.add(new TouchOperation(name));
boolean exists = future.getNow();
if (!exists) {
for (Object value : state.values()) {
if (value != NULL) {
exists = true;
break;
}
}
}
result.trySuccess(exists);
}
});
return result;
}
public RFuture deleteAsync(CommandAsyncExecutor commandExecutor) {
return deleteAsync(commandExecutor, new DeleteOperation(name));
}
protected RFuture deleteAsync(CommandAsyncExecutor commandExecutor, final TransactionalOperation operation) {
final RPromise result = new RedissonPromise();
if (deleted != null) {
operations.add(operation);
result.trySuccess(!deleted);
deleted = true;
return result;
}
set.isExistsAsync().addListener(new FutureListener() {
@Override
public void operationComplete(Future future) throws Exception {
if (!future.isSuccess()) {
result.tryFailure(future.cause());
return;
}
operations.add(operation);
for (HashValue key : state.keySet()) {
state.put(key, NULL);
}
deleted = true;
result.trySuccess(future.getNow());
}
});
return result;
}
public RFuture containsAsync(Object value) {
for (Object val : state.values()) {
if (val != NULL && isEqual(val, value)) {
return RedissonPromise.newSucceededFuture(true);
}
}
return set.containsAsync(value);
}
protected abstract ListScanResult