blob: 3ace710001148fb57c55ede774ca1be0852291d0 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2004 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.discovery;
import java.io.Serializable;
import java.net.URI;
import org.eclipse.core.runtime.Assert;
import org.eclipse.core.runtime.IAdapterManager;
import org.eclipse.ecf.core.identity.Namespace;
import org.eclipse.ecf.discovery.identity.*;
import org.eclipse.ecf.internal.discovery.DiscoveryPlugin;
/**
* Base implementation of {@link IServiceInfo}. Subclasses may be created as
* appropriate.
*/
public class ServiceInfo implements IServiceInfo, Serializable {
private static final long serialVersionUID = -5651115550295457142L;
/**
* @since 4.0
*/
public static final long DEFAULT_TTL = 3600; // 1h
public static final int DEFAULT_PRIORITY = 0;
public static final int DEFAULT_WEIGHT = 0;
public static final String UNKNOWN_PROTOCOL = "unknown"; //$NON-NLS-1$
/**
* @since 3.0
*/
protected String serviceName;
protected IServiceID serviceID;
protected int priority;
protected int weight;
protected IServiceProperties properties;
/**
* @since 4.0
*/
protected long timeToLive;
protected ServiceInfo() {
// null constructor for subclasses
}
/**
* Create an IServiceInfo instance.
*
* @param anURI
* The (absolute) location of the service.
* @param aServiceName
* a user chosen service name. Only ASCII characters are allowed.
* @param aServiceTypeID
* the service type identifier.
* @since 3.0
*/
public ServiceInfo(URI anURI, String aServiceName, IServiceTypeID aServiceTypeID) {
this(anURI, aServiceName, aServiceTypeID, DEFAULT_PRIORITY, DEFAULT_WEIGHT, null);
}
/**
* Create an IServiceInfo instance.
*
* @param anURI
* The (absolute) location of the service.
* @param aServiceName
* a user chosen service name. Only ASCII characters are allowed.
* @param aServiceTypeID
* the service type identifier.
* @param props
* generic service properties.
* @since 3.0
*/
public ServiceInfo(URI anURI, String aServiceName, IServiceTypeID aServiceTypeID, IServiceProperties props) {
this(anURI, aServiceName, aServiceTypeID, DEFAULT_PRIORITY, DEFAULT_WEIGHT, props);
}
/**
* Create an IServiceInfo instance.
*
* @param anURI
* The (absolute) location of the service.
* @param aServiceName
* a user chosen service name. Only ASCII characters are allowed.
* @param aServiceTypeID
* the service type identifier.
* @param priority
* the service priority. The priority of this target host. A
* client MUST attempt to contact the target host with the
* lowest-numbered priority it can reach; target hosts with the
* same priority SHOULD be tried in an order defined by the
* weight field.
*
* @param weight
* the service weight. A server selection mechanism. The weight
* field specifies a relative weight for entries with the same
* priority. Larger weights SHOULD be given a proportionately
* higher probability of being selected. Domain administrators
* SHOULD use Weight 0 when there isn't any server selection to
* do. In the presence of records containing weights greater than
* 0, records with weight 0 should have a very small chance of
* being selected.
* @param props
* generic service properties.
* @since 3.0
*/
public ServiceInfo(URI anURI, String aServiceName, IServiceTypeID aServiceTypeID, int priority, int weight,
IServiceProperties props) {
this(anURI, aServiceName, aServiceTypeID, priority, weight, props, DEFAULT_TTL);
}
/**
* Create an IServiceInfo instance.
*
* @param anURI
* The (absolute) location of the service.
* @param aServiceName
* a user chosen service name. Only ASCII characters are allowed.
* @param aServiceTypeID
* the service type identifier.
* @param priority
* the service priority. The priority of this target host. A
* client MUST attempt to contact the target host with the
* lowest-numbered priority it can reach; target hosts with the
* same priority SHOULD be tried in an order defined by the
* weight field.
*
* @param weight
* the service weight. A server selection mechanism. The weight
* field specifies a relative weight for entries with the same
* priority. Larger weights SHOULD be given a proportionately
* higher probability of being selected. Domain administrators
* SHOULD use Weight 0 when there isn't any server selection to
* do. In the presence of records containing weights greater than
* 0, records with weight 0 should have a very small chance of
* being selected.
* @param props
* generic service properties.
* @param ttl
* time to live
*
* @since 4.0
*/
public ServiceInfo(URI anURI, String aServiceName, IServiceTypeID aServiceTypeID, int priority, int weight,
IServiceProperties props, long ttl) {
Assert.isNotNull(anURI);
Assert.isNotNull(aServiceName);
Assert.isNotNull(aServiceTypeID);
// Assert.isLegal(anURI.isOpaque(), "Opaque URI is not supported");
// Assert.isLegal(!anURI.isAbsolute(),
// "Non absolute URI is not supported");
// [scheme:][//authority][path][?query][#fragment]
// Scheme -> Protocol
String scheme = anURI.getScheme();
if (scheme == null) {
scheme = UNKNOWN_PROTOCOL;
}
// UserInfo
String userInfo = anURI.getUserInfo();
if (userInfo == null) {
userInfo = "";
} else {
userInfo += "@";
}
// Host
String host = anURI.getHost();
Assert.isNotNull(host);
// Port
int port = anURI.getPort();
if (port == -1) {
port = 0;
}
// Path
String path = anURI.getPath();
if (path == null) {
path = "/";
}
// query
String query = anURI.getQuery();
if (query == null) {
query = "";
} else {
query = "?" + query;
}
// fragment
String fragment = anURI.getFragment();
if (fragment == null) {
fragment = "";
} else {
fragment = "#" + fragment;
}
URI uri = URI.create(scheme + "://" + userInfo + host + ":" + port + path + query + fragment);
// service id
Namespace ns = aServiceTypeID.getNamespace();
this.serviceID = (IServiceID) ns.createInstance(new Object[] { aServiceTypeID, uri });
((ServiceID) serviceID).setServiceInfo(this);
this.serviceName = aServiceName;
this.weight = weight;
this.priority = priority;
properties = (props == null) ? new ServiceProperties() : props;
this.timeToLive = ttl;
}
/*
* (non-Javadoc)
*
* @see org.eclipse.ecf.discovery.IServiceInfo#getAddress()
*/
public URI getLocation() {
return serviceID.getLocation();
}
/*
* (non-Javadoc)
*
* @see org.eclipse.ecf.discovery.IServiceInfo#getServiceID()
*/
public IServiceID getServiceID() {
return serviceID;
}
/*
* (non-Javadoc)
*
* @see org.eclipse.ecf.discovery.IServiceInfo#getPriority()
*/
public int getPriority() {
return priority;
}
/*
* (non-Javadoc)
*
* @see org.eclipse.ecf.discovery.IServiceInfo#getWeight()
*/
public int getWeight() {
return weight;
}
/*
* (non-Javadoc)
*
* @see org.eclipse.ecf.discovery.IServiceInfo#getServiceProperties()
*/
public IServiceProperties getServiceProperties() {
return properties;
}
/*
* (non-Javadoc)
*
* @see java.lang.Object#toString()
*/
public String toString() {
final StringBuffer buf = new StringBuffer("ServiceInfo["); //$NON-NLS-1$
buf.append("uri=").append(getLocation()).append(";id=").append(serviceID) //$NON-NLS-1$ //$NON-NLS-2$
.append(";priority=") //$NON-NLS-1$
.append(priority).append(";weight=").append(weight) //$NON-NLS-1$
.append(
";props=")
.append(properties).append("]"); //$NON-NLS-1$
return buf.toString();
}
/*
* (non-Javadoc)
*
* @see org.eclipse.core.runtime.IAdaptable#getAdapter(java.lang.Class)
*/
public Object getAdapter(Class adapter) {
if (adapter.isInstance(this)) {
return this;
}
final IAdapterManager adapterManager = DiscoveryPlugin.getDefault().getAdapterManager();
if (adapterManager == null)
return null;
return adapterManager.loadAdapter(this, adapter.getName());
}
/**
* (non-Javadoc)
*
* @see org.eclipse.ecf.discovery.IServiceInfo#getServiceName()
* @since 3.0
*/
public String getServiceName() {
return serviceName;
}
/**
* (non-Javadoc)
*
* @see org.eclipse.ecf.discovery.IServiceInfo#getTTL()
* @since 4.0
*/
public long getTTL() {
return timeToLive;
}
}