@@ -225,89 +225,89 @@ public List<DiffRow> generateDiffRows(final List<String> original, Patch<String>
225225int endPos =0 ;
226226final List <AbstractDelta <String >>deltaList =patch .getDeltas ();
227227
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+ }
229233
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+ }
233240
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+ }
237251
238- // Inserted DiffRow
239- if (delta .getType () ==DeltaType .INSERT ) {
240- endPos =orig .last () +1 ;
252+ switch (delta .getType ()) {
253+ case INSERT :
241254for (String line :rev .getLines ()) {
242255diffRows .add (buildDiffRow (Tag .INSERT ,"" ,line ));
243256 }
244- continue ;
245- }
246-
247- // Deleted DiffRow
248- if (delta .getType () ==DeltaType .DELETE ) {
249- endPos =orig .last () +1 ;
257+ break ;
258+ case DELETE :
250259for (String line :orig .getLines ()) {
251260diffRows .add (buildDiffRow (Tag .DELETE ,line ,"" ));
252261 }
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+ }
263272 }
264- }
265- endPos =orig .last () +1 ;
266273 }
267274
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 ;
273276 }
274277
275278/**
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
279284 */
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 ())));
306306 }
307- idx ++ ;
307+ return deltas ;
308308 }
309-
310- //System.out.println("got now " + deltaList );
309+
310+ return Collections . singletonList ( delta );
311311 }
312312
313313private DiffRow buildDiffRow (Tag type ,String orgline ,String newline ) {