/**
* 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.core.model.lock;
/**
* セルLockを管理するユーティリティ.
*/
public abstract class CellLockManager extends LockManager {
/**
* セルの処理状態:通常.
*/
public static final long CELL_STATUS_NORMAL = 0L;
/**
* セルの処理状態:一括削除中.
*/
public static final long CELL_STATUS_BULK_DELETION = 1L;
abstract Lock getLock(String fullKey);
abstract Boolean putLock(String fullKey, Lock lock);
/**
* 参照カウントオブジェクトのプレフィックス.
*/
public static final String REFERENCE_COUNT_PREFIX = "CellAccessCount_";
/**
* セルステータスオブジェクトのプレフィックス.
*/
public static final String CELL_STATUS_PREFIX = "CellStatus_";
/**
* 指定したIDのセルの処理ステータスを返す.
* @param cellId 処理ステータスを取得する対象のセルID
* @return 指定したセルの処理ステータス
*/
public static long getCellStatus(String cellId) {
String key = CELL_STATUS_PREFIX + cellId;
long status = singleton.doGetCellStatus(key);
if (status < 0) {
// 存在しない場合は何もしていないので「0:通常」を返す
status = CELL_STATUS_NORMAL;
}
return status;
}
/**
* セルの処理ステータスを「一括削除中」に設定する.
* @param cellId 対象のセルID
* @return 設定に成功した場合true、エラーとなった場合はfalse
*/
public static Boolean setBulkDeletionStatus(String cellId) {
return setCellStatus(cellId, CELL_STATUS_BULK_DELETION);
}
/**
* セルの処理ステータスを「一括削除中」に設定する.
* @param cellId 対象のセルID
* @return 設定に成功した場合true、エラーとなった場合はfalse
*/
public static Boolean resetBulkDeletionStatus(String cellId) {
return setCellStatus(cellId, CELL_STATUS_NORMAL);
}
/**
* 指定した初期値でセルの処理ステータスを設定する.
* ステータスに「0:通常」を指定した場合は設定済みのステータスオブジェクトを削除する.
* @param cellId 対象のセルID
* @param status 処理ステータス (0:通常 1:一括削除処理中)
* @return 設定後の処理ステータス
*/
private static Boolean setCellStatus(String cellId, long status) {
String key = CELL_STATUS_PREFIX + cellId;
Boolean success = true;
if (status == CELL_STATUS_NORMAL) {
// 通常状態に戻す場合はデータ自体を削除する
singleton.doDeleteCellStatus(key);
} else {
success = singleton.doSetCellStatus(key, status);
}
return success;
}
/**
* 指定したIDのセルに対する参照カウントを返す.
* @param cellId 参照カウントを取得する対象のセルID
* @return 指定したセルの参照カウント
*/
public static long getReferenceCount(String cellId) {
String key = REFERENCE_COUNT_PREFIX + cellId;
long count = singleton.doGetReferenceCount(key);
return count;
}
/**
* 指定したセルの参照カウントをインクリメントする.
* @param cellId 対象のセルID
* @return インクリメント後の参照カウントの値
*/
public static long incrementReferenceCount(String cellId) {
String key = REFERENCE_COUNT_PREFIX + cellId;
long count = singleton.doIncrementReferenceCount(key);
return count;
}
/**
* 指定したセルの参照カウントをデクリメントする.
* @param cellId 対象のセルID
* @return デクリメント後の参照カウントの値
*/
public static long decrementReferenceCount(String cellId) {
String key = REFERENCE_COUNT_PREFIX + cellId;
long count = singleton.doDecrementReferenceCount(key);
if (count < 0) {
count = 0;
}
return count;
}
}