/*
 *  Licensed to the Apache Software Foundation (ASF) under one
 *  or more contributor license agreements.  See the NOTICE file
 *  distributed with this work for additional information
 *  regarding copyright ownership.  The ASF licenses this file
 *  to you 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.apache.directory.server.dhcp.store;


import java.net.InetAddress;

import org.apache.directory.server.dhcp.messages.HardwareAddress;


/**
 * The definition of a host.
 * 
 * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
 * @version $Rev: 545042 $, $Date: 2007-06-06 22:32:01 -0500 (Mi, 06 Jun 2007) $
 */
public class Host extends DhcpConfigElement
{
    private final String name;

    private HardwareAddress hardwareAddress;

    /**
     * The host's fixed address. May be <code>null</code>.
     */
    private InetAddress address;


    public Host(String name, InetAddress address, HardwareAddress hardwareAddress)
    {
        this.name = name;
        this.address = address;
        this.hardwareAddress = hardwareAddress;
    }


    public HardwareAddress getHardwareAddress()
    {
        return hardwareAddress;
    }


    public String getName()
    {
        return name;
    }


    public InetAddress getAddress()
    {
        return address;
    }
}
