+package tim.prune.data;
+
+import java.io.File;
+
+/**
+ * Class to represent a general media object for correlation.
+ * Subclasses are currently Photo and AudioClip
+ */
+public abstract class MediaObject
+{
+ /** File where media is stored (if any) */
+ protected File _file = null;
+ /** Name of file */
+ protected String _name = null;
+ /** Cached data if downloaded */
+ protected byte[] _data = null;
+ /** URL if media came from net */
+ protected String _url = null;
+ /** Timestamp, if any */
+ protected Timestamp _timestamp = null;
+ /** Associated DataPoint if correlated */
+ protected DataPoint _dataPoint = null;
+ /** Status when loaded */
+ private Status _originalStatus = Status.NOT_CONNECTED;
+ /** Current status */
+ private Status _currentStatus = Status.NOT_CONNECTED;
+
+ /** Connection status */
+ public enum Status
+ {
+ /** Media is not connected to any point */
+ NOT_CONNECTED,
+ /** Media has been connected to a point since it was loaded */
+ TAGGED,
+ /** Media is connected to a point */
+ CONNECTED
+ };
+
+
+ /**
+ * Constructor
+ * @param inFile file object
+ * @param inStamp timestamp object
+ */
+ public MediaObject(File inFile, Timestamp inStamp)
+ {
+ _file = inFile;
+ _name = inFile.getName();
+ _data = null;
+ _timestamp = inStamp;
+ }
+
+ /**
+ * Constructor for byte arrays
+ * @param inData byte array containing data
+ * @param inName name of object
+ * @param inUrl source url of object or null
+ */
+ public MediaObject(byte[] inData, String inName, String inUrl)
+ {
+ _file = null;
+ _data = inData;
+ _name = inName;
+ _url = inUrl;
+ _timestamp = null;
+ }
+
+ /**
+ * @return the file object
+ */
+ public File getFile() {
+ return _file;
+ }
+
+ /** @return media name */
+ public String getName() {
+ return _name;
+ }
+
+ /**
+ * @return the timestamp object
+ */
+ public Timestamp getTimestamp() {
+ return _timestamp;
+ }
+
+ /**
+ * @param inTimestamp Timestamp object
+ */
+ public void setTimestamp(Timestamp inTimestamp) {
+ _timestamp = inTimestamp;
+ }
+
+ /**
+ * @return byte data of media
+ */
+ public byte[] getByteData() {
+ return _data;
+ }
+
+ /**
+ * @return source Url (or null)
+ */
+ public String getUrl() {
+ return _url;
+ }
+
+ /**
+ * @return the full path to the media, either filename or url
+ */
+ public String getFullPath()
+ {
+ if (_file != null) return _file.getAbsolutePath();
+ return getUrl();
+ }
+
+ /**
+ * @return true if details are valid (might not have timestamp)
+ */
+ public boolean isValid()
+ {
+ return ((_file != null && _file.exists() && _file.canRead())
+ || (_data != null && _data.length > 0));
+ }
+
+ /**
+ * @return true if file has timestamp
+ */
+ public boolean hasTimestamp() {
+ return _timestamp != null && _timestamp.isValid();
+ }
+
+ /**
+ * Check if this object refers to the same object as another
+ * @param inOther other MediaObject
+ * @return true if the objects are the same
+ */
+ public boolean equals(MediaObject inOther)
+ {
+ if (_file != null)
+ {
+ // compare file objects
+ return (inOther != null && inOther.getFile() != null && getFile() != null
+ && inOther.getFile().equals(getFile()));
+ }
+ // compare data arrays
+ return (inOther != null && _name != null && inOther._name != null && _name.equals(inOther._name)
+ && _data != null && inOther._data != null && _data.length == inOther._data.length);
+ }
+
+ /**
+ * Set the data point associated with the photo
+ * @param inPoint DataPoint with coordinates etc
+ */
+ public void setDataPoint(DataPoint inPoint)
+ {
+ _dataPoint = inPoint;
+ // set status according to point
+ if (inPoint == null) {
+ setCurrentStatus(Status.NOT_CONNECTED);
+ }
+ else {
+ setCurrentStatus(Status.CONNECTED);
+ }
+ }
+
+ /**
+ * @return the DataPoint object
+ */
+ public DataPoint getDataPoint() {
+ return _dataPoint;
+ }
+
+ /**
+ * @param inStatus status of file when loaded
+ */
+ public void setOriginalStatus(Status inStatus)
+ {
+ _originalStatus = inStatus;
+ _currentStatus = inStatus;
+ }
+
+ /**
+ * @return status of file when it was loaded
+ */
+ public Status getOriginalStatus()
+ {
+ return _originalStatus;
+ }
+
+ /**
+ * @return current status
+ */
+ public Status getCurrentStatus()
+ {
+ return _currentStatus;
+ }
+ /**
+ * @param inStatus current status
+ */
+ public void setCurrentStatus(Status inStatus)
+ {
+ _currentStatus = inStatus;
+ }
+
+ /**
+ * @return true if this object is connected to a point
+ */
+ public boolean isConnected()
+ {
+ return _currentStatus != Status.NOT_CONNECTED;
+ }
+
+ /**
+ * @return true if status has changed since load
+ */
+ public boolean isModified()
+ {
+ return _currentStatus != _originalStatus;
+ }
+
+ /**
+ * Reset any cached data (eg thumbnail)
+ */
+ public void resetCachedData() {}
+}