/*PLEASE DO NOT EDIT THIS CODE*/
/*This code was generated using the UMPLE 1.33.0.6934.a386b0a58 modeling language!*/

package example;
import java.util.*;

// line 3 "../EqualsTest.ump"
public class Student
{

  //------------------------
  // MEMBER VARIABLES
  //------------------------

  //Student Attributes
  private int intId;
  private double doubleId;
  private boolean booleanId;
  private String stringId;
  private List<String> stringListIds;

  //Helper Variables
  private int cachedHashCode;
  private boolean canSetIntId;
  private boolean canSetDoubleId;
  private boolean canSetBooleanId;
  private boolean canSetStringId;
  private boolean canSetStringListIds;

  //------------------------
  // CONSTRUCTOR
  //------------------------

  public Student(int aIntId, double aDoubleId, boolean aBooleanId, String aStringId)
  {
    cachedHashCode = -1;
    canSetIntId = true;
    canSetDoubleId = true;
    canSetBooleanId = true;
    canSetStringId = true;
    canSetStringListIds = true;
    intId = aIntId;
    doubleId = aDoubleId;
    booleanId = aBooleanId;
    stringId = aStringId;
    stringListIds = new ArrayList<String>();
  }

  //------------------------
  // INTERFACE
  //------------------------

  public boolean setIntId(int aIntId)
  {
    boolean wasSet = false;
    if (!canSetIntId) { return false; }
    intId = aIntId;
    wasSet = true;
    return wasSet;
  }

  public boolean setDoubleId(double aDoubleId)
  {
    boolean wasSet = false;
    if (!canSetDoubleId) { return false; }
    doubleId = aDoubleId;
    wasSet = true;
    return wasSet;
  }

  public boolean setBooleanId(boolean aBooleanId)
  {
    boolean wasSet = false;
    if (!canSetBooleanId) { return false; }
    booleanId = aBooleanId;
    wasSet = true;
    return wasSet;
  }

  public boolean setStringId(String aStringId)
  {
    boolean wasSet = false;
    if (!canSetStringId) { return false; }
    stringId = aStringId;
    wasSet = true;
    return wasSet;
  }
  /* Code from template attribute_SetMany */
  public boolean addStringListId(String aStringListId)
  {
    boolean wasAdded = false;
    if (!canSetStringListIds) { return false; }
    wasAdded = stringListIds.add(aStringListId);
    return wasAdded;
  }

  public boolean removeStringListId(String aStringListId)
  {
    boolean wasRemoved = false;
    if (!canSetStringListIds) { return false; }
    wasRemoved = stringListIds.remove(aStringListId);
    return wasRemoved;
  }

  public int getIntId()
  {
    return intId;
  }

  public double getDoubleId()
  {
    return doubleId;
  }

  public boolean getBooleanId()
  {
    return booleanId;
  }

  public String getStringId()
  {
    return stringId;
  }
  /* Code from template attribute_GetMany */
  public String getStringListId(int index)
  {
    String aStringListId = stringListIds.get(index);
    return aStringListId;
  }

  public String[] getStringListIds()
  {
    String[] newStringListIds = stringListIds.toArray(new String[stringListIds.size()]);
    return newStringListIds;
  }

  public int numberOfStringListIds()
  {
    int number = stringListIds.size();
    return number;
  }

  public boolean hasStringListIds()
  {
    boolean has = stringListIds.size() > 0;
    return has;
  }

  public int indexOfStringListId(String aStringListId)
  {
    int index = stringListIds.indexOf(aStringListId);
    return index;
  }
  /* Code from template attribute_IsBoolean */
  public boolean isBooleanId()
  {
    return booleanId;
  }

  public boolean equals(Object obj)
  {
    if (obj == null) { return false; }
    if (!getClass().equals(obj.getClass())) { return false; }

    Student compareTo = (Student)obj;
  
    if (getIntId() != compareTo.getIntId())
    {
      return false;
    }

    if (getDoubleId() != compareTo.getDoubleId())
    {
      return false;
    }

    if (getBooleanId() != compareTo.getBooleanId())
    {
      return false;
    }

    if (getStringId() == null && compareTo.getStringId() != null)
    {
      return false;
    }
    else if (getStringId() != null && !getStringId().equals(compareTo.getStringId()))
    {
      return false;
    }

    if (getStringListIds().length != compareTo.getStringListIds().length)
    {
      return false;
    }

    for (int i=0; i<getStringListIds().length; i++)
    {
      String me = getStringListIds()[i];
      String them = compareTo.getStringListIds()[i];
      if (me == null && them != null)
      {
       return false;
      }
      else if (me != null && !me.equals(them))
      {
        return false;
      }
    }

    return true;
  }

  public int hashCode()
  {
    if (cachedHashCode != -1)
    {
      return cachedHashCode;
    }
    cachedHashCode = 17;
    cachedHashCode = cachedHashCode * 23 + getIntId();

    cachedHashCode = cachedHashCode * 23 + (Double.valueOf(getDoubleId())).hashCode();

    cachedHashCode = cachedHashCode * 23 + (getBooleanId() ? 1 : 0);

    if (getStringId() != null)
    {
      cachedHashCode = cachedHashCode * 23 + getStringId().hashCode();
    }
    else
    {
      cachedHashCode = cachedHashCode * 23;
    }

    if (getStringListIds() != null)
    {
      cachedHashCode = cachedHashCode * 23 + getStringListIds().hashCode();
    }
    else
    {
      cachedHashCode = cachedHashCode * 23;
    }

    canSetIntId = false;
    canSetDoubleId = false;
    canSetBooleanId = false;
    canSetStringId = false;
    canSetStringListIds = false;
    return cachedHashCode;
  }

  public void delete()
  {}


  public String toString()
  {
    return super.toString() + "["+
            "stringId" + ":" + getStringId()+ "," +
            "booleanId" + ":" + getBooleanId()+ "," +
            "doubleId" + ":" + getDoubleId()+ "," +
            "intId" + ":" + getIntId()+ "]";
  }
}
/*PLEASE DO NOT EDIT THIS CODE*/
/*This code was generated using the UMPLE 1.33.0.6934.a386b0a58 modeling language!*/

package example;

// line 3 "../EqualsTest_AlreadyImmutable.ump"
public class Student
{

  //------------------------
  // MEMBER VARIABLES
  //------------------------

  //Student Attributes
  private int intId;
  private double doubleId;
  private boolean booleanId;
  private String stringId;

  //Helper Variables
  private int cachedHashCode;
  private boolean canSetIntId;

  //------------------------
  // CONSTRUCTOR
  //------------------------

  public Student(double aDoubleId, boolean aBooleanId, String aStringId)
  {
    cachedHashCode = -1;
    canSetIntId = true;
    doubleId = aDoubleId;
    booleanId = aBooleanId;
    stringId = aStringId;
  }

  //------------------------
  // INTERFACE
  //------------------------
  /* Code from template attribute_SetImmutable */
  public boolean setIntId(int aIntId)
  {
    boolean wasSet = false;
    if (!canSetIntId) { return false; }
    canSetIntId = false;
    intId = aIntId;
    wasSet = true;
    return wasSet;
  }

  public int getIntId()
  {
    return intId;
  }

  public double getDoubleId()
  {
    return doubleId;
  }

  public boolean getBooleanId()
  {
    return booleanId;
  }

  public String getStringId()
  {
    return stringId;
  }
  /* Code from template attribute_IsBoolean */
  public boolean isBooleanId()
  {
    return booleanId;
  }

  public boolean equals(Object obj)
  {
    if (obj == null) { return false; }
    if (!getClass().equals(obj.getClass())) { return false; }

    Student compareTo = (Student)obj;
  
    if (getIntId() != compareTo.getIntId())
    {
      return false;
    }

    if (getDoubleId() != compareTo.getDoubleId())
    {
      return false;
    }

    if (getBooleanId() != compareTo.getBooleanId())
    {
      return false;
    }

    if (getStringId() == null && compareTo.getStringId() != null)
    {
      return false;
    }
    else if (getStringId() != null && !getStringId().equals(compareTo.getStringId()))
    {
      return false;
    }

    return true;
  }

  public int hashCode()
  {
    if (cachedHashCode != -1)
    {
      return cachedHashCode;
    }
    cachedHashCode = 17;
    cachedHashCode = cachedHashCode * 23 + getIntId();

    cachedHashCode = cachedHashCode * 23 + (Double.valueOf(getDoubleId())).hashCode();

    cachedHashCode = cachedHashCode * 23 + (getBooleanId() ? 1 : 0);

    if (getStringId() != null)
    {
      cachedHashCode = cachedHashCode * 23 + getStringId().hashCode();
    }
    else
    {
      cachedHashCode = cachedHashCode * 23;
    }

    canSetIntId = false;
    return cachedHashCode;
  }

  public void delete()
  {}


  public String toString()
  {
    return super.toString() + "["+
            "stringId" + ":" + getStringId()+ "," +
            "booleanId" + ":" + getBooleanId()+ "," +
            "doubleId" + ":" + getDoubleId()+ "," +
            "intId" + ":" + getIntId()+ "]";
  }
}
/*PLEASE DO NOT EDIT THIS CODE*/
/*This code was generated using the UMPLE 1.33.0.6934.a386b0a58 modeling language!*/

package example;
import java.util.*;

// line 15 "../EqualsTest.ump"
public class Mentor
{

  //------------------------
  // MEMBER VARIABLES
  //------------------------

  //Mentor Associations
  private Course main;
  private List<Course> secondaries;

  //Helper Variables
  private int cachedHashCode;
  private boolean canSetMain;
  private boolean canSetSecondaries;

  //------------------------
  // CONSTRUCTOR
  //------------------------

  public Mentor()
  {
    cachedHashCode = -1;
    canSetMain = true;
    canSetSecondaries = true;
    secondaries = new ArrayList<Course>();
  }

  //------------------------
  // INTERFACE
  //------------------------
  /* Code from template association_GetOne */
  public Course getMain()
  {
    return main;
  }

  public boolean hasMain()
  {
    boolean has = main != null;
    return has;
  }
  /* Code from template association_GetMany */
  public Course getSecondary(int index)
  {
    Course aSecondary = secondaries.get(index);
    return aSecondary;
  }

  public List<Course> getSecondaries()
  {
    List<Course> newSecondaries = Collections.unmodifiableList(secondaries);
    return newSecondaries;
  }

  public int numberOfSecondaries()
  {
    int number = secondaries.size();
    return number;
  }

  public boolean hasSecondaries()
  {
    boolean has = secondaries.size() > 0;
    return has;
  }

  public int indexOfSecondary(Course aSecondary)
  {
    int index = secondaries.indexOf(aSecondary);
    return index;
  }
  /* Code from template association_SetOptionalOneToOptionalOne */
  public boolean setMain(Course aNewMain)
  {
    boolean wasSet = false;
    if (!canSetMain) { return false; }
    if (aNewMain == null)
    {
      Course existingMain = main;
      main = null;
      
      if (existingMain != null && existingMain.getMentorMain() != null)
      {
        existingMain.setMentorMain(null);
      }
      wasSet = true;
      return wasSet;
    }

    Course currentMain = getMain();
    if (currentMain != null && !currentMain.equals(aNewMain))
    {
      currentMain.setMentorMain(null);
    }

    main = aNewMain;
    Mentor existingMentorMain = aNewMain.getMentorMain();

    if (!equals(existingMentorMain))
    {
      aNewMain.setMentorMain(this);
    }
    wasSet = true;
    return wasSet;
  }
  /* Code from template association_MinimumNumberOfMethod */
  public static int minimumNumberOfSecondaries()
  {
    return 0;
  }
  /* Code from template association_AddManyToOptionalOne */
  public boolean addSecondary(Course aSecondary)
  {
    boolean wasAdded = false;
    if (!canSetSecondaries) { return false; }
    if (secondaries.contains(aSecondary)) { return false; }
    Mentor existingMentorSecondary = aSecondary.getMentorSecondary();
    if (existingMentorSecondary == null)
    {
      aSecondary.setMentorSecondary(this);
    }
    else if (!this.equals(existingMentorSecondary))
    {
      existingMentorSecondary.removeSecondary(aSecondary);
      addSecondary(aSecondary);
    }
    else
    {
      secondaries.add(aSecondary);
    }
    wasAdded = true;
    return wasAdded;
  }

  public boolean removeSecondary(Course aSecondary)
  {
    boolean wasRemoved = false;
    if (!canSetSecondaries) { return false; }
    if (secondaries.contains(aSecondary))
    {
      secondaries.remove(aSecondary);
      aSecondary.setMentorSecondary(null);
      wasRemoved = true;
    }
    return wasRemoved;
  }
  /* Code from template association_AddIndexControlFunctions */
  public boolean addSecondaryAt(Course aSecondary, int index)
  {  
    boolean wasAdded = false;
    if(addSecondary(aSecondary))
    {
      if(index < 0 ) { index = 0; }
      if(index > numberOfSecondaries()) { index = numberOfSecondaries() - 1; }
      secondaries.remove(aSecondary);
      secondaries.add(index, aSecondary);
      wasAdded = true;
    }
    return wasAdded;
  }

  public boolean addOrMoveSecondaryAt(Course aSecondary, int index)
  {
    boolean wasAdded = false;
    if(secondaries.contains(aSecondary))
    {
      if(index < 0 ) { index = 0; }
      if(index > numberOfSecondaries()) { index = numberOfSecondaries() - 1; }
      secondaries.remove(aSecondary);
      secondaries.add(index, aSecondary);
      wasAdded = true;
    } 
    else 
    {
      wasAdded = addSecondaryAt(aSecondary, index);
    }
    return wasAdded;
  }

  public boolean equals(Object obj)
  {
    if (obj == null) { return false; }
    if (!getClass().equals(obj.getClass())) { return false; }

    Mentor compareTo = (Mentor)obj;
  
    if (getMain() == null && compareTo.getMain() != null)
    {
      return false;
    }
    else if (getMain() != null && !getMain().equals(compareTo.getMain()))
    {
      return false;
    }

    if (getSecondaries().size() != compareTo.getSecondaries().size())
    {
      return false;
    }

    for (int i=0; i<getSecondaries().size(); i++)
    {
      Course me = getSecondaries().get(i);
      Course them = compareTo.getSecondaries().get(i);
      if (me == null && them != null)
      {
       return false;
      }
      else if (me != null && !me.equals(them))
      {
        return false;
      }
    }

    return true;
  }

  public int hashCode()
  {
    if (cachedHashCode != -1)
    {
      return cachedHashCode;
    }
    cachedHashCode = 17;
    if (getMain() != null)
    {
      cachedHashCode = cachedHashCode * 23 + getMain().hashCode();
    }
    else
    {
      cachedHashCode = cachedHashCode * 23;
    }
    if (getSecondaries() != null)
    {
      cachedHashCode = cachedHashCode * 23 + getSecondaries().hashCode();
    }
    else
    {
      cachedHashCode = cachedHashCode * 23;
    }

    canSetMain = false;
    canSetSecondaries = false;
    return cachedHashCode;
  }

  public void delete()
  {
    if (main != null)
    {
      main.setMentorMain(null);
    }
    while( !secondaries.isEmpty() )
    {
      secondaries.get(0).setMentorSecondary(null);
    }
  }

}