/* * Copyright (c) 2011 NTT DATA Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package jp.terasoluna.fw.batch.util; import java.util.concurrent.ConcurrentHashMap; import jp.terasoluna.fw.batch.constants.LogId; import jp.terasoluna.fw.batch.message.MessageAccessor; import jp.terasoluna.fw.logger.TLogger; /** * メッセージ管理ユーティリティ。<br> * <br> * <p> * メッセージの管理を行いたい場合に利用する。<br> * 本クラスのクラス変数に保存されるMessageAccessorはスレッドグループ毎にインスタンスが保持される。 * </p> * @deprecated バージョン3.6.0より、本クラスによるメッセージ管理機能は非推奨である。業務ロジック内でメッセージ管理機能を使用する場合、commonContext.xmlに{@code MessageAccessorImpl}を定義の上、業務ロジッククラスで{@code MessageAccessor}をインジェクションすること。 * @see jp.terasoluna.fw.batch.message.MessageAccessor * @see jp.terasoluna.fw.batch.message.MessageAccessorImpl */ @Deprecated public class MessageUtil { /** ロガー. */ private static final TLogger LOGGER = TLogger.getLogger(MessageUtil.class); /** スレッドグループ毎にメッセージソースアクセサを保持する. */ private static final ConcurrentHashMap<ThreadGroup, MessageAccessor> tgm = new ConcurrentHashMap<ThreadGroup, MessageAccessor>(); /** * コンストラクタ. */ protected MessageUtil() { } /** * コードに応じたメッセージを返却する<br> * @param code コード * @return コードに応じたメッセージを返却する */ public static String getMessage(String code) { return getMessage(code, null); } /** * コードに応じたメッセージを返却する<br> * @param code コード * @return コードに応じたメッセージを返却する */ public static String getMessage(String code, Object[] args) { String mes = null; MessageAccessor ma = null; ThreadGroup tg = getThreadGroup(); if (tg != null) { ma = tgm.get(tg); if (LOGGER.isTraceEnabled()) { LOGGER.trace(LogId.TAL025006, getThreadMessage()); } } if (ma != null) { try { mes = ma.getMessage(code, args); } catch (Exception e) { // 何もしない } } else { LOGGER.debug(LogId.DAL025043); } // メッセージが見つからなかった場合 if (mes == null) { StringBuilder sb = new StringBuilder(); sb.append("Message not found. CODE:["); sb.append(code); sb.append("]"); return sb.toString(); } return mes; } /** * メッセージソースアクセサを設定する.<br> * <p> * ここで設定するMessageAccessorはスレッドグループ毎に保持される。 * </p> * @param messageAccessor MessageAccessor */ public static void setMessageAccessor(MessageAccessor messageAccessor) { if (messageAccessor == null) { if (LOGGER.isWarnEnabled()) { LOGGER.warn(LogId.WAL025008, getThreadMessage()); } return; } ThreadGroup tg = getThreadGroup(); if (tg != null) { tgm.put(tg, messageAccessor); if (LOGGER.isTraceEnabled()) { LOGGER.trace(LogId.TAL025007, getThreadMessage()); } } } /** * メッセージソースアクセサを削除する.<br> */ public static void removeMessageAccessor() { ThreadGroup tg = getThreadGroup(); if (tg != null) { tgm.remove(tg); if (LOGGER.isTraceEnabled()) { LOGGER.trace(LogId.TAL025008, getThreadMessage()); } } } /** * スレッドグループを取得する. * @return ThreadGroup */ private static ThreadGroup getThreadGroup() { Thread ct = Thread.currentThread(); if (ct != null && ct.getThreadGroup() != null) { return ct.getThreadGroup(); } return null; } /** * スレッドグループとスレッド名を返すメソッド.<br> * デバッグ用メッセージを返す。 * @return スレッドグループとスレッド名が判別可能なメッセージ */ private static String getThreadMessage() { StringBuilder sb = new StringBuilder(); Thread ct = Thread.currentThread(); if (ct != null && getThreadGroup() != null) { sb.append(" tg:["); sb.append(getThreadGroup().getName()); sb.append("]"); } if (ct != null) { sb.append(" t:["); sb.append(ct.getName()); sb.append("]"); } return sb.toString(); } }