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(); parent = ( VersionedNode ) s.merge( 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 testMergeDetachedParentWithNewChildCommitWithReadOnlyParent() 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
		parent = ( VersionedNode ) s.merge( 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 statements32
    Number of unmapped statements in the first code fragment0
    Number of unmapped statements in the second code fragment0
    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
    parent = (VersionedNode)s.merge(parent);
    13
    parent = (VersionedNode)s.merge(parent);
    13
    child = (VersionedNode)s.merge(child);
    Differences
    Expression1Expression2Difference
    parentchildVARIABLE_NAME_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
    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
    13
    child = (VersionedNode)s.merge(child);
    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());
    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 assertNotNull(parent) 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 assertNotNull(parent) 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);
    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 (28)
    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 parent cannot be parameterized, because it has dependencies to/from statements that will be extracted
    6Expression child cannot be parameterized, because it has dependencies to/from statements that will be extracted
    7Expression parent cannot be parameterized, because it has dependencies to/from statements that will be extracted
    8Expression child cannot be parameterized, because it has dependencies to/from statements that will be extracted
    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 assertSame(parent,child.getParent()) cannot be parameterized, because it has dependencies to/from statements that will be extracted
    14Expression assertNull(child.getParent()) cannot be parameterized, because it has dependencies to/from statements that will be extracted
    15Expression assertSame(parent,child.getParent()) is a void method call, and thus it cannot be parameterized
    16Expression assertNull(child.getParent()) is a void method call, and thus it cannot be parameterized
    17Expression assertSame(parent,child.getParent()) cannot be parameterized, because it has dependencies to/from statements that will be extracted
    18Expression assertNull(child.getParent()) cannot be parameterized, because it has dependencies to/from statements that will be extracted
    19Expression assertSame(parent,child.getParent()) is a void method call, and thus it cannot be parameterized
    20Expression assertNull(child.getParent()) is a void method call, and thus it cannot be parameterized
    21Expression assertSame(child,parent.getChildren().iterator().next()) cannot be parameterized, because it has dependencies to/from statements that will be extracted
    22Expression assertNotNull(parent) cannot be parameterized, because it has dependencies to/from statements that will be extracted
    23Expression assertSame(child,parent.getChildren().iterator().next()) is a void method call, and thus it cannot be parameterized
    24Expression assertNotNull(parent) is a void method call, and thus it cannot be parameterized
    25Expression assertSame(child,parent.getChildren().iterator().next()) cannot be parameterized, because it has dependencies to/from statements that will be extracted
    26Expression assertNotNull(parent) cannot be parameterized, because it has dependencies to/from statements that will be extracted
    27Expression assertSame(child,parent.getChildren().iterator().next()) is a void method call, and thus it cannot be parameterized
    28Expression assertNotNull(parent) is a void method call, and thus it cannot be parameterized