private Chromosome getChromosome() {
   if (chromosome == null) {
     chromosome = (Chromosome) DynamicUtil.createObject(Collections.singleton(Chromosome.class));
     chromosome.setPrimaryIdentifier("X");
     chromosome.setLength(new Integer(10000));
     chromosome.setId(new Integer(101));
   }
   return chromosome;
 }
  private void createOverlapTestData() throws Exception {
    Chromosome chr = (Chromosome) DynamicUtil.createObject(Collections.singleton(Chromosome.class));
    chr.setPrimaryIdentifier("X");
    chr.setLength(new Integer(1000));
    chr.setId(new Integer(101));

    Set<InterMineObject> toStore = new HashSet<InterMineObject>();

    toStore.add(chr);

    int[][] exonInfo = {
      {1000, 1, 1},
      {1001, 2, 10},
      {1002, 10, 15},
      {1003, 16, 19},
      {1004, 16, 19},
      {1005, 20, 29},
      {1006, 30, 100},
      {1007, 30, 34},
      {1008, 32, 95},
      {1009, 38, 53},
      {1010, 40, 50},
      {1011, 44, 44},
      {1012, 54, 54},
      {1013, 54, 54},
      {1014, 60, 70},
      {1015, 120, 140},
      {1016, 141, 145},
      {1017, 146, 180},
      {1018, 220, 240},
      {1019, 240, 245},
      {1020, 245, 280},
    };

    Exon[] exons = new Exon[exonInfo.length];
    Location[] exonLocs = new Location[exonInfo.length];

    for (int i = 0; i < exons.length; i++) {
      exons[i] = (Exon) DynamicUtil.createObject(Collections.singleton(Exon.class));
      int exonId = exonInfo[i][0];
      int start = exonInfo[i][1];
      int end = exonInfo[i][2];
      exons[i].setId(new Integer(exonId));
      exons[i].setLength(new Integer(end - start + 1));
      exons[i].setChromosome(chr);
      exonLocs[i] = createLocation(chr, exons[i], "1", start, end, Location.class);
      exonLocs[i].setId(new Integer(1000 + exonId));
    }

    ReversePrimer rp =
        (ReversePrimer) DynamicUtil.createObject(Collections.singleton(ReversePrimer.class));
    rp.setId(new Integer(3000));
    rp.setLength(new Integer(100));
    rp.setChromosome(chr);

    Location rpLoc = createLocation(chr, rp, "1", 1, 100, Location.class);
    rpLoc.setId(new Integer(3001));

    toStore.add(rp);
    toStore.add(rpLoc);
    toStore.addAll(Arrays.asList(exons));
    toStore.addAll(Arrays.asList(exonLocs));

    for (InterMineObject imo : toStore) {
      osw.store(imo);
    }
  }
  public void testSetChromosomeLocationsAndLengths() throws Exception {
    Chromosome chr1 =
        (Chromosome) DynamicUtil.createObject(Collections.singleton(Chromosome.class));
    chr1.setPrimaryIdentifier("1");
    chr1.setId(new Integer(101));
    Chromosome chr2 =
        (Chromosome) DynamicUtil.createObject(Collections.singleton(Chromosome.class));
    chr1.setPrimaryIdentifier("2");
    chr1.setId(new Integer(102));

    Exon exon1 = (Exon) DynamicUtil.createObject(Collections.singleton(Exon.class));
    exon1.setId(new Integer(107));
    exon1.setLength(new Integer(1000));
    Exon exon2 = (Exon) DynamicUtil.createObject(Collections.singleton(Exon.class));
    exon2.setId(new Integer(108));
    Exon exon3 = (Exon) DynamicUtil.createObject(Collections.singleton(Exon.class));
    exon3.setId(new Integer(109));

    // exon 2 has two chromosome locations, shouldn't get chromosome[Location] references
    Location exon1OnChr = createLocation(chr1, exon1, "1", 51, 100, Location.class);
    exon1OnChr.setId(new Integer(1010));
    Location exon2OnChr = createLocation(chr2, exon2, "1", 201, 250, Location.class);
    exon2OnChr.setId(new Integer(1011));
    Location exon2OnChrDup = createLocation(chr1, exon2, "1", 501, 550, Location.class);
    exon2OnChrDup.setId(new Integer(1012));
    Location exon3OnChr = createLocation(chr2, exon3, "1", 601, 650, Location.class);
    exon3OnChr.setId(new Integer(1013));

    Set<InterMineObject> toStore =
        new HashSet<InterMineObject>(
            Arrays.asList(
                new InterMineObject[] {
                  chr1, chr2, exon1, exon2, exon3, exon1OnChr, exon2OnChr, exon2OnChrDup, exon3OnChr
                }));

    for (InterMineObject imo : toStore) {
      osw.store(imo);
    }

    CalculateLocations cl = new CalculateLocations(osw);
    cl.setChromosomeLocationsAndLengths();

    ObjectStore os = osw.getObjectStore();
    Exon resExon1 = (Exon) os.getObjectById(new Integer(107));
    Exon resExon2 = (Exon) os.getObjectById(new Integer(108));
    Exon resExon3 = (Exon) os.getObjectById(new Integer(109));

    assertEquals(chr1.getId(), resExon1.getChromosome().getId());
    assertEquals(exon1OnChr.getId(), resExon1.getChromosomeLocation().getId());

    assertNull(resExon2.getChromosome());
    assertNull(resExon2.getChromosomeLocation());

    assertEquals(chr2.getId(), resExon3.getChromosome().getId());
    assertEquals(exon3OnChr.getId(), resExon3.getChromosomeLocation().getId());

    // exon1 has length set so should stay as 1000, exon3 should get length 50 set from location
    assertEquals(new Integer(1000), resExon1.getLength());
    assertEquals(new Integer(50), resExon3.getLength());
    // nothing done to exon2
    assertNull(resExon2.getLength());
  }