/*
* Title: CloudSim Toolkit
* Description: CloudSim (Cloud Simulation) Toolkit for Modeling and Simulation of Clouds
* Licence: GPL - http://www.gnu.org/copyleft/gpl.html
*
* Copyright (c) 2009-2012, The University of Melbourne, Australia
*/
package org.cloudbus.cloudsim;
import java.util.Date;
import org.cloudbus.cloudsim.core.CloudSim;
/**
* A class for storing related information regarding to a {@link gridsim.datagrid.File} entity.
*
* @author Uros Cibej
* @author Anthony Sulistio
* @since CloudSim Toolkit 1.0
*/
public class FileAttribute {
private String name; // logical file name
private String ownerName; // owner name of this file
private int id; // file ID given by a Replica Catalogue
private int type; // file type, e.g. raw, reconstructed, etc
private int size; // file size in byte
private int checksum; // check sum
private double lastUpdateTime; // last updated time (sec) - relative
private long creationTime; // creation time (ms) - abosulte/relative
private double cost; // price of this file
private boolean masterCopy; // false if it is a replica
private boolean readOnly; // false if it can be rewritten
private int resourceId; // resource ID storing this file
/**
* Allocates a new FileAttribute class.
*
* @param fileName file name
* @param fileSize size of this file (in bytes)
* @throws ParameterException This happens when one of the following scenarios occur:
* <ul>
* <li>the file name is empty or <tt>null</tt>
* <li>the file size is zero or negative numbers
* </ul>
*/
public FileAttribute(String fileName, int fileSize) throws ParameterException {
// check for errors in the input
if (fileName == null || fileName.length() == 0) {
throw new ParameterException("FileAttribute(): Error - invalid file name.");
}
if (fileSize <= 0) {
throw new ParameterException("FileAttribute(): Error - size <= 0.");
}
size = fileSize;
name = fileName;
// set the file creation time. This is absolute time
Date date = CloudSim.getSimulationCalendar().getTime();
if (date == null) {
creationTime = 0;
} else {
creationTime = date.getTime();
}
ownerName = null;
id = File.NOT_REGISTERED;
checksum = 0;
type = File.TYPE_UNKOWN;
lastUpdateTime = 0;
cost = 0;
resourceId = -1;
masterCopy = true;
readOnly = false;
}
/**
* Copy the values of this object into another FileAttribute class
*
* @param attr a FileAttribute object (the destination)
* @return <tt>true</tt> if the copy operation is successful, <tt>false</tt> otherwise
*/
public boolean copyValue(FileAttribute attr) {
if (attr == null) {
return false;
}
attr.setFileSize(size);
attr.setResourceID(resourceId);
attr.setOwnerName(ownerName);
attr.setUpdateTime(lastUpdateTime);
attr.setRegistrationId(id);
attr.setType(type);
attr.setChecksum(checksum);
attr.setCost(cost);
attr.setMasterCopy(masterCopy);
attr.setReadOnly(readOnly);
attr.setName(name);
attr.setCreationTime(creationTime);
return true;
}
/**
* Sets the file creation time (in millisecond)
*
* @param creationTime the file creation time (in millisecond)
* @return <tt>true</tt> if successful, <tt>false</tt> otherwise
*/
public boolean setCreationTime(long creationTime) {
if (creationTime <= 0) {
return false;
}
this.creationTime = creationTime;
return true;
}
/**
* Gets the file creation time (in millisecond)
*
* @return the file creation time (in millisecond)
*/
public long getCreationTime() {
return creationTime;
}
/**
* Sets the resource ID that stores this file
*
* @param resourceID a resource ID
* @return <tt>true</tt> if successful, <tt>false</tt> otherwise
*/
public boolean setResourceID(int resourceID) {
if (resourceID == -1) {
return false;
}
resourceId = resourceID;
return true;
}
/**
* Gets the resource ID that stores this file
*
* @return the resource ID
*/
public int getResourceID() {
return resourceId;
}
/**
* Sets the owner name of this file
*
* @param name the owner name
* @return <tt>true</tt> if successful, <tt>false</tt> otherwise
*/
public boolean setOwnerName(String name) {
if (name == null || name.length() == 0) {
return false;
}
ownerName = name;
return true;
}
/**
* Gets the owner name of this file
*
* @return the owner name or <tt>null</tt> if empty
*/
public String getOwnerName() {
return ownerName;
}
/**
* Gets the size of this object (in byte).<br>
* NOTE: This object size is NOT the actual file size. Moreover, this size is used for
* transferring this object over a network.
*
* @return the object size (in byte)
*/
public int getAttributeSize() {
int length = DataCloudTags.PKT_SIZE;
if (ownerName != null) {
length += ownerName.length();
}
if (name != null) {
length += name.length();
}
return length;
}
/**
* Sets the file size (in MBytes)
*
* @param fileSize the file size (in MBytes)
* @return <tt>true</tt> if successful, <tt>false</tt> otherwise
*/
public boolean setFileSize(int fileSize) {
if (fileSize < 0) {
return false;
}
size = fileSize;
return true;
}
/**
* Gets the file size (in MBytes)
*
* @return the file size (in MBytes)
*/
public int getFileSize() {
return size;
}
/**
* Gets the file size (in bytes)
*
* @return the file size (in bytes)
*/
public int getFileSizeInByte() {
return size * Consts.MILLION; // 1e6
// return size * 1048576; // 1e6 - more accurate
}
/**
* Sets the last update time of this file (in seconds)<br>
* NOTE: This time is relative to the start time. Preferably use
* {@link gridsim.CloudSim#clock()} method.
*
* @param time the last update time (in seconds)
* @return <tt>true</tt> if successful, <tt>false</tt> otherwise
*/
public boolean setUpdateTime(double time) {
if (time <= 0 || time < lastUpdateTime) {
return false;
}
lastUpdateTime = time;
return true;
}
/**
* Gets the last update time (in seconds)
*
* @return the last update time (in seconds)
*/
public double getLastUpdateTime() {
return lastUpdateTime;
}
/**
* Sets the file registration ID (published by a Replica Catalogue entity)
*
* @param id registration ID
* @return <tt>true</tt> if successful, <tt>false</tt> otherwise
*/
public boolean setRegistrationId(int id) {
if (id < 0) {
return false;
}
this.id = id;
return true;
}
/**
* Gets the file registration ID
*
* @return registration ID
*/
public int getRegistrationID() {
return id;
}
/**
* Sets the file type (e.g. raw, tag, etc)
*
* @param type a file type
* @return <tt>true</tt> if successful, <tt>false</tt> otherwise
*/
public boolean setType(int type) {
if (type < 0) {
return false;
}
this.type = type;
return true;
}
/**
* Gets this file type
*
* @return file type
*/
public int getType() {
return type;
}
/**
* Sets the checksum of this file
*
* @param checksum the checksum of this file
* @return <tt>true</tt> if successful, <tt>false</tt> otherwise
*/
public boolean setChecksum(int checksum) {
if (checksum < 0) {
return false;
}
this.checksum = checksum;
return true;
}
/**
* Gets the file checksum
*
* @return file checksum
*/
public int getChecksum() {
return checksum;
}
/**
* Sets the cost associated with this file
*
* @param cost cost of this file
* @return <tt>true</tt> if successful, <tt>false</tt> otherwise
*/
public boolean setCost(double cost) {
if (cost < 0) {
return false;
}
this.cost = cost;
return true;
}
/**
* Gets the cost associated with this file
*
* @return the cost of this file
*/
public double getCost() {
return cost;
}
/**
* Checks if this file already registered to a Replica Catalogue
*
* @return <tt>true</tt> if it is registered, <tt>false</tt> otherwise
*/
public boolean isRegistered() {
boolean result = true;
if (id == File.NOT_REGISTERED) {
result = false;
}
return result;
}
/**
* Marks this file as a master copy or replica
*
* @param masterCopy a flag denotes <tt>true</tt> for master copy or <tt>false</tt> for a
* replica
*/
public void setMasterCopy(boolean masterCopy) {
this.masterCopy = masterCopy;
}
/**
* Checks whether this file is a master copy or replica
*
* @return <tt>true</tt> if it is a master copy or <tt>false</tt> otherwise
*/
public boolean isMasterCopy() {
return masterCopy;
}
/**
* Marks this file as a read only or not
*
* @param readOnly a flag denotes <tt>true</tt> for read only or <tt>false</tt> for re-writeable
*/
public void setReadOnly(boolean readOnly) {
this.readOnly = readOnly;
}
/**
* Checks whether this file is a read only or not
*
* @return <tt>true</tt> if it is a read only or <tt>false</tt> otherwise
*/
public boolean isReadOnly() {
return readOnly;
}
/**
* Sets the file name
*
* @param name the file name
*/
public void setName(String name) {
this.name = name;
}
/**
* Returns the file name
*
* @return the file name
*/
public String getName() {
return name;
}
}