mirror of
https://github.com/vanitasvitae/Smack.git
synced 2024-09-27 18:19:33 +02:00
681 lines
18 KiB
Java
681 lines
18 KiB
Java
/**
|
|
*
|
|
* Copyright 2015-2017 Ishan Khanna, Fernando Ramirez, 2019-2020 Florian Schmaus
|
|
*
|
|
* Licensed 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.jivesoftware.smackx.geoloc.packet;
|
|
|
|
import java.io.Serializable;
|
|
import java.net.URI;
|
|
import java.util.Date;
|
|
|
|
import javax.xml.namespace.QName;
|
|
|
|
import org.jivesoftware.smack.packet.ExtensionElement;
|
|
import org.jivesoftware.smack.packet.Message;
|
|
import org.jivesoftware.smack.util.EqualsUtil;
|
|
import org.jivesoftware.smack.util.HashCode;
|
|
import org.jivesoftware.smack.util.XmlStringBuilder;
|
|
|
|
import org.jivesoftware.smackx.xdata.FormField;
|
|
import org.jivesoftware.smackx.xdata.FormFieldChildElement;
|
|
|
|
/**
|
|
* A GeoLocation Extension packet, which is used by the XMPP clients to exchange their respective geographic locations.
|
|
*
|
|
* @see <a href="http://www.xmpp.org/extensions/xep-0080.html">XEP-0080</a>
|
|
* @author Ishan Khanna
|
|
*/
|
|
public final class GeoLocation implements Serializable, ExtensionElement, FormFieldChildElement {
|
|
|
|
private static final long serialVersionUID = 1L;
|
|
|
|
public static final String NAMESPACE = "http://jabber.org/protocol/geoloc";
|
|
|
|
public static final String ELEMENT = "geoloc";
|
|
|
|
public static final QName QNAME = new QName(NAMESPACE, ELEMENT);
|
|
|
|
public static final GeoLocation EMPTY_GEO_LOCATION = GeoLocation.builder().build();
|
|
|
|
private final Double accuracy;
|
|
private final Double alt;
|
|
private final Double altAccuracy;
|
|
private final String area;
|
|
private final Double bearing;
|
|
private final String building;
|
|
private final String country;
|
|
private final String countryCode;
|
|
private final String datum;
|
|
private final String description;
|
|
private final Double error;
|
|
private final String floor;
|
|
private final Double lat;
|
|
private final String locality;
|
|
private final Double lon;
|
|
private final String postalcode;
|
|
private final String region;
|
|
private final String room;
|
|
private final Double speed;
|
|
private final String street;
|
|
private final String text;
|
|
private final Date timestamp;
|
|
private final String tzo;
|
|
private final URI uri;
|
|
|
|
private GeoLocation(Builder builder) {
|
|
accuracy = builder.accuracy;
|
|
alt = builder.alt;
|
|
altAccuracy = builder.altAccuracy;
|
|
area = builder.area;
|
|
bearing = builder.bearing;
|
|
building = builder.building;
|
|
country = builder.country;
|
|
countryCode = builder.countryCode;
|
|
datum = builder.datum;
|
|
description = builder.description;
|
|
error = builder.error;
|
|
floor = builder.floor;
|
|
lat = builder.lat;
|
|
locality = builder.locality;
|
|
lon = builder.lon;
|
|
postalcode = builder.postalcode;
|
|
region = builder.region;
|
|
room = builder.room;
|
|
speed = builder.speed;
|
|
street = builder.street;
|
|
text = builder.text;
|
|
timestamp = builder.timestamp;
|
|
tzo = builder.tzo;
|
|
uri = builder.uri;
|
|
}
|
|
|
|
public Double getAccuracy() {
|
|
return accuracy;
|
|
}
|
|
|
|
public Double getAlt() {
|
|
return alt;
|
|
}
|
|
|
|
public Double getAltAccuracy() {
|
|
return altAccuracy;
|
|
}
|
|
|
|
public String getArea() {
|
|
return area;
|
|
}
|
|
|
|
public Double getBearing() {
|
|
return bearing;
|
|
}
|
|
|
|
public String getBuilding() {
|
|
return building;
|
|
}
|
|
|
|
public String getCountry() {
|
|
return country;
|
|
}
|
|
|
|
public String getCountryCode() {
|
|
return countryCode;
|
|
}
|
|
|
|
public String getDatum() {
|
|
return datum;
|
|
}
|
|
|
|
public String getDescription() {
|
|
return description;
|
|
}
|
|
|
|
/**
|
|
* Get the error.
|
|
*
|
|
* @return the error.
|
|
* @deprecated use {@link #getAccuracy()} instead.
|
|
*/
|
|
@Deprecated
|
|
public Double getError() {
|
|
return error;
|
|
}
|
|
|
|
public String getFloor() {
|
|
return floor;
|
|
}
|
|
|
|
public Double getLat() {
|
|
return lat;
|
|
}
|
|
|
|
public String getLocality() {
|
|
return locality;
|
|
}
|
|
|
|
public Double getLon() {
|
|
return lon;
|
|
}
|
|
|
|
public String getPostalcode() {
|
|
return postalcode;
|
|
}
|
|
|
|
public String getRegion() {
|
|
return region;
|
|
}
|
|
|
|
public String getRoom() {
|
|
return room;
|
|
}
|
|
|
|
public Double getSpeed() {
|
|
return speed;
|
|
}
|
|
|
|
public String getStreet() {
|
|
return street;
|
|
}
|
|
|
|
public String getText() {
|
|
return text;
|
|
}
|
|
|
|
public Date getTimestamp() {
|
|
return timestamp;
|
|
}
|
|
|
|
public String getTzo() {
|
|
return tzo;
|
|
}
|
|
|
|
public URI getUri() {
|
|
return uri;
|
|
}
|
|
|
|
@Override
|
|
public QName getQName() {
|
|
return QNAME;
|
|
}
|
|
|
|
@Override
|
|
public String getElementName() {
|
|
return ELEMENT;
|
|
}
|
|
|
|
@Override
|
|
public CharSequence toXML(org.jivesoftware.smack.packet.XmlEnvironment enclosingNamespace) {
|
|
XmlStringBuilder xml = new XmlStringBuilder(this);
|
|
xml.rightAngleBracket();
|
|
xml.optElement("accuracy", accuracy);
|
|
xml.optElement("alt", alt);
|
|
xml.optElement("altaccuracy", altAccuracy);
|
|
xml.optElement("area", area);
|
|
xml.optElement("bearing", bearing);
|
|
xml.optElement("building", building);
|
|
xml.optElement("country", country);
|
|
xml.optElement("countrycode", countryCode);
|
|
xml.optElement("datum", datum);
|
|
xml.optElement("description", description);
|
|
xml.optElement("error", error);
|
|
xml.optElement("floor", floor);
|
|
xml.optElement("lat", lat);
|
|
xml.optElement("locality", locality);
|
|
xml.optElement("lon", lon);
|
|
xml.optElement("postalcode", postalcode);
|
|
xml.optElement("region", region);
|
|
xml.optElement("room", room);
|
|
xml.optElement("speed", speed);
|
|
xml.optElement("street", street);
|
|
xml.optElement("text", text);
|
|
xml.optElement("timestamp", timestamp);
|
|
xml.optElement("tzo", tzo);
|
|
xml.optElement("uri", uri);
|
|
xml.closeElement(this);
|
|
return xml;
|
|
}
|
|
|
|
@Override
|
|
public String getNamespace() {
|
|
return NAMESPACE;
|
|
}
|
|
|
|
private final HashCode.Cache hashCodeCache = new HashCode.Cache();
|
|
|
|
@Override
|
|
public int hashCode() {
|
|
return hashCodeCache.getHashCode(c ->
|
|
c
|
|
.append(accuracy)
|
|
.append(alt)
|
|
.append(altAccuracy)
|
|
.append(area)
|
|
.append(bearing)
|
|
.append(building)
|
|
.append(country)
|
|
.append(countryCode)
|
|
.append(datum)
|
|
.append(description)
|
|
.append(error)
|
|
.append(floor)
|
|
.append(lat)
|
|
.append(locality)
|
|
.append(lon)
|
|
.append(postalcode)
|
|
.append(region)
|
|
.append(room)
|
|
.append(speed)
|
|
.append(street)
|
|
.append(text)
|
|
.append(timestamp)
|
|
.append(tzo)
|
|
.append(uri)
|
|
);
|
|
}
|
|
|
|
@Override
|
|
public boolean equals(Object obj) {
|
|
return EqualsUtil.equals(this, obj, (e, o) -> {
|
|
e
|
|
.append(accuracy, o.accuracy)
|
|
.append(altAccuracy, o.altAccuracy)
|
|
.append(area, o.area)
|
|
.append(bearing, o.bearing)
|
|
.append(building, o.building)
|
|
.append(country, o.country)
|
|
.append(countryCode, o.countryCode)
|
|
.append(datum, o.datum)
|
|
.append(description, o.description)
|
|
.append(error, o.error)
|
|
.append(floor, o.floor)
|
|
.append(lat, o.lat)
|
|
.append(locality, o.locality)
|
|
.append(lon, o.lon)
|
|
.append(postalcode, o.postalcode)
|
|
.append(region, o.region)
|
|
.append(room, o.room)
|
|
.append(speed, o.speed)
|
|
.append(street, o.street)
|
|
.append(text, o.text)
|
|
.append(timestamp, o.timestamp)
|
|
.append(tzo, o.tzo)
|
|
.append(uri, o.uri)
|
|
;
|
|
});
|
|
}
|
|
|
|
/**
|
|
* Returns a new instance of {@link Builder}.
|
|
* @return Builder
|
|
*/
|
|
public static Builder builder() {
|
|
return new GeoLocation.Builder();
|
|
}
|
|
|
|
@Override
|
|
public boolean isExclusiveElement() {
|
|
return true;
|
|
}
|
|
|
|
/**
|
|
* Returns the first GeoLocation, or <code>null</code> if it doesn't exist in {@link Message}.
|
|
* <br>
|
|
* @param message The Message stanza containing GeoLocation
|
|
* @return GeoLocation
|
|
*/
|
|
public static GeoLocation from(Message message) {
|
|
return message.getExtension(GeoLocation.class);
|
|
}
|
|
|
|
/**
|
|
* Returns the first GeoLocation, or <code>null</code> if it doesn't exist in {@link FormField}.
|
|
* <br>
|
|
* @param formField the Formfield containing GeoLocation
|
|
* @return GeoLocation
|
|
*/
|
|
public static GeoLocation from(FormField formField) {
|
|
return (GeoLocation) formField.getFormFieldChildElement(QNAME);
|
|
}
|
|
|
|
/**
|
|
* This class defines a builder class for {@link GeoLocation}.
|
|
* <br>
|
|
* {@link GeoLocation} instance can be obtained using {@link #build()} method as follows.<br><br>
|
|
* <code>GeoLocation.Builder builder = GeoLocation.builder(); <br>
|
|
* GeoLocation geoLocation = builder.build();</code>
|
|
* <br><br>
|
|
* To set GeoLocation parameters, use their respective setters.
|
|
*/
|
|
public static final class Builder {
|
|
|
|
private Double accuracy;
|
|
private Double alt;
|
|
private Double altAccuracy;
|
|
private String area;
|
|
private Double bearing;
|
|
private String building;
|
|
private String country;
|
|
private String countryCode;
|
|
|
|
// If datum is not included, receiver MUST assume WGS84; receivers MUST implement WGS84; senders MAY use another
|
|
// datum, but it is not recommended.
|
|
private String datum = "WGS84";
|
|
|
|
private String description;
|
|
private Double error;
|
|
private String floor;
|
|
private Double lat;
|
|
private String locality;
|
|
private Double lon;
|
|
private String postalcode;
|
|
private String region;
|
|
private String room;
|
|
private Double speed;
|
|
private String street;
|
|
private String text;
|
|
private Date timestamp;
|
|
private String tzo;
|
|
private URI uri;
|
|
|
|
/**
|
|
* Deprecated, do not use.
|
|
* @deprecated use {@link GeoLocation#builder()} instead.
|
|
*/
|
|
@Deprecated
|
|
// TODO Make constructor private in Smack 4.6.
|
|
public Builder() {
|
|
}
|
|
|
|
/**
|
|
* Sets accuracy of horizontal GPS error in meters.
|
|
*
|
|
* @param accuracy accuracy in meters
|
|
* @return Builder
|
|
*/
|
|
public Builder setAccuracy(Double accuracy) {
|
|
this.accuracy = accuracy;
|
|
return this;
|
|
}
|
|
|
|
/**
|
|
* Sets Altitude in meters above or below sea level.
|
|
*
|
|
* @param alt altitude in meters
|
|
* @return Builder
|
|
*/
|
|
public Builder setAlt(Double alt) {
|
|
this.alt = alt;
|
|
return this;
|
|
}
|
|
|
|
/**
|
|
* Sets Vertical GPS error in meters.
|
|
*
|
|
* @param altAccuracy altAccuracy in meters
|
|
* @return Builder
|
|
*/
|
|
public Builder setAltAccuracy(Double altAccuracy) {
|
|
this.altAccuracy = altAccuracy;
|
|
return this;
|
|
}
|
|
|
|
/**
|
|
* Sets a named area such as a campus or neighborhood.
|
|
*
|
|
* @param area the named area
|
|
* @return Builder
|
|
*/
|
|
public Builder setArea(String area) {
|
|
this.area = area;
|
|
return this;
|
|
}
|
|
|
|
/**
|
|
* Sets GPS bearing (direction in which the entity is heading<br>
|
|
* to reach its next waypoint), measured in decimal degrees,<br>
|
|
* relative to true north.
|
|
*
|
|
* @param bearing bearing in decimal degrees
|
|
* @return Builder
|
|
*/
|
|
public Builder setBearing(Double bearing) {
|
|
this.bearing = bearing;
|
|
return this;
|
|
}
|
|
|
|
/**
|
|
* Sets a specific building on a street or in an area.
|
|
*
|
|
* @param building name of the building
|
|
* @return Builder
|
|
*/
|
|
public Builder setBuilding(String building) {
|
|
this.building = building;
|
|
return this;
|
|
}
|
|
|
|
/**
|
|
* Sets the nation where the user is located.
|
|
*
|
|
* @param country user's country of location
|
|
* @return Builder
|
|
*/
|
|
public Builder setCountry(String country) {
|
|
this.country = country;
|
|
return this;
|
|
}
|
|
|
|
/**
|
|
* Sets The ISO 3166 two-letter country code.
|
|
*
|
|
* @param countryCode two-letter country code
|
|
* @return Builder
|
|
*/
|
|
public Builder setCountryCode(String countryCode) {
|
|
this.countryCode = countryCode;
|
|
return this;
|
|
}
|
|
|
|
/**
|
|
* Sets GPS Datum.
|
|
*
|
|
* @param datum GPS datum
|
|
* @return Builder
|
|
*/
|
|
public Builder setDatum(String datum) {
|
|
this.datum = datum;
|
|
return this;
|
|
}
|
|
|
|
/**
|
|
* Sets A natural-language name for or description of the location.
|
|
*
|
|
* @param description description of the location
|
|
* @return Builder
|
|
*/
|
|
public Builder setDescription(String description) {
|
|
this.description = description;
|
|
return this;
|
|
}
|
|
|
|
/**
|
|
* Sets Horizontal GPS error in arc minutes;<br>
|
|
* this element is deprecated in favor of accuracy.
|
|
*
|
|
* @param error error in arc minutes
|
|
* @return Builder
|
|
* @deprecated use {@link #setAccuracy(Double)} instead.
|
|
*/
|
|
@Deprecated
|
|
public Builder setError(Double error) {
|
|
this.error = error;
|
|
return this;
|
|
}
|
|
|
|
/**
|
|
* Sets a particular floor in a building.
|
|
*
|
|
* @param floor floor in a building
|
|
* @return Builder
|
|
*/
|
|
public Builder setFloor(String floor) {
|
|
this.floor = floor;
|
|
return this;
|
|
}
|
|
|
|
/**
|
|
* Sets Latitude in decimal degrees North.
|
|
*
|
|
* @param lat latitude in decimal degrees
|
|
* @return Builder
|
|
*/
|
|
public Builder setLat(Double lat) {
|
|
this.lat = lat;
|
|
return this;
|
|
}
|
|
|
|
/**
|
|
* Sets Locality within the administrative region,<br>
|
|
* such as a town or city.
|
|
*
|
|
* @param locality locality in a region
|
|
* @return Builder
|
|
*/
|
|
public Builder setLocality(String locality) {
|
|
this.locality = locality;
|
|
return this;
|
|
}
|
|
|
|
/**
|
|
* Sets Longitude in decimal degrees East.
|
|
*
|
|
* @param lon longitude in decimal degrees
|
|
* @return Builder
|
|
*/
|
|
public Builder setLon(Double lon) {
|
|
this.lon = lon;
|
|
return this;
|
|
}
|
|
|
|
/**
|
|
* Sets PostalCode used for postal delivery.
|
|
*
|
|
* @param postalcode code for postal delivery
|
|
* @return Builder
|
|
*/
|
|
public Builder setPostalcode(String postalcode) {
|
|
this.postalcode = postalcode;
|
|
return this;
|
|
}
|
|
|
|
/**
|
|
* Sets an administrative region of the nation,<br>
|
|
* such as a state or province.
|
|
*
|
|
* @param region an administrative region
|
|
* @return Builder
|
|
*/
|
|
public Builder setRegion(String region) {
|
|
this.region = region;
|
|
return this;
|
|
}
|
|
|
|
/**
|
|
* Sets a particular room in a building.
|
|
*
|
|
* @param room room inside a building
|
|
* @return Builder
|
|
*/
|
|
public Builder setRoom(String room) {
|
|
this.room = room;
|
|
return this;
|
|
}
|
|
|
|
/**
|
|
* Sets Speed at which the entity is moving, in meters per second.
|
|
*
|
|
* @param speed speed in meters per second
|
|
* @return Builder
|
|
*/
|
|
public Builder setSpeed(Double speed) {
|
|
this.speed = speed;
|
|
return this;
|
|
}
|
|
|
|
/**
|
|
* Sets a thoroughfare within the locality, or a crossing of two thoroughfares.
|
|
*
|
|
* @param street name of the street
|
|
* @return Builder
|
|
*/
|
|
public Builder setStreet(String street) {
|
|
this.street = street;
|
|
return this;
|
|
}
|
|
|
|
/**
|
|
* Sets a catch-all element that captures any other information about the location.
|
|
*
|
|
* @param text distinctive feature about the location
|
|
* @return Builder
|
|
*/
|
|
public Builder setText(String text) {
|
|
this.text = text;
|
|
return this;
|
|
}
|
|
|
|
/**
|
|
* Sets UTC timestamp specifying the moment when the reading was taken.
|
|
*
|
|
* @param timestamp timestamp of the reading
|
|
* @return Builder
|
|
*/
|
|
public Builder setTimestamp(Date timestamp) {
|
|
this.timestamp = timestamp;
|
|
return this;
|
|
}
|
|
|
|
/**
|
|
* Sets the time zone offset from UTC for the current location.
|
|
*
|
|
* @param tzo time zone offset
|
|
* @return Builder
|
|
*/
|
|
public Builder setTzo(String tzo) {
|
|
this.tzo = tzo;
|
|
return this;
|
|
}
|
|
|
|
/**
|
|
* Sets URI or URL pointing to information about the location.
|
|
*
|
|
* @param uri uri to the location
|
|
* @return Builder
|
|
*/
|
|
public Builder setUri(URI uri) {
|
|
this.uri = uri;
|
|
return this;
|
|
}
|
|
|
|
/**
|
|
* This method is called to build {@link GeoLocation} from the Builder.
|
|
*
|
|
* @return GeoLocation
|
|
*/
|
|
public GeoLocation build() {
|
|
return new GeoLocation(this);
|
|
}
|
|
}
|
|
}
|