00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 package com.realtime.crossfire.jxclient.metaserver;
00023
00024 import java.io.BufferedReader;
00025 import java.io.File;
00026 import java.io.IOException;
00027 import java.io.InputStream;
00028 import java.io.InputStreamReader;
00029 import java.net.HttpURLConnection;
00030 import java.net.URL;
00031 import java.util.Map;
00032 import org.jetbrains.annotations.NotNull;
00033
00039 public class Metaserver {
00040
00044 private static final long EXPIRE_INTERVAL = 60L*60*24*2;
00045
00049 @NotNull
00050 private static final String METASERVER_URL = "http://crossfire.real-time.com/metaserver2/meta_client.php";
00051
00055 @NotNull
00056 private final ServerCache serverCache;
00057
00061 @NotNull
00062 private final MetaserverModel metaserverModel;
00063
00069 public Metaserver(@NotNull final File metaserverCacheFile, @NotNull final MetaserverModel metaserverModel) {
00070 serverCache = new ServerCache(metaserverCacheFile);
00071 this.metaserverModel = metaserverModel;
00072 metaserverModel.begin();
00073 for (final MetaserverEntry metaserverEntry : serverCache.getAll().values()) {
00074 metaserverModel.add(metaserverEntry);
00075 }
00076 metaserverModel.commit();
00077 }
00078
00082 public void updateMetaList() {
00083 metaserverModel.begin();
00084
00085 serverCache.expire(EXPIRE_INTERVAL*1000);
00086 final Map<String, MetaserverEntry> oldEntries = serverCache.getAll();
00087
00088 final MetaserverEntry localhostMetaserverEntry = MetaserverEntryParser.parseEntry(ServerCache.DEFAULT_ENTRY_LOCALHOST);
00089 assert localhostMetaserverEntry != null;
00090 metaserverModel.add(localhostMetaserverEntry);
00091 oldEntries.remove(ServerCache.makeKey(localhostMetaserverEntry));
00092 serverCache.put(localhostMetaserverEntry);
00093
00094 try {
00095 final URL url = new URL(METASERVER_URL);
00096 final String httpProxy = System.getenv("http_proxy");
00097 if (httpProxy != null && httpProxy.length() > 0) {
00098 if (httpProxy.regionMatches(true, 0, "http://", 0, 7)) {
00099 final String[] tmp = httpProxy.substring(7).replaceAll("/.*", "").split(":", 2);
00100 System.setProperty("http.proxyHost", tmp[0]);
00101 System.setProperty("http.proxyPort", tmp.length >= 2 ? tmp[1] : "80");
00102 } else {
00103 System.err.println("Warning: unsupported http_proxy protocol: "+httpProxy);
00104 }
00105 }
00106 final HttpURLConnection conn = (HttpURLConnection)url.openConnection();
00107 try {
00108 conn.setRequestMethod("GET");
00109 conn.setUseCaches(false);
00110 conn.connect();
00111 if (conn.getResponseCode() == HttpURLConnection.HTTP_OK) {
00112 final InputStream in = conn.getInputStream();
00113 final InputStreamReader isr = new InputStreamReader(in, "ISO-8859-1");
00114 try {
00115 final BufferedReader br = new BufferedReader(isr);
00116 try {
00117 final MetaserverEntryParser metaserverEntryParser = new MetaserverEntryParser();
00118 while (true) {
00119 final String line = br.readLine();
00120 if (line == null) {
00121 break;
00122 }
00123
00124 final MetaserverEntry metaserverEntry = metaserverEntryParser.parseLine(line);
00125 if (metaserverEntry != null) {
00126 metaserverModel.add(metaserverEntry);
00127 oldEntries.remove(ServerCache.makeKey(metaserverEntry));
00128 serverCache.put(metaserverEntry);
00129 }
00130 }
00131 } finally {
00132 br.close();
00133 }
00134 } finally {
00135 isr.close();
00136 }
00137 }
00138 } finally {
00139 conn.disconnect();
00140 }
00141 } catch (final IOException ignored) {
00142
00143 }
00144
00145
00146 for (final MetaserverEntry metaserverEntry : oldEntries.values()) {
00147 metaserverModel.add(metaserverEntry);
00148 }
00149
00150 metaserverModel.commit();
00151 serverCache.save();
00152 }
00153
00154 }