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() {} }