blob: 26d19a4fe8c8e821f3603c89d2dbcb22cab2e21a [file] [log] [blame]
/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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.datatorrent.lib.io.block;
import javax.validation.constraints.NotNull;
import com.google.common.base.Preconditions;
/**
* Represents the metadata of a block.
*
* @since 2.1.0
*/
public interface BlockMetadata
{
/**
* @return unique block id.
*/
long getBlockId();
/**
* @return the start offset associated with the block.
*/
long getOffset();
/**
* @return the length of the source in the block.
*/
long getLength();
/**
* @return if this is the last block in file.
*/
boolean isLastBlock();
/**
* @return the previous block id.
*/
long getPreviousBlockId();
abstract class AbstractBlockMetadata implements BlockMetadata
{
private long offset;
private long length;
private boolean isLastBlock;
private long previousBlockId;
private long blockId;
@SuppressWarnings("unused")
protected AbstractBlockMetadata()
{
offset = -1;
length = -1;
isLastBlock = false;
previousBlockId = -1;
blockId = -1;
}
/**
* Constructs Block metadata
*
* @param offset offset of the file in the block
* @param length length of the file in the block
* @param isLastBlock true if this is the last block of file
* @param previousBlockId id of the previous block
*/
@Deprecated
public AbstractBlockMetadata(long offset, long length, boolean isLastBlock, long previousBlockId)
{
this.offset = offset;
this.length = length;
this.isLastBlock = isLastBlock;
this.previousBlockId = previousBlockId;
this.blockId = -1;
}
/**
* Constructs Block metadata
*
* @param blockId block id
* @param offset offset of the file in the block
* @param length length of the file in the block
* @param isLastBlock true if this is the last block of file
* @param previousBlockId id of the previous block
*/
public AbstractBlockMetadata(long blockId, long offset, long length, boolean isLastBlock, long previousBlockId)
{
this.blockId = blockId;
this.offset = offset;
this.length = length;
this.isLastBlock = isLastBlock;
this.previousBlockId = previousBlockId;
}
@Override
public boolean equals(Object o)
{
if (this == o) {
return true;
}
if (!(o instanceof AbstractBlockMetadata)) {
return false;
}
AbstractBlockMetadata that = (AbstractBlockMetadata)o;
return getBlockId() == that.getBlockId();
}
@Override
public int hashCode()
{
return (int)getBlockId();
}
@Override
public long getOffset()
{
return offset;
}
/**
* Sets the offset of the file in the block.
*/
public void setOffset(long offset)
{
this.offset = offset;
}
@Override
public long getLength()
{
return length;
}
/**
* Sets the length of the file in the block.
*/
public void setLength(long length)
{
this.length = length;
}
@Override
public boolean isLastBlock()
{
return isLastBlock;
}
public void setLastBlock(boolean lastBlock)
{
this.isLastBlock = lastBlock;
}
@Override
public long getPreviousBlockId()
{
return previousBlockId;
}
/**
* Sets the previous block id.
*
* @param previousBlockId previous block id.
*/
public void setPreviousBlockId(long previousBlockId)
{
this.previousBlockId = previousBlockId;
}
@Override
public long getBlockId()
{
return blockId;
}
public void setBlockId(long blockId)
{
this.blockId = blockId;
}
}
/**
* A block of file which contains file path and other block properties.
* It also controls if blocks should be read in sequence
*/
class FileBlockMetadata extends AbstractBlockMetadata
{
private final String filePath;
private long fileLength;
protected FileBlockMetadata()
{
super();
filePath = null;
}
public FileBlockMetadata(String filePath, long blockId, long offset, long length, boolean isLastBlock,
long previousBlockId)
{
super(blockId, offset, length, isLastBlock, previousBlockId);
this.filePath = filePath;
}
public FileBlockMetadata(String filePath, long blockId, long offset, long length, boolean isLastBlock,
long previousBlockId, long fileLength)
{
super(blockId, offset, length, isLastBlock, previousBlockId);
this.filePath = filePath;
this.fileLength = fileLength;
}
public FileBlockMetadata(String filePath)
{
this.filePath = filePath;
}
public FileBlockMetadata(String filePath, long fileLength)
{
this.filePath = filePath;
this.fileLength = fileLength;
}
public String getFilePath()
{
return filePath;
}
/**
* Returns the length of the file to which this block belongs
*
* @return length of the file to which this block belongs
*/
public long getFileLength()
{
return fileLength;
}
/**
* Set the length of the file to which this block belongs
*
* @param fileLength
*/
public void setFileLength(long fileLength)
{
this.fileLength = fileLength;
}
public FileBlockMetadata newInstance(@NotNull String filePath)
{
Preconditions.checkNotNull(filePath);
return new FileBlockMetadata(filePath);
}
}
}