Skip to content

Package: ConcreteDiffFileProcessor

ConcreteDiffFileProcessor

nameinstructionbranchcomplexitylinemethod
ConcreteDiffFileProcessor()
M: 0 C: 3
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 1
100%
M: 0 C: 1
100%
createOneLineChange(DiffPartFileLine, ChangeType, Set)
M: 0 C: 11
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 2
100%
M: 0 C: 1
100%
createOneLineChanges(List, List, Set)
M: 0 C: 11
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 3
100%
M: 0 C: 1
100%
detectRenominations(List, List, Set, DiffFile)
M: 0 C: 49
100%
M: 0 C: 6
100%
M: 0 C: 4
100%
M: 0 C: 17
100%
M: 0 C: 1
100%
detectShiftsAndContentChanges(List, List, Set)
M: 0 C: 74
100%
M: 0 C: 8
100%
M: 0 C: 5
100%
M: 0 C: 23
100%
M: 0 C: 1
100%
fillAddedAndRemovedLinesLists(DiffFile, List, List)
M: 0 C: 56
100%
M: 0 C: 10
100%
M: 0 C: 6
100%
M: 0 C: 14
100%
M: 0 C: 1
100%
process(DiffFile)
M: 0 C: 38
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 8
100%
M: 0 C: 1
100%
processRemainingLines(List, ChangeType, Set)
M: 0 C: 15
100%
M: 0 C: 2
100%
M: 0 C: 2
100%
M: 0 C: 4
100%
M: 0 C: 1
100%

Coverage

1: package migration.processor;
2:
3: import java.util.ArrayList;
4: import java.util.HashSet;
5: import java.util.Iterator;
6: import java.util.List;
7: import java.util.Set;
8:
9: import migration.difffile.AddLine;
10: import migration.difffile.DiffFile;
11: import migration.difffile.DiffPartFile;
12: import migration.difffile.DiffPartFileLine;
13: import migration.difffile.RemoveLine;
14: import migration.difffile.objects.DiffDefinition;
15: import migration.processeddifffile.ChangeType;
16: import migration.processeddifffile.OneLineChange;
17: import migration.processeddifffile.ProcessedDiffFile;
18: import migration.processeddifffile.RelatedLinesChange;
19: import migration.processeddifffile.VariableDefinitionChange;
20:
21: /**
22: * Processes the DiffFile.
23: *
24: * @author max
25: *
26: */
27: public class ConcreteDiffFileProcessor implements DiffFileProcessor {
28:
29:         @Override
30:         public ProcessedDiffFile process(final DiffFile diffFile) {
31:
32:                 final List<DiffPartFileLine> addedLines = new ArrayList<>();
33:                 final List<DiffPartFileLine> removedLines = new ArrayList<>();
34:
35:                 final Set<VariableDefinitionChange> changes = new HashSet<>();
36:
37:                 fillAddedAndRemovedLinesLists(diffFile, removedLines, addedLines);
38:                 detectShiftsAndContentChanges(removedLines, addedLines, changes);
39:                 detectRenominations(removedLines, addedLines, changes, diffFile);
40:                 createOneLineChanges(removedLines, addedLines, changes);
41:
42:                 return new ProcessedDiffFile(changes);
43:         }
44:
45:         /**
46:          * Adds all Added/removed lines to the respective list, if they contain a variable definition.
47:          *
48:          * @param diffFile
49:          * the diffFile
50:          * @param removedLines
51:          * the list for the removed lines
52:          * @param addedLines
53:          * the list for the added lines
54:          */
55:         private void fillAddedAndRemovedLinesLists(final DiffFile diffFile,
56:                         final List<DiffPartFileLine> removedLines, final List<DiffPartFileLine> addedLines) {
57:                 final List<DiffPartFile> diffPartFiles = diffFile.getPartFiles();
58:•                for (DiffPartFile diffPartFile : diffPartFiles) {
59:                         final List<DiffPartFileLine> lines = diffPartFile.getLines();
60:                         for (Iterator<DiffPartFileLine> linesIterator = lines.iterator(); linesIterator
61:•                                        .hasNext();) {
62:                                 final DiffPartFileLine currentLine = linesIterator.next();
63:•                                if (currentLine.getFileEntity() instanceof DiffDefinition) {
64:•                                        if (currentLine.getState().equals(new AddLine())) {
65:                                                 addedLines.add(currentLine);
66:•                                        } else if (currentLine.getState().equals(new RemoveLine())) {
67:                                                 removedLines.add(currentLine);
68:                                         }
69:                                 }
70:                         }
71:                 }
72:         }
73:
74:         /**
75:          * Detects all shifted and content-changed variable definitions.
76:          *
77:          * @param removedLines
78:          * the list of removed lines
79:          * @param addedLines
80:          * the list of added lines
81:          * @param changes
82:          * the list for the changes to be stored
83:          */
84:         private void detectShiftsAndContentChanges(final List<DiffPartFileLine> removedLines,
85:                         final List<DiffPartFileLine> addedLines,
86:                         final Set<VariableDefinitionChange> changes) {
87:                 final Iterator<DiffPartFileLine> removedLinesIterator = removedLines.iterator();
88:•                while (removedLinesIterator.hasNext()) {
89:                         final DiffPartFileLine currentRemovedLine = removedLinesIterator.next();
90:                         final Iterator<DiffPartFileLine> addedLinesIterator = addedLines.iterator();
91:•                        while (addedLinesIterator.hasNext()) {
92:                                 final DiffPartFileLine currentAddedLine = addedLinesIterator.next();
93:                                 final DiffDefinition removedDefinition =
94:                                                 (DiffDefinition) currentRemovedLine.getFileEntity();
95:                                 final DiffDefinition addedDefinition =
96:                                                 (DiffDefinition) currentAddedLine.getFileEntity();
97:•                                if (currentRemovedLine.getFileEntity().equals(currentAddedLine.getFileEntity())) {
98:                                         changes.add(new RelatedLinesChange(removedDefinition, addedDefinition,
99:                                                         ChangeType.ShiftedDefinition));
100:                                         removedLinesIterator.remove();
101:                                         addedLinesIterator.remove();
102:                                 } else if (((DiffDefinition) currentRemovedLine.getFileEntity()).getIdentifier()
103:•                                                .equals(((DiffDefinition) currentAddedLine.getFileEntity())
104:                                                                 .getIdentifier())) {
105:                                         changes.add(new RelatedLinesChange(removedDefinition, addedDefinition,
106:                                                         ChangeType.ContentChangedDefinition));
107:                                         removedLinesIterator.remove();
108:                                         addedLinesIterator.remove();
109:                                 }
110:                         }
111:                 }
112:         }
113:
114:         /**
115:          * Detects all renamed definitions. Requires that all shifted definitions have been detected.
116:          *
117:          * @param removedLines
118:          * the list of removed lines
119:          * @param addedLines
120:          * the list of added lines
121:          * @param changes
122:          * the list for the changes to be stored
123:          * @param diffFile
124:          * the diffFile to be processed
125:          */
126:         private void detectRenominations(final List<DiffPartFileLine> removedLines,
127:                         final List<DiffPartFileLine> addedLines, final Set<VariableDefinitionChange> changes,
128:                         final DiffFile diffFile) {
129:                 final Iterator<DiffPartFileLine> removedLinesIterator = removedLines.iterator();
130:•                while (removedLinesIterator.hasNext()) {
131:                         final DiffPartFileLine currentRemovedLine = removedLinesIterator.next();
132:                         final Iterator<DiffPartFileLine> addedLinesIterator = addedLines.iterator();
133:•                        while (addedLinesIterator.hasNext()) {
134:                                 final DiffPartFileLine currentAddedLine = addedLinesIterator.next();
135:•                                if (diffFile.isRenameInTheSameContext(currentRemovedLine, currentAddedLine)) {
136:                                         final DiffDefinition removedDefinition =
137:                                                         (DiffDefinition) currentRemovedLine.getFileEntity();
138:                                         final DiffDefinition addedDefinition =
139:                                                         (DiffDefinition) currentAddedLine.getFileEntity();
140:                                         changes.add(new RelatedLinesChange(removedDefinition, addedDefinition,
141:                                                         ChangeType.RenamedDefinition));
142:                                         removedLinesIterator.remove();
143:                                         addedLinesIterator.remove();
144:                                 }
145:                         }
146:                 }
147:         }
148:
149:         /**
150:          * create the one line change entries for the remaining lines.
151:          *
152:          * @param addedLines
153:          * the remaining add lines
154:          * @param removedLines
155:          * the remaining remove lines
156:          * @param changes
157:          * the list for the changes to be stored
158:          */
159:         private void createOneLineChanges(final List<DiffPartFileLine> removedLines,
160:                         final List<DiffPartFileLine> addedLines,
161:                         final Set<VariableDefinitionChange> changes) {
162:                 processRemainingLines(removedLines, ChangeType.RemovedDefinition, changes);
163:                 processRemainingLines(addedLines, ChangeType.AddedDefinition, changes);
164:         }
165:
166:         /**
167:          * creates one line changes with the given classification for each line.
168:          *
169:          * @param remainingLines
170:          * the list of removed lines
171:          * @param classification
172:          * the classification of the change
173:          * @param changes
174:          * the list for the changes to be stored
175:          */
176:         private void processRemainingLines(final List<DiffPartFileLine> remainingLines,
177:                         final ChangeType classification, final Set<VariableDefinitionChange> changes) {
178:                 final Iterator<DiffPartFileLine> removedLinesIterator = remainingLines.iterator();
179:•                while (removedLinesIterator.hasNext()) {
180:                         createOneLineChange(removedLinesIterator.next(), classification, changes);
181:                 }
182:         }
183:
184:         /**
185:          * creates a one line change for the line.
186:          *
187:          * @param line
188:          * the line to be processed
189:          * @param classification
190:          * the classification of the change
191:          * @param changes
192:          * the list for the changes to be stored
193:          */
194:         private void createOneLineChange(final DiffPartFileLine line, final ChangeType classification,
195:                         final Set<VariableDefinitionChange> changes) {
196:                 changes.add(new OneLineChange((DiffDefinition) line.getFileEntity(), classification));
197:
198:         }
199: }