package games.strategy.engine.framework.headlessGameServer; import java.util.List; import java.util.Map; import java.util.Observer; import java.util.concurrent.CopyOnWriteArrayList; import javax.swing.Action; import games.strategy.engine.chat.IChatPanel; import games.strategy.engine.data.GameData; import games.strategy.engine.framework.IGame; import games.strategy.engine.framework.startup.launcher.ILauncher; import games.strategy.engine.framework.startup.launcher.ServerLauncher; import games.strategy.engine.framework.startup.mc.GameSelectorModel; import games.strategy.engine.framework.startup.mc.IRemoteModelListener; import games.strategy.engine.framework.startup.mc.ServerModel; import games.strategy.engine.framework.startup.ui.ISetupPanel; import games.strategy.engine.framework.startup.ui.InGameLobbyWatcher; import games.strategy.engine.framework.startup.ui.InGameLobbyWatcherWrapper; import games.strategy.engine.pbem.PBEMMessagePoster; import games.strategy.util.ThreadUtil; /** * Server setup model. */ public class HeadlessServerSetup implements IRemoteModelListener, ISetupPanel { private static final long serialVersionUID = 9021977178348892504L; private final List<Observer> m_listeners = new CopyOnWriteArrayList<>(); private final ServerModel m_model; private final GameSelectorModel m_gameSelectorModel; private final InGameLobbyWatcherWrapper m_lobbyWatcher = new InGameLobbyWatcherWrapper(); public HeadlessServerSetup(final ServerModel model, final GameSelectorModel gameSelectorModel) { m_model = model; m_gameSelectorModel = gameSelectorModel; m_model.setRemoteModelListener(this); createLobbyWatcher(); setupListeners(); setWidgetActivation(); internalPlayerListChanged(); } public void createLobbyWatcher() { if (m_lobbyWatcher != null) { m_lobbyWatcher.setInGameLobbyWatcher(InGameLobbyWatcher.newInGameLobbyWatcher(m_model.getMessenger(), null, m_lobbyWatcher.getInGameLobbyWatcher())); m_lobbyWatcher.setGameSelectorModel(m_gameSelectorModel); } } public synchronized void repostLobbyWatcher(final IGame iGame) { if (iGame != null) { return; } if (canGameStart()) { return; } System.out.println("Restarting lobby watcher"); shutDownLobbyWatcher(); ThreadUtil.sleep(3000); HeadlessGameServer.resetLobbyHostOldExtensionProperties(); createLobbyWatcher(); } public void shutDownLobbyWatcher() { if (m_lobbyWatcher != null) { m_lobbyWatcher.shutDown(); } } private void setupListeners() {} @Override public void setWidgetActivation() {} @Override public void shutDown() { m_model.setRemoteModelListener(IRemoteModelListener.NULL_LISTENER); m_model.shutDown(); if (m_lobbyWatcher != null) { m_lobbyWatcher.shutDown(); } } @Override public void cancel() { m_model.setRemoteModelListener(IRemoteModelListener.NULL_LISTENER); m_model.cancel(); if (m_lobbyWatcher != null) { m_lobbyWatcher.shutDown(); } } @Override public boolean canGameStart() { if (m_gameSelectorModel.getGameData() == null || m_model == null) { return false; } final Map<String, String> players = m_model.getPlayersToNodeListing(); if (players == null || players.isEmpty()) { return false; } for (final String player : players.keySet()) { if (players.get(player) == null) { return false; } } // make sure at least 1 player is enabled final Map<String, Boolean> someoneEnabled = m_model.getPlayersEnabledListing(); for (final boolean bool : someoneEnabled.values()) { if (bool) { return true; } } return false; } @Override public void playerListChanged() { internalPlayerListChanged(); } @Override public void playersTakenChanged() { internalPlayersTakenChanged(); } private void internalPlayersTakenChanged() { notifyObservers(); } private void internalPlayerListChanged() { internalPlayersTakenChanged(); } @Override public IChatPanel getChatPanel() { return m_model.getChatPanel(); } public ServerModel getModel() { return m_model; } @Override public synchronized ILauncher getLauncher() { final ServerLauncher launcher = (ServerLauncher) m_model.getLauncher(); if (launcher == null) { return null; } launcher.setInGameLobbyWatcher(m_lobbyWatcher); return launcher; } @Override public List<Action> getUserActions() { return null; } @Override public void addObserver(final Observer observer) { m_listeners.add(observer); } @Override public void removeObserver(final Observer observer) { m_listeners.add(observer); } @Override public void notifyObservers() { for (final Observer observer : m_listeners) { observer.update(null, null); } } @Override public void preStartGame() {} @Override public void postStartGame() { final GameData data = m_gameSelectorModel.getGameData(); data.getProperties().set(PBEMMessagePoster.PBEM_GAME_PROP_NAME, false); } @Override public boolean isMetaSetupPanelInstance() { return false; } }