From 5fd6a09a17ac137da8175dc6ceb1d4471337a886 Mon Sep 17 00:00:00 2001 From: Aleksey Pivovarov Date: Sat, 31 Jan 2015 16:47:40 +0300 Subject: [PATCH] diff: cleanup: convert ComparisonUtil into service --- .../diff/comparison/ComparisonManager.java | 83 +++++++++++++++++++ ...onUtil.java => ComparisonManagerImpl.java} | 64 +++++++------- .../simple/SimpleThreesideDiffChange.java | 4 +- .../src/com/intellij/diff/util/DiffUtil.java | 11 +-- .../comparison/ComparisonUtilAutoTest.java | 13 +-- .../comparison/ComparisonUtilTestBase.java | 14 ++-- .../src/META-INF/PlatformExtensions.xml | 2 + .../properties/SvnPropertiesDiffViewer.java | 15 ++-- 8 files changed, 146 insertions(+), 60 deletions(-) create mode 100644 platform/diff-api/src/com/intellij/diff/comparison/ComparisonManager.java rename platform/diff-api/src/com/intellij/diff/comparison/{ComparisonUtil.java => ComparisonManagerImpl.java} (82%) diff --git a/platform/diff-api/src/com/intellij/diff/comparison/ComparisonManager.java b/platform/diff-api/src/com/intellij/diff/comparison/ComparisonManager.java new file mode 100644 index 000000000000..272a1f12f57f --- /dev/null +++ b/platform/diff-api/src/com/intellij/diff/comparison/ComparisonManager.java @@ -0,0 +1,83 @@ +/* + * Copyright 2000-2015 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.intellij.diff.comparison; + +import com.intellij.diff.fragments.DiffFragment; +import com.intellij.diff.fragments.LineFragment; +import com.intellij.openapi.components.ServiceManager; +import com.intellij.openapi.progress.ProgressIndicator; +import org.jetbrains.annotations.NotNull; + +import java.util.List; + +/** + * Class for the text comparison + * CharSequences should to have '\n' as line separator + *

+ * It's good idea not to compare String due to expensive subSequence() implementation. Try to wrap into CharSequenceSubSequence. + */ +public abstract class ComparisonManager { + @NotNull + public static ComparisonManager getInstance() { + return ServiceManager.getService(ComparisonManager.class); + } + + @NotNull + public abstract List compareLines(@NotNull CharSequence text1, + @NotNull CharSequence text2, + @NotNull ComparisonPolicy policy, + @NotNull ProgressIndicator indicator); + + @NotNull + public abstract List compareLinesInner(@NotNull CharSequence text1, + @NotNull CharSequence text2, + @NotNull ComparisonPolicy policy, + @NotNull ProgressIndicator indicator); + + @NotNull + public abstract List compareLinesInner(@NotNull CharSequence text1, + @NotNull CharSequence text2, + @NotNull List lineFragments, + @NotNull ComparisonPolicy policy, + @NotNull ProgressIndicator indicator); + + @NotNull + public abstract List compareWords(@NotNull CharSequence text1, + @NotNull CharSequence text2, + @NotNull ComparisonPolicy policy, + @NotNull ProgressIndicator indicator); + + @NotNull + public abstract List compareChars(@NotNull CharSequence text1, + @NotNull CharSequence text2, + @NotNull ComparisonPolicy policy, + @NotNull ProgressIndicator indicator); + + public abstract boolean isEquals(@NotNull CharSequence text1, @NotNull CharSequence text2, @NotNull ComparisonPolicy policy); + + // + // Post process line fragments + // + + @NotNull + public abstract List squash(@NotNull List oldFragments); + + @NotNull + public abstract List processBlocks(@NotNull List oldFragments, + @NotNull final CharSequence text1, @NotNull final CharSequence text2, + @NotNull final ComparisonPolicy policy, + final boolean squash, final boolean trim); +} diff --git a/platform/diff-api/src/com/intellij/diff/comparison/ComparisonUtil.java b/platform/diff-api/src/com/intellij/diff/comparison/ComparisonManagerImpl.java similarity index 82% rename from platform/diff-api/src/com/intellij/diff/comparison/ComparisonUtil.java rename to platform/diff-api/src/com/intellij/diff/comparison/ComparisonManagerImpl.java index 0aeefac50726..d9ae5a1acb01 100644 --- a/platform/diff-api/src/com/intellij/diff/comparison/ComparisonUtil.java +++ b/platform/diff-api/src/com/intellij/diff/comparison/ComparisonManagerImpl.java @@ -34,20 +34,14 @@ import java.util.List; import static com.intellij.diff.comparison.iterables.DiffIterableUtil.convertIntoFragments; -/** - * Class for the text comparison - * CharSequences should to have '\n' as line separator - *

- * It's good idea not to compare String due to expensive subSequence() implementation. Try to wrap into CharSequenceSubSequence. - */ -public class ComparisonUtil { - public static final Logger LOG = Logger.getInstance(ComparisonUtil.class); +public class ComparisonManagerImpl extends ComparisonManager { + public static final Logger LOG = Logger.getInstance(ComparisonManagerImpl.class); @NotNull - public static List compareLines(@NotNull CharSequence text1, - @NotNull CharSequence text2, - @NotNull ComparisonPolicy policy, - @NotNull ProgressIndicator indicator) { + public List compareLines(@NotNull CharSequence text1, + @NotNull CharSequence text2, + @NotNull ComparisonPolicy policy, + @NotNull ProgressIndicator indicator) { if (policy == ComparisonPolicy.IGNORE_WHITESPACES) { return ByLine.compare(text1, text2, policy, indicator); } @@ -57,20 +51,20 @@ public class ComparisonUtil { } @NotNull - public static List compareLinesInner(@NotNull CharSequence text1, - @NotNull CharSequence text2, - @NotNull ComparisonPolicy policy, - @NotNull ProgressIndicator indicator) { + public List compareLinesInner(@NotNull CharSequence text1, + @NotNull CharSequence text2, + @NotNull ComparisonPolicy policy, + @NotNull ProgressIndicator indicator) { List fragments = compareLines(text1, text2, policy, indicator); return compareLinesInner(text1, text2, fragments, policy, indicator); } @NotNull - public static List compareLinesInner(@NotNull CharSequence text1, - @NotNull CharSequence text2, - @NotNull List lineFragments, - @NotNull ComparisonPolicy policy, - @NotNull ProgressIndicator indicator) { + public List compareLinesInner(@NotNull CharSequence text1, + @NotNull CharSequence text2, + @NotNull List lineFragments, + @NotNull ComparisonPolicy policy, + @NotNull ProgressIndicator indicator) { List fineFragments = new ArrayList(lineFragments.size()); int tooBigChunksCount = 0; @@ -131,18 +125,18 @@ public class ComparisonUtil { } @NotNull - public static List compareWords(@NotNull CharSequence text1, - @NotNull CharSequence text2, - @NotNull ComparisonPolicy policy, - @NotNull ProgressIndicator indicator) { + public List compareWords(@NotNull CharSequence text1, + @NotNull CharSequence text2, + @NotNull ComparisonPolicy policy, + @NotNull ProgressIndicator indicator) { return ByWord.compare(text1, text2, policy, indicator); } @NotNull - public static List compareChars(@NotNull CharSequence text1, - @NotNull CharSequence text2, - @NotNull ComparisonPolicy policy, - @NotNull ProgressIndicator indicator) { + public List compareChars(@NotNull CharSequence text1, + @NotNull CharSequence text2, + @NotNull ComparisonPolicy policy, + @NotNull ProgressIndicator indicator) { if (policy == ComparisonPolicy.IGNORE_WHITESPACES) { return convertIntoFragments(ByChar.compareIgnoreWhitespaces(text1, text2, indicator)); } @@ -153,7 +147,7 @@ public class ComparisonUtil { return convertIntoFragments(ByChar.compareTwoStep(text1, text2, indicator)); } - public static boolean isEquals(@NotNull CharSequence text1, @NotNull CharSequence text2, @NotNull ComparisonPolicy policy) { + public boolean isEquals(@NotNull CharSequence text1, @NotNull CharSequence text2, @NotNull ComparisonPolicy policy) { switch (policy) { case DEFAULT: return StringUtil.equals(text1, text2); @@ -171,7 +165,7 @@ public class ComparisonUtil { // @NotNull - public static List squash(@NotNull List oldFragments) { + public List squash(@NotNull List oldFragments) { if (oldFragments.isEmpty()) return oldFragments; final List newFragments = new ArrayList(); @@ -185,10 +179,10 @@ public class ComparisonUtil { } @NotNull - public static List processBlocks(@NotNull List oldFragments, - @NotNull final CharSequence text1, @NotNull final CharSequence text2, - @NotNull final ComparisonPolicy policy, - final boolean squash, final boolean trim) { + public List processBlocks(@NotNull List oldFragments, + @NotNull final CharSequence text1, @NotNull final CharSequence text2, + @NotNull final ComparisonPolicy policy, + final boolean squash, final boolean trim) { if (!squash && !trim) return oldFragments; if (oldFragments.isEmpty()) return oldFragments; diff --git a/platform/diff-impl/src/com/intellij/diff/tools/simple/SimpleThreesideDiffChange.java b/platform/diff-impl/src/com/intellij/diff/tools/simple/SimpleThreesideDiffChange.java index a8753e47f6dd..c0477ba882b7 100644 --- a/platform/diff-impl/src/com/intellij/diff/tools/simple/SimpleThreesideDiffChange.java +++ b/platform/diff-impl/src/com/intellij/diff/tools/simple/SimpleThreesideDiffChange.java @@ -15,8 +15,8 @@ */ package com.intellij.diff.tools.simple; +import com.intellij.diff.comparison.ComparisonManager; import com.intellij.diff.comparison.ComparisonPolicy; -import com.intellij.diff.comparison.ComparisonUtil; import com.intellij.diff.fragments.MergeLineFragment; import com.intellij.diff.util.*; import com.intellij.openapi.editor.Document; @@ -203,7 +203,7 @@ class SimpleThreesideDiffChange { CharSequence content1 = getRangeContent(fragment, editors, side1); CharSequence content2 = getRangeContent(fragment, editors, side2); - return ComparisonUtil.isEquals(content1, content2, policy); + return ComparisonManager.getInstance().isEquals(content1, content2, policy); } @NotNull diff --git a/platform/diff-impl/src/com/intellij/diff/util/DiffUtil.java b/platform/diff-impl/src/com/intellij/diff/util/DiffUtil.java index 78fa9c912e89..bd04e5c1fc59 100644 --- a/platform/diff-impl/src/com/intellij/diff/util/DiffUtil.java +++ b/platform/diff-impl/src/com/intellij/diff/util/DiffUtil.java @@ -20,8 +20,8 @@ import com.intellij.diff.DiffContext; import com.intellij.diff.DiffDialogHints; import com.intellij.diff.DiffTool; import com.intellij.diff.SuppressiveDiffTool; +import com.intellij.diff.comparison.ComparisonManager; import com.intellij.diff.comparison.ComparisonPolicy; -import com.intellij.diff.comparison.ComparisonUtil; import com.intellij.diff.contents.DiffContent; import com.intellij.diff.contents.DocumentContent; import com.intellij.diff.contents.EmptyContent; @@ -442,7 +442,8 @@ public class DiffUtil { List fragments = doCompareWithCache(request, text1, text2, stamp1, stamp2, config, indicator); indicator.checkCanceled(); - return ComparisonUtil.processBlocks(fragments, text1, text2, config.policy, config.squashFragments, config.trimFragments); + return ComparisonManager.getInstance().processBlocks(fragments, text1, text2, + config.policy, config.squashFragments, config.trimFragments); } @NotNull @@ -461,14 +462,14 @@ public class DiffUtil { if (cachedData.getFragments().isEmpty()) return cachedData.getFragments(); if (!config.innerFragments) return cachedData.getFragments(); if (cachedData.isInnerFragments()) return cachedData.getFragments(); - newFragments = ComparisonUtil.compareLinesInner(text1, text2, cachedData.getFragments(), config.policy, indicator); + newFragments = ComparisonManager.getInstance().compareLinesInner(text1, text2, cachedData.getFragments(), config.policy, indicator); } else { if (config.innerFragments) { - newFragments = ComparisonUtil.compareLinesInner(text1, text2, config.policy, indicator); + newFragments = ComparisonManager.getInstance().compareLinesInner(text1, text2, config.policy, indicator); } else { - newFragments = ComparisonUtil.compareLines(text1, text2, config.policy, indicator); + newFragments = ComparisonManager.getInstance().compareLines(text1, text2, config.policy, indicator); } } diff --git a/platform/diff-impl/tests/com/intellij/diff/comparison/ComparisonUtilAutoTest.java b/platform/diff-impl/tests/com/intellij/diff/comparison/ComparisonUtilAutoTest.java index 154b49c7202e..3012e92bf41a 100644 --- a/platform/diff-impl/tests/com/intellij/diff/comparison/ComparisonUtilAutoTest.java +++ b/platform/diff-impl/tests/com/intellij/diff/comparison/ComparisonUtilAutoTest.java @@ -79,7 +79,7 @@ public class ComparisonUtilAutoTest extends AutoTestCase { CharSequence sequence1 = text1.getCharsSequence(); CharSequence sequence2 = text2.getCharsSequence(); - List fragments = ComparisonUtil.compareLinesInner(sequence1, sequence2, policy, INDICATOR); + List fragments = ComparisonManager.getInstance().compareLinesInner(sequence1, sequence2, policy, INDICATOR); debugData.set(fragments); checkResultLine(text1, text2, fragments, policy, true); @@ -96,10 +96,10 @@ public class ComparisonUtilAutoTest extends AutoTestCase { CharSequence sequence1 = text1.getCharsSequence(); CharSequence sequence2 = text2.getCharsSequence(); - List fragments = ComparisonUtil.compareLinesInner(sequence1, sequence2, policy, INDICATOR); + List fragments = ComparisonManager.getInstance().compareLinesInner(sequence1, sequence2, policy, INDICATOR); debugData.set(fragments); - List squashedFragments = ComparisonUtil.squash(fragments); + List squashedFragments = ComparisonManager.getInstance().squash(fragments); debugData.set(new Object[]{fragments, squashedFragments}); checkResultLine(text1, text2, squashedFragments, policy, false); @@ -116,10 +116,10 @@ public class ComparisonUtilAutoTest extends AutoTestCase { CharSequence sequence1 = text1.getCharsSequence(); CharSequence sequence2 = text2.getCharsSequence(); - List fragments = ComparisonUtil.compareLinesInner(sequence1, sequence2, policy, INDICATOR); + List fragments = ComparisonManager.getInstance().compareLinesInner(sequence1, sequence2, policy, INDICATOR); debugData.set(fragments); - List processed = ComparisonUtil.processBlocks(fragments, sequence1, sequence2, policy, true, true); + List processed = ComparisonManager.getInstance().processBlocks(fragments, sequence1, sequence2, policy, true, true); debugData.set(new Object[]{fragments, processed}); checkResultLine(text1, text2, processed, policy, false); @@ -133,7 +133,8 @@ public class ComparisonUtilAutoTest extends AutoTestCase { doTest(seed, runs, maxLength, policies, new TestTask() { @Override public void run(@NotNull Document text1, @NotNull Document text2, @NotNull ComparisonPolicy policy, @NotNull Ref debugData) { - List fragments = ComparisonUtil.compareChars(text1.getCharsSequence(), text2.getCharsSequence(), policy, INDICATOR); + List fragments = ComparisonManager.getInstance() + .compareChars(text1.getCharsSequence(), text2.getCharsSequence(), policy, INDICATOR); debugData.set(fragments); checkResultChar(text1.getCharsSequence(), text2.getCharsSequence(), fragments, policy); diff --git a/platform/diff-impl/tests/com/intellij/diff/comparison/ComparisonUtilTestBase.java b/platform/diff-impl/tests/com/intellij/diff/comparison/ComparisonUtilTestBase.java index 648fb2d617ea..61396d9fb74d 100644 --- a/platform/diff-impl/tests/com/intellij/diff/comparison/ComparisonUtilTestBase.java +++ b/platform/diff-impl/tests/com/intellij/diff/comparison/ComparisonUtilTestBase.java @@ -58,7 +58,8 @@ public abstract class ComparisonUtilTestBase extends UsefulTestCase { @Nullable Couple matchings, @Nullable List expected, @NotNull ComparisonPolicy policy) { - List fragments = ComparisonUtil.compareLines(before.getCharsSequence(), after.getCharsSequence(), policy, INDICATOR); + List fragments = ComparisonManager.getInstance() + .compareLines(before.getCharsSequence(), after.getCharsSequence(), policy, INDICATOR); checkConsistency(fragments, before, after, policy); if (matchings != null) checkLineMatching(fragments, before, after, matchings, policy); if (expected != null) checkLineChanges(fragments, before, after, expected, policy); @@ -69,8 +70,9 @@ public abstract class ComparisonUtilTestBase extends UsefulTestCase { @Nullable Couple matchings, @Nullable List expected, @NotNull ComparisonPolicy policy) { - List rawFragments = ComparisonUtil.compareLinesInner(before.getCharsSequence(), after.getCharsSequence(), policy, INDICATOR); - List fragments = ComparisonUtil.squash(rawFragments); + List rawFragments = ComparisonManager.getInstance() + .compareLinesInner(before.getCharsSequence(), after.getCharsSequence(), policy, INDICATOR); + List fragments = ComparisonManager.getInstance().squash(rawFragments); checkConsistencyWord(fragments, before, after, policy); @@ -86,7 +88,8 @@ public abstract class ComparisonUtilTestBase extends UsefulTestCase { @Nullable Couple matchings, @Nullable List expected, @NotNull ComparisonPolicy policy) { - List fragments = ComparisonUtil.compareChars(before.getCharsSequence(), after.getCharsSequence(), policy, INDICATOR); + List fragments = ComparisonManager.getInstance() + .compareChars(before.getCharsSequence(), after.getCharsSequence(), policy, INDICATOR); checkConsistency(fragments, before, after, policy); if (matchings != null) checkDiffMatching(fragments, before, after, matchings, policy); if (expected != null) checkDiffChanges(fragments, before, after, expected, policy); @@ -97,7 +100,8 @@ public abstract class ComparisonUtilTestBase extends UsefulTestCase { @Nullable Couple matchings, @Nullable List expected, @NotNull ComparisonPolicy policy) { - List fragments = ComparisonUtil.compareLinesInner(before.getCharsSequence(), after.getCharsSequence(), policy, INDICATOR); + List fragments = ComparisonManager.getInstance() + .compareLinesInner(before.getCharsSequence(), after.getCharsSequence(), policy, INDICATOR); checkConsistency(fragments, before, after, policy); if (matchings != null) checkLineMatching(fragments, before, after, matchings, policy); if (expected != null) checkLineChanges(fragments, before, after, expected, policy); diff --git a/platform/platform-resources/src/META-INF/PlatformExtensions.xml b/platform/platform-resources/src/META-INF/PlatformExtensions.xml index 0188f66b8eb5..b60ba49f752b 100644 --- a/platform/platform-resources/src/META-INF/PlatformExtensions.xml +++ b/platform/platform-resources/src/META-INF/PlatformExtensions.xml @@ -87,6 +87,8 @@ serviceImplementation="com.intellij.diff.impl.DiffContentFactoryImpl"/> +