/* * Copyright (c) 2015 by Robert Bärhold, Zuse Institute Berlin * * Licensed under the BSD License, see LICENSE file for details. * */ package org.xtreemfs.mrc.metadata; import java.nio.ByteBuffer; import java.util.HashSet; import java.util.Set; import org.xtreemfs.mrc.database.babudb.BabuDBStorageHelper; /** * Contains all client specific expire times regarding its voucher of a specific file. */ public class BufferBackedFileVoucherClientInfo extends BufferBackedIndexMetadata implements FileVoucherClientInfo { private final Set<Long> expireTimeSet = new HashSet<Long>(); public BufferBackedFileVoucherClientInfo(byte[] key, byte[] val) { super(key, 0, key.length, val, 0, val.length); ByteBuffer tmp = ByteBuffer.wrap(valBuf); for (int i = 0; i < val.length; i += Long.SIZE / Byte.SIZE) { expireTimeSet.add(tmp.getLong(i)); } } public BufferBackedFileVoucherClientInfo(long fileId, String clientId, long expireTime) { super(null, 0, 0, null, 0, 0); keyBuf = BabuDBStorageHelper.createFileVoucherClientInfoKey(fileId, clientId); keyLen = keyBuf.length; addExpireTime(expireTime); updateValueBuffer(); } @Override public void addExpireTime(long expireTime) { expireTimeSet.add(expireTime); } @Override public void addExpireTimeSet(Set<Long> expireTimeSet) { this.expireTimeSet.addAll(expireTimeSet); } @Override public void removeExpireTimeSet(Set<Long> expireTimeSet) { this.expireTimeSet.removeAll(expireTimeSet); } @Override public void clearExpireTimeSet() { expireTimeSet.clear(); } @Override public boolean hasExpireTime(long expireTime) { return expireTimeSet.contains(expireTime); } @Override public boolean hasNewerExpireTime(long compareExpireTime) { for (Long expireTime : expireTimeSet) { if (expireTime > compareExpireTime) { return true; } } return false; } /** * Updates the value buffer with the expire times. Iff the set of expireTime is empty, it will be set to null in * order to delete the entry. */ private void updateValueBuffer() { if (expireTimeSet.size() == 0) { valLen = 0; valBuf = null; } else { int curExpireTimeOffset = 0; int longSizeBytes = Long.SIZE / Byte.SIZE; valLen = longSizeBytes * expireTimeSet.size(); valBuf = new byte[valLen]; ByteBuffer tmp = ByteBuffer.wrap(valBuf); for (Long expireTime : expireTimeSet) { tmp.putLong(curExpireTimeOffset, expireTime); curExpireTimeOffset += longSizeBytes; } } } // Getter /** * Returns the value buffer after refreshing it with the current values. */ @Override public byte[] getValBuf() { updateValueBuffer(); return super.getValBuf(); } @Override public int getExpireTimeSetSize() { return expireTimeSet.size(); } @Override public String getClientId() { return BabuDBStorageHelper.extractClientIdFromFileVoucherClientInfoKey(keyBuf); } }