/**
 * Copyright (C) 2004-2011 Jive Software. All rights reserved.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package net.java.sipmack.sip.simple;

/**
 * The <contact> element contains a URL of the contact address. It optionally
 * has a 'priority' attribute, whose value means a relative priority of this
 * contact address over the others. The value of the attribute MUST be a decimal
 * number between 0 and 1 inclusive with at most 3 digits after the decimal
 * point. Higher values indicate higher priority. Examples of priority values
 * are 0, 0.021, 0.5, 1.00. If the 'priority' attribute is omitted, applications
 * MUST assign the contact address the lowest priority. If the 'priority' value
 * is out of the range, applications just SHOULD ignore the value and process it
 * as if the attribute was not present. Applications SHOULD handle contacts with
 * a higher priority as they have precedence over those with lower priorities.
 * How they are actually treated is beyond this specification. Also, how to
 * handle contacts with the same priority is up to implementations.
 *
 * @author Emil Ivov
 * @version 1.0
 */

public class ContactUri implements Comparable<ContactUri> {
    /**
     */
    private float priority = 0;

    /**
     */
    private String contactValue = null;

    /**
     * Sets the value of the priority attribute.
     *
     * @param priority a three digit float value indicating contact priority
     * @uml.property name="priority"
     */
    public void setPriority(float priority) {
        this.priority = priority;
    }

    /**
     * Sets the value of this contact.
     *
     * @param contactValue the value to give to this contact
     * @uml.property name="contactValue"
     */
    public void setContactValue(String contactValue) {
        this.contactValue = contactValue;
    }

    /**
     * Returns the value of the priority attribute.
     *
     * @return a three digit float value indicating contact priority
     * @uml.property name="priority"
     */
    public float getPriority() {
        return priority;
    }

    /**
     * Returns the value of this contact
     *
     * @return the value of this contact
     * @uml.property name="contactValue"
     */
    public String getContactValue() {
        return contactValue;
    }

    /**
     * Compares this object with the specified object for order.
     *
     * @param o the Object to be compared.
     * @return a negative integer, zero, or a positive integer as this object is
     *         less than, equal to, or greater than the specified object.
     */
//    public int compareTo(Object o) {
//        if (!(o instanceof ContactUri))
//            return Integer.MAX_VALUE;
//        return -(((int)(getPriority() * 1000)) - (int)(((ContactUri)o)
//                .getPriority() * 1000));
//    }

    public Object clone() {
        ContactUri clone = new ContactUri();
        clone.setContactValue(new String(getContactValue()));
        clone.setPriority(getPriority());
        return clone;
	}

    @Override
    public int compareTo(ContactUri o) {
	return -(((int)(getPriority() * 1000)) - (int)(((ContactUri)o)
                .getPriority() * 1000));
    }
}
