/*
 * Copyright 2014 Open Networking Laboratory
 *
 * 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 org.onlab.onos.net;

import static org.onlab.onos.net.PortNumber.P0;

/**
 * Representation of a network edge location where an end-station host is
 * connected.
 */
public class HostLocation extends ConnectPoint {

    /**
     * Represents a no location or an unknown location.
     */
    public static final HostLocation NONE = new HostLocation(DeviceId.NONE, P0, 0L);

    // Note that time is explicitly excluded from the notion of equality.
    private final long time;

    /**
     * Creates a new host location using the supplied device &amp; port.
     *
     * @param deviceId   device identity
     * @param portNumber device port number
     * @param time       time when detected, in millis since start of epoch
     */
    public HostLocation(DeviceId deviceId, PortNumber portNumber, long time) {
        super(deviceId, portNumber);
        this.time = time;
    }

    /**
     * Creates a new host location derived from the supplied connection point.
     *
     * @param connectPoint connection point
     * @param time         time when detected, in millis since start of epoch
     */
    public HostLocation(ConnectPoint connectPoint, long time) {
        super(connectPoint.deviceId(), connectPoint.port());
        this.time = time;
    }

    /**
     * Returns the time when the location was established, given in
     * milliseconds since start of epoch.
     *
     * @return time in milliseconds since start of epoch
     */
    public long time() {
        return time;
    }

}
