001package org.nuxeo.ecm.core.management.jtajca.internal;
002
003import java.util.Arrays;
004import java.util.Collection;
005import java.util.Comparator;
006
007import javax.management.ObjectInstance;
008
009import org.nuxeo.ecm.core.api.CoreInstance;
010import org.nuxeo.ecm.core.api.CoreInstance.RegistrationInfo;
011import org.nuxeo.ecm.core.management.jtajca.CoreSessionMonitor;
012import org.nuxeo.ecm.core.management.jtajca.Defaults;
013import org.nuxeo.runtime.metrics.MetricsService;
014
015import com.codahale.metrics.JmxAttributeGauge;
016import com.codahale.metrics.MetricRegistry;
017import com.codahale.metrics.SharedMetricRegistries;
018
019public class DefaultCoreSessionMonitor implements CoreSessionMonitor {
020
021    // @since 5.7.2
022    protected final MetricRegistry registry = SharedMetricRegistries.getOrCreate(MetricsService.class.getName());
023
024    @Override
025    public int getCount() {
026        return CoreInstance.getInstance().getNumberOfSessions();
027    }
028
029    @Override
030    public String[] getInfos() {
031        return toInfos(toSortedRegistration(CoreInstance.getInstance().getRegistrationInfos()));
032    }
033
034    public RegistrationInfo[] toSortedRegistration(Collection<RegistrationInfo> infos) {
035        RegistrationInfo[] sortedInfos = infos.toArray(new RegistrationInfo[infos.size()]);
036        Arrays.sort(sortedInfos, new Comparator<RegistrationInfo>() {
037
038            @Override
039            public int compare(RegistrationInfo o1, RegistrationInfo o2) {
040                return o2.session.getSessionId().compareTo(o1.session.getSessionId());
041            }
042
043        });
044        return sortedInfos;
045    }
046
047    public String[] toInfos(RegistrationInfo[] infos) {
048        String[] values = new String[infos.length];
049        for (int i = 0; i < infos.length; ++i) {
050            values[i] = Defaults.instance.printStackTrace(infos[i]);
051        }
052        return values;
053    }
054
055    protected ObjectInstance self;
056
057    @Override
058    public void install() {
059        self = DefaultMonitorComponent.bind(CoreSessionMonitor.class, this);
060        registry.register(MetricRegistry.name("nuxeo.repositories", "sessions"),
061                new JmxAttributeGauge(self.getObjectName(), "Count"));
062    }
063
064    @Override
065    public void uninstall() {
066        DefaultMonitorComponent.unbind(self);
067        registry.remove(MetricRegistry.name("nuxeo.repositories", "sessions"));
068        self = null;
069    }
070
071}