blob: 34baa378bebdb1becdd5016d90bfb04a70b14924 [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.management.internal.beans;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.apache.geode.distributed.internal.locks.DLockService;
import org.apache.geode.distributed.internal.locks.DLockToken;
import org.apache.geode.management.internal.ManagementConstants;
/**
* This class acts as a Bridge between JMX layer and GemFire layer
*
*
*/
public class LockServiceMBeanBridge {
private DLockService lockService;
public LockServiceMBeanBridge(DLockService lockService) {
this.lockService = lockService;
}
/** Operations **/
public void becomeLockGrantor() {
lockService.becomeLockGrantor();
}
/**
*
* @return currently held lock by this lock Service
*/
public String[] listHeldLocks() {
Map<Object, DLockToken> tokenMap = lockService.snapshotService();
Iterator<Object> it = tokenMap.keySet().iterator();
List<String> listOfLocks = new ArrayList<String>();
int j = 0;
while (it.hasNext()) {
Object lockObject = it.next();
DLockToken token = tokenMap.get(lockObject);
if (token.getUsageCount() > 0) {
// As lock objects are of Object type, this is the best
// info we can give
listOfLocks.add(lockObject.toString());
}
}
if (listOfLocks.size() > 0) {
String[] retStr = new String[listOfLocks.size()];
listOfLocks.toArray(retStr);
return retStr;
}
return ManagementConstants.NO_DATA_STRING;
}
/** Config Data **/
public boolean isDistributed() {
return lockService.isDistributed();
}
public boolean isLockGrantor() {
return lockService.isLockGrantor();
}
public String fetchGrantorMember() {
return lockService.peekLockGrantorId() != null
? lockService.peekLockGrantorId().getLockGrantorMember().getId() : null;
}
public int getMemberCount() {
return 0;
}
public String[] getMemberNames() {
return ManagementConstants.NO_DATA_STRING;
}
public String getName() {
return lockService.getName();
}
/**
* Returns a list of thread which are blocked on some Object
*
* @return map of object Name and thread holding lock on that object
*/
public Map<String, String> listThreadsHoldingLock() {
Map<Object, DLockToken> tokenMap = lockService.snapshotService();
Iterator<Object> it = tokenMap.keySet().iterator();
Map<String, String> listOfLocks = new HashMap<String, String>();
int j = 0;
while (it.hasNext()) {
Object lockObject = it.next();
DLockToken token = tokenMap.get(lockObject);
if (token.getUsageCount() > 0) {
listOfLocks.put(lockObject.toString(), token.getThreadName());
}
}
return listOfLocks;
}
}