組み込みWebサーバーでランキングや統計をリアルタイムに表形式で表示するクラス。

40Fields
1Constructors
32Methods
4345Lines
Package
com.example.rankingplugin.web
Source
web/WebDataServer.java
Kind
class
Roles
DB / 永続化Web / HTTP非同期 / スケジューラ初期化 / ブートストラップ
このクラスにも章立て解説を追加しています。 自動抽出の一覧だけでなく、下の『重点クラスの詳細解説』で読む順番・内部サブシステム・変更時の注意点まで追えます。 全クラス章立てガイドを見る
サブシステム横断ガイドもあります。 このクラスを含む上位の流れは こちらの処理遷移図ページ から読むと把握しやすいです。

クラス説明

組み込みWebサーバーでランキングや統計をリアルタイムに表形式で表示するクラス。
SparkJava と Gson を利用。

責務と見どころ

重点クラスの詳細解説

Web ダッシュボード全体の入口で、Spark のルート登録・短TTLキャッシュ・プレイヤー状態配信・チャット/ラグAPI・管理画面系の導線が一か所に集まっています。巨大なのは「画面描画」と「データ供給」を同時に担っているためです。

最初に追う読む順番

  1. WebDataServer
    依存サービス、キャッシュ、内部サーバ、メンテナンスタスクがどの順で立ち上がるかを最初に確認します。
  2. setupRoutes
    ルート登録の本体です。どの URL がどのデータを返し、どこで権限や Cookie を見るかを掴めます。
  3. currentMcid
    セッション Cookie から MCID を復元する入口です。管理系・チャット系の認証前提を追うときの起点になります。
  4. handleGlobalChatSend
    Web 側からの投稿処理で、セッション確認・クールダウン・DB 反映・通知の流れがまとまっています。
  5. startStatePublisher
    ゲーム内のプレイヤー状態を Web 向けテーブルへ押し出す定期処理です。リアルタイム感の源泉です。
  6. startEventMaintenance
    期限切れイベントや古い状態の掃除を担うため、運用時の整合性を見るのに重要です。
  7. shutdown
    Spark 停止、独自スレッド停止、Bukkit タスク停止の順がまとまっており、停止時不具合の起点になります。

内部サブシステムの地図

運用保守と補助サービス連携

ラグ解析、アクセスログ、イベント配信、Discord 起動通知までを束ねます。大きな責務の分割候補を見極めたいときはこの塊から切り出すのが自然です。

代表フロー詳解

起動からルート公開まで

  1. WebDataServer
  2. ensure* 系メソッド群
  3. setupRoutes
  4. chatService.installRoutes
  5. Spark.init
  6. Spark.awaitInitialization
  7. startEventMaintenance
  8. startStatePublisher
  9. sendBootDigestToDiscord

起動時はまず不足テーブルを揃え、その後でルートを束ねて公開し、最後に定期配信と保守タスクを点灯します。ルート公開より前に初期化が済んでいることが前提です。

Web 側チャット送信

  1. currentMcid
  2. handleGlobalChatSend
  3. globalCooldown チェック
  4. DB 読み出し/書き込み
  5. chatService 連携
  6. HTTP 応答

投稿元を Cookie から解決し、短い全体クールダウンを通したうえで保存と転送を行います。セッション不整合や多重送信はこの流れを追うと見つけやすいです。

プレイヤー状態のリアルタイム同期

  1. startStatePublisher
  2. callSyncMethod
  3. オンラインプレイヤー走査
  4. 防御/攻撃/体力など計算
  5. plugin_player_state 更新
  6. Web API が参照

重い部分を全部 async に寄せるのではなく、Bukkit API に触る瞬間だけ同期に戻しているのがポイントです。Main thread safe かどうかを壊すと最初にここで問題が出ます。

停止処理

  1. shutdown
  2. statePushTask.cancel
  3. eventMaintenanceTask.cancel
  4. chatService.shutdown
  5. serverLagService.shutdown
  6. Spark.stop

停止順序が逆転すると、閉じたプールに対する DB アクセスや、死んだ Web サービスへの書き込みが出やすくなります。終了時不具合はこの順序を確認してください。

変更時の注意点

外部接点

外部ルート

このクラス内で直接見つかる主な Web ルート/項目名です。

PUT playerPUT healthPUT max_healthPUT attackPUT defensePUT worldPUT xPUT yPUT zGET playerGET healthGET max_health

主な永続化テーブル

SQL 文字列から抽出できた主要テーブルです。スキーマ変更時の確認用です。

webcoop_sessionswebcoop_banwebcoop_global_chatplugin_player_statehealthweb_access_logplugin_difficulty_serverplugin_server_statusanima_tree_progressadmin_eventsadmin_event_deliverieslevel_profiles

フィールド

VisibilityTypeName役割
privateDataSourcedsDB 接続元を保持します。
privateScoreServicescoreService関連サービスへの参照です。
privateCurrencyServicecurrencyService関連サービスへの参照です。
privateGsongsongson の状態を保持します。
privateintMAX_OFFSETMAX_OFFSET の状態を保持します。
privateOnlineStatusServiceonlineStatusService関連サービスへの参照です。
privateStringserverIdserverId の状態を保持します。
privateStringADMIN_TOKENADMIN_TOKEN の状態を保持します。
privateDateTimeFormatterLDT_FMTLDT_FMT の状態を保持します。
privateDateTimeFormatterJST_OUTJST_OUT の状態を保持します。
privateIpLinkServiceipLinkService関連サービスへの参照です。
privateJavaPluginpluginrプラグイン本体参照です。
privateJavaPluginpluginRefプラグイン本体参照です。
privateScoreManagerscoreManager関連マネージャーへの参照です。
privateDiscordNotifierdiscorddiscord の状態を保持します。
privateStringcachedTopScoresJsonキャッシュまたは直近計算結果を保持します。
privatelongcachedTopScoresAtMsキャッシュまたは直近計算結果を保持します。
privateStringcachedLastScoresJsonキャッシュまたは直近計算結果を保持します。
privatelongcachedLastScoresAtMsキャッシュまたは直近計算結果を保持します。
privateStringcachedLast2ScoresJsonキャッシュまたは直近計算結果を保持します。
privatelongcachedLast2ScoresAtMsキャッシュまたは直近計算結果を保持します。
privatejava.util.concurrent.atomic.AtomicBooleancachesStartedキャッシュまたは直近計算結果を保持します。
privatelongcacheRefreshMsキャッシュまたは直近計算結果を保持します。
privateServerLagServiceserverLagService関連サービスへの参照です。
privatecom.example.rankingplugin.web.ChatServicechatService関連サービスへの参照です。
privateBukkitTaskstatePushTask非同期処理やスケジューラ制御に使うハンドルです。
privateintSTATE_PUSH_TICKSSTATE_PUSH_TICKS の状態を保持します。
privateintSTATE_STALE_SECONDSSTATE_STALE_SECONDS の状態を保持します。
privateintPLAYER_STATE_TTL_SECONDSPLAYER_STATE_TTL_SECONDS の状態を保持します。
privatecom.sun.net.httpserver.HttpServerSERVER_REFSERVER_REF の状態を保持します。
privatebooleanlastBingo5x5lastBingo5x5 の状態を保持します。
privatebooleanlastSpawnBoostlastSpawnBoost の状態を保持します。
privateNavigableMap<Integer, Long>xpPrefixxpPrefix の状態を保持します。
privatelongEVENT_RETENTION_SECONDSEVENT_RETENTION_SECONDS の状態を保持します。
privateMap<String, Long>globalCooldownglobalCooldown の状態を保持します。
privatelongGLOBAL_CT_MSGLOBAL_CT_MS の状態を保持します。
privateStringSESSION_COOKIESESSION_COOKIE の状態を保持します。
privatejava.util.concurrent.ScheduledFuture<?>eventMaintenanceTask非同期処理やスケジューラ制御に使うハンドルです。
privatebooleanrunningrunning の状態を保持します。
privateScheduledExecutorServiceeventExeceventExec の状態を保持します。

コンストラクタ / 初期化

Signature説明主要呼び出し
public WebDataServer(int basePort,JavaPlugin plugin, DataSource ds, ScoreService scoreService, CurrencyService currencyService, OnlineStatusService onlineStatusService, ScoreManager scoreManager, String serverId, IpLinkService ipLinkService, JavaPlugin pluginr,DiscordNotifier discord)依存オブジェクトや初期状態を受け取り、このクラスの動作を開始できる状態へ組み立てます。max → getConfig → getLong → startWebCaches → getInt → getBoolean

メソッド索引

NameVisibilityKind説明
httppublicメソッドhttp の主要処理を担当します。
getOrNullIntprivateメソッド必要な状態を取得し、呼び出し側で利用しやすい形へ返します。
getOrNullDoubleprivateメソッド必要な状態を取得し、呼び出し側で利用しやすい形へ返します。
WebDataServerpublicコンストラクタ依存オブジェクトや初期状態を受け取り、このクラスの動作を開始できる状態へ組み立てます。
isPoolClosedExceptionprivateメソッドHikariPool の "has been closed" など、プールクローズ後の例外かどうか判定
currentMcidprivateメソッドログインCookieからMCIDを引く。
handleGlobalChatSendprivateメソッド入力やリクエストを受けて、検証・処理・応答までをまとめて担当します。
startStatePublisherprivateメソッド初期化と各種登録を行い、機能を有効化します。
ensurePlayerStateTableprivateメソッド必要なテーブル・状態・前提条件が揃っているかを確認し、不足分を補います。
ensureAccessLogTableprivateメソッド必要なテーブル・状態・前提条件が揃っているかを確認し、不足分を補います。
ensureDifficultyTableprivateメソッド必要なテーブル・状態・前提条件が揃っているかを確認し、不足分を補います。
ensureStatusTableMemColsprivateメソッド必要なテーブル・状態・前提条件が揃っているかを確認し、不足分を補います。
ensureAnimaTreeTableprivateメソッド必要なテーブル・状態・前提条件が揃っているかを確認し、不足分を補います。
startEventMaintenanceprivateメソッド初期化と各種登録を行い、機能を有効化します。
ensureAdminTablesprivateメソッド必要なテーブル・状態・前提条件が揃っているかを確認し、不足分を補います。
ensureLevelingTablesForWebprivateメソッド必要なテーブル・状態・前提条件が揃っているかを確認し、不足分を補います。
ensureSlotStateTableprivateメソッド必要なテーブル・状態・前提条件が揃っているかを確認し、不足分を補います。
getOrNullLongprivateメソッド必要な状態を取得し、呼び出し側で利用しやすい形へ返します。
claimDeliveryprivateメソッドDB への問い合わせまたは更新処理を担当します。
computeReducePercentprivateメソッドcomputeReducePercent の主要処理を担当します。
computeAttackPowerprivateメソッドcomputeAttackPower の主要処理を担当します。
pollBingo5x5FlagprivateメソッドDB への問い合わせまたは更新処理を担当します。
parseTopRewardsprivateメソッド入力テキストや設定値を解析して内部表現へ変換します。
previewprivateメソッドpreview の主要処理を担当します。
parseTop3FromRewardConfigprivateメソッド入力テキストや設定値を解析して内部表現へ変換します。
sendBootDigestToDiscordprivateメソッドDB への問い合わせまたは更新処理を担当します。
loadXpPrefixIfNeededprivateメソッド必要な状態を取得し、呼び出し側で利用しやすい形へ返します。
totalXpOfprivateメソッド累計XPを返す。
nextReqForprivateメソッドDB への問い合わせまたは更新処理を担当します。
jsonQuoteprivateメソッドjsonQuote の主要処理を担当します。
shutdownpublicメソッドプラグイン無効化時に呼び出す
setupRoutesprivateメソッド初期化と各種登録を行い、機能を有効化します。

メソッド詳細

http

メソッドpublicstatic
public static com.sun.net.httpserver.HttpServer http()

http の主要処理を担当します。

引数

throws

なし

主要な呼び出し順

目立つ内部呼び出しは抽出されませんでした。

getOrNullInt

メソッドprivatestatic
private static Integer getOrNullInt(ResultSet rs, String col, int def) throws SQLException

必要な状態を取得し、呼び出し側で利用しやすい形へ返します。

引数

throws

SQLException

主要な呼び出し順

getIntwasNull

getOrNullDouble

メソッドprivatestatic
private static Double getOrNullDouble(ResultSet rs, String col) throws SQLException

必要な状態を取得し、呼び出し側で利用しやすい形へ返します。

引数

throws

SQLException

主要な呼び出し順

getDoublewasNull

WebDataServer

コンストラクタpublic
public WebDataServer(int basePort,JavaPlugin plugin, DataSource ds, ScoreService scoreService, CurrencyService currencyService, OnlineStatusService onlineStatusService, ScoreManager scoreManager, String serverId, IpLinkService ipLinkService, JavaPlugin pluginr,DiscordNotifier discord)

依存オブジェクトや初期状態を受け取り、このクラスの動作を開始できる状態へ組み立てます。

引数

throws

なし

主要な呼び出し順

maxgetConfiggetLongstartWebCachesgetIntgetBooleanensureAdminTablesensureAccessLogTable

isPoolClosedException

メソッドprivate
private boolean isPoolClosedException(Throwable ex)

HikariPool の "has been closed" など、プールクローズ後の例外かどうか判定

引数

throws

なし

主要な呼び出し順

getMessagecontainsgetCause

currentMcid

メソッドprivate
private String currentMcid(Request req)

ログインCookieからMCIDを引く。

引数

throws

なし

主要な呼び出し順

ofNullablecookieorElseisEmptygetConnectionprepareStatementsetStringexecuteQuery

handleGlobalChatSend

メソッドprivate
private String handleGlobalChatSend(Request req, Response res)

入力やリクエストを受けて、検証・処理・応答までをまとめて担当します。

引数

throws

なし

主要な呼び出し順

typecurrentMcidstatusgetConnectionprepareStatementsetStringexecuteQuerynext

startStatePublisher

メソッドprivate
private void startStatePublisher()

初期化と各種登録を行い、機能を有効化します。

引数

throws

なし

主要な呼び出し順

getSchedulerrunTaskTimerAsynchronouslycallSyncMethodgetOnlinePlayersgetNamegetHealthofNullablegetAttribute

ensurePlayerStateTable

メソッドprivate
private void ensurePlayerStateTable()

必要なテーブル・状態・前提条件が揃っているかを確認し、不足分を補います。

引数

throws

なし

主要な呼び出し順

getConnectioncreateStatementexecuteUpdateplugin_player_stateprintlngetMessage

ensureAccessLogTable

メソッドprivate
private void ensureAccessLogTable()

必要なテーブル・状態・前提条件が揃っているかを確認し、不足分を補います。

引数

throws

なし

主要な呼び出し順

getConnectioncreateStatementexecuteUpdateweb_access_logprintlngetMessage

ensureDifficultyTable

メソッドprivate
private void ensureDifficultyTable()

必要なテーブル・状態・前提条件が揃っているかを確認し、不足分を補います。

引数

throws

なし

主要な呼び出し順

getConnectioncreateStatementexecuteUpdateplugin_difficulty_serverprintlngetMessage

ensureStatusTableMemCols

メソッドprivate
private void ensureStatusTableMemCols()

必要なテーブル・状態・前提条件が揃っているかを確認し、不足分を補います。

引数

throws

なし

主要な呼び出し順

getConnectioncreateStatementexecuteUpdateprintlngetMessage

ensureAnimaTreeTable

メソッドprivate
private void ensureAnimaTreeTable()

必要なテーブル・状態・前提条件が揃っているかを確認し、不足分を補います。

引数

throws

なし

主要な呼び出し順

getConnectioncreateStatementexecuteUpdateanima_tree_progressprintlngetMessage

startEventMaintenance

メソッドprivate
private void startEventMaintenance()

初期化と各種登録を行い、機能を有効化します。

引数

throws

なし

主要な呼び出し順

isCancelledscheduleAtFixedRategetConnectionnowplusHoursprepareStatementvalueOfsetTimestamp

ensureAdminTables

メソッドprivate
private void ensureAdminTables()

必要なテーブル・状態・前提条件が揃っているかを確認し、不足分を補います。

引数

throws

なし

主要な呼び出し順

getConnectioncreateStatementexecuteUpdateadmin_eventsvalueOfgetMessagecontainsadmin_event_deliveries

ensureLevelingTablesForWeb

メソッドprivate
private void ensureLevelingTablesForWeb()

必要なテーブル・状態・前提条件が揃っているかを確認し、不足分を補います。

引数

throws

なし

主要な呼び出し順

getConnectioncreateStatementexecuteUpdatelevel_profileslevel_thresholdslevel_sp_stateprintlngetMessage

ensureSlotStateTable

メソッドprivate
private void ensureSlotStateTable()

必要なテーブル・状態・前提条件が揃っているかを確認し、不足分を補います。

引数

throws

なし

主要な呼び出し順

getConnectioncreateStatementexecuteUpdateplugin_slot_stateprintlngetMessage

getOrNullLong

メソッドprivatestatic
private static Long getOrNullLong(ResultSet rs, String col) throws SQLException

必要な状態を取得し、呼び出し側で利用しやすい形へ返します。

引数

throws

SQLException

主要な呼び出し順

getLongwasNull

claimDelivery

メソッドprivate
private boolean claimDelivery(Connection c, int eventId, com.example.rankingplugin.discord.DiscordNotifier.Phase phase)

DB への問い合わせまたは更新処理を担当します。

引数

throws

なし

主要な呼び出し順

admin_event_deliveriesprepareStatementsetIntsetStringnameexecuteUpdategetSQLStatestartsWith

computeReducePercent

メソッドprivate
private double computeReducePercent(org.bukkit.entity.Player p)

computeReducePercent の主要処理を担当します。

引数

throws

なし

主要な呼び出し順

getInventorygetHelmetgetChestplategetLeggingsgetBootsgetItemMetagetPersistentDataContainergetOrDefault

computeAttackPower

メソッドprivate
private double computeAttackPower(org.bukkit.entity.Player p)

computeAttackPower の主要処理を担当します。

引数

throws

なし

主要な呼び出し順

ofNullablegetAttributemaporElsegetInventorygetItemInMainHandgetEnchantmentLevelgetPotionEffect

pollBingo5x5Flag

メソッドprivate
private void pollBingo5x5Flag()

DB への問い合わせまたは更新処理を担当します。

引数

throws

なし

主要な呼び出し順

getConnectionprepareStatementexecuteQuerynextisPoolClosedExceptiongetLoggerlogsetBingoSpawnBoostRunning

parseTopRewards

メソッドprivate
private Map<Integer, Long> parseTopRewards(String json)

入力テキストや設定値を解析して内部表現へ変換します。

引数

throws

なし

主要な呼び出し順

isEmptyemptyMapparseStringgetAsJsonObjecthasvalueOfgetAsLong

preview

メソッドprivate
private String preview(String s, int max)

preview の主要処理を担当します。

引数

throws

なし

主要な呼び出し順

striplengthsubstring

parseTop3FromRewardConfig

メソッドprivate
private Map<Integer, Long> parseTop3FromRewardConfig(String rewardJson)

入力テキストや設定値を解析して内部表現へ変換します。

引数

throws

なし

主要な呼び出し順

isEmptyemptyMapparseStringgetAsJsonObjecthasgetAsLong

sendBootDigestToDiscord

メソッドprivate
private void sendBootDigestToDiscord()

DB への問い合わせまたは更新処理を担当します。

引数

throws

なし

主要な呼び出し順

getConnectionnowprepareStatementexecuteQuerynextgetStringgetTimestamptoLocalDateTime

loadXpPrefixIfNeeded

メソッドprivate
private void loadXpPrefixIfNeeded()

必要な状態を取得し、呼び出し側で利用しやすい形へ返します。

引数

throws

なし

主要な呼び出し順

getConnectionprepareStatementexecuteQuerynextgetIntmax

totalXpOf

メソッドprivate
private long totalXpOf(int level, int currentXp)

累計XPを返す。

引数

throws

なし

主要な呼び出し順

loadXpPrefixIfNeededmaxfloorEntrygetValue

nextReqFor

メソッドprivate
private Integer nextReqFor(int level)

DB への問い合わせまたは更新処理を担当します。

引数

throws

なし

主要な呼び出し順

loadXpPrefixIfNeededgetConnectionprepareStatementsetIntexecuteQuerynextgetInt

jsonQuote

メソッドprivatestatic
private static String jsonQuote(String s)

jsonQuote の主要処理を担当します。

引数

throws

なし

主要な呼び出し順

lengthappendcharAtformattoString

shutdown

メソッドpublic
public void shutdown()

プラグイン無効化時に呼び出す

引数

throws

なし

主要な呼び出し順

cancelshutdownNowstopgetLoggerlog

setupRoutes

メソッドprivate
private void setupRoutes()

初期化と各種登録を行い、機能を有効化します。

引数

throws

なし

主要な呼び出し順

beforeofNullableheadersmapsplittrimfilterisEmpty

代表的な処理フロー

  1. 初期化フロー
    WebDataServer → max → getConfig → getLong → startWebCaches → getInt
    依存オブジェクトや初期状態を受け取り、このクラスの動作を開始できる状態へ組み立てます。
  2. handleGlobalChatSend フロー
    handleGlobalChatSend → type → currentMcid → status → getConnection → prepareStatement
    入力やリクエストを受けて、検証・処理・応答までをまとめて担当します。
  3. setupRoutes フロー
    setupRoutes → before → ofNullable → headers → map → split
    初期化と各種登録を行い、機能を有効化します。
  4. startEventMaintenance フロー
    startEventMaintenance → isCancelled → scheduleAtFixedRate → getConnection → now → plusHours
    初期化と各種登録を行い、機能を有効化します。
  5. startStatePublisher フロー
    startStatePublisher → getScheduler → runTaskTimerAsynchronously → callSyncMethod → getOnlinePlayers → getName
    初期化と各種登録を行い、機能を有効化します。
  6. loadXpPrefixIfNeeded フロー
    loadXpPrefixIfNeeded → getConnection → prepareStatement → executeQuery → next → getInt
    必要な状態を取得し、呼び出し側で利用しやすい形へ返します。

外部との接点

Web ルート

PUT playerPUT healthPUT max_healthPUT attackPUT defensePUT worldPUT xPUT yPUT zGET playerGET healthGET max_healthGET attackGET defenseGET worldGET xGET yGET zGET 1GET 2GET 3GET /admin/loginPOST /admin/loginGET /GET /wikiGET /wiki/GET /lagGET /api/lag/chunksGET /api/lag/chunkdetailsGET /api/lag/sources

SQL / テーブル

webcoop_sessionswebcoop_banwebcoop_global_chatplugin_player_statehealthCURRENT_TIMESTAMPweb_access_logplugin_difficulty_serverplugin_server_statusanima_tree_progressadmin_eventsadmin_event_deliverieslevel_profileslevel_thresholdslevel_sp_stateplugin_slot_statebingo_card_5x5idcurrenciesplayer_login

関連クラス

補足