Crossfire JXClient, Trunk  R20561
MetaserverModel.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 
25 import java.util.ArrayList;
26 import java.util.Collection;
27 import java.util.Collections;
28 import java.util.HashMap;
29 import java.util.List;
30 import java.util.Map;
31 import org.jetbrains.annotations.NotNull;
32 import org.jetbrains.annotations.Nullable;
33 
39 public class MetaserverModel {
40 
44  @NotNull
45  private final List<MetaserverEntry> metaList = new ArrayList<>();
46 
51  @NotNull
52  private final Collection<MetaserverEntry> metaListPending = new ArrayList<>();
53 
57  @NotNull
58  private final Object sync = new Object();
59 
63  @NotNull
65 
70  @NotNull
71  private final Map<Integer, EventListenerList2<MetaserverEntryListener>> metaserverEntryListeners = new HashMap<>();
72 
78  @Nullable
79  public MetaserverEntry getEntry(final int index) {
80  try {
81  synchronized (sync) {
82  return metaList.get(index);
83  }
84  } catch (final IndexOutOfBoundsException ignored) {
85  return null;
86  }
87  }
88 
94  public int getServerIndex(@NotNull final String serverName) {
95  synchronized (sync) {
96  int index = 0;
97  for (final MetaserverEntry metaserverEntry : metaList) {
98  if (metaserverEntry.getHostname().equals(serverName)) {
99  return index;
100  }
101 
102  index++;
103  }
104  }
105 
106  return -1;
107  }
108 
113  public int size() {
114  synchronized (sync) {
115  return metaList.size();
116  }
117  }
118 
123  public void addMetaserverEntry(@NotNull final MetaserverEntry metaserverEntry) {
124  synchronized (sync) {
125  metaListPending.add(metaserverEntry);
126  }
127  }
128 
132  public void begin() {
133  metaListPending.clear();
134  }
135 
139  public void commit() {
140  final int oldMetaListSize;
141  final int newMetaListSize;
142  synchronized (sync) {
143  oldMetaListSize = metaList.size();
144  metaList.clear();
145  metaList.addAll(metaListPending);
146  Collections.sort(metaList);
147  newMetaListSize = metaList.size();
148  }
149  metaListPending.clear();
150 
151  for (final MetaserverListener metaserverListener : metaserverListeners) {
152  metaserverListener.numberOfEntriesChanged();
153  }
154 
155  for (int i = 0, iMax = Math.max(oldMetaListSize, newMetaListSize); i < iMax; i++) {
156  for (final MetaserverEntryListener metaserverEntryListener : getMetaserverEntryListeners(i)) {
157  metaserverEntryListener.entryChanged();
158  }
159  }
160  }
161 
166  public void addMetaserverListener(@NotNull final MetaserverListener listener) {
167  metaserverListeners.add(listener);
168  }
169 
174  public void removeMetaserverListener(@NotNull final MetaserverListener listener) {
175  metaserverListeners.remove(listener);
176  }
177 
183  public void addMetaserverEntryListener(final int index, @NotNull final MetaserverEntryListener listener) {
184  getMetaserverEntryListeners(index).add(listener);
185  }
186 
192  public void removeMetaserverEntryListener(final int index, @NotNull final MetaserverEntryListener listener) {
193  getMetaserverEntryListeners(index).remove(listener);
194  }
195 
201  @NotNull
203  synchronized (metaserverEntryListeners) {
204  final EventListenerList2<MetaserverEntryListener> existingListeners = metaserverEntryListeners.get(index);
205  if (existingListeners != null) {
206  return existingListeners;
207  }
208 
210  metaserverEntryListeners.put(index, newListeners);
211  return newListeners;
212  }
213  }
214 
215 }
Interface for listeners on metaserver related events.
final EventListenerList2< MetaserverListener > metaserverListeners
All registered metaserver listeners.
EventListenerList2< MetaserverEntryListener > getMetaserverEntryListeners(final int index)
Returns the metaserver entry listeners for one entry index.
int size()
Returns the number of metaserver entries.
int getServerIndex(@NotNull final String serverName)
Returns the index of an entry by server name.
Represents a response line from the metaserver.
MetaserverEntry getEntry(final int index)
Returns a metaserver entry by index.
void removeMetaserverEntryListener(final int index, @NotNull final MetaserverEntryListener listener)
Removes a metaserver entry listener for one entry.
final Map< Integer, EventListenerList2< MetaserverEntryListener > > metaserverEntryListeners
All registered metaserver entry listeners.
void add(@NotNull final T listener)
Adds a listener.
void addMetaserverListener(@NotNull final MetaserverListener listener)
Adds a metaserver listener.
void removeMetaserverListener(@NotNull final MetaserverListener listener)
Removes a metaserver listener.
Interface for listeners on metaserver entry related events.
final List< MetaserverEntry > metaList
The current entries.
final Collection< MetaserverEntry > metaListPending
The pending entries.
void addMetaserverEntryListener(final int index, @NotNull final MetaserverEntryListener listener)
Adds a metaserver entry listener for one entry.
void remove(@NotNull final T listener)
Removes a listener.
void addMetaserverEntry(@NotNull final MetaserverEntry metaserverEntry)
Adds an entry.
final Object sync
Object used for synchronization.