• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright (c) 1999-2004 Brian Wellington (bwelling@xbill.org)
2 
3 package org.xbill.DNS;
4 
5 import java.io.*;
6 
7 /**
8  * Geographical Location - describes the physical location of a host.
9  *
10  * @author Brian Wellington
11  */
12 
13 public class GPOSRecord extends Record {
14 
15 private static final long serialVersionUID = -6349714958085750705L;
16 
17 private byte [] latitude, longitude, altitude;
18 
GPOSRecord()19 GPOSRecord() {}
20 
21 Record
getObject()22 getObject() {
23 	return new GPOSRecord();
24 }
25 
26 private void
validate(double longitude, double latitude)27 validate(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 */
46 public
GPOSRecord(Name name, int dclass, long ttl, double longitude, double latitude, double altitude)47 GPOSRecord(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 */
64 public
GPOSRecord(Name name, int dclass, long ttl, String longitude, String latitude, String altitude)65 GPOSRecord(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 
80 void
rrFromWire(DNSInput in)81 rrFromWire(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 
93 void
rdataFromString(Tokenizer st, Name origin)94 rdataFromString(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 */
112 String
rrToString()113 rrToString() {
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 */
124 public String
getLongitudeString()125 getLongitudeString() {
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  */
134 public double
getLongitude()135 getLongitude() {
136 	return Double.parseDouble(getLongitudeString());
137 }
138 
139 /** Returns the latitude as a string */
140 public String
getLatitudeString()141 getLatitudeString() {
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  */
150 public double
getLatitude()151 getLatitude() {
152 	return Double.parseDouble(getLatitudeString());
153 }
154 
155 /** Returns the altitude as a string */
156 public String
getAltitudeString()157 getAltitudeString() {
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  */
166 public double
getAltitude()167 getAltitude() {
168 	return Double.parseDouble(getAltitudeString());
169 }
170 
171 void
rrToWire(DNSOutput out, Compression c, boolean canonical)172 rrToWire(DNSOutput out, Compression c, boolean canonical) {
173 	out.writeCountedString(longitude);
174 	out.writeCountedString(latitude);
175 	out.writeCountedString(altitude);
176 }
177 
178 }
179