/** * personium.io * Copyright 2014 FUJITSU LIMITED * * 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 com.fujitsu.dc.common.ads; import java.io.File; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * ADS書き込み失敗ログへの入出処理に関する抽象クラス. */ public abstract class AbstractAdsWriteFailureLog { static Logger logger = LoggerFactory.getLogger(AbstractAdsWriteFailureLog.class); /** * 出力中のADS書き込み失敗ログファイル名のフォーマット. */ public static final String LOGNAME_FORMAT_ACTIVE = "adsWriteFailure_%s_%d.log"; /** * ローテートされたADS書き込み失敗ログファイル名のフォーマット. */ public static final String LOGNAME_FORMAT_ROTATE = "adsWriteFailure_%s.log.%d"; /** * ローテートされたADS書き込み失敗ログの論理削除ファイル名の拡張子. */ public static final String LOGICAL_DELETED_LOGNAME_SUFFIX = ".done"; /** * リトライ可能なADS書き込み失敗ログの論理削除ファイル名の拡張子. */ public static final String RETRY_LOGNAME_SUFFIX = ".retry"; /** * リトライ不可能なADS書き込み失敗ログを出力するファイル名の拡張子. */ public static final String ERROR_LOGNAME_SUFFIX = ".error"; /** * PCSバージョン情報(default: 1). <br /> * dc-config.propertiesを参照できないものと考え、システムプロパティで処理を行うものとする.<br /> * ただし、クラスロード時に設定内容が確定してしまうため、書き換えできない。 */ String pcsVersion; /** * ADS書き込み失敗ログ格納ディレクトリ(default: /fjnfs/dc-core/ads) . <br /> * dc-config.propertiesを参照できないものと考え、システムプロパティで処理を行うものとする.<br /> * ただし、クラスロード時に設定内容が確定してしまうため、書き換えできない。 */ String baseDir; /** * ADS書き込み失敗ログを物理削除するか否かを示すフラグ(default: true). <br /> * dc-config.propertiesを参照できないものと考え、システムプロパティで処理を行うものとする.<br /> * ただし、クラスロード時に設定内容が確定してしまうため、書き換えできない。 */ boolean isPhysicalDelete; /** * コンストラクタ. <br /> * 本クラスを継承して使用する場合、コンストラクタで初期化している変数について、適切な値を再設定すること. */ public AbstractAdsWriteFailureLog() { pcsVersion = null; baseDir = null; isPhysicalDelete = true; } /** * PCSバージョンを取得する. * @return PCSバージョン */ public String getPcsVersion() { return pcsVersion; } /** * ADS書き込み失敗ログ格納ディレクトリのパスを取得する. * @return ADS書き込み失敗ログ格納ディレクトリパス */ public String getBaseDir() { return baseDir; } /** * ADS書き込み失敗ログを物理削除するか否かを返す. * @return 物理削除の場合は trueを、論理削除の場合は falseを返す */ public boolean isPhysicalDelete() { return isPhysicalDelete; } /** * ADS書き込み失敗ログを削除する. * @param deleteFile 削除対象のADS書き込み失敗ログ * @throws AdsWriteFailureLogException ログの削除に失敗した場合 */ public synchronized void deleteRotatedLog(File deleteFile) throws AdsWriteFailureLogException { if (null == deleteFile) { String message = String.format("adsWriteFailureLog configuration is wrong."); throw new AdsWriteFailureLogException(message); } if (null != deleteFile && !deleteFile.isFile()) { String message = String.format("adsWriteFailureLog is not found, or already deleted. [%s]", deleteFile.getAbsolutePath()); logger.info(message); return; } // ファイルを削除する場合、Java.ioパッケージのメソッドでは、削除対象ファイルにアクセスしているプロセスがあるとfalseが返却される。 // JDK1.7からサポートされた Java.nioパッケージのメソッドでは、このような状態の場合に例外をスローする仕様となっており、 // JDK1.7への対応が必要だと思われる。 if (isPhysicalDelete()) { // 物理削除 String message = String.format("adsWriteFailureLog is going to be deleted physically. [%s]", deleteFile.getAbsolutePath()); logger.info(message); if (!deleteFile.delete()) { message = String.format("Failed to delete adsWriteFailureLog. [%b,%s] ", isPhysicalDelete(), deleteFile.getAbsolutePath()); throw new AdsWriteFailureLogException(message); } } else { // 論理削除 String message = String.format("adsWriteFailureLog is going to be deleted logically. [%s]", deleteFile.getAbsolutePath()); logger.info(message); String deletedFileName = deleteFile.getName() + LOGICAL_DELETED_LOGNAME_SUFFIX; File deletedFile = new File(deleteFile.getParent(), deletedFileName); if (!deleteFile.renameTo(deletedFile)) { // ここでエラーを検知してもフィールドは初期化しない。原因を究明してから原因別に対処を行う。 message = String.format("Failed to delete adsWriteFailureLog. [%b,%s] ", isPhysicalDelete(), deleteFile.getAbsolutePath()); throw new AdsWriteFailureLogException(message); } } } }