/*
* JBoss, Home of Professional Open Source
* Copyright 2011 Red Hat Inc. and/or its affiliates and other
* contributors as indicated by the @author tags. All rights reserved.
* See the copyright.txt in the distribution for a full listing of
* individual contributors.
*
* This is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this software; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package org.infinispan.context;
import org.infinispan.container.entries.CacheEntry;
import org.infinispan.context.impl.AbstractInvocationContext;
import java.util.Collections;
import java.util.Map;
import java.util.Set;
/**
* @author Mircea Markus
* @since 5.1
*/
public class SingleKeyNonTxInvocationContext extends AbstractInvocationContext {
private final boolean isOriginLocal;
private Object key;
/**
* It is possible for the key to only be wrapped but not locked, e.g. when a get takes place.
*/
private boolean isLocked;
private CacheEntry cacheEntry;
public SingleKeyNonTxInvocationContext(boolean originLocal) {
isOriginLocal = originLocal;
}
@Override
public boolean isOriginLocal() {
return isOriginLocal;
}
@Override
public boolean isInTxScope() {
return false;
}
@Override
public Object getLockOwner() {
return Thread.currentThread();
}
@Override
public Set<Object> getLockedKeys() {
return isLocked && key != null ? Collections.singleton(key) : Collections.emptySet();
}
@Override
public void clearLockedKeys() {
key = null;
cacheEntry = null;
}
@Override
public void addLockedKey(Object key) {
if (cacheEntry != null && !key.equals(this.key))
throw illegalStateException();
isLocked = true;
}
private IllegalStateException illegalStateException() {
return new IllegalStateException("This is a single key invocation context, using multiple keys shouldn't be possible");
}
@Override
public CacheEntry lookupEntry(Object key) {
if (key != null && key.equals(this.key)) return cacheEntry;
return null;
}
@Override
public Map<Object, CacheEntry> getLookedUpEntries() {
return key == null ? Collections.<Object, CacheEntry>emptyMap() : Collections.singletonMap(key, cacheEntry);
}
@Override
public void putLookedUpEntry(Object key, CacheEntry e) {
this.key = key;
this.cacheEntry = e;
}
@Override
public void putLookedUpEntries(Map<Object, CacheEntry> lookedUpEntries) {
if (lookedUpEntries.size() > 1) throw illegalStateException();
Map.Entry<Object, CacheEntry> e = lookedUpEntries.entrySet().iterator().next();
this.key = e.getKey();
this.cacheEntry = e.getValue();
}
@Override
public void removeLookedUpEntry(Object key) {
if (key.equals(this.key))
clearLockedKeys();
}
@Override
public void clearLookedUpEntries() {
clearLockedKeys();
}
public CacheEntry getCacheEntry() {
return cacheEntry;
}
}