CloneStreamMaster master = new CloneStreamMaster(istream); InputStream inputStream = master.getClone(); byte[] md5sum = MD5SumHelper.createMD5(inputStream); // close stream inputStream.close(); // get new inputstream inputStream = master.getClone(); Message message = new Message(inputStream, list, md5sum); // check if this message was already learned // -> only add if this is not the case if (db.MD5SumExists(md5sum)) { // message already exists // --> correct token data filter.correctMessageAsSpam(message); } else { // new message filter.trainMessageAsSpam(message); } // close stream inputStream.close(); // set dirty flag hasChanged = true;
CloneStreamMaster master = new CloneStreamMaster(istream); InputStream inputStream = master.getClone(); byte[] md5sum = MD5SumHelper.createMD5(inputStream); // close stream inputStream.close(); // get new inputstream inputStream = master.getClone(); Message message = new Message(inputStream, list, md5sum); // check if this message was already learned if (db.MD5SumExists(md5sum)) { // message already exists // --> correct token data filter.correctMessageAsHam(message); } else { // new message filter.trainMessageAsHam(message); } // close stream inputStream.close(); // set dirty flag hasChanged = true;
Clone fragments detected by clone detection tool
File path: /columba-1.4-src/mail/src/main/java/org/columba/mail/spam/MacchiatoPlugin.java File path: /columba-1.4-src/mail/src/main/java/org/columba/mail/spam/MacchiatoPlugin.java
Method name: void trainMessageAsSpam(IMailbox, Object) Method name: void trainMessageAsHam(IMailbox, Object)
Number of AST nodes: 11 Number of AST nodes: 11
1
CloneStreamMaster master = new CloneStreamMaster(istream);
1
CloneStreamMaster master = new CloneStreamMaster(istream);
2
			InputStream inputStream = master.getClone();
2
			InputStream inputStream = master.getClone();
3
			byte[] md5sum = MD5SumHelper.createMD5(inputStream);
3
			byte[] md5sum = MD5SumHelper.createMD5(inputStream);
4
			// close stream
4
			// close stream
5
			inputStream.close();
5
			inputStream.close();
6
			// get new inputstream
6
			// get new inputstream
7
			inputStream = master.getClone();
7
			inputStream = master.getClone();
8
			Message message = new Message(inputStream, list, md5sum);
8
			Message message = new Message(inputStream, list, md5sum);
9
			// check if this message was already learned
9
			// check if this message was already learned
10
			// -> only add if this is not the case
10
			
11
			if (db.MD5SumExists(md5sum)) {
11
if (db.MD5SumExists(md5sum)) {
12
				// message already exists
12
				// message already exists
13
				// --> correct token data
13
				// --> correct token data
14
				filter.correctMessageAsSpam(message);
14
				filter.correctMessageAsHam(message);
15
			} else {
15
			} else {
16
				// new message
16
				// new message
17
				filter.trainMessageAsSpam(message);
17
				filter.trainMessageAsHam(message);
18
			}
18
			}
19
			// close stream
19
			// close stream
20
			inputStream.close();
20
			inputStream.close();
21
			// set dirty flag
21
			// set dirty flag
22
			hasChanged = true;
22
			hasChanged = true;
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.6
Clones locationClones are declared in the same class
Number of node comparisons33
  1. {Refactorable}
    Mapping Summary
    Number of mapped statements11
    Number of unmapped statements in the first code fragment0
    Number of unmapped statements in the second code fragment0
    Time elapsed for statement mapping (ms)7.3
    Clone typeType 2
    Mapped Statements
    ID Statement ID Statement
    10
    CloneStreamMaster master = new CloneStreamMaster(istream);
    10
    CloneStreamMaster master = new CloneStreamMaster(istream);
    11
    InputStream inputStream = master.getClone();
    11
    InputStream inputStream = master.getClone();
    12
    byte[] md5sum = MD5SumHelper.createMD5(inputStream);
    12
    byte[] md5sum = MD5SumHelper.createMD5(inputStream);
    13
    inputStream.close();
    13
    inputStream.close();
    14
    inputStream = master.getClone();
    14
    inputStream = master.getClone();
    15
    Message message = new Message(inputStream, list, md5sum);
    15
    Message message = new Message(inputStream, list, md5sum);
    16
    if (db.MD5SumExists(md5sum))
    16
    if (db.MD5SumExists(md5sum))
    17
    filter.correctMessageAsSpam(message);
    17
    filter.correctMessageAsSpam(message);
    17
    filter.correctMessageAsHam(message);
    Differences
    Expression1Expression2Difference
    correctMessageAsSpamcorrectMessageAsHamMETHOD_INVOCATION_NAME_MISMATCH
    Preondition Violations
    Expression filter.correctMessageAsSpam(message) cannot be parameterized, because it has dependencies to/from statements that will be extracted
    Expression filter.correctMessageAsHam(message) cannot be parameterized, because it has dependencies to/from statements that will be extracted
    Expression filter.correctMessageAsSpam(message) is a void method call, and thus it cannot be parameterized
    Expression filter.correctMessageAsHam(message) is a void method call, and thus it cannot be parameterized
    17
    filter.correctMessageAsHam(message);
    else
    else
    18
    filter.trainMessageAsSpam(message);
    18
    filter.trainMessageAsSpam(message);
    18
    filter.trainMessageAsHam(message);
    Differences
    Expression1Expression2Difference
    trainMessageAsSpamtrainMessageAsHamMETHOD_INVOCATION_NAME_MISMATCH
    Preondition Violations
    Expression filter.trainMessageAsSpam(message) cannot be parameterized, because it has dependencies to/from statements that will be extracted
    Expression filter.trainMessageAsHam(message) cannot be parameterized, because it has dependencies to/from statements that will be extracted
    Expression filter.trainMessageAsSpam(message) is a void method call, and thus it cannot be parameterized
    Expression filter.trainMessageAsHam(message) is a void method call, and thus it cannot be parameterized
    18
    filter.trainMessageAsHam(message);
    19
    inputStream.close();
    19
    inputStream.close();
    20
    hasChanged = true;
    20
    hasChanged = true;
    Precondition Violations (8)
    Row Violation
    1Expression filter.correctMessageAsSpam(message) cannot be parameterized, because it has dependencies to/from statements that will be extracted
    2Expression filter.correctMessageAsHam(message) cannot be parameterized, because it has dependencies to/from statements that will be extracted
    3Expression filter.correctMessageAsSpam(message) is a void method call, and thus it cannot be parameterized
    4Expression filter.correctMessageAsHam(message) is a void method call, and thus it cannot be parameterized
    5Expression filter.trainMessageAsSpam(message) cannot be parameterized, because it has dependencies to/from statements that will be extracted
    6Expression filter.trainMessageAsHam(message) cannot be parameterized, because it has dependencies to/from statements that will be extracted
    7Expression filter.trainMessageAsSpam(message) is a void method call, and thus it cannot be parameterized
    8Expression filter.trainMessageAsHam(message) is a void method call, and thus it cannot be parameterized