22 package com.realtime.crossfire.jxclient.metaserver;
24 import java.io.BufferedWriter;
26 import java.io.FileInputStream;
27 import java.io.FileNotFoundException;
28 import java.io.FileOutputStream;
29 import java.io.IOException;
30 import java.io.InputStreamReader;
31 import java.io.LineNumberReader;
32 import java.io.OutputStreamWriter;
33 import java.util.HashMap;
34 import java.util.Iterator;
36 import java.util.Map.Entry;
37 import org.jetbrains.annotations.NotNull;
38 import org.jetbrains.annotations.Nullable;
50 public static final CharSequence
DEFAULT_ENTRY_LOCALHOST =
"0|localhost|0|--|Local server. Start server before you try to connect.|0|0|0|||";
57 private final Map<String, Info>
entries =
new HashMap<>();
81 entries.put(
makeKey(metaserverEntry),
new Info(metaserverEntry));
88 public void expire(
final long timestamp) {
89 final long now = System.currentTimeMillis();
91 final Iterator<Info> it = entries.values().iterator();
92 while (it.hasNext()) {
93 final Info info = it.next();
106 public Map<String, MetaserverEntry>
getAll() {
107 final Map<String, MetaserverEntry> result =
new HashMap<>();
108 for (
final Entry<String, Info> entry : entries.entrySet()) {
109 result.put(entry.getKey(), entry.getValue().getMetaserverEntry());
121 return metaserverEntry.getHostname();
133 try (
final FileInputStream fis =
new FileInputStream(file)) {
134 try (
final InputStreamReader isr =
new InputStreamReader(fis,
"UTF-8")) {
135 try (
final LineNumberReader lnr =
new LineNumberReader(isr)) {
137 final String line = lnr.readLine();
142 final String[] tmp = line.split(
" ", 2);
143 if (tmp.length != 2) {
144 System.err.println(file+
":"+lnr.getLineNumber()+
": syntax error");
148 final long timestamp;
150 timestamp = Long.parseLong(tmp[0]);
151 }
catch (
final NumberFormatException ignored) {
152 System.err.println(file+
":"+lnr.getLineNumber()+
": syntax error");
156 System.err.println(file+
":"+lnr.getLineNumber()+
": syntax error");
164 }
catch (
final FileNotFoundException ignored) {
166 final long now = System.currentTimeMillis()-1;
167 addEntry(DEFAULT_ENTRY_LOCALHOST, now);
168 addEntry(
"0|crossfire.metalforge.net|0|--|Latest SVN 1.x branch.<br>Eden Prairie, MN US<br>4.65Mb link<br><a href=\"http://crossfire.real-time.com\">crossfire.real-time.com</a>|0|0|0|Standard|Standard|Standard", now);
169 addEntry(
"0|invidious.meflin.net|0|--|<b>Welcome, we are testing 2.0 come on in the water is fine.</b>|0|0|0|Standard|Standard|Standard + Testing", now);
170 }
catch (
final IOException ex) {
171 System.err.println(file+
": "+ex.getMessage());
181 private boolean addEntry(@NotNull
final CharSequence metaserverEntryLine,
final long timestamp) {
183 if (metaserverEntry == null) {
187 entries.put(
makeKey(metaserverEntry),
new Info(metaserverEntry, timestamp));
201 }
catch (
final IOException ex) {
202 System.err.println(file+
": "+ex.getMessage());
211 private void saveInternal(@NotNull
final File file)
throws IOException {
212 try (
final FileOutputStream fos =
new FileOutputStream(file)) {
213 try (
final OutputStreamWriter osw =
new OutputStreamWriter(fos,
"UTF-8")) {
214 try (
final BufferedWriter bw =
new BufferedWriter(osw)) {
215 for (
final Info info : entries.values()) {
216 bw.write(Long.toString(info.getTimestamp()));
Represents a response line from the metaserver.
static String format(@NotNull final MetaserverEntry entry)
Formats a metaserver entry that returns the metaserver entry when parse with parseEntry(CharSequence)...
Parser for response lines of metaserver response lines.
static MetaserverEntry parseEntry(@NotNull final CharSequence entry)
Parses a metaserver response line.