Home | History | Annotate | Download | only in DNS
      1 // Copyright (c) 1999-2004 Brian Wellington (bwelling (at) 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 
     19 GPOSRecord() {}
     20 
     21 Record
     22 getObject() {
     23 	return new GPOSRecord();
     24 }
     25 
     26 private void
     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
     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
     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
     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
     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
    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
    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
    135 getLongitude() {
    136 	return Double.parseDouble(getLongitudeString());
    137 }
    138 
    139 /** Returns the latitude as a string */
    140 public String
    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
    151 getLatitude() {
    152 	return Double.parseDouble(getLatitudeString());
    153 }
    154 
    155 /** Returns the altitude as a string */
    156 public String
    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
    167 getAltitude() {
    168 	return Double.parseDouble(getAltitudeString());
    169 }
    170 
    171 void
    172 rrToWire(DNSOutput out, Compression c, boolean canonical) {
    173 	out.writeCountedString(longitude);
    174 	out.writeCountedString(latitude);
    175 	out.writeCountedString(altitude);
    176 }
    177 
    178 }
    179