/****************************************************************************
 * Copyright (c) 2006, 2007 Composent, Inc. and others.
 * 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:
 *    Composent, Inc. - initial API and implementation
 *****************************************************************************/
package org.eclipse.ecf.provider.filetransfer.identity;

import java.net.MalformedURLException;
import java.net.URI;
import java.net.URISyntaxException;
import java.net.URL;
import org.eclipse.core.runtime.Assert;
import org.eclipse.ecf.core.identity.BaseID;
import org.eclipse.ecf.core.identity.Namespace;
import org.eclipse.ecf.filetransfer.identity.IFileID;
import org.eclipse.ecf.internal.provider.filetransfer.Messages;

public class FileTransferID extends BaseID implements IFileID {

	private static final long serialVersionUID = 1274308869502156992L;

	URL fileURL;
	URI fileURI;

	public FileTransferID(Namespace namespace, URL url) {
		super(namespace);
		Assert.isNotNull(url, Messages.FileTransferID_Exception_Url_Not_Null);
		this.fileURL = url;
	}

	/**
	 * @since 3.2
	 */
	public FileTransferID(Namespace namespace, URI uri) {
		super(namespace);
		Assert.isNotNull(uri, "FileTransferID URI cannot be null"); //$NON-NLS-1$
		this.fileURI = uri;
	}

	protected int namespaceCompareTo(BaseID o) {
		if (o == null)
			return 1;
		if (!(o instanceof FileTransferID))
			return 1;

		return (fileURI != null) ? fileURI.compareTo(((FileTransferID) o).fileURI) : fileURL.toExternalForm().compareTo(((FileTransferID) o).toExternalForm());
	}

	protected boolean namespaceEquals(BaseID o) {
		if (o == null)
			return false;
		if (!(o instanceof FileTransferID))
			return false;

		return (fileURI != null) ? fileURI.equals(((FileTransferID) o).fileURI) : fileURL.equals(((FileTransferID) o).fileURL);
	}

	protected String namespaceGetName() {
		return (fileURI != null) ? fileURI.toASCIIString() : fileURL.toExternalForm();
	}

	protected int namespaceHashCode() {
		return (fileURI != null) ? fileURI.hashCode() : this.fileURL.hashCode();
	}

	public String getFilename() {
		return getFileNameOnly();
	}

	public URL getURL() throws MalformedURLException {
		return (fileURI != null) ? fileURI.toURL() : fileURL;
	}

	protected String getFileNameOnly() {
		final String path = this.fileURL.getPath();
		return path.substring(path.lastIndexOf("/") + 1); //$NON-NLS-1$;
	}

	public String toString() {
		final StringBuffer b = new StringBuffer("FileTransferID["); //$NON-NLS-1$
		b.append(toExternalForm());
		b.append("]"); //$NON-NLS-1$
		return b.toString();
	}

	/**
	 * @since 3.2
	 */
	public URI getURI() throws URISyntaxException {
		return (fileURI != null) ? fileURI : new URI(fileURL.toExternalForm());
	}
}
