Session s = openSession(); s.beginTransaction(); VersionedNode parent = new VersionedNode( "parent", "parent" ); s.persist( parent ); s.getTransaction().commit(); s.close(); clearCounts(); parent.setName( "new parent name" ); VersionedNode child = new VersionedNode( "child", "child"); parent.addChild( child ); s = openSession(); s.beginTransaction(); s.update( parent ); s.setReadOnly( parent, true ); s.getTransaction().commit(); s.close(); assertUpdateCount( 0 ); assertInsertCount( 1 ); s = openSession(); s.beginTransaction(); parent = ( VersionedNode ) s.get( VersionedNode.class, parent.getId() ); child = ( VersionedNode ) s.get( VersionedNode.class, child.getId() ); assertEquals( parent.getName(), "parent" ); assertEquals( 1, parent.getChildren().size() ); assertEquals( 0, parent.getVersion() ); assertSame( parent, child.getParent() ); assertSame( child, parent.getChildren().iterator().next() ); assertEquals( 0, child.getVersion() ); s.delete( parent ); s.delete( child ); s.getTransaction().commit(); s.close();
Session s = openSession(); s.beginTransaction(); VersionedNode child = new VersionedNode( "child", "child" ); s.persist( child ); s.getTransaction().commit(); s.close(); clearCounts(); child.setName( "new child name" ); VersionedNode parent = new VersionedNode( "parent", "parent"); parent.addChild( child ); s = openSession(); s.beginTransaction(); child = ( VersionedNode ) s.merge( child ); s.setReadOnly( child, true ); s.getTransaction().commit(); s.close(); assertUpdateCount( 1 ); assertInsertCount( 1 ); s = openSession(); s.beginTransaction(); parent = ( VersionedNode ) s.get( VersionedNode.class, parent.getId() ); child = ( VersionedNode ) s.get( VersionedNode.class, child.getId() ); assertEquals( child.getName(), "child" ); assertNull( child.getParent() ); assertEquals( 0, child.getVersion() ); assertNotNull( parent ); assertEquals( 0, parent.getChildren().size() ); assertEquals( 1, parent.getVersion() ); // hmmm, why is was version updated? s.delete( parent ); s.delete( child ); s.getTransaction().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/readonly/ReadOnlyVersionedNodesTest.java File path: /hibernate-distribution-3.3.2.GA/project/testsuite/src/test/java/org/hibernate/test/readonly/ReadOnlyVersionedNodesTest.java
Method name: void testUpdateParentWithNewChildCommitWithReadOnlyParent() Method name: void testMergeDetachedChildWithNewParentCommitWithReadOnlyChild()
Number of AST nodes: 32 Number of AST nodes: 32
1
Session s = openSession();
1
Session s = openSession();
2
		s.beginTransaction();
2
		s.beginTransaction();
3
		VersionedNode parent = new VersionedNode( "parent", "parent" );
3
		VersionedNode child = new VersionedNode( "child", "child" );
4
		s.persist( parent );
4
		s.persist( child );
5
		s.getTransaction().commit();
5
		s.getTransaction().commit();
6
		s.close();
6
		s.close();
7
		clearCounts();
7
		clearCounts();
8
		parent.setName( "new parent name" );
8
		child.setName( "new child name" );
9
		VersionedNode child = new VersionedNode( "child", "child");
9
		VersionedNode parent = new VersionedNode( "parent", "parent");
10
		parent.addChild( child );
10
		parent.addChild( child );
11
		s = openSession();
11
		s = openSession();
12
		s.beginTransaction();
12
		s.beginTransaction();
13
		s.update( parent );
13
		child = ( VersionedNode ) s.merge( child );
14
		s.setReadOnly( parent, true );
14
		s.setReadOnly( child, true );
15
		s.getTransaction().commit();
15
		s.getTransaction().commit();
16
		s.close();
16
		s.close();
17
		assertUpdateCount( 0 );
17
		assertUpdateCount( 1 );
18
		assertInsertCount( 1 );
18
		assertInsertCount( 1 );
19
		s = openSession();
19
		s = openSession();
20
		s.beginTransaction();
20
		s.beginTransaction();
21
		parent = ( VersionedNode ) s.get( VersionedNode.class, parent.getId() );
21
		parent = ( VersionedNode ) s.get( VersionedNode.class, parent.getId() );
22
		child = ( VersionedNode ) s.get( VersionedNode.class, child.getId() );
22
		child = ( VersionedNode ) s.get( VersionedNode.class, child.getId() );
23
		assertEquals( parent.getName(), "parent" );
23
		assertEquals( child.getName(), "child" );
24
		assertEquals( 1, parent.getChildren().size() );
24
		assertNull( child.getParent() );
25
		assertEquals( 0, parent.getVersion() );
25
		assertEquals( 0, child.getVersion() );
26
		assertSame( parent, child.getParent() );
26
		assertNotNull( parent );
27
		assertSame( child, parent.getChildren().iterator().next() );
27
		assertEquals( 0, parent.getChildren().size() );
28
		assertEquals( 0, child.getVersion() );
28
		assertEquals( 1, parent.getVersion() );	// hmmm, why is was version updated?
29
		s.delete( parent );
29
		s.delete( parent );
30
		s.delete( child );
30
		s.delete( child );
31
		s.getTransaction().commit();
31
		s.getTransaction().commit();
32
		s.close();
32
		s.close();
Summary
Number of common nesting structure subtrees1
Number of refactorable cases0
Number of non-refactorable cases1
Time elapsed for finding largest common nesting structure subtrees (ms)0.0
Clones locationClones are declared in the same class
Number of node comparisons365
  1. {Non-refactorable}
    Mapping Summary
    Number of mapped statements31
    Number of unmapped statements in the first code fragment1
    Number of unmapped statements in the second code fragment1
    Time elapsed for statement mapping (ms)0.0
    Clone typeType 2
    Mapped Statements
    ID Statement ID Statement
    1
    Session s = openSession();
    1
    Session s = openSession();
    2
    s.beginTransaction();
    2
    s.beginTransaction();
    3
    VersionedNode parent = new VersionedNode("parent", "parent");
    3
    VersionedNode parent = new VersionedNode("parent", "parent");
    3
    VersionedNode child = new VersionedNode("child", "child");
    Differences
    Expression1Expression2Difference
    parentchildVARIABLE_NAME_MISMATCH
    "parent""child"LITERAL_VALUE_MISMATCH
    "parent""child"LITERAL_VALUE_MISMATCH
    3
    VersionedNode child = new VersionedNode("child", "child");
    4
    s.persist(parent);
    4
    s.persist(parent);
    4
    s.persist(child);
    Differences
    Expression1Expression2Difference
    parentchildVARIABLE_NAME_MISMATCH
    Preondition Violations
    Expression parent cannot be parameterized, because it has dependencies to/from statements that will be extracted
    Expression child cannot be parameterized, because it has dependencies to/from statements that will be extracted
    4
    s.persist(child);
    5
    s.getTransaction().commit();
    5
    s.getTransaction().commit();
    6
    s.close();
    6
    s.close();
    7
    clearCounts();
    7
    clearCounts();
    8
    parent.setName("new parent name");
    8
    parent.setName("new parent name");
    8
    child.setName("new child name");
    Differences
    Expression1Expression2Difference
    "new parent name""new child name"LITERAL_VALUE_MISMATCH
    parentchildVARIABLE_NAME_MISMATCH
    Preondition Violations
    Expression parent cannot be parameterized, because it has dependencies to/from statements that will be extracted
    Expression child cannot be parameterized, because it has dependencies to/from statements that will be extracted
    8
    child.setName("new child name");
    9
    VersionedNode child = new VersionedNode("child", "child");
    9
    VersionedNode child = new VersionedNode("child", "child");
    9
    VersionedNode parent = new VersionedNode("parent", "parent");
    Differences
    Expression1Expression2Difference
    childparentVARIABLE_NAME_MISMATCH
    "child""parent"LITERAL_VALUE_MISMATCH
    "child""parent"LITERAL_VALUE_MISMATCH
    9
    VersionedNode parent = new VersionedNode("parent", "parent");
    10
    parent.addChild(child);
    10
    parent.addChild(child);
    11
    s = openSession();
    11
    s = openSession();
    12
    s.beginTransaction();
    12
    s.beginTransaction();
    13
    s.update(parent);
    13
    s.update(parent);
    29
    s.delete(parent);
    Differences
    Expression1Expression2Difference
    updatedeleteMETHOD_INVOCATION_NAME_MISMATCH
    Preondition Violations
    Expression s.update(parent) cannot be parameterized, because it has dependencies to/from statements that will be extracted
    Expression s.delete(parent) cannot be parameterized, because it has dependencies to/from statements that will be extracted
    Expression s.update(parent) is a void method call, and thus it cannot be parameterized
    Expression s.delete(parent) is a void method call, and thus it cannot be parameterized
    29
    s.delete(parent);
    14
    s.setReadOnly(parent, true);
    14
    s.setReadOnly(parent, true);
    14
    s.setReadOnly(child, true);
    Differences
    Expression1Expression2Difference
    parentchildVARIABLE_NAME_MISMATCH
    Preondition Violations
    Expression parent cannot be parameterized, because it has dependencies to/from statements that will be extracted
    Expression child cannot be parameterized, because it has dependencies to/from statements that will be extracted
    14
    s.setReadOnly(child, true);
    15
    s.getTransaction().commit();
    15
    s.getTransaction().commit();
    16
    s.close();
    16
    s.close();
    17
    assertUpdateCount(0);
    17
    assertUpdateCount(0);
    17
    assertUpdateCount(1);
    Differences
    Expression1Expression2Difference
    01LITERAL_VALUE_MISMATCH
    17
    assertUpdateCount(1);
    18
    assertInsertCount(1);
    18
    assertInsertCount(1);
    19
    s = openSession();
    19
    s = openSession();
    20
    s.beginTransaction();
    20
    s.beginTransaction();
    21
    parent = (VersionedNode)s.get(VersionedNode.class, parent.getId());
    21
    parent = (VersionedNode)s.get(VersionedNode.class, parent.getId());
    13
    child = (VersionedNode)s.merge(child);
    Differences
    Expression1Expression2Difference
    parentchildVARIABLE_NAME_MISMATCH
    getmergeMETHOD_INVOCATION_NAME_MISMATCH
    s.get(VersionedNode.class,parent.getId())s.merge(child)ARGUMENT_NUMBER_MISMATCH
    Preondition Violations
    Expression parent cannot be parameterized, because it has dependencies to/from statements that will be extracted
    Expression child cannot be parameterized, because it has dependencies to/from statements that will be extracted
    Expression s.get(VersionedNode.class,parent.getId()) cannot be parameterized, because it has dependencies to/from statements that will be extracted
    Expression s.merge(child) cannot be parameterized, because it has dependencies to/from statements that will be extracted
    Expression s.get(VersionedNode.class,parent.getId()) cannot be parameterized, because it has dependencies to/from statements that will be extracted
    Expression s.merge(child) cannot be parameterized, because it has dependencies to/from statements that will be extracted
    13
    child = (VersionedNode)s.merge(child);
                                                                                                                                            
    21
    parent = (VersionedNode)s.get(VersionedNode.class, parent.getId());
    Preondition Violations
    Unmatched statement parent=(VersionedNode)s.get(VersionedNode.class,parent.getId()); cannot be moved before or after the extracted code, because it has dependencies to/from statements that will be extracted
    21
    parent = (VersionedNode)s.get(VersionedNode.class, parent.getId());
    22
    child = (VersionedNode)s.get(VersionedNode.class, child.getId());
    22
    child = (VersionedNode)s.get(VersionedNode.class, child.getId());
    23
    assertEquals(parent.getName(), "parent");
    23
    assertEquals(parent.getName(), "parent");
    23
    assertEquals(child.getName(), "child");
    Differences
    Expression1Expression2Difference
    parentchildVARIABLE_NAME_MISMATCH
    "parent""child"LITERAL_VALUE_MISMATCH
    Preondition Violations
    Expression parent cannot be parameterized, because it has dependencies to/from statements that will be extracted
    Expression child cannot be parameterized, because it has dependencies to/from statements that will be extracted
    23
    assertEquals(child.getName(), "child");
    24
    assertEquals(1, parent.getChildren().size());
    24
    assertEquals(1, parent.getChildren().size());
    27
    assertEquals(0, parent.getChildren().size());
    Differences
    Expression1Expression2Difference
    10LITERAL_VALUE_MISMATCH
    27
    assertEquals(0, parent.getChildren().size());
    25
    assertEquals(0, parent.getVersion());
    25
    assertEquals(0, parent.getVersion());
    28
    assertEquals(1, parent.getVersion());
    Differences
    Expression1Expression2Difference
    01LITERAL_VALUE_MISMATCH
    28
    assertEquals(1, parent.getVersion());
    26
    assertSame(parent, child.getParent());
    26
    assertSame(parent, child.getParent());
    24
    assertNull(child.getParent());
    Differences
    Expression1Expression2Difference
    assertSameassertNullMETHOD_INVOCATION_NAME_MISMATCH
    assertSame(parent,child.getParent())assertNull(child.getParent())ARGUMENT_NUMBER_MISMATCH
    Preondition Violations
    Expression assertSame(parent,child.getParent()) cannot be parameterized, because it has dependencies to/from statements that will be extracted
    Expression assertNull(child.getParent()) cannot be parameterized, because it has dependencies to/from statements that will be extracted
    Expression assertSame(parent,child.getParent()) is a void method call, and thus it cannot be parameterized
    Expression assertNull(child.getParent()) is a void method call, and thus it cannot be parameterized
    Expression assertSame(parent,child.getParent()) cannot be parameterized, because it has dependencies to/from statements that will be extracted
    Expression assertNull(child.getParent()) cannot be parameterized, because it has dependencies to/from statements that will be extracted
    Expression assertSame(parent,child.getParent()) is a void method call, and thus it cannot be parameterized
    Expression assertNull(child.getParent()) is a void method call, and thus it cannot be parameterized
    24
    assertNull(child.getParent());
    27
    assertSame(child, parent.getChildren().iterator().next());
    27
    assertSame(child, parent.getChildren().iterator().next());
    26
    assertNotNull(parent);
    Differences
    Expression1Expression2Difference
    assertSameassertNotNullMETHOD_INVOCATION_NAME_MISMATCH
    assertSame(child,parent.getChildren().iterator().next())assertNotNull(parent)ARGUMENT_NUMBER_MISMATCH
    Preondition Violations
    Expression assertSame(child,parent.getChildren().iterator().next()) cannot be parameterized, because it has dependencies to/from statements that will be extracted
    Expression assertSame(child,parent.getChildren().iterator().next()) is a void method call, and thus it cannot be parameterized
    Expression assertNotNull(parent) is a void method call, and thus it cannot be parameterized
    Expression assertSame(child,parent.getChildren().iterator().next()) cannot be parameterized, because it has dependencies to/from statements that will be extracted
    Expression assertSame(child,parent.getChildren().iterator().next()) is a void method call, and thus it cannot be parameterized
    Expression assertNotNull(parent) is a void method call, and thus it cannot be parameterized
    26
    assertNotNull(parent);
    28
    assertEquals(0, child.getVersion());
    25
    assertEquals(0, child.getVersion());
    29
    s.delete(parent);
                                              
    30
    s.delete(child);
    30
    s.delete(child);
    31
    s.getTransaction().commit();
    31
    s.getTransaction().commit();
    32
    s.close();
    32
    s.close();
    Precondition Violations (34)
    Row Violation
    1Expression parent cannot be parameterized, because it has dependencies to/from statements that will be extracted
    2Expression child cannot be parameterized, because it has dependencies to/from statements that will be extracted
    3Expression parent cannot be parameterized, because it has dependencies to/from statements that will be extracted
    4Expression child cannot be parameterized, because it has dependencies to/from statements that will be extracted
    5Expression s.update(parent) cannot be parameterized, because it has dependencies to/from statements that will be extracted
    6Expression s.delete(parent) cannot be parameterized, because it has dependencies to/from statements that will be extracted
    7Expression s.update(parent) is a void method call, and thus it cannot be parameterized
    8Expression s.delete(parent) is a void method call, and thus it cannot be parameterized
    9Expression parent cannot be parameterized, because it has dependencies to/from statements that will be extracted
    10Expression child cannot be parameterized, because it has dependencies to/from statements that will be extracted
    11Expression parent cannot be parameterized, because it has dependencies to/from statements that will be extracted
    12Expression child cannot be parameterized, because it has dependencies to/from statements that will be extracted
    13Expression s.get(VersionedNode.class,parent.getId()) cannot be parameterized, because it has dependencies to/from statements that will be extracted
    14Expression s.merge(child) cannot be parameterized, because it has dependencies to/from statements that will be extracted
    15Expression s.get(VersionedNode.class,parent.getId()) cannot be parameterized, because it has dependencies to/from statements that will be extracted
    16Expression s.merge(child) cannot be parameterized, because it has dependencies to/from statements that will be extracted
    17Unmatched statement parent=(VersionedNode)s.get(VersionedNode.class,parent.getId()); cannot be moved before or after the extracted code, because it has dependencies to/from statements that will be extracted
    18Expression parent cannot be parameterized, because it has dependencies to/from statements that will be extracted
    19Expression child cannot be parameterized, because it has dependencies to/from statements that will be extracted
    20Expression assertSame(parent,child.getParent()) cannot be parameterized, because it has dependencies to/from statements that will be extracted
    21Expression assertNull(child.getParent()) cannot be parameterized, because it has dependencies to/from statements that will be extracted
    22Expression assertSame(parent,child.getParent()) is a void method call, and thus it cannot be parameterized
    23Expression assertNull(child.getParent()) is a void method call, and thus it cannot be parameterized
    24Expression assertSame(parent,child.getParent()) cannot be parameterized, because it has dependencies to/from statements that will be extracted
    25Expression assertNull(child.getParent()) cannot be parameterized, because it has dependencies to/from statements that will be extracted
    26Expression assertSame(parent,child.getParent()) is a void method call, and thus it cannot be parameterized
    27Expression assertNull(child.getParent()) is a void method call, and thus it cannot be parameterized
    28Expression assertSame(child,parent.getChildren().iterator().next()) cannot be parameterized, because it has dependencies to/from statements that will be extracted
    29Expression assertSame(child,parent.getChildren().iterator().next()) is a void method call, and thus it cannot be parameterized
    30Expression assertNotNull(parent) is a void method call, and thus it cannot be parameterized
    31Expression assertSame(child,parent.getChildren().iterator().next()) cannot be parameterized, because it has dependencies to/from statements that will be extracted
    32Expression assertSame(child,parent.getChildren().iterator().next()) is a void method call, and thus it cannot be parameterized
    33Expression assertNotNull(parent) is a void method call, and thus it cannot be parameterized
    34Clone fragment #1 returns variables s, parent , while Clone fragment #2 returns variables parent, s