Contract c = new Contract("gavin", "phone"); ContractVariation cv1 = new ContractVariation(1, c); cv1.setText("expensive"); ContractVariation cv2 = new ContractVariation(2, c); cv2.setText("more expensive"); Session s = openSession(); Transaction t = s.beginTransaction(); s.persist(c); t.commit(); s.close(); s = openSession(); t = s.beginTransaction(); c.getVariations().add( new ContractVariation(3, c) ); try { s.update( c ); fail( "should have failed because reassociated object has a dirty collection"); } catch ( HibernateException ex ) { // expected } finally { t.rollback(); s.close(); } s = openSession(); t = s.beginTransaction(); c = (Contract) s.createCriteria(Contract.class).uniqueResult(); assertEquals( c.getCustomerName(), "gavin" ); assertEquals( c.getVariations().size(), 2 ); Iterator it = c.getVariations().iterator(); cv1 = (ContractVariation) it.next(); assertEquals( cv1.getText(), "expensive" ); cv2 = (ContractVariation) it.next(); assertEquals( cv2.getText(), "more expensive" ); s.delete(c); assertEquals( s.createCriteria(Contract.class).setProjection( Projections.rowCount() ).uniqueResult(), new Integer(0) ); assertEquals( s.createCriteria(ContractVariation.class).setProjection( Projections.rowCount() ).uniqueResult(), new Integer(0) ); t.commit(); s.close();
Contract c = new Contract("gavin", "phone"); ContractVariation cv1 = new ContractVariation(1, c); cv1.setText("expensive"); ContractVariation cv2 = new ContractVariation(2, c); cv2.setText("more expensive"); Session s = openSession(); Transaction t = s.beginTransaction(); s.persist(c); t.commit(); s.close(); s = openSession(); t = s.beginTransaction(); c.getVariations().add( new ContractVariation(3, c) ); s.merge( c ); try { t.commit(); fail( "should have failed because an immutable collection was changed"); } catch ( HibernateException ex ) { // expected t.rollback(); } finally { s.close(); } s = openSession(); t = s.beginTransaction(); c = (Contract) s.createCriteria(Contract.class).uniqueResult(); assertEquals( c.getCustomerName(), "gavin" ); assertEquals( c.getVariations().size(), 2 ); Iterator it = c.getVariations().iterator(); cv1 = (ContractVariation) it.next(); assertEquals( cv1.getText(), "expensive" ); cv2 = (ContractVariation) it.next(); assertEquals( cv2.getText(), "more expensive" ); s.delete(c); assertEquals( s.createCriteria(Contract.class).setProjection( Projections.rowCount() ).uniqueResult(), new Integer(0) ); assertEquals( s.createCriteria(ContractVariation.class).setProjection( Projections.rowCount() ).uniqueResult(), new Integer(0) ); t.commit(); s.close();
Clone fragments detected by clone detection tool
File path: /hibernate-distribution-3.3.2.GA/project/testsuite/src/test/java/org/hibernate/test/immutable/ImmutableTest.java File path: /hibernate-distribution-3.3.2.GA/project/testsuite/src/test/java/org/hibernate/test/immutable/ImmutableTest.java
Method name: void testImmutableCollectionWithUpdate() Method name: void testImmutableCollectionWithMerge()
Number of AST nodes: 31 Number of AST nodes: 32
1
Contract c = new Contract("gavin", "phone");
1
Contract c = new Contract("gavin", "phone");
2
		ContractVariation cv1 = new ContractVariation(1, c);
2
		ContractVariation cv1 = new ContractVariation(1, c);
3
		cv1.setText("expensive");
3
		cv1.setText("expensive");
4
		ContractVariation cv2 = new ContractVariation(2, c);
4
		ContractVariation cv2 = new ContractVariation(2, c);
5
		cv2.setText("more expensive");
5
		cv2.setText("more expensive");
6
		Session s = openSession();
6
		Session s = openSession();
7
		Transaction t = s.beginTransaction();
7
		Transaction t = s.beginTransaction();
8
		s.persist(c);
8
		s.persist(c);
9
		t.commit();
9
		t.commit();
10
		s.close();
10
		s.close();
11
		s = openSession();
11
		s = openSession();
12
		t = s.beginTransaction();
12
		t = s.beginTransaction();
13
		c.getVariations().add( new ContractVariation(3, c) );
13
		c.getVariations().add( new ContractVariation(3, c) );
14
		try {
14
		
15
			s.update( c 
15
s.merge( c );
16
		try {
16
);
17
			t.commit();
17
			fail( "should have failed because reassociated object has a dirty collection");
18
			fail( "should have failed because an immutable collection was changed");
18
		}
19
		}
19
		catch ( HibernateException ex ) {
20
		catch ( HibernateException ex ) {
20
			// expected
21
			// expected
21
		}
22
		
22
		finally {
23
			t.rollback();
23
	t.rollback();
24
		}
25
		finally {
24
			s.close();
26
			s.close();
25
		}
27
		}
26
		s = openSession();
28
		s = openSession();
27
		t = s.beginTransaction();
29
		t = s.beginTransaction();
28
		c = (Contract) s.createCriteria(Contract.class).uniqueResult();
30
		c = (Contract) s.createCriteria(Contract.class).uniqueResult();
29
		assertEquals( c.getCustomerName(), "gavin" );
31
		assertEquals( c.getCustomerName(), "gavin" );
30
		assertEquals( c.getVariations().size(), 2 );
32
		assertEquals( c.getVariations().size(), 2 );
31
		Iterator it = c.getVariations().iterator();
33
		Iterator it = c.getVariations().iterator();
32
		cv1 = (ContractVariation) it.next();
34
		cv1 = (ContractVariation) it.next();
33
		assertEquals( cv1.getText(), "expensive" );
35
		assertEquals( cv1.getText(), "expensive" );
34
		cv2 = (ContractVariation) it.next();
36
		cv2 = (ContractVariation) it.next();
35
		assertEquals( cv2.getText(), "more expensive" );
37
		assertEquals( cv2.getText(), "more expensive" );
36
		s.delete(c);
38
		s.delete(c);
37
		assertEquals( s.createCriteria(Contract.class).setProjection( Projections.rowCount() ).uniqueResult(), new Integer(0) );
39
		assertEquals( s.createCriteria(Contract.class).setProjection( Projections.rowCount() ).uniqueResult(), new Integer(0) );
38
		assertEquals( s.createCriteria(ContractVariation.class).setProjection( Projections.rowCount() ).uniqueResult(), new Integer(0) );
40
		assertEquals( s.createCriteria(ContractVariation.class).setProjection( Projections.rowCount() ).uniqueResult(), new Integer(0) );
39
		t.commit();
41
		t.commit();
40
		s.close();
42
		s.close();
Summary
Number of common nesting structure subtrees1
Number of refactorable cases1
Number of non-refactorable cases0
Time elapsed for finding largest common nesting structure subtrees (ms)0.1
Clones locationClones are declared in the same class
Number of node comparisons260
  1. {Refactorable}
    Mapping Summary
    Number of mapped statements28
    Number of unmapped statements in the first code fragment3
    Number of unmapped statements in the second code fragment4
    Time elapsed for statement mapping (ms)48.2
    Clone typeType 3
    Mapped Statements
    ID Statement ID Statement
    1
    Contract c = new Contract("gavin", "phone");
    1
    Contract c = new Contract("gavin", "phone");
    2
    ContractVariation cv1 = new ContractVariation(1, c);
    2
    ContractVariation cv1 = new ContractVariation(1, c);
    3
    cv1.setText("expensive");
    3
    cv1.setText("expensive");
    4
    ContractVariation cv2 = new ContractVariation(2, c);
    4
    ContractVariation cv2 = new ContractVariation(2, c);
    5
    cv2.setText("more expensive");
    5
    cv2.setText("more expensive");
    6
    Session s = openSession();
    6
    Session s = openSession();
    7
    Transaction t = s.beginTransaction();
    7
    Transaction t = s.beginTransaction();
    8
    s.persist(c);
    8
    s.persist(c);
    9
    t.commit();
    9
    t.commit();
    10
    s.close();
    10
    s.close();
    11
    s = openSession();
    11
    s = openSession();
    12
    t = s.beginTransaction();
    12
    t = s.beginTransaction();
    13
    c.getVariations().add(new ContractVariation(3, c));
    13
    c.getVariations().add(new ContractVariation(3, c));
                                  
    14
    s.merge(c);
    Preondition Violations
    Unmatched statement s.merge(c); cannot be moved before or after the extracted code, because it has dependencies to/from statements that will be extracted
    14
    s.merge(c);
    14
    try
    14
    try
    Preondition Violations
    Unmatched statement try cannot be moved before or after the extracted code, because it has dependencies to/from statements that will be extracted
                  
    15
    s.update(c);
    15
    s.update(c);
    Preondition Violations
    Unmatched statement s.update(c); cannot be moved before or after the extracted code, because it has dependencies to/from statements that will be extracted
                                    
    16
    fail("should have failed because reassociated object has a dirty collection");
                                                                                                                                                                        
                  
    15
    try
    Preondition Violations
    Unmatched statement try cannot be moved before or after the extracted code, because it has dependencies to/from statements that will be extracted
    15
    try
                                  
    16
    t.commit();
    Preondition Violations
    Unmatched statement t.commit(); cannot be moved before or after the extracted code, because it has dependencies to/from statements that will be extracted
    16
    t.commit();
                                                                                                                                                          
    17
    fail("should have failed because an immutable collection was changed");
    17
    s = openSession();
    18
    s = openSession();
    18
    t = s.beginTransaction();
    19
    t = s.beginTransaction();
    19
    c = (Contract)s.createCriteria(Contract.class).uniqueResult();
    20
    c = (Contract)s.createCriteria(Contract.class).uniqueResult();
    20
    assertEquals(c.getCustomerName(), "gavin");
    21
    assertEquals(c.getCustomerName(), "gavin");
    21
    assertEquals(c.getVariations().size(), 2);
    22
    assertEquals(c.getVariations().size(), 2);
    22
    Iterator it = c.getVariations().iterator();
    23
    Iterator it = c.getVariations().iterator();
    23
    cv1 = (ContractVariation)it.next();
    24
    cv1 = (ContractVariation)it.next();
    24
    assertEquals(cv1.getText(), "expensive");
    25
    assertEquals(cv1.getText(), "expensive");
    25
    cv2 = (ContractVariation)it.next();
    26
    cv2 = (ContractVariation)it.next();
    26
    assertEquals(cv2.getText(), "more expensive");
    27
    assertEquals(cv2.getText(), "more expensive");
    27
    s.delete(c);
    28
    s.delete(c);
    28
    assertEquals(s.createCriteria(Contract.class).setProjection(Projections.rowCount()).uniqueResult(), new Integer(0));
    29
    assertEquals(s.createCriteria(Contract.class).setProjection(Projections.rowCount()).uniqueResult(), new Integer(0));
    29
    assertEquals(s.createCriteria(ContractVariation.class).setProjection(Projections.rowCount()).uniqueResult(), new Integer(0));
    30
    assertEquals(s.createCriteria(ContractVariation.class).setProjection(Projections.rowCount()).uniqueResult(), new Integer(0));
    30
    t.commit();
    31
    t.commit();
    31
    s.close();
    32
    s.close();
    Precondition Violations (5)
    Row Violation
    1Unmatched statement s.merge(c); cannot be moved before or after the extracted code, because it has dependencies to/from statements that will be extracted
    2Unmatched statement try cannot be moved before or after the extracted code, because it has dependencies to/from statements that will be extracted
    3Unmatched statement s.update(c); cannot be moved before or after the extracted code, because it has dependencies to/from statements that will be extracted
    4Unmatched statement try cannot be moved before or after the extracted code, because it has dependencies to/from statements that will be extracted
    5Unmatched statement t.commit(); cannot be moved before or after the extracted code, because it has dependencies to/from statements that will be extracted