photo-manager / PHOTO MANAGER / src / photomanager / Photo.java
Photo.java
Raw
package photomanager;

/**
 * The Photo class represents a photo. 
 * 
 * A photo has a source (URL or path to the file), 
 * 
 * the width and height in pixels, 
 * 
 * the date the photo was taken,
 * 
 * 
 * comments the user has added (if any). 
 * 
 * If you look at the class definition,
 * 
 * 
 * after "public class Photo" you will see "implements Comparable<Photo>". 
 * 
 * You can ignore it; it means that the Photo class must implement a method called
 * compareTo that takes a Photo as a parameter and returns an integer. 
 * 
 * Why do we need it? 
 * 
 * Because it will allow us to sort ArrayList of Photos using the compareTo method that you will define.  
 * 
 */


public class Photo implements Comparable<Photo> {
	private String photoSource;
	private int width, height;
	private String date;
	private StringBuffer comments;

	
	
	//++++++++++++++++++++++++++++ CONSTRUCTORS
	
	/**
	 * DONE		Initializes the instance variables with the provided parameter values and
	 * DONE		Initializes comments with a StringBuffer object. 
	 * 
	 * DONE		It will throw an IllegalArgumentException with the message 
	 * "Constructor: Invalid arguments" 
	 * if any string parameter is null,
	 * or blank, 
	 * or if the width or height are negative or zero.  
	 * 
	 * DONE		Use the String class isBlank() method to verify whether a string is blank. 
	 * 
	 * DONE		Assume that if a date is provided, it represents a valid date. 
	 * 
	 * DONE		Don't verify whether photoSource represents a photo that exists.
	 * 
	 * @param photoSource URL or file location.
	 * @param width Photo's width in pixels.
	 * @param height Photo's height in pixels.
	 * @param date Date the photo was taken.
	 * @throws IllegalArgumentException For invalid parameter.
	 */
	
	
	public Photo(String photoSource, int width, int height, String date) {
		
		
		if (photoSource == null || photoSource.isBlank() || date == null || date.isBlank() || width <= 0 || height <= 0) {
			
			throw new IllegalArgumentException("Constructor: Invalid arguments");
		
		}
		
		this.comments = new StringBuffer();
		this.photoSource = photoSource;
		this.width = width;
		this.height = height;
		this.date = date;
		
		
	}
	
	/**
	 * Copy constructor. 
	 * 
	 * Modifications to the new object should not affect the original object.
	 * 
	 * @param photo To copy.
	 */
	
	public Photo(Photo photo) {
		
		this(photo.photoSource, photo.width, photo.height, photo.date);
		this.comments = new StringBuffer(photo.comments);
	}
	
	
	// ++++++++++++++++++++++++++++ METHODS

	/**
	 * Returns a string with photoSource, width, height and date values separated
	 * by commas.  
	 * 
	 * Comments are not part of the string.
	 * 
	 * @return String with values separated by commas.
	 */
	

	public String toString() {
		char separatorComma = ',';
		String stringCreated = photoSource + separatorComma + width + separatorComma + height + separatorComma + date;
		return stringCreated;
	}

	/**
	 * Get method for photoSource.
	 * @return photoSource.
	 */
	public String getPhotoSource() {
		return photoSource;
	}

	/**
	 * Get method for width.
	 * @return width.
	 */
	public int getWidth() {
		return width;
	}
	
	/**
	 * Get method for height.
	 * @return height.
	 */
	public int getHeight() {
		return height;
	}

	/**
	 * Get method for date.
	 * @return date.
	 */
	public String getDate() {
		return date;
	}

	/**
	 * DONE		Appends the newComment parameter to the comments StringBuffer.  
	 * 
	 * DONE		Comments must be separated by commas. 
	 * 
	 * DONE		The last comment should not be followed by a comma.
	 * 
	 * DONE		If the parameter is null or blank according to isBlank() 
	 * 
	 * DONE		no comment will be appended, and IllegalArgumentException
	 * 
	 * 
	 * DONE		with the message "Invalid comment" will be thrown.  
	 * 
	 * DONE		The method returns a reference to the current object.
	 * 
	 * 
	 * @param newComment Comment to add.
	 * @return Reference to the current object.
	 */
	
	
	public Photo addComments(String newComment) {
		
		if (newComment.isBlank() || newComment == null) {
			throw new IllegalArgumentException("Invalid comment");
		} else {
			
			if (comments.length() != 0) {
				comments.append(',');
			}
			comments.append(newComment);
		}
		
		return this;
	}

	/**
	 * Returns a string that corresponds to the comments.
	 * 
	 * @return String corresponding to comments.
	 */
	
	
	public String getComments() {
		
		return comments.toString(); 
		
	}

	/**
	 * This method will compare the date of the current object 
	 * against the parameter's object.
	 * 
	 * 
	 * Use the Utilities.getDate() method that takes a string as a parameter 
	 * and returns an integer (of type long) representing the date.  
	 * 
	 * We can represent dates including time using integers. 
	 * 
	 * The number returned by Utilities.getDate() 
	 * represents seconds since the Unix epoch (00:00:00 UTC on 1 January 1970).
	 * 
	 * The compareTo method will return 
	 * 
	 * ||a negative value if the date of the current object
	 * ||precedes the date of the parameter, 
	 * 
	 * zero if the dates are the same, 
	 * 
	 * a positive value otherwise.  
	 * 
	 * Don't be surprise if the amount of code required for compareTo method 
	 * is minimal. 
	 * 
	 * Do not using casting to convert a long to int.
	 * 
	 * I know that date is a string. 
	 * 
	 */
	public int compareTo(Photo photo) {
		
		if ( Utilities.getDate(this.date) < Utilities.getDate(photo.date) ) {
			return -1;
		}
		
		else if ( Utilities.getDate(this.date) == Utilities.getDate(photo.date) ) {
			return 0;
		}
		
		else {
			return 1;
		}
		
	}
}