1600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang/*
2600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang* Conditions Of Use
3600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang*
4600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang* This software was developed by employees of the National Institute of
5600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang* Standards and Technology (NIST), an agency of the Federal Government.
6600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang* Pursuant to title 15 Untied States Code Section 105, works of NIST
7600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang* employees are not subject to copyright protection in the United States
8600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang* and are considered to be in the public domain.  As a result, a formal
9600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang* license is not needed to use the software.
10600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang*
11600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang* This software is provided by NIST as a service and is expressly
12600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang* provided "AS IS."  NIST MAKES NO WARRANTY OF ANY KIND, EXPRESS, IMPLIED
13600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang* OR STATUTORY, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTY OF
14600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT
15600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang* AND DATA ACCURACY.  NIST does not warrant or make any representations
16600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang* regarding the use of the software or the results thereof, including but
17600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang* not limited to the correctness, accuracy, reliability or usefulness of
18600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang* the software.
19600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang*
20600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang* Permission to use this software is contingent upon your acceptance
21600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang* of the terms of this agreement
22600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang*
23600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang* .
24600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang*
25600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang*/
26600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang/*******************************************************************************
27600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang* Product of NIST/ITL Advanced Networking Technologies Division (ANTD).        *
28600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang*******************************************************************************/
29600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wangpackage gov.nist.core;
30600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wangimport java.net.*;
31600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
32600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang/**
33600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang* Holds the hostname:port.
34600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang*
35600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang*@version 1.2
36600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang*
37600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang*@author M. Ranganathan
38600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang*
39600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang*
40600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang*
41600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang*/
42600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wangpublic final class HostPort extends GenericObject {
43600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
44600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
45600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    private static final long serialVersionUID = -7103412227431884523L;
46600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
47600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    // host / ipv4/ ipv6/
48600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    /** host field
49600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     */
50600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    protected Host host;
51600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
52600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    /** port field
53600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *
54600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     */
55600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    protected int port;
56600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
57600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    /** Default constructor
58600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     */
59600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    public HostPort() {
60600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
61600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        host = null;
62600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        port = -1; // marker for not set.
63600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    }
64600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
65600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    /**
66600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * Encode this hostport into its string representation.
67600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * Note that this could be different from the string that has
68600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * been parsed if something has been edited.
69600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * @return String
70600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     */
71600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    public String encode() {
72600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        return encode(new StringBuffer()).toString();
73600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    }
74600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
75600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    public StringBuffer encode(StringBuffer buffer) {
76600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        host.encode(buffer);
77600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        if (port != -1)
78600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            buffer.append(COLON).append(port);
79600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        return buffer;
80600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    }
81600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
82600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    /** returns true if the two objects are equals, false otherwise.
83600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * @param other Object to set
84600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * @return boolean
85600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     */
86600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    public boolean equals(Object other) {
87600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        if (other == null) return false;
88600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        if (getClass () != other.getClass ()) {
89600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            return false;
90600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        }
91600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        HostPort that = (HostPort) other;
92600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        return port == that.port && host.equals(that.host);
93600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    }
94600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
95600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    /** get the Host field
96600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * @return host field
97600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     */
98600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    public Host getHost() {
99600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        return host;
100600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    }
101600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
102600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    /** get the port field
103600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * @return int
104600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     */
105600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    public int getPort() {
106600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        return port;
107600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    }
108600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
109600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    /**
110600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * Returns boolean value indicating if Header has port
111600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * @return boolean value indicating if Header has port
112600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     */
113600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    public boolean hasPort() {
114600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        return port != -1;
115600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    }
116600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
117600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    /** remove port.
118600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     */
119600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    public void removePort() {
120600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        port = -1;
121600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    }
122600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
123600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    /**
124600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang         * Set the host member
125600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang         * @param h Host to set
126600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang         */
127600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    public void setHost(Host h) {
128600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        host = h;
129600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    }
130600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
131600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    /**
132600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang         * Set the port member
133600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang         * @param p int to set
134600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang         */
135600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    public void setPort(int p) {
136600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        port = p;
137600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    }
138600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
139600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    /** Return the internet address corresponding to the host.
140600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *@throws java.net.UnkownHostException if host name cannot be resolved.
141600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *@return the inet address for the host.
142600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     */
143600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    public InetAddress getInetAddress() throws java.net.UnknownHostException {
144600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        if (host == null)
145600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            return null;
146600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        else
147600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            return host.getInetAddress();
148600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    }
149600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
150600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    public void merge(Object mergeObject) {
151600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        super.merge (mergeObject);
152600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        if (port == -1)
153600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            port = ((HostPort) mergeObject).port;
154600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    }
155600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
156600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    public Object clone() {
157600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        HostPort retval = (HostPort) super.clone();
158600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        if (this.host != null)
159600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            retval.host = (Host) this.host.clone();
160600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        return retval;
161600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    }
162600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
163600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    public String toString() {
164600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        return this.encode();
165600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    }
166600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
167600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    @Override
168600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    public int hashCode() {
169600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        return this.host.hashCode() + this.port;
170600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    }
171600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang}
172