001 package net.minecraft.profiler;
002
003 import cpw.mods.fml.relauncher.Side;
004 import cpw.mods.fml.relauncher.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.7");
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 }