/* * Copyright (c) 2013 Andrew Fontaine, James Finlay, Jesse Tucker, Jacob Viau, and * Evan DeGraff * * Permission is hereby granted, free of charge, to any person obtaining a copy of * this software and associated documentation files (the "Software"), to deal in * the Software without restriction, including without limitation the rights to * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of * the Software, and to permit persons to whom the Software is furnished to do so, * subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all * copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ package ca.cmput301f13t03.adventure_datetime.model; import com.google.gson.Gson; import java.util.ArrayList; import java.util.UUID; /** * A model for a fragment of the Choose-Your-Own-Adventure * * @author Andrew Fontaine * @version 1.0 * @since 23/10/13 */ public class StoryFragment implements Comparable<StoryFragment> { /** * The UUID of the story linked to the fragment */ private UUID storyID; /** * The UUID of the fragment */ private UUID fragmentID; /** * The list of all Story Media associated with the fragment */ private transient ArrayList<Image> storyMedia; /** * The list of image ID's for JSON serialization. */ private ArrayList<UUID> mediaIds; /** * The text content of the fragment */ private String storyText; /** * The list of choices associated with the fragment */ private ArrayList<Choice> choices; /** * Constructor for making StoryFragments, used by @link{StoryDB} * * @param storyID UUID of the Story the StoryFragment is a part of * @param fragmentID UUID of the StoryFragment * @param storyText Text of the StoryFragment * @param storyMedia List of media associated with the StoryFragment * @param choices List of Choices associated with the Story Fragment */ public StoryFragment(UUID storyID, UUID fragmentID, String storyText, ArrayList<Image> storyMedia, ArrayList<Choice> choices) { this.storyID = storyID; this.fragmentID = fragmentID; this.storyText = storyText; this.storyMedia = storyMedia; this.choices = choices; } /** * Constructor for making a StoryFragment, used by @link{StoryManager} * It creates a new UUID for the new StoryFragment * * @param storyID UUID of the Story the StoryFragment is a part of * @param storyText Text of the StoryFragment * @param choice New Choice for the new StoryFragment */ public StoryFragment(UUID storyID, String storyText, Choice choice) { this.storyID = storyID; this.fragmentID = UUID.randomUUID(); this.choices = new ArrayList<Choice>(); this.choices.add(choice); this.storyText = storyText; this.storyMedia = new ArrayList<Image>(); } /** * Constructor for making a StoryFragment, used by @link{StoryManager} * It creates a new UUID for the new StoryFragment * * @param storyID UUID of the Story the StoryFragment is a part of * @param storyText Text of the StoryFragment */ public StoryFragment(UUID storyID, String storyText) { this.storyID = storyID; this.fragmentID = UUID.randomUUID(); this.storyText = storyText; this.choices = new ArrayList<Choice>(); this.storyMedia = new ArrayList<Image>(); } /** * Constructor for making a StoryFragment, used by @link{StoryManager} adn @link{StoryDB} * * * @param choices List of Choices associated with the Story Fragment * @param storyID UUID of the Story the StoryFragment is a part of * @param fragmentID UUID of the StoryFragment * @param storyText Text of the StoryFragment */ public StoryFragment(ArrayList<Choice> choices, UUID storyID, UUID fragmentID, String storyText) { this.choices = choices; this.storyID = storyID; this.fragmentID = fragmentID; this.storyText = storyText; this.storyMedia = new ArrayList<Image>(); } /** * Gets the UUID of the Story associated with the StoryFragment * * @return UUID of the Story */ public UUID getStoryID() { return storyID; } /** * Sets the UUID of the Story associated with the StoryFragment * @param id */ public void setStoryID(UUID id) { this.storyID = id; } /** * Gets the StoryFragment UUID * * @return UUID of the StoryFragment */ public UUID getFragmentID() { return fragmentID; } /** * Sets the StoryFragment UUID * */ public void setFragmentID() { this.fragmentID = UUID.randomUUID(); } /** * Gets the List of all Media associated with the StoryFragment * * @return List of all Media */ public ArrayList<Image> getStoryMedia() { return storyMedia; } public String getStoryMediaInJson() { if(storyMedia == null) storyMedia = new ArrayList<Image>(); ArrayList<UUID> uuids = new ArrayList<UUID>(); for(Image image : storyMedia) { uuids.add(image.getId()); } Gson gson = new Gson(); return gson.toJson(uuids); } /** * Sets the list of all story media * * @param storyMedia The new list of media */ public void setStoryMedia(ArrayList<Image> storyMedia) { this.storyMedia = storyMedia; } /** * Add media to the list of media * * @param media Media to add */ public void addMedia(Image media) { storyMedia.add(media); } /** * Removes media from the list of media * * @param media The media to remove */ public void removeMedia(Image media) { storyMedia.remove(media); } public void removeMedia(int media) { storyMedia.remove(media); } /** * Gets media at a certain index of the list * * @param id The index of the media * * @return The media */ public Image getMedia(int id) { return storyMedia.get(id); } /** * Gets the text of the StoryFragment * * @return Text of StoryFragment */ public String getStoryText() { return storyText; } /** * Sets the text of the StoryFragment * * @param storyText The text to set to */ public void setStoryText(String storyText) { this.storyText = storyText; } /** * Gets the list of all Choices associated with the StoryFragment * * @return The list of all Choices */ public ArrayList<Choice> getChoices() { return choices; } /** * Gets all Choices associated with the StoryFragment as a JSON string * * @return All the Choices as a JSON string */ public String getChoicesInJson() { Gson gson = new Gson(); return gson.toJson(choices); } /** * Sets the list of Choices to a new list * * @param choices The list of Choices to be set to */ public void setChoices(ArrayList<Choice> choices) { this.choices = choices; } /** * Add a Choice to the list of Choices * * @param choice The Choice to add */ public void addChoice(Choice choice) { choices.add(choice); } /** * Removes a Choice from the list of Choices * * @param choice The Choice to remove */ public void removeChoice(Choice choice) { choices.remove(choice); } /** * Gets a Choice at a specific index in the list * * @param id The index of the Choice * * @return The Choice at that index */ public Choice getChoice(int id) { return (Choice) choices.toArray()[id]; } public ArrayList<UUID> getMediaIds() { return this.mediaIds; } /** * Updates the media id's. Call this before serializing to JSON */ public void updateMediaIds() { if (this.storyMedia == null) return; this.mediaIds = new ArrayList<UUID>(); for (Image i : this.storyMedia) { this.mediaIds.add(i.getId()); } } @Override public int compareTo(StoryFragment other) { return this.fragmentID.compareTo(other.fragmentID); } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; StoryFragment fragment = (StoryFragment) o; if (choices != null ? !choices.equals(fragment.choices) : fragment.choices != null) return false; if (!fragmentID.equals(fragment.fragmentID)) return false; if (!storyID.equals(fragment.storyID)) return false; if (storyMedia != null ? !storyMedia.equals(fragment.storyMedia) : fragment.storyMedia != null) return false; if (!storyText.equals(fragment.storyText)) return false; return true; } @Override public int hashCode() { int result = storyID.hashCode(); result = 31 * result + fragmentID.hashCode(); result = 31 * result + (storyMedia != null ? storyMedia.hashCode() : 0); result = 31 * result + storyText.hashCode(); result = 31 * result + (choices != null ? choices.hashCode() : 0); return result; } public StoryFragment newId() { fragmentID = UUID.randomUUID(); for(Image image : getStoryMedia()) { image.setId(UUID.randomUUID()); } return this; } }