001package org.javasimon.jdbc4.jmx;
002
003import org.javasimon.Manager;
004import org.javasimon.Simon;
005import org.javasimon.SimonState;
006import org.javasimon.Stopwatch;
007import org.javasimon.utils.SimonUtils;
008
009/**
010 * Jdbc MXBean implementation. See {@link JdbcMXBean} for interface
011 * documentation.
012 * Most methods are implemented by calling the {@link Manager}.
013 *
014 * @author Radovan Sninsky
015 * @author <a href="mailto:virgo47@gmail.com">Richard "Virgo" Richter</a>
016 * @since 2
017 */
018public class JdbcMXBeanImpl implements JdbcMXBean {
019        private Manager manager;
020        private String prefix;
021
022        /**
023         * MXBean constructor with prefix initialization to default ({@code org.javasimon.jdbc}).
024         *
025         * @param manager instance of {@link Manager}, typically {@code SimonManager.manager()}.
026         */
027        public JdbcMXBeanImpl(Manager manager) {
028                this.manager = manager;
029                this.prefix = "org.javasimon.jdbc";
030        }
031
032        /**
033         * MXBean constructor with custom prefix initialization.
034         *
035         * @param manager instance of {@link Manager}, typically {@code SimonManager.manager()}.
036         * @param prefix  custom prefix
037         */
038        public JdbcMXBeanImpl(Manager manager, String prefix) {
039                this.manager = manager;
040                this.prefix = prefix;
041        }
042
043        public String getPrefix() {
044                return prefix;
045        }
046
047        public void setPrefix(String value) {
048                prefix = value;
049        }
050
051        public void enableMonitoring() {
052                Simon s = manager.getSimon(prefix);
053                if (s != null) {
054                        s.setState(SimonState.ENABLED, true);
055                }
056        }
057
058        public void disableMonitoring() {
059                Simon s = manager.getSimon(prefix);
060                if (s != null) {
061                        s.setState(SimonState.DISABLED, true);
062                }
063        }
064
065        public boolean isMonitoringEnabled() {
066                return manager.getSimon(prefix) != null && manager.getSimon(prefix).isEnabled();
067        }
068
069        public JdbcObjectInfo connectionsStat() {
070                Stopwatch s = manager.getStopwatch(prefix + ".conn");
071
072                if (s != null) {
073                        return new JdbcObjectInfo(
074                                s.getActive(),
075                                s.getMaxActive(),
076                                s.getMaxActiveTimestamp(),
077                                s.getCounter(),
078                                s.getCounter() - s.getActive(),
079                                s.getMin(),
080                                s.getMax(),
081                                s.getTotal()
082                        );
083                }
084                return null;
085        }
086
087        public JdbcObjectInfo statementsStat() {
088                Stopwatch s = manager.getStopwatch(prefix + ".stmt");
089
090                if (s != null) {
091                        return new JdbcObjectInfo(
092                                s.getActive(),
093                                s.getMaxActive(),
094                                s.getMaxActiveTimestamp(),
095                                s.getCounter(),
096                                s.getCounter() - s.getActive(),
097                                s.getMin(),
098                                s.getMax(),
099                                s.getTotal()
100                        );
101                }
102                return null;
103        }
104
105        public JdbcObjectInfo resultsetsStat() {
106                return null;
107        }
108
109        public String[] getSqlCommands() {
110                Simon s = manager.getSimon(prefix + ".sql");
111                if (s != null) {
112                        String[] names = new String[s.getChildren().size()];
113                        int i = 0;
114                        for (Simon sn : s.getChildren()) {
115                                names[i++] = SimonUtils.localName(sn.getName());
116                        }
117                        return names;
118                } else {
119                        return new String[0];
120                }
121        }
122
123        public org.javasimon.jmx.StopwatchSample getSqlCommandStat(String cmdId) {
124                if (manager.getSimon(prefix + ".sql." + cmdId) != null) {
125                        return new org.javasimon.jmx.StopwatchSample(
126                                manager.getStopwatch(prefix + ".sql." + cmdId).sample());
127                }
128                return null;
129        }
130
131        public String[] getSqls(String cmdId) {
132                Simon s = manager.getSimon(prefix + ".sql." + cmdId);
133                if (s != null) {
134                        String[] names = new String[s.getChildren().size()];
135                        int i = 0;
136                        for (Simon sn : s.getChildren()) {
137                                names[i++] = SimonUtils.localName(sn.getName());
138                        }
139                        return names;
140                } else {
141                        return new String[0];
142                }
143        }
144
145        public org.javasimon.jmx.StopwatchSample getSqlStat(String sqlId) {
146                if (manager != null) {
147                        for (String simonName : manager.getSimonNames()) {
148                                if (SimonUtils.localName(simonName).equals(sqlId)) {
149                                        return new org.javasimon.jmx.StopwatchSample(
150                                                manager.getStopwatch(simonName).sample());
151                                }
152                        }
153                }
154                return null;
155        }
156}