@@ -225,89 +225,89 @@ public List<DiffRow> generateDiffRows(final List<String> original, Patch<String> |
225 | 225 | int endPos = 0; |
226 | 226 | final List<AbstractDelta<String>> deltaList = patch.getDeltas(); |
227 | 227 |
|
228 | | - decompressDeltas(deltaList); |
| 228 | + for (AbstractDelta<String> originalDelta : deltaList) { |
| 229 | + for (AbstractDelta<String> delta : decompressDeltas(originalDelta)) { |
| 230 | + endPos = transformDeltaIntoDiffRow(original, endPos, diffRows, delta); |
| 231 | + } |
| 232 | + } |
229 | 233 |
|
230 | | - for (AbstractDelta<String> delta : deltaList) { |
231 | | - Chunk<String> orig = delta.getSource(); |
232 | | - Chunk<String> rev = delta.getTarget(); |
| 234 | + // Copy the final matching chunk if any. |
| 235 | + for (String line : original.subList(endPos, original.size())) { |
| 236 | + diffRows.add(buildDiffRow(Tag.EQUAL, line, line)); |
| 237 | + } |
| 238 | + return diffRows; |
| 239 | + } |
233 | 240 |
|
234 | | - for (String line : original.subList(endPos, orig.getPosition())) { |
235 | | - diffRows.add(buildDiffRow(Tag.EQUAL, line, line)); |
236 | | - } |
| 241 | + /** |
| 242 | + * Transforms one patch delta into a DiffRow object. |
| 243 | + */ |
| 244 | + private int transformDeltaIntoDiffRow(final List<String> original, int endPos, List<DiffRow> diffRows, AbstractDelta<String> delta) { |
| 245 | + Chunk<String> orig = delta.getSource(); |
| 246 | + Chunk<String> rev = delta.getTarget(); |
| 247 | + |
| 248 | + for (String line : original.subList(endPos, orig.getPosition())) { |
| 249 | + diffRows.add(buildDiffRow(Tag.EQUAL, line, line)); |
| 250 | + } |
237 | 251 |
|
238 | | - // Inserted DiffRow |
239 | | - if (delta.getType() == DeltaType.INSERT) { |
240 | | - endPos = orig.last() + 1; |
| 252 | + switch (delta.getType()) { |
| 253 | + case INSERT: |
241 | 254 | for (String line : rev.getLines()) { |
242 | 255 | diffRows.add(buildDiffRow(Tag.INSERT, "", line)); |
243 | 256 | } |
244 | | - continue; |
245 | | - } |
246 | | - |
247 | | - // Deleted DiffRow |
248 | | - if (delta.getType() == DeltaType.DELETE) { |
249 | | - endPos = orig.last() + 1; |
| 257 | + break; |
| 258 | + case DELETE: |
250 | 259 | for (String line : orig.getLines()) { |
251 | 260 | diffRows.add(buildDiffRow(Tag.DELETE, line, "")); |
252 | 261 | } |
253 | | - continue; |
254 | | - } |
255 | | - |
256 | | - if (showInlineDiffs) { |
257 | | - diffRows.addAll(generateInlineDiffs(delta)); |
258 | | - } else { |
259 | | - for (int j = 0; j < Math.max(orig.size(), rev.size()); j++) { |
260 | | - diffRows.add(buildDiffRow(Tag.CHANGE, |
261 | | - orig.getLines().size() > j ? orig.getLines().get(j) : "", |
262 | | - rev.getLines().size() > j ? rev.getLines().get(j) : "")); |
| 262 | + break; |
| 263 | + default: |
| 264 | + if (showInlineDiffs) { |
| 265 | + diffRows.addAll(generateInlineDiffs(delta)); |
| 266 | + } else { |
| 267 | + for (int j = 0; j < Math.max(orig.size(), rev.size()); j++) { |
| 268 | + diffRows.add(buildDiffRow(Tag.CHANGE, |
| 269 | + orig.getLines().size() > j ? orig.getLines().get(j) : "", |
| 270 | + rev.getLines().size() > j ? rev.getLines().get(j) : "")); |
| 271 | + } |
263 | 272 | } |
264 | | - } |
265 | | - endPos = orig.last() + 1; |
266 | 273 | } |
267 | 274 |
|
268 | | - // Copy the final matching chunk if any. |
269 | | - for (String line : original.subList(endPos, original.size())) { |
270 | | - diffRows.add(buildDiffRow(Tag.EQUAL, line, line)); |
271 | | - } |
272 | | - return diffRows; |
| 275 | + return orig.last() + 1; |
273 | 276 | } |
274 | 277 |
|
275 | 278 | /** |
276 | | - * Decompresses ChangeDeltas with different source and target size to a ChangeDelta with same size and |
277 | | - * a following InsertDelta or DeleteDelta. With this problems of building DiffRows getting smaller. |
278 | | - * @param deltaList |
| 279 | + * Decompresses ChangeDeltas with different source and target size to a |
| 280 | + * ChangeDelta with same size and a following InsertDelta or DeleteDelta. |
| 281 | + * With this problems of building DiffRows getting smaller. |
| 282 | + * |
| 283 | + * @param deltaList |
279 | 284 | */ |
280 | | - private void decompressDeltas(final List<AbstractDelta<String>> deltaList) { |
281 | | - for (int idx = 0; idx < deltaList.size(); idx++) { |
282 | | - AbstractDelta<String> delta = deltaList.get(idx); |
283 | | - if (delta.getType() == DeltaType.CHANGE && delta.getSource().size() != delta.getTarget().size()) { |
284 | | - //System.out.println("decompress this " + delta); |
285 | | - |
286 | | - List<AbstractDelta<String>> corrected = new ArrayList<>(); |
287 | | - int minSize = Math.min(delta.getSource().size(), delta.getTarget().size()); |
288 | | - Chunk<String> orig = delta.getSource(); |
289 | | - Chunk<String> rev = delta.getTarget(); |
290 | | - |
291 | | - deltaList.set(idx, new ChangeDelta<String>( |
292 | | - new Chunk<>(orig.getPosition(), orig.getLines().subList(0, minSize)), |
293 | | - new Chunk<>(rev.getPosition(), rev.getLines().subList(0, minSize)))); |
294 | | - |
295 | | - if (orig.getLines().size() < rev.getLines().size()) { |
296 | | - deltaList.add(idx + 1, new InsertDelta<String>( |
297 | | - new Chunk<>(orig.getPosition() + minSize, Collections.emptyList()), |
298 | | - new Chunk<>(rev.getPosition() + minSize, rev.getLines().subList(minSize, rev.getLines().size())))); |
299 | | - } else { |
300 | | - deltaList.add(idx + 1, new DeleteDelta<String>( |
301 | | - new Chunk<>(orig.getPosition() + minSize, orig.getLines().subList(minSize, orig.getLines().size())), |
302 | | - new Chunk<>(rev.getPosition() + minSize, Collections.emptyList()))); |
303 | | - } |
304 | | - |
305 | | - //System.out.println(" to " + corrected); |
| 285 | + private List<AbstractDelta<String>> decompressDeltas(AbstractDelta<String> delta) { |
| 286 | + if (delta.getType() == DeltaType.CHANGE && delta.getSource().size() != delta.getTarget().size()) { |
| 287 | + List<AbstractDelta<String>> deltas = new ArrayList<>(); |
| 288 | + //System.out.println("decompress this " + delta); |
| 289 | + |
| 290 | + int minSize = Math.min(delta.getSource().size(), delta.getTarget().size()); |
| 291 | + Chunk<String> orig = delta.getSource(); |
| 292 | + Chunk<String> rev = delta.getTarget(); |
| 293 | + |
| 294 | + deltas.add(new ChangeDelta<String>( |
| 295 | + new Chunk<>(orig.getPosition(), orig.getLines().subList(0, minSize)), |
| 296 | + new Chunk<>(rev.getPosition(), rev.getLines().subList(0, minSize)))); |
| 297 | + |
| 298 | + if (orig.getLines().size() < rev.getLines().size()) { |
| 299 | + deltas.add(new InsertDelta<String>( |
| 300 | + new Chunk<>(orig.getPosition() + minSize, Collections.emptyList()), |
| 301 | + new Chunk<>(rev.getPosition() + minSize, rev.getLines().subList(minSize, rev.getLines().size())))); |
| 302 | + } else { |
| 303 | + deltas.add(new DeleteDelta<String>( |
| 304 | + new Chunk<>(orig.getPosition() + minSize, orig.getLines().subList(minSize, orig.getLines().size())), |
| 305 | + new Chunk<>(rev.getPosition() + minSize, Collections.emptyList()))); |
306 | 306 | } |
307 | | - idx++; |
| 307 | + return deltas; |
308 | 308 | } |
309 | | - |
310 | | - //System.out.println("got now " + deltaList); |
| 309 | + |
| 310 | + return Collections.singletonList(delta); |
311 | 311 | } |
312 | 312 |
|
313 | 313 | private DiffRow buildDiffRow(Tag type, String orgline, String newline) { |
|