/*******************************************************************************
 * Copyright (c) 2009, Cloudsmith Inc.
 * The code, documentation and other materials contained herein have been
 * licensed under the Eclipse Public License - v 1.0 by the copyright holder
 * listed above, as the Initial Contributor under such license. The text or
 * such license is available at www.eclipse.org.
 ******************************************************************************/
package org.eclipse.equinox.internal.p2.repository;

import java.util.Properties;

/**
 * Carries information about a file transfer.
 * 
 */
public class FileInfo {
	public static final String PROPERTY_CONTENT_TYPE = "contentType"; //$NON-NLS-1$

	public static final String PROPERTY_LAST_MODIFIED = "lastModified"; //$NON-NLS-1$

	public static final String PROPERTY_NAME = "name"; //$NON-NLS-1$

	public static final String PROPERTY_SIZE = "size"; //$NON-NLS-1$

	public static final String PROPERTY_SPEED = "speed"; //$NON-NLS-1$

	public static final long UNKNOWN_RATE = -1L;

	private String contentType;

	private long lastModified = 0L;

	private String name;

	private long size = -1L;

	private long averageSpeed = UNKNOWN_RATE;

	public FileInfo() {
		contentType = ""; //$NON-NLS-1$
		name = ""; //$NON-NLS-1$
	}

	public FileInfo(FileInfo fileInfo) {
		initFrom(fileInfo);
	}

	/*
	 * (non java doc)
	 * properties based method for possible use with resumable download
	 */
	public FileInfo(Properties properties) {
		name = properties.getProperty(PROPERTY_NAME);
		contentType = properties.getProperty(PROPERTY_CONTENT_TYPE);

		String v = properties.getProperty(PROPERTY_LAST_MODIFIED);
		if (v != null)
			lastModified = Long.parseLong(v);

		v = properties.getProperty(PROPERTY_SIZE);
		if (v != null)
			size = Long.parseLong(v);
		v = properties.getProperty(PROPERTY_SPEED);
		if (v != null)
			averageSpeed = Long.parseLong(v);
	}

	/*
	 * (non java doc)
	 * properties based method for possible use with resumable download
	 */
	public void addProperties(Properties properties) {
		if (contentType != null)
			properties.setProperty(PROPERTY_CONTENT_TYPE, contentType);
		if (lastModified != 0L)
			properties.setProperty(PROPERTY_LAST_MODIFIED, Long.toString(lastModified));
		if (name != null)
			properties.setProperty(PROPERTY_NAME, name);
		if (size != -1L)
			properties.setProperty(PROPERTY_SIZE, Long.toString(size));
		if (averageSpeed != UNKNOWN_RATE)
			properties.setProperty(PROPERTY_SPEED, Long.toString(averageSpeed));

	}

	public final String getContentType() {
		return contentType;
	}

	public long getLastModified() {
		return lastModified;
	}

	public final String getRemoteName() {
		return name;
	}

	public final long getSize() {
		return size;
	}

	public void initFrom(FileInfo info) {
		setName(info.getRemoteName());
		setContentType(info.getContentType());
		setSize(info.getSize());
		setLastModified(info.getLastModified());
	}

	public void reset() {
		name = null;
		contentType = null;
		size = -1;
		lastModified = 0;
	}

	public final void setContentType(String contentType) {
		this.contentType = contentType;
	}

	public void setLastModified(long timestamp) {
		lastModified = timestamp;
	}

	public final void setName(String name) {
		this.name = name;
	}

	public final void setSize(long size) {
		this.size = size;
	}

	/**
	 * Set the average transfer rate measured in bytes/second
	 * @param averageSpeed rate in bytes/second, or {@link #UNKNOWN_RATE}
	 */
	public void setAverageSpeed(long averageSpeed) {
		this.averageSpeed = averageSpeed;
	}

	/**
	 * Returns the average transfer rate measured in bytes/second.
	 * @return transfer rate in bytes/second or {@link #UNKNOWN_RATE}
	 */
	public long getAverageSpeed() {
		return averageSpeed;
	}
}
