/*******************************************************************************
 * Copyright (c) 2010-2011 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.osgi.services.remoteserviceadmin;

import org.eclipse.ecf.core.identity.Namespace;
import org.eclipse.ecf.discovery.identity.IServiceID;

/**
 * Discovered endpoint description. Instances of this class represent discovered
 * endpoint descriptions that were discovered by a particular discovery locator
 * namespace.  Instances of this class are typically created via a {@link IDiscoveredEndpointDescriptionFactory}.
 * 
 * @see IDiscoveredEndpointDescriptionFactory
 */
public class DiscoveredEndpointDescription {

	private Namespace discoveryLocatorNamespace;
	private IServiceID serviceID;
	private org.osgi.service.remoteserviceadmin.EndpointDescription endpointDescription;
	private int hashCode = 7;

	public DiscoveredEndpointDescription(
			Namespace discoveryLocatorNamespace,
			IServiceID serviceID,
			org.osgi.service.remoteserviceadmin.EndpointDescription endpointDescription) {
		this.discoveryLocatorNamespace = discoveryLocatorNamespace;
		this.serviceID = serviceID;
		this.endpointDescription = endpointDescription;
		this.hashCode = 31 * this.hashCode
				+ discoveryLocatorNamespace.getName().hashCode();
		this.hashCode = 31 * this.hashCode + endpointDescription.hashCode();
	}

	public int hashCode() {
		return hashCode;
	}

	public boolean equals(Object other) {
		if (other == null)
			return false;
		if (other == this)
			return true;
		if (!(other instanceof DiscoveredEndpointDescription))
			return false;
		DiscoveredEndpointDescription o = (DiscoveredEndpointDescription) other;
		return (this.discoveryLocatorNamespace
				.equals(o.discoveryLocatorNamespace) && this.endpointDescription
				.equals(o.endpointDescription));
	}

	public Namespace getDiscoveryLocatorNamespace() {
		return discoveryLocatorNamespace;
	}

	public IServiceID getServiceID() {
		return serviceID;
	}

	public org.osgi.service.remoteserviceadmin.EndpointDescription getEndpointDescription() {
		return endpointDescription;
	}
}
