/*
* Copyright (C) 2008-2015 by Holger Arndt
*
* This file is part of the Universal Java Matrix Package (UJMP).
* See the NOTICE file distributed with this work for additional
* information regarding copyright ownership and licensing.
*
* UJMP 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
* of the License, or (at your option) any later version.
*
* UJMP 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 UJMP; if not, write to the
* Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
* Boston, MA 02110-1301 USA
*/
package org.ujmp.core.util.matrices;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import java.util.TimerTask;
import org.ujmp.core.Coordinates;
import org.ujmp.core.mapmatrix.DefaultMapMatrix;
import org.ujmp.core.mapmatrix.MapMatrix;
import org.ujmp.core.util.UJMPTimer;
public class RunningThreadsMatrix extends DefaultMapMatrix<Object, Object> {
private static final long serialVersionUID = -6988423129848472319L;
private final UJMPTimer timer;
public RunningThreadsMatrix() {
super(ThreadMap.getInstance());
setLabel("Running Threads");
setColumnLabel(0, "Thread");
setColumnLabel(1, "StackTrace");
final RunningThreadsMatrix m = this;
TimerTask task = new TimerTask() {
private MapMatrix<Object, Object> oldMap = new DefaultMapMatrix<Object, Object>();
@Override
public void run() {
if (oldMap.size() != size()) {
oldMap.clear();
oldMap.putAll(m);
m.fireValueChanged();
} else {
for (Object key : oldMap.keySet()) {
if (!oldMap.containsKey(key)) {
oldMap.clear();
oldMap.putAll(m);
m.fireValueChanged();
break;
} else {
Object value = m.get(key);
if (value != oldMap.get(key)) {
oldMap.put(key, value);
m.fireValueChanged(Coordinates.wrap(m.indexOfKey(key), 1), value);
}
}
}
}
}
};
timer = UJMPTimer.newInstance(this.getClass().getSimpleName());
timer.schedule(task, 1000, 1000);
}
}
class ThreadMap implements Map<Object, Object> {
private static ThreadMap threadMap = null;
public static ThreadMap getInstance() {
if (threadMap == null) {
threadMap = new ThreadMap();
}
return threadMap;
}
public void clear() {
}
public boolean containsKey(Object key) {
return Thread.getAllStackTraces().containsKey(key);
}
public boolean containsValue(Object value) {
return Thread.getAllStackTraces().containsValue(value);
}
public Set<java.util.Map.Entry<Object, Object>> entrySet() {
return Collections.emptySet();
}
public Object get(Object key) {
StackTraceElement[] st = Thread.getAllStackTraces().get(key);
if (st != null) {
return Arrays.asList(st);
} else {
return null;
}
}
public boolean isEmpty() {
return Thread.getAllStackTraces().isEmpty();
}
public Set<Object> keySet() {
return new HashSet<Object>(Thread.getAllStackTraces().keySet());
}
public Object put(Object key, Object value) {
return null;
}
public void putAll(Map<? extends Object, ? extends Object> m) {
}
public Object remove(Object key) {
return null;
}
public int size() {
return Thread.getAllStackTraces().size();
}
public Collection<Object> values() {
return new ArrayList<Object>(Thread.getAllStackTraces().values());
}
}