Patch.java

1
package com.jsql.model.injection.strategy.blind.patch;
2
3
import java.net.URLEncoder;
4
import java.nio.charset.StandardCharsets;
5
import java.util.LinkedList;
6
7
/**
8
 * Class representing one patch operation.
9
 */
10
public class Patch {
11
12
    private final LinkedList<Diff> diffs;
13
    private int start1;
14
    private int start2;
15
    private int length1;
16
    private int length2;
17
18
    /**
19
     * Constructor.  Initializes with an empty list of diffs.
20
     */
21
    public Patch() {
22
        this.diffs = new LinkedList<>();
23
    }
24
25
    /**
26
     * Emmulate GNU diff's format.
27
     * Header: @@ -382,8 +481,9 @@
28
     * Indicies are printed as 1-based, not 0-based.
29
     * @return The GNU diff string.
30
     */
31
    @Override
32
    public String toString() {
33
        String coords1;
34
        String coords2;
35
36 1 1. toString : negated conditional → NO_COVERAGE
        if (this.length1 == 0) {
37
            coords1 = this.start1 + ",0";
38 1 1. toString : negated conditional → NO_COVERAGE
        } else if (this.length1 == 1) {
39 1 1. toString : Replaced integer addition with subtraction → NO_COVERAGE
            coords1 = Integer.toString(this.start1 + 1);
40
        } else {
41 1 1. toString : Replaced integer addition with subtraction → NO_COVERAGE
            coords1 = (this.start1 + 1) + "," + this.length1;
42
        }
43
44 1 1. toString : negated conditional → NO_COVERAGE
        if (this.length2 == 0) {
45
            coords2 = this.start2 + ",0";
46 1 1. toString : negated conditional → NO_COVERAGE
        } else if (this.length2 == 1) {
47 1 1. toString : Replaced integer addition with subtraction → NO_COVERAGE
            coords2 = Integer.toString(this.start2 + 1);
48
        } else {
49 1 1. toString : Replaced integer addition with subtraction → NO_COVERAGE
            coords2 = (this.start2 + 1) + "," + this.length2;
50
        }
51
52
        StringBuilder text = new StringBuilder();
53
        text.append("@@ -").append(coords1).append(" +").append(coords2)
54
                .append(" @@\n");
55
56
        // Escape the body of the patch with %xx notation.
57
        for (Diff aDiff : this.diffs) {
58
            switch (aDiff.getOperation()) {
59
                case INSERT:
60
                    text.append('+');
61
                    break;
62
                case DELETE:
63
                    text.append('-');
64
                    break;
65
                case EQUAL:
66
                    text.append(' ');
67
                    break;
68
            }
69
            text.append(URLEncoder.encode(aDiff.getText(), StandardCharsets.UTF_8).replace('+', ' '))
70
                    .append("\n");
71
        }
72
73 1 1. toString : replaced return value with "" for com/jsql/model/injection/strategy/blind/patch/Patch::toString → NO_COVERAGE
        return Patch.unescapeForEncodeUriCompatability(text.toString());
74
    }
75
76
    /**
77
     * Unescape selected chars for compatibility with JavaScript's encodeURI.
78
     * In speed critical applications this could be dropped since the
79
     * receiving application will certainly decode these fine.
80
     * Note that this function is case-sensitive. Thus, "%3f" would not be
81
     * unescaped.  But this is ok because it is only called with the output of
82
     * URLEncoder.encode() which returns uppercase hex.
83
     *
84
     * Example: "%3F" -> "?", "%24" -> "$", etc.
85
     *
86
     * @param str The string to escape.
87
     * @return The escaped string.
88
     */
89
    public static String unescapeForEncodeUriCompatability(String str) {
90 1 1. unescapeForEncodeUriCompatability : replaced return value with "" for com/jsql/model/injection/strategy/blind/patch/Patch::unescapeForEncodeUriCompatability → NO_COVERAGE
        return str.replace("%21", "!").replace("%7E", "~")
91
                .replace("%27", "'").replace("%28", "(").replace("%29", ")")
92
                .replace("%3B", ";").replace("%2F", "/").replace("%3F", "?")
93
                .replace("%3A", ":").replace("%40", "@").replace("%26", "&")
94
                .replace("%3D", "=").replace("%2B", "+").replace("%24", "$")
95
                .replace("%2C", ",").replace("%23", "#");
96
    }
97
98
    // Getter and setter
99
100
    public LinkedList<Diff> getDiffs() {
101 1 1. getDiffs : replaced return value with null for com/jsql/model/injection/strategy/blind/patch/Patch::getDiffs → NO_COVERAGE
        return this.diffs;
102
    }
103
104
    public int getStart1() {
105 1 1. getStart1 : replaced int return with 0 for com/jsql/model/injection/strategy/blind/patch/Patch::getStart1 → NO_COVERAGE
        return this.start1;
106
    }
107
108
    public void setStart1(int start1) {
109
        this.start1 = start1;
110
    }
111
112
    public int getStart2() {
113 1 1. getStart2 : replaced int return with 0 for com/jsql/model/injection/strategy/blind/patch/Patch::getStart2 → NO_COVERAGE
        return this.start2;
114
    }
115
116
    public void setStart2(int start2) {
117
        this.start2 = start2;
118
    }
119
120
    public int getLength1() {
121 1 1. getLength1 : replaced int return with 0 for com/jsql/model/injection/strategy/blind/patch/Patch::getLength1 → NO_COVERAGE
        return this.length1;
122
    }
123
124
    public void setLength1(int length1) {
125
        this.length1 = length1;
126
    }
127
128
    public int getLength2() {
129 1 1. getLength2 : replaced int return with 0 for com/jsql/model/injection/strategy/blind/patch/Patch::getLength2 → NO_COVERAGE
        return this.length2;
130
    }
131
132
    public int setLength2(int length2) {
133
        this.length2 = length2;
134 1 1. setLength2 : replaced int return with 0 for com/jsql/model/injection/strategy/blind/patch/Patch::setLength2 → NO_COVERAGE
        return length2;
135
    }
136
}

Mutations

36

1.1
Location : toString
Killed by : none
negated conditional → NO_COVERAGE

38

1.1
Location : toString
Killed by : none
negated conditional → NO_COVERAGE

39

1.1
Location : toString
Killed by : none
Replaced integer addition with subtraction → NO_COVERAGE

41

1.1
Location : toString
Killed by : none
Replaced integer addition with subtraction → NO_COVERAGE

44

1.1
Location : toString
Killed by : none
negated conditional → NO_COVERAGE

46

1.1
Location : toString
Killed by : none
negated conditional → NO_COVERAGE

47

1.1
Location : toString
Killed by : none
Replaced integer addition with subtraction → NO_COVERAGE

49

1.1
Location : toString
Killed by : none
Replaced integer addition with subtraction → NO_COVERAGE

73

1.1
Location : toString
Killed by : none
replaced return value with "" for com/jsql/model/injection/strategy/blind/patch/Patch::toString → NO_COVERAGE

90

1.1
Location : unescapeForEncodeUriCompatability
Killed by : none
replaced return value with "" for com/jsql/model/injection/strategy/blind/patch/Patch::unescapeForEncodeUriCompatability → NO_COVERAGE

101

1.1
Location : getDiffs
Killed by : none
replaced return value with null for com/jsql/model/injection/strategy/blind/patch/Patch::getDiffs → NO_COVERAGE

105

1.1
Location : getStart1
Killed by : none
replaced int return with 0 for com/jsql/model/injection/strategy/blind/patch/Patch::getStart1 → NO_COVERAGE

113

1.1
Location : getStart2
Killed by : none
replaced int return with 0 for com/jsql/model/injection/strategy/blind/patch/Patch::getStart2 → NO_COVERAGE

121

1.1
Location : getLength1
Killed by : none
replaced int return with 0 for com/jsql/model/injection/strategy/blind/patch/Patch::getLength1 → NO_COVERAGE

129

1.1
Location : getLength2
Killed by : none
replaced int return with 0 for com/jsql/model/injection/strategy/blind/patch/Patch::getLength2 → NO_COVERAGE

134

1.1
Location : setLength2
Killed by : none
replaced int return with 0 for com/jsql/model/injection/strategy/blind/patch/Patch::setLength2 → NO_COVERAGE

Active mutators

Tests examined


Report generated by PIT 1.22.0