Crossfire JXClient, Trunk  R20561
Metaserver.java
Go to the documentation of this file.
1 /*
2  * This file is part of JXClient, the Fullscreen Java Crossfire Client.
3  *
4  * JXClient is free software; you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License as published by
6  * the Free Software Foundation; either version 2 of the License, or
7  * (at your option) any later version.
8  *
9  * JXClient is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with JXClient; if not, write to the Free Software
16  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
17  *
18  * Copyright (C) 2005-2008 Yann Chachkoff.
19  * Copyright (C) 2006-2011 Andreas Kirschbaum.
20  */
21 
22 package com.realtime.crossfire.jxclient.metaserver;
23 
24 import java.io.BufferedReader;
25 import java.io.File;
26 import java.io.IOException;
27 import java.io.InputStream;
28 import java.io.InputStreamReader;
29 import java.net.HttpURLConnection;
30 import java.net.URL;
31 import java.util.Map;
32 import org.jetbrains.annotations.NotNull;
33 
39 public class Metaserver {
40 
44  private static final long EXPIRE_INTERVAL = 60L*60*24*2;
45 
49  @NotNull
50  private static final String METASERVER_URL = "http://crossfire.real-time.com/metaserver2/meta_client.php";
51 
55  @NotNull
56  private final ServerCache serverCache;
57 
61  @NotNull
63 
69  public Metaserver(@NotNull final File metaserverCacheFile, @NotNull final MetaserverModel metaserverModel) {
70  serverCache = new ServerCache(metaserverCacheFile);
71  this.metaserverModel = metaserverModel;
72  metaserverModel.begin();
73  serverCache.getAll().values().forEach(metaserverModel::addMetaserverEntry);
74  metaserverModel.commit();
75  }
76 
80  public void updateMetaList() {
81  metaserverModel.begin();
82 
83  serverCache.expire(EXPIRE_INTERVAL*1000);
84  final Map<String, MetaserverEntry> oldEntries = serverCache.getAll();
85 
87  assert localhostMetaserverEntry != null;
88  metaserverModel.addMetaserverEntry(localhostMetaserverEntry);
89  oldEntries.remove(ServerCache.makeKey(localhostMetaserverEntry));
90  serverCache.put(localhostMetaserverEntry);
91 
92  try {
93  final URL url = new URL(METASERVER_URL);
94  final String httpProxy = System.getenv("http_proxy");
95  if (httpProxy != null && !httpProxy.isEmpty()) {
96  if (httpProxy.regionMatches(true, 0, "http://", 0, 7)) {
97  final String[] tmp = httpProxy.substring(7).replaceAll("/.*", "").split(":", 2);
98  System.setProperty("http.proxyHost", tmp[0]);
99  System.setProperty("http.proxyPort", tmp.length >= 2 ? tmp[1] : "80");
100  } else {
101  System.err.println("Warning: unsupported http_proxy protocol: "+httpProxy);
102  }
103  }
104  final HttpURLConnection conn = (HttpURLConnection)url.openConnection();
105  try {
106  conn.setRequestMethod("GET");
107  conn.setUseCaches(false);
108  conn.connect();
109  if (conn.getResponseCode() == HttpURLConnection.HTTP_OK) {
110  final InputStream in = conn.getInputStream();
111  try (final InputStreamReader isr = new InputStreamReader(in, "ISO-8859-1")) {
112  try (final BufferedReader br = new BufferedReader(isr)) {
113  final MetaserverEntryParser metaserverEntryParser = new MetaserverEntryParser();
114  while (true) {
115  final String line = br.readLine();
116  if (line == null) {
117  break;
118  }
119 
120  final MetaserverEntry metaserverEntry = metaserverEntryParser.parseLine(line);
121  if (metaserverEntry != null) {
122  metaserverModel.addMetaserverEntry(metaserverEntry);
123  oldEntries.remove(ServerCache.makeKey(metaserverEntry));
124  serverCache.put(metaserverEntry);
125  }
126  }
127  }
128  }
129  }
130  } finally {
131  conn.disconnect();
132  }
133  } catch (final IOException ignored) {
134  // ignore (but keep already parsed entries)
135  }
136 
137  // add previously known entries that are not anymore present
138  oldEntries.values().forEach(metaserverModel::addMetaserverEntry);
139 
140  metaserverModel.commit();
141  serverCache.save();
142  }
143 
144 }
Metaserver(@NotNull final File metaserverCacheFile, @NotNull final MetaserverModel metaserverModel)
Creates a new instance.
Definition: Metaserver.java:69
static final String METASERVER_URL
The metaserver URL.
Definition: Metaserver.java:50
Map< String, MetaserverEntry > getAll()
Returns all cached entries.
static String makeKey(@NotNull final MetaserverEntry metaserverEntry)
Returns the key for a metaserver entry.
final MetaserverModel metaserverModel
The MetaserverModel instance to update.
Definition: Metaserver.java:62
Maintains a set of known servers backed up in a file.
void expire(final long timestamp)
Expires entries older than a given timestamp from the cache.
void updateMetaList()
Updates the contents of metaserverModel.
Definition: Metaserver.java:80
Represents a response line from the metaserver.
static final long EXPIRE_INTERVAL
The time (in seconds) to forget about old metaserver entries.
Definition: Metaserver.java:44
Queries Crossfire&#39;s metaserver to learn about existing servers.
Definition: Metaserver.java:39
static final CharSequence DEFAULT_ENTRY_LOCALHOST
The default entry for the "localhost" server.
MetaserverEntry parseLine(@NotNull final String line)
Parses a metaserver response line.
Parser for response lines of metaserver response lines.
static MetaserverEntry parseEntry(@NotNull final CharSequence entry)
Parses a metaserver response line.
final ServerCache serverCache
The cached metaserver entries.
Definition: Metaserver.java:56
void put(@NotNull final MetaserverEntry metaserverEntry)
Adds an entry to the cache.
void save()
Saves all entries to the backing file.
void addMetaserverEntry(@NotNull final MetaserverEntry metaserverEntry)
Adds an entry.