/*******************************************************************************
 * Copyright (c) 2008-2011 Chair for Applied Software Engineering,
 * Technische Universitaet Muenchen.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 * Carl Peiffer, Jan Finis - initial API and implementation
 ******************************************************************************/
package org.eclipse.emf.emfstore.internal.client.model.filetransfer;

import java.io.File;

import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.emf.emfstore.internal.client.model.ESWorkspaceProviderImpl;
import org.eclipse.emf.emfstore.internal.client.model.connectionmanager.ConnectionManager;
import org.eclipse.emf.emfstore.internal.client.model.impl.ProjectSpaceBase;
import org.eclipse.emf.emfstore.internal.client.model.util.EMFStoreCommand;
import org.eclipse.emf.emfstore.internal.server.exceptions.FileTransferException;
import org.eclipse.emf.emfstore.internal.server.filetransfer.FilePartitionerUtil;
import org.eclipse.emf.emfstore.internal.server.filetransfer.FileTransferInformation;
import org.eclipse.emf.emfstore.internal.server.model.FileIdentifier;
import org.eclipse.emf.emfstore.internal.server.model.ProjectId;
import org.eclipse.emf.emfstore.internal.server.model.SessionId;

/**
 * Abstract class for the file transfer job encapsulating methods used for downloads and uploads.
 *
 * @author pfeifferc, jfinis
 */
public abstract class FileTransferJob extends Job {

	private ConnectionManager connectionManager;
	private Exception exception;
	private File file;
	private ProjectId projectId;
	private SessionId sessionId;
	private boolean canceled;

	private final ProjectSpaceBase projectSpace;
	private final FileTransferManager transferManager;
	private final FileTransferCacheManager cache;
	private final FileTransferInformation fileInformation;
	private final FileIdentifier fileId;

	/**
	 * Constructor to be called by subclasses.
	 *
	 * @param transferManager the transfer manager handling the transfer job
	 * @param fileInfo the transfer information of the job
	 * @param name of the transfer job
	 */
	protected FileTransferJob(FileTransferManager transferManager, FileTransferInformation fileInfo, String name) {
		super(name);
		fileInformation = fileInfo;
		fileId = fileInfo.getFileIdentifier();
		projectSpace = transferManager.getProjectSpace();
		this.transferManager = transferManager;
		cache = transferManager.getCache();
	}

	/**
	 * Gets the attributes required for the file transfer.
	 *
	 * @throws FileTransferException if there are any null values in the attributes
	 */
	protected void getConnectionAttributes() throws FileTransferException {

		connectionManager = ESWorkspaceProviderImpl.getInstance().getConnectionManager();
		projectId = projectSpace.getProjectId();

		if (projectSpace.getUsersession() == null) {
			throw new FileTransferException(Messages.FileTransferJob_UnknownSession);
		}

		new EMFStoreCommand() {
			@Override
			protected void doRun() {
				sessionId = projectSpace.getUsersession().getSessionId();
			}
		}.run(false);
	}

	/**
	 * @param monitor monitor
	 */
	protected void setTotalWork(IProgressMonitor monitor) {
		monitor.beginTask(Messages.FileTransferJob_Transferring,
			fileInformation.getFileSize() / FilePartitionerUtil.getChunkSize());
	}

	/**
	 * @see org.eclipse.core.runtime.jobs.Job#canceling()
	 */
	@Override
	protected void canceling() {
		canceled = true;
		super.canceling();
	}

	/**
	 * Increments the chunk number by 1.
	 */
	protected void incrementChunkNumber() {
		fileInformation.setChunkNumber(fileInformation.getChunkNumber() + 1);
	}

	/**
	 * @param monitor progress monitor
	 */
	protected void initializeMonitor(IProgressMonitor monitor) {
		// set monitor total work based on file size previously retrieved
		setTotalWork(monitor);
		// set progress based on how many file chunks that have already been sent
		monitor.worked(fileInformation.getChunkNumber());
	}

	/**
	 * @return the exception, if there has been any. Null otherwise.
	 */
	public Exception getException() {
		return exception;
	}

	/**
	 * Returns the connection manager, handling the connection to the emf store.
	 *
	 * @return the connection manager
	 */
	protected ConnectionManager getConnectionManager() {
		return connectionManager;
	}

	/**
	 * Returns the transferred file.
	 *
	 * @return the file where the file transfer is stored
	 */
	protected File getFile() {
		return file;
	}

	/**
	 * Sets the transferred file.
	 *
	 * @param file the file to store the transfer in
	 */
	protected void setFile(File file) {
		this.file = file;
	}

	/**
	 * Returns the project id of the project to which the file transfer belongs.
	 *
	 * @return project id
	 */
	protected ProjectId getProjectId() {
		return projectId;
	}

	/**
	 * Returns the session id for the connection with the emf store.
	 *
	 * @return session id
	 */
	protected SessionId getSessionId() {
		return sessionId;
	}

	/**
	 * Whether the user canceled the transfer.
	 *
	 * @return true iff canceled
	 */
	protected boolean isCanceled() {
		return canceled;
	}

	/**
	 * Returns the project space which is associated with the file transfer.
	 *
	 * @return the associated project space
	 */
	protected ProjectSpaceBase getProjectSpace() {
		return projectSpace;
	}

	/**
	 * Returns the file transfer manager administering the file transfer.
	 *
	 * @return the file transfer manager
	 */
	protected FileTransferManager getTransferManager() {
		return transferManager;
	}

	/**
	 * Returns the cache manager associated with the project space of this file transfer.
	 *
	 * @return the cache manager
	 */
	protected FileTransferCacheManager getCache() {
		return cache;
	}

	/**
	 * Returns the file transfer information of this transfer.
	 *
	 * @return transfer information
	 */
	protected FileTransferInformation getFileInformation() {
		return fileInformation;
	}

	/**
	 * Returns the file identifier of this file transfer.
	 *
	 * @return the file identifier
	 */
	protected FileIdentifier getFileId() {
		return fileId;
	}

	/**
	 * Sets the exception for this transfer. Do this in case an exception occurs. This exception can later be retrieved
	 * by get exception.
	 *
	 * @param exception the exception that occurred
	 */
	protected void setException(Exception exception) {
		this.exception = exception;
	}

}
