blob: 97a1c17da389a889f16ab85735242e30fff17356 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more contributor license
* agreements. See the NOTICE file distributed with this work for additional information regarding
* copyright ownership. The ASF licenses this file to You 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.apache.geode.internal.cache.tx;
import java.util.Set;
import org.apache.geode.cache.EntryExistsException;
import org.apache.geode.cache.EntryNotFoundException;
import org.apache.geode.cache.Operation;
import org.apache.geode.cache.Region.Entry;
import org.apache.geode.cache.UnsupportedOperationInTransactionException;
import org.apache.geode.cache.client.ServerOperationException;
import org.apache.geode.cache.client.internal.ServerRegionDataAccess;
import org.apache.geode.internal.cache.DistributedPutAllOperation;
import org.apache.geode.internal.cache.DistributedRemoveAllOperation;
import org.apache.geode.internal.cache.EntryEventImpl;
import org.apache.geode.internal.cache.InternalRegion;
import org.apache.geode.internal.cache.KeyInfo;
import org.apache.geode.internal.cache.tier.sockets.ClientProxyMembershipID;
import org.apache.geode.internal.cache.tier.sockets.VersionedObjectList;
public class ClientTXRegionStub implements TXRegionStub {
// private final LocalRegion region;
private final ServerRegionDataAccess proxy;
public ClientTXRegionStub(InternalRegion region) {
// this.region = region;
this.proxy = region.getServerProxy();
}
@Override
public boolean containsKey(KeyInfo keyInfo) {
return proxy.containsKey(keyInfo.getKey());
}
@Override
public boolean containsValueForKey(KeyInfo keyInfo) {
return proxy.containsValueForKey(keyInfo.getKey());
}
@Override
public void destroyExistingEntry(EntryEventImpl event, boolean cacheWrite,
Object expectedOldValue) {
if (event.getOperation().isLocal()) {
throw new UnsupportedOperationInTransactionException();
}
Object result = proxy.destroy(event.getKey(), expectedOldValue, event.getOperation(), event,
event.getCallbackArgument());
if (result instanceof EntryNotFoundException) {
throw (EntryNotFoundException) result;
}
}
@Override
public Object findObject(KeyInfo keyInfo, boolean isCreate, boolean generateCallbacks,
Object value, boolean preferCD, ClientProxyMembershipID requestingClient,
EntryEventImpl event) {
return proxy.get(keyInfo.getKey(), keyInfo.getCallbackArg(), event);
}
@Override
public Entry<?, ?> getEntry(KeyInfo keyInfo, boolean allowTombstones) {
return proxy.getEntry(keyInfo.getKey());
}
@Override
public Object getEntryForIterator(KeyInfo keyInfo, boolean allowTombstones) {
return getEntry(keyInfo, allowTombstones);
}
@Override
public void invalidateExistingEntry(EntryEventImpl event, boolean invokeCallbacks,
boolean forceNewEntry) {
if (event.getOperation().isLocal()) {
throw new UnsupportedOperationInTransactionException();
}
proxy.invalidate(event);
}
@Override
public boolean putEntry(EntryEventImpl event, boolean ifNew, boolean ifOld,
Object expectedOldValue, boolean requireOldValue, long lastModified,
boolean overwriteDestroyed) {
if (event.isBulkOpInProgress()) {
// this is a put all, ignore this!
return true;
}
Object result = null;
try {
result = proxy.put(event.getKey(), event.getRawNewValue(), event.getDeltaBytes(), event,
event.getOperation(), requireOldValue, expectedOldValue, event.getCallbackArgument(),
event.isCreate());
} catch (ServerOperationException e) {
if (e.getCause() != null && (e.getCause() instanceof EntryExistsException)) {
throw (EntryExistsException) e.getCause();
}
throw e;
}
if (event.getOperation() == Operation.REPLACE) {
if (!requireOldValue) { // replace(K,V,V)
return ((Boolean) result).booleanValue();
} else { // replace(K,V)
event.setOldValue(result);
}
} else if (event.getOperation() == Operation.PUT_IF_ABSENT) {
// if (logger.isDebugEnabled()) {
// logger.debug("putIfAbsent for " + event.getKey() + " is returning " + result);
// }
event.setOldValue(result);
if (result != null) {
return false;
}
}
return true;
}
@Override
public int entryCount() {
return proxy.size();
}
@Override
public Set getRegionKeysForIteration() {
return proxy.keySet();
}
@Override
public void postPutAll(DistributedPutAllOperation putallOp, VersionedObjectList successfulPuts,
InternalRegion r) {
/*
* Don't do anything here , it's handled in proxy and elsewhere.
*/
}
@Override
public void postRemoveAll(DistributedRemoveAllOperation op, VersionedObjectList successfulOps,
InternalRegion region) {
// Don't do anything here , it's handled in proxy and elsewhere.
}
@Override
public void cleanup() {}
}