blob: 688d56755577fc18ab28ad91e5a8adfa95076fa1 [file] [log] [blame]
Shuyi Chend7955ce2013-05-22 14:51:55 -07001// Copyright (c) 1999-2004 Brian Wellington (bwelling@xbill.org)
2
3package org.xbill.DNS;
4
5import java.io.*;
6
7/**
8 * Geographical Location - describes the physical location of a host.
9 *
10 * @author Brian Wellington
11 */
12
13public class GPOSRecord extends Record {
14
15private static final long serialVersionUID = -6349714958085750705L;
16
17private byte [] latitude, longitude, altitude;
18
19GPOSRecord() {}
20
21Record
22getObject() {
23 return new GPOSRecord();
24}
25
26private void
27validate(double longitude, double latitude) throws IllegalArgumentException
28{
29 if (longitude < -90.0 || longitude > 90.0) {
30 throw new IllegalArgumentException("illegal longitude " +
31 longitude);
32 }
33 if (latitude < -180.0 || latitude > 180.0) {
34 throw new IllegalArgumentException("illegal latitude " +
35 latitude);
36 }
37}
38
39/**
40 * Creates an GPOS Record from the given data
41 * @param longitude The longitude component of the location.
42 * @param latitude The latitude component of the location.
43 * @param altitude The altitude component of the location (in meters above sea
44 * level).
45*/
46public
47GPOSRecord(Name name, int dclass, long ttl, double longitude, double latitude,
48 double altitude)
49{
50 super(name, Type.GPOS, dclass, ttl);
51 validate(longitude, latitude);
52 this.longitude = Double.toString(longitude).getBytes();
53 this.latitude = Double.toString(latitude).getBytes();
54 this.altitude = Double.toString(altitude).getBytes();
55}
56
57/**
58 * Creates an GPOS Record from the given data
59 * @param longitude The longitude component of the location.
60 * @param latitude The latitude component of the location.
61 * @param altitude The altitude component of the location (in meters above sea
62 * level).
63*/
64public
65GPOSRecord(Name name, int dclass, long ttl, String longitude, String latitude,
66 String altitude)
67{
68 super(name, Type.GPOS, dclass, ttl);
69 try {
70 this.longitude = byteArrayFromString(longitude);
71 this.latitude = byteArrayFromString(latitude);
72 validate(getLongitude(), getLatitude());
73 this.altitude = byteArrayFromString(altitude);
74 }
75 catch (TextParseException e) {
76 throw new IllegalArgumentException(e.getMessage());
77 }
78}
79
80void
81rrFromWire(DNSInput in) throws IOException {
82 longitude = in.readCountedString();
83 latitude = in.readCountedString();
84 altitude = in.readCountedString();
85 try {
86 validate(getLongitude(), getLatitude());
87 }
88 catch(IllegalArgumentException e) {
89 throw new WireParseException(e.getMessage());
90 }
91}
92
93void
94rdataFromString(Tokenizer st, Name origin) throws IOException {
95 try {
96 longitude = byteArrayFromString(st.getString());
97 latitude = byteArrayFromString(st.getString());
98 altitude = byteArrayFromString(st.getString());
99 }
100 catch (TextParseException e) {
101 throw st.exception(e.getMessage());
102 }
103 try {
104 validate(getLongitude(), getLatitude());
105 }
106 catch(IllegalArgumentException e) {
107 throw new WireParseException(e.getMessage());
108 }
109}
110
111/** Convert to a String */
112String
113rrToString() {
114 StringBuffer sb = new StringBuffer();
115 sb.append(byteArrayToString(longitude, true));
116 sb.append(" ");
117 sb.append(byteArrayToString(latitude, true));
118 sb.append(" ");
119 sb.append(byteArrayToString(altitude, true));
120 return sb.toString();
121}
122
123/** Returns the longitude as a string */
124public String
125getLongitudeString() {
126 return byteArrayToString(longitude, false);
127}
128
129/**
130 * Returns the longitude as a double
131 * @throws NumberFormatException The string does not contain a valid numeric
132 * value.
133 */
134public double
135getLongitude() {
136 return Double.parseDouble(getLongitudeString());
137}
138
139/** Returns the latitude as a string */
140public String
141getLatitudeString() {
142 return byteArrayToString(latitude, false);
143}
144
145/**
146 * Returns the latitude as a double
147 * @throws NumberFormatException The string does not contain a valid numeric
148 * value.
149 */
150public double
151getLatitude() {
152 return Double.parseDouble(getLatitudeString());
153}
154
155/** Returns the altitude as a string */
156public String
157getAltitudeString() {
158 return byteArrayToString(altitude, false);
159}
160
161/**
162 * Returns the altitude as a double
163 * @throws NumberFormatException The string does not contain a valid numeric
164 * value.
165 */
166public double
167getAltitude() {
168 return Double.parseDouble(getAltitudeString());
169}
170
171void
172rrToWire(DNSOutput out, Compression c, boolean canonical) {
173 out.writeCountedString(longitude);
174 out.writeCountedString(latitude);
175 out.writeCountedString(altitude);
176}
177
178}