package com.tesora.dve.locking;
/*
* #%L
* Tesora Inc.
* Database Virtualization Engine
* %%
* Copyright (C) 2011 - 2014 Tesora Inc.
* %%
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License, version 3,
* as published by the Free Software Foundation.
*
* This program 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 Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
* #L%
*/
import java.util.Collections;
import java.util.EnumMap;
import java.util.EnumSet;
import java.util.Map;
public enum LockMode {
UNLOCKED,
ACQUIRING_SHARED,
ACQUIRING_EXCLUSIVE,
ACQUIRING_EXCLUSIVE_WITH_SHARE,
SHARED,
EXCLUSIVE;
static final Map<LockMode, EnumSet<LockMode>> grants;
static final Map<LockMode, EnumSet<LockMode>> conflictsWith;
static final Map<LockMode, LockMode> wantedMode;
static final LockMode[] ordinalLookup;
static {
//-------------------------------------------------------------------------------------
EnumMap<LockMode, EnumSet<LockMode>> grantsMap = new EnumMap<LockMode, EnumSet<LockMode>>(LockMode.class);
grantsMap.put(UNLOCKED, EnumSet.of(UNLOCKED));
grantsMap.put(ACQUIRING_SHARED,EnumSet.of(UNLOCKED));
grantsMap.put(ACQUIRING_EXCLUSIVE,EnumSet.of(UNLOCKED));
grantsMap.put(ACQUIRING_EXCLUSIVE_WITH_SHARE,EnumSet.of(SHARED));
grantsMap.put(SHARED,EnumSet.of(SHARED));
grantsMap.put(EXCLUSIVE,EnumSet.of(SHARED,EXCLUSIVE));
grants = Collections.unmodifiableMap(grantsMap);
//-------------------------------------------------------------------------------------
EnumSet<LockMode> none = EnumSet.noneOf(LockMode.class);
EnumSet<LockMode> notUnlocked = EnumSet.complementOf(EnumSet.of(UNLOCKED));
EnumSet<LockMode> wantsExclusive = EnumSet.of(ACQUIRING_EXCLUSIVE, ACQUIRING_EXCLUSIVE_WITH_SHARE, EXCLUSIVE);
EnumMap<LockMode, EnumSet<LockMode>> conflictsMap = new EnumMap<LockMode, EnumSet<LockMode>>(LockMode.class);
conflictsMap.put(UNLOCKED, none);
conflictsMap.put(ACQUIRING_SHARED, wantsExclusive);
conflictsMap.put(ACQUIRING_EXCLUSIVE, notUnlocked);
conflictsMap.put(ACQUIRING_EXCLUSIVE_WITH_SHARE,notUnlocked);
conflictsMap.put(SHARED, wantsExclusive);
conflictsMap.put(EXCLUSIVE,notUnlocked);
conflictsWith = Collections.unmodifiableMap(conflictsMap);
//-------------------------------------------------------------------------------------
Map<LockMode, LockMode> wantedMap = new EnumMap<LockMode, LockMode>(LockMode.class);
wantedMap.put(UNLOCKED, UNLOCKED);
wantedMap.put(ACQUIRING_SHARED, SHARED);
wantedMap.put(ACQUIRING_EXCLUSIVE, EXCLUSIVE);
wantedMap.put(ACQUIRING_EXCLUSIVE_WITH_SHARE, EXCLUSIVE);
wantedMap.put(SHARED, SHARED);
wantedMap.put(EXCLUSIVE, EXCLUSIVE);
wantedMode = Collections.unmodifiableMap(wantedMap);
//-------------------------------------------------------------------------------------
ordinalLookup = LockMode.values();
}
public static LockMode forOrdinal(int ord){
return ordinalLookup[ord];
}
public EnumSet<LockMode> grants(){
return grants.get(this);
}
public EnumSet<LockMode> wouldGrant(){
return grants.get(this.wantedMode());
}
public boolean wouldGrant(LockMode mode){
return grants.get(this).contains(mode);
}
public boolean conflictsWith(LockMode mode){
return conflictsWith.get(this).contains(mode);
}
public LockMode wantedMode(){
return wantedMode.get(this);
}
public boolean isAcquiring(){
return wantedMode.get(this) != this;
}
}