package org.fluxtream.core.connectors.fluxtream_capture;
import org.fluxtream.core.connectors.Connector;
import org.fluxtream.core.connectors.ObjectType;
import org.fluxtream.core.connectors.annotations.ObjectTypeSpec;
import org.fluxtream.core.domain.AbstractFacet;
import org.fluxtream.core.domain.Geolocation;
import org.fluxtream.core.domain.Tag;
import org.fluxtream.core.images.ImageOrientation;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import javax.persistence.Entity;
import javax.persistence.Lob;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import java.awt.*;
import java.io.Serializable;
/**
* @author Chris Bartley (bartley@cmu.edu)
*/
@Entity(name = "Facet_FluxtreamCapturePhoto")
@ObjectTypeSpec(name = "photo", value = 1, isImageType = true, prettyname = "Photos")
@NamedQueries({
@NamedQuery(name = "fluxtream_capture.photo.all", query = "SELECT facet FROM Facet_FluxtreamCapturePhoto facet WHERE facet.guestId=? ORDER BY facet.start ASC"),
@NamedQuery(name = "fluxtream_capture.photo.newest", query = "SELECT facet FROM Facet_FluxtreamCapturePhoto facet WHERE facet.guestId=? ORDER BY facet.start DESC LIMIT 1"),
@NamedQuery(name = "fluxtream_capture.photo.byId", query = "SELECT facet FROM Facet_FluxtreamCapturePhoto facet WHERE facet.guestId=? AND facet.id=?")
})
public class FluxtreamCapturePhotoFacet extends AbstractFacet implements Serializable, Geolocation {
public static final int NUM_THUMBNAILS = 3;
private String hash;
private String title;
private String captureYYYYDDD;
private String imageType;
@Lob
private byte[] thumbnail0;
@Lob
private byte[] thumbnail1;
@Lob
private byte[] thumbnail2;
private int thumbnail0Width;
private int thumbnail0Height;
private int thumbnail1Width;
private int thumbnail1Height;
private int thumbnail2Width;
private int thumbnail2Height;
private int orientation;
private Double latitude;
private Double longitude;
private Float heading;
private String headingRef;
private Float altitude;
private Integer altitudeRef;
private Float gpsPrecision;
private String gpsDatestamp;
private String gpsTimestamp;
public FluxtreamCapturePhotoFacet() {
super();
}
@SuppressWarnings("UnusedDeclaration")
public FluxtreamCapturePhotoFacet(Long apiKeyId) {
super(apiKeyId);
}
public FluxtreamCapturePhotoFacet(@NotNull final FluxtreamCapturePhoto photo, final Long apiKeyId) {
super(apiKeyId);
guestId = photo.getGuestId();
timeUpdated = System.currentTimeMillis();
start = photo.getCaptureTimeMillisUtc();
end = start;
hash = photo.getPhotoHash();
final Connector connector = Connector.getConnector("fluxtream_capture");
this.api = connector.value();
this.objectType = ObjectType.getObjectType(connector, "photo").value();
captureYYYYDDD = photo.getCaptureYYYYDDD();
imageType = photo.getImageType().getFileExtension();
thumbnail0 = photo.getThumbnail0();
thumbnail1 = photo.getThumbnail1();
thumbnail2 = photo.getThumbnail2();
final Dimension thumbnail0Size = photo.getThumbnail0Size();
final Dimension thumbnail1Size = photo.getThumbnail1Size();
final Dimension thumbnail2Size = photo.getThumbnail2Size();
thumbnail0Width = thumbnail0Size.width;
thumbnail0Height = thumbnail0Size.height;
thumbnail1Width = thumbnail1Size.width;
thumbnail1Height = thumbnail1Size.height;
thumbnail2Width = thumbnail2Size.width;
thumbnail2Height = thumbnail2Size.height;
orientation = photo.getOrientation().getId();
this.addTags(photo.getTags(), Tag.COMMA_DELIMITER);
this.comment = photo.getComment();
final Geolocation geolocation = photo.getGeolocation();
if (geolocation != null) {
latitude = geolocation.getLatitude();
longitude = geolocation.getLongitude();
heading = geolocation.getHeading();
headingRef = geolocation.getHeadingRef();
altitude = geolocation.getAltitude();
altitudeRef = geolocation.getAltitudeRef();
gpsPrecision = geolocation.getGpsPrecision();
gpsDatestamp = geolocation.getGpsDatestamp();
gpsTimestamp = geolocation.getGpsTimestamp();
}
}
@Override
protected void makeFullTextIndexable() {
this.fullTextDescription = title;
}
public long getGuestId() {
return guestId;
}
public String getHash() {
return hash;
}
public String getTitle() {
return title;
}
public String getCaptureYYYYDDD() {
return captureYYYYDDD;
}
public String getImageType() {
return imageType;
}
/** Returns the thumbnail associated with the given <code>thumbnailIndex</code>, or thumbnail0 if no such index exists. */
public byte[] getThumbnail(final int thumbnailIndex) {
if (thumbnailIndex == 1) {
return thumbnail1;
} else if (thumbnailIndex == 2) {
return thumbnail2;
}
return thumbnail0;
}
@Nullable
public Dimension getThumbnailSize(final int thumbnailIndex) {
switch (thumbnailIndex) {
case 0:
return new Dimension(thumbnail0Width, thumbnail0Height);
case 1:
return new Dimension(thumbnail1Width, thumbnail1Height);
case 2:
return new Dimension(thumbnail2Width, thumbnail2Height);
}
return null;
}
@Nullable
public ImageOrientation getOrientation() {
return ImageOrientation.findById(orientation);
}
public Double getLatitude() {
return latitude;
}
public Double getLongitude() {
return longitude;
}
public Float getHeading() {
return heading;
}
public String getHeadingRef() {
return headingRef;
}
public Float getAltitude() {
return altitude;
}
public Integer getAltitudeRef() {
return altitudeRef;
}
public Float getGpsPrecision() {
return gpsPrecision;
}
public String getGpsDatestamp() {
return gpsDatestamp;
}
public String getGpsTimestamp() {
return gpsTimestamp;
}
@Nullable
public String getPhotoStoreKey() {
if (guestId != 0 && captureYYYYDDD != null && start != 0 && hash != null) {
return FluxtreamCapturePhoto.createPhotoStoreKey(guestId, captureYYYYDDD, start, hash);
}
return null;
}
}