Fix temp path calculation
[idea/community.git] / platform / platform-impl / src / com / intellij / openapi / diff / impl / processing / TextCompareProcessor.java
1 /*
2  * Copyright 2000-2009 JetBrains s.r.o.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 package com.intellij.openapi.diff.impl.processing;
17
18 import com.intellij.openapi.diagnostic.Logger;
19 import com.intellij.openapi.diff.ex.DiffFragment;
20 import com.intellij.openapi.diff.impl.ComparisonPolicy;
21 import com.intellij.openapi.diff.impl.fragments.Fragment;
22 import com.intellij.openapi.diff.impl.fragments.LineFragment;
23 import com.intellij.openapi.diff.impl.highlighting.FragmentSide;
24 import com.intellij.openapi.diff.impl.highlighting.LineBlockDivider;
25 import com.intellij.openapi.diff.impl.highlighting.Util;
26
27 import java.util.ArrayList;
28 import java.util.Iterator;
29
30 public class TextCompareProcessor {
31   private static final Logger LOG = Logger.getInstance("#com.intellij.openapi.diff.impl.processing.Processor");
32   private final ComparisonPolicy myComparisonPolicy;
33
34   public TextCompareProcessor(ComparisonPolicy comparisonPolicy) {
35     myComparisonPolicy = comparisonPolicy;
36   }
37
38   public ArrayList<LineFragment> process(String text1, String text2) {
39     DiffFragment[] woFormattingBlocks = DiffPolicy.LINES_WO_FORMATTING.buildFragments(text1, text2);
40     DiffFragment[] step1lineFragments = new DiffCorrection.TrueLineBlocks(myComparisonPolicy).
41         correctAndNormalize(woFormattingBlocks);
42     ArrayList<LineFragment> lineBlocks = new DiffFragmentsProcessor().process(step1lineFragments);
43     for (Iterator<LineFragment> iterator = lineBlocks.iterator(); iterator.hasNext();) {
44       LineFragment lineBlock = iterator.next();
45       if (lineBlock.isOneSide() || lineBlock.isEqual()) continue;
46       String subText1 = lineBlock.getText(text1, FragmentSide.SIDE1);
47       String subText2 = lineBlock.getText(text2, FragmentSide.SIDE2);
48       ArrayList<LineFragment> subFragments = findSubFragments(subText1, subText2);
49       lineBlock.setChildren(new ArrayList<Fragment>(subFragments));
50     }
51     return lineBlocks;
52   }
53
54   private ArrayList<LineFragment> findSubFragments(String text1, String text2) {
55     DiffFragment[] fragments = new ByWord(myComparisonPolicy).buildFragments(text1, text2);
56     fragments = DiffCorrection.ConnectSingleSideToChange.INSTANCE.correct(fragments);
57     fragments = UniteSameType.INSTANCE.correct(fragments);
58     fragments = PreferWholeLines.INSTANCE.correct(fragments);
59     fragments = UniteSameType.INSTANCE.correct(fragments);
60     DiffFragment[][] lines = Util.splitByUnchangedLines(fragments);
61     lines = Util.uniteFormattingOnly(lines);
62
63     LineFragmentsCollector collector = new LineFragmentsCollector();
64     for (int i = 0; i < lines.length; i++) {
65       DiffFragment[] line = lines[i];
66       DiffFragment[][] subLines = LineBlockDivider.SINGLE_SIDE.divide(line);
67       subLines = Util.uniteFormattingOnly(subLines);
68       for (int j = 0; j < subLines.length; j++) {
69         DiffFragment[] subLineFragments = subLines[j];
70         LineFragment subLine = collector.addDiffFragment(Util.concatenate(subLineFragments));
71         if (!subLine.isOneSide()) {
72           subLine.setChildren(processInlineFragments(subLineFragments));
73         }
74       }
75     }
76     return collector.getFragments();
77   }
78
79   private ArrayList<Fragment> processInlineFragments(DiffFragment[] subLineFragments) {
80     LOG.assertTrue(subLineFragments.length > 0);
81     FragmentsCollector result = new FragmentsCollector();
82     for (int i = 0; i < subLineFragments.length; i++) {
83       DiffFragment fragment = subLineFragments[i];
84       result.addDiffFragment(fragment);
85     }
86     return result.getFragments();
87   }
88 }