Crossfire JXClient, Trunk
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-2017,2019-2023 Andreas Kirschbaum
20  * Copyright (C) 2010-2012,2014-2018,2020-2023 Nicolas Weeger
21  */
22 
23 package com.realtime.crossfire.jxclient.metaserver;
24 
26 import java.util.ArrayList;
27 import java.util.Collection;
28 import java.util.Collections;
29 import java.util.HashMap;
30 import java.util.List;
31 import java.util.Map;
32 import org.jetbrains.annotations.NotNull;
33 import org.jetbrains.annotations.Nullable;
34 
40 public class MetaserverModel {
41 
45  @NotNull
46  private final List<MetaserverEntry> metaList = new ArrayList<>();
47 
52  @NotNull
53  private final Collection<MetaserverEntry> metaListPending = new ArrayList<>();
54 
58  @NotNull
59  private final Object sync = new Object();
60 
64  @NotNull
66 
71  @NotNull
72  private final Map<Integer, EventListenerList2<MetaserverEntryListener>> metaserverEntryListeners = new HashMap<>();
73 
79  @Nullable
80  public MetaserverEntry getEntry(final int index) {
81  try {
82  synchronized (sync) {
83  return metaList.get(index);
84  }
85  } catch (final IndexOutOfBoundsException ignored) {
86  return null;
87  }
88  }
89 
95  public int getServerIndex(@NotNull final String serverName) {
96  synchronized (sync) {
97  int index = 0;
98  for (MetaserverEntry metaserverEntry : metaList) {
99  if (metaserverEntry.getHostname().equals(serverName)) {
100  return index;
101  }
102 
103  index++;
104  }
105  }
106 
107  return -1;
108  }
109 
114  public int size() {
115  synchronized (sync) {
116  return metaList.size();
117  }
118  }
119 
124  public void addMetaserverEntry(@NotNull final MetaserverEntry metaserverEntry) {
125  synchronized (sync) {
126  metaListPending.add(metaserverEntry);
127  }
128  }
129 
133  public void begin() {
134  metaListPending.clear();
135  }
136 
140  public void commit() {
141  final int oldMetaListSize;
142  final int newMetaListSize;
143  synchronized (sync) {
144  oldMetaListSize = metaList.size();
145  metaList.clear();
146  metaList.addAll(metaListPending);
147  Collections.sort(metaList);
148  newMetaListSize = metaList.size();
149  }
150  metaListPending.clear();
151 
152  for (MetaserverListener metaserverListener : metaserverListeners) {
153  metaserverListener.numberOfEntriesChanged();
154  }
155 
156  for (int i = 0, iMax = Math.max(oldMetaListSize, newMetaListSize); i < iMax; i++) {
157  for (MetaserverEntryListener metaserverEntryListener : getMetaserverEntryListeners(i)) {
158  metaserverEntryListener.entryChanged();
159  }
160  }
161  }
162 
167  public void addMetaserverListener(@NotNull final MetaserverListener listener) {
168  metaserverListeners.add(listener);
169  }
170 
175  public void removeMetaserverListener(@NotNull final MetaserverListener listener) {
176  metaserverListeners.remove(listener);
177  }
178 
184  public void addMetaserverEntryListener(final int index, @NotNull final MetaserverEntryListener listener) {
185  getMetaserverEntryListeners(index).add(listener);
186  }
187 
193  public void removeMetaserverEntryListener(final int index, @NotNull final MetaserverEntryListener listener) {
194  getMetaserverEntryListeners(index).remove(listener);
195  }
196 
202  @NotNull
204  synchronized (metaserverEntryListeners) {
205  final EventListenerList2<MetaserverEntryListener> existingListeners = metaserverEntryListeners.get(index);
206  if (existingListeners != null) {
207  return existingListeners;
208  }
209 
211  metaserverEntryListeners.put(index, newListeners);
212  return newListeners;
213  }
214  }
215 
216 }
com.realtime.crossfire.jxclient
com.realtime.crossfire.jxclient.metaserver.MetaserverModel.metaserverEntryListeners
final Map< Integer, EventListenerList2< MetaserverEntryListener > > metaserverEntryListeners
Definition: MetaserverModel.java:72
com.realtime.crossfire.jxclient.metaserver.MetaserverModel.addMetaserverEntryListener
void addMetaserverEntryListener(final int index, @NotNull final MetaserverEntryListener listener)
Definition: MetaserverModel.java:184
com.realtime.crossfire.jxclient.metaserver.MetaserverModel.metaList
final List< MetaserverEntry > metaList
Definition: MetaserverModel.java:46
com.realtime.crossfire.jxclient.metaserver.MetaserverListener
Definition: MetaserverListener.java:31
com.realtime.crossfire.jxclient.util.EventListenerList2
Definition: EventListenerList2.java:37
com.realtime.crossfire.jxclient.metaserver.MetaserverModel.addMetaserverListener
void addMetaserverListener(@NotNull final MetaserverListener listener)
Definition: MetaserverModel.java:167
com.realtime.crossfire.jxclient.metaserver.MetaserverModel.getEntry
MetaserverEntry getEntry(final int index)
Definition: MetaserverModel.java:80
com.realtime.crossfire.jxclient.metaserver.MetaserverModel.commit
void commit()
Definition: MetaserverModel.java:140
com.realtime.crossfire.jxclient.metaserver.MetaserverModel.removeMetaserverEntryListener
void removeMetaserverEntryListener(final int index, @NotNull final MetaserverEntryListener listener)
Definition: MetaserverModel.java:193
com.realtime.crossfire.jxclient.metaserver.MetaserverModel.sync
final Object sync
Definition: MetaserverModel.java:59
com.realtime.crossfire.jxclient.util
Definition: Codec.java:23
com.realtime.crossfire.jxclient.metaserver.MetaserverModel.size
int size()
Definition: MetaserverModel.java:114
com.realtime.crossfire.jxclient.metaserver.MetaserverModel.metaListPending
final Collection< MetaserverEntry > metaListPending
Definition: MetaserverModel.java:53
com.realtime.crossfire
com.realtime
com
com.realtime.crossfire.jxclient.metaserver.MetaserverModel.addMetaserverEntry
void addMetaserverEntry(@NotNull final MetaserverEntry metaserverEntry)
Definition: MetaserverModel.java:124
com.realtime.crossfire.jxclient.metaserver.MetaserverModel.getServerIndex
int getServerIndex(@NotNull final String serverName)
Definition: MetaserverModel.java:95
com.realtime.crossfire.jxclient.metaserver.MetaserverModel.metaserverListeners
final EventListenerList2< MetaserverListener > metaserverListeners
Definition: MetaserverModel.java:65
com.realtime.crossfire.jxclient.metaserver.MetaserverModel.begin
void begin()
Definition: MetaserverModel.java:133
com.realtime.crossfire.jxclient.metaserver.MetaserverModel.removeMetaserverListener
void removeMetaserverListener(@NotNull final MetaserverListener listener)
Definition: MetaserverModel.java:175
com.realtime.crossfire.jxclient.metaserver.MetaserverEntry
Definition: MetaserverEntry.java:33
com.realtime.crossfire.jxclient.metaserver.MetaserverModel.getMetaserverEntryListeners
EventListenerList2< MetaserverEntryListener > getMetaserverEntryListeners(final int index)
Definition: MetaserverModel.java:203
com.realtime.crossfire.jxclient.metaserver.MetaserverModel
Definition: MetaserverModel.java:40
com.realtime.crossfire.jxclient.metaserver.MetaserverEntryListener
Definition: MetaserverEntryListener.java:31