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 com.realtime.crossfire.jxclient.guistate.ClientSocketState;
00025 import com.realtime.crossfire.jxclient.guistate.GuiStateListener;
00026 import com.realtime.crossfire.jxclient.guistate.GuiStateManager;
00027 import org.jetbrains.annotations.NotNull;
00028
00037 public class MetaserverProcessor {
00038
00042 private static final int UPDATE_INTERVAL = 15*60;
00043
00047 private static final int MIN_UPDATE_INTERVAL = 5*60;
00048
00052 @NotNull
00053 private final Metaserver metaserver;
00054
00058 @NotNull
00059 private final Object sync = new Object();
00060
00064 private boolean running = false;
00065
00073 private int counter = UPDATE_INTERVAL;
00074
00079 private long nextQuery = System.currentTimeMillis();
00080
00084 @NotNull
00085 private final Runnable runnable = new Runnable() {
00086
00087 @Override
00088 public void run() {
00089 try {
00090 while (!Thread.currentThread().isInterrupted()) {
00091 boolean executeProcess = false;
00092 synchronized (sync) {
00093
00094 sync.wait(1000);
00095 if (counter > 0) {
00096 counter--;
00097 if (counter == 0) {
00098 executeProcess = true;
00099 counter = UPDATE_INTERVAL;
00100 }
00101 }
00102 }
00103 if (executeProcess) {
00104 final long now = System.currentTimeMillis();
00105 if (nextQuery <= now) {
00106 nextQuery = now+MIN_UPDATE_INTERVAL;
00107 metaserver.updateMetaList();
00108 }
00109 }
00110 }
00111 } catch (final InterruptedException ignored) {
00112
00113 }
00114 }
00115
00116 };
00117
00122 @NotNull
00123 private final GuiStateListener guiStateListener = new GuiStateListener() {
00124
00125 @Override
00126 public void start() {
00127
00128 }
00129
00130 @Override
00131 public void metaserver() {
00132 query();
00133 }
00134
00135 @Override
00136 public void preConnecting(@NotNull final String serverInfo) {
00137
00138 }
00139
00140 @Override
00141 public void connecting(@NotNull final String serverInfo) {
00142 disable();
00143 }
00144
00145 @Override
00146 public void connecting(@NotNull final ClientSocketState clientSocketState) {
00147
00148 }
00149
00150 @Override
00151 public void connected() {
00152
00153 }
00154
00155 @Override
00156 public void connectFailed(@NotNull final String reason) {
00157
00158 }
00159
00160 };
00161
00167 public MetaserverProcessor(@NotNull final Metaserver metaserver, @NotNull final GuiStateManager guiStateManager) {
00168 this.metaserver = metaserver;
00169 guiStateManager.addGuiStateListener(guiStateListener);
00170 query();
00171 }
00172
00177 public void query() {
00178 synchronized (sync) {
00179 if (!running) {
00180 running = true;
00181 new Thread(runnable, "JXClient:MetaserverProcessor").start();
00182 }
00183 counter = 1;
00184 }
00185 }
00186
00191 public void disable() {
00192 synchronized (sync) {
00193 counter = 0;
00194 }
00195 }
00196
00197 }