    001    package net.minecraft.profiler;
    002
    003    import cpw.mods.fml.common.Side;
    004    import cpw.mods.fml.common.asm.SideOnly;
    005    import java.lang.management.ManagementFactory;
    006    import java.lang.management.RuntimeMXBean;
    007    import java.net.MalformedURLException;
    008    import java.net.URL;
    009    import java.util.HashMap;
    010    import java.util.Iterator;
    011    import java.util.LinkedHashMap;
    012    import java.util.List;
    013    import java.util.Map;
    014    import java.util.Timer;
    015    import java.util.UUID;
    016    import java.util.Map.Entry;
    017
    018    public class PlayerUsageSnooper
    019    {
    020        /** String map for report data */
    021        private Map dataMap = new HashMap();
    022        private final String uniqueID = UUID.randomUUID().toString();
    023
    024        /** URL of the server to send the report to */
    025        private final URL serverUrl;
    026        private final IPlayerUsage playerStatsCollector;
    027
    028        /** set to fire the snooperThread every 15 mins */
    029        private final Timer threadTrigger = new Timer("Snooper Timer", true);
    030        private final Object syncLock = new Object();
    031        private boolean isRunning = false;
    032
    033        /** incremented on every getSelfCounterFor */
    034        private int selfCounter = 0;
    035
    036        public PlayerUsageSnooper(String par1Str, IPlayerUsage par2IPlayerUsage)
    037        {
    038            try
    039            {
    040                this.serverUrl = new URL("http://snoop.minecraft.net/" + par1Str + "?version=" + 1);
    041            }
    042            catch (MalformedURLException var4)
    043            {
    044                throw new IllegalArgumentException();
    045            }
    046
    047            this.playerStatsCollector = par2IPlayerUsage;
    048        }
    049
    050        /**
    051         * Note issuing start multiple times is not an error.
    052         */
    053        public void startSnooper()
    054        {
    055            if (!this.isRunning)
    056            {
    057                this.isRunning = true;
    058                this.addBaseDataToSnooper();
    059                this.threadTrigger.schedule(new PlayerUsageSnooperThread(this), 0L, 900000L);
    060            }
    061        }
    062
    063        private void addBaseDataToSnooper()
    064        {
    065            this.addJvmArgsToSnooper();
    066            this.addData("snooper_token", this.uniqueID);
    067            this.addData("os_name", System.getProperty("os.name"));
    068            this.addData("os_version", System.getProperty("os.version"));
    069            this.addData("os_architecture", System.getProperty("os.arch"));
    070            this.addData("java_version", System.getProperty("java.version"));
    071            this.addData("version", "1.4.5");
    072            this.playerStatsCollector.addServerTypeToSnooper(this);
    073        }
    074
    075        private void addJvmArgsToSnooper()
    076        {
    077            RuntimeMXBean var1 = ManagementFactory.getRuntimeMXBean();
    078            List var2 = var1.getInputArguments();
    079            int var3 = 0;
    080            Iterator var4 = var2.iterator();
    081
    082            while (var4.hasNext())
    083            {
    084                String var5 = (String)var4.next();
    085
    086                if (var5.startsWith("-X"))
    087                {
    088                    this.addData("jvm_arg[" + var3++ + "]", var5);
    089                }
    090            }
    091
    092            this.addData("jvm_args", Integer.valueOf(var3));
    093        }
    094
    095        public void addMemoryStatsToSnooper()
    096        {
    097            this.addData("memory_total", Long.valueOf(Runtime.getRuntime().totalMemory()));
    098            this.addData("memory_max", Long.valueOf(Runtime.getRuntime().maxMemory()));
    099            this.addData("memory_free", Long.valueOf(Runtime.getRuntime().freeMemory()));
    100            this.addData("cpu_cores", Integer.valueOf(Runtime.getRuntime().availableProcessors()));
    101            this.playerStatsCollector.addServerStatsToSnooper(this);
    102        }
    103
    104        /**
    105         * Adds information to the report
    106         */
    107        public void addData(String par1Str, Object par2Obj)
    108        {
    109            Object var3 = this.syncLock;
    110
    111            synchronized (this.syncLock)
    112            {
    113                this.dataMap.put(par1Str, par2Obj);
    114            }
    115        }
    116
    117        @SideOnly(Side.CLIENT)
    118        public Map getCurrentStats()
    119        {
    120            LinkedHashMap var1 = new LinkedHashMap();
    121            Object var2 = this.syncLock;
    122
    123            synchronized (this.syncLock)
    124            {
    125                this.addMemoryStatsToSnooper();
    126                Iterator var3 = this.dataMap.entrySet().iterator();
    127
    128                while (var3.hasNext())
    129                {
    130                    Entry var4 = (Entry)var3.next();
    131                    var1.put(var4.getKey(), var4.getValue().toString());
    132                }
    133
    134                return var1;
    135            }
    136        }
    137
    138        public boolean isSnooperRunning()
    139        {
    140            return this.isRunning;
    141        }
    142
    143        public void stopSnooper()
    144        {
    145            this.threadTrigger.cancel();
    146        }
    147
    148        @SideOnly(Side.CLIENT)
    149        public String getUniqueID()
    150        {
    151            return this.uniqueID;
    152        }
    153
    154        static IPlayerUsage getStatsCollectorFor(PlayerUsageSnooper par0PlayerUsageSnooper)
    155        {
    156            return par0PlayerUsageSnooper.playerStatsCollector;
    157        }
    158
    159        static Object getSyncLockFor(PlayerUsageSnooper par0PlayerUsageSnooper)
    160        {
    161            return par0PlayerUsageSnooper.syncLock;
    162        }
    163
    164        static Map getDataMapFor(PlayerUsageSnooper par0PlayerUsageSnooper)
    165        {
    166            return par0PlayerUsageSnooper.dataMap;
    167        }
    168
    169        /**
    170         * returns a value indicating how many times this function has been run on the snooper
    171         */
    172        static int getSelfCounterFor(PlayerUsageSnooper par0PlayerUsageSnooper)
    173        {
    174            return par0PlayerUsageSnooper.selfCounter++;
    175        }
    176
    177        static URL getServerUrlFor(PlayerUsageSnooper par0PlayerUsageSnooper)
    178        {
    179            return par0PlayerUsageSnooper.serverUrl;
    180        }
    181    }