Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/patch/FileDiffResult.java')
-rw-r--r--bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/patch/FileDiffResult.java326
1 files changed, 0 insertions, 326 deletions
diff --git a/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/patch/FileDiffResult.java b/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/patch/FileDiffResult.java
deleted file mode 100644
index 84ca27166..000000000
--- a/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/patch/FileDiffResult.java
+++ /dev/null
@@ -1,326 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.compare.internal.patch;
-
-import java.io.*;
-import java.util.*;
-
-import org.eclipse.compare.internal.CompareUIPlugin;
-import org.eclipse.compare.internal.Utilities;
-import org.eclipse.compare.patch.*;
-import org.eclipse.compare.structuremergeviewer.Differencer;
-import org.eclipse.core.resources.*;
-import org.eclipse.core.runtime.*;
-import org.eclipse.osgi.util.NLS;
-
-public class FileDiffResult implements IFilePatchResult {
-
- private FileDiff fDiff;
- private boolean fMatches= false;
- private boolean fDiffProblem;
- private String fErrorMessage;
- private Map fHunkResults = new HashMap();
- private List fBeforeLines, fAfterLines;
- private final PatchConfiguration configuration;
- private String charset;
-
- public FileDiffResult(FileDiff diff, PatchConfiguration configuration) {
- super();
- fDiff = diff;
- this.configuration = configuration;
- }
-
- public PatchConfiguration getConfiguration() {
- return configuration;
- }
-
- public boolean canApplyHunk(Hunk hunk) {
- HunkResult result = getHunkResult(hunk);
- return result.isOK() && !fDiffProblem;
- }
-
- /**
- * Refreshes the state of the diff to {no matches, no problems} and checks to see what hunks contained
- * by this Diff can actually be applied.
- *
- * Checks to see:
- * 1) if the target file specified in fNewPath exists and is patchable
- * 2) which hunks contained by this diff can actually be applied to the file
- * @param storage the contents being patched or <code>null</code> for an addition
- * @param monitor a progress monitor or <code>null</code> if no progress monitoring is desired
- */
- public void refresh(IStorage storage, IProgressMonitor monitor) {
- fMatches= false;
- fDiffProblem= false;
- boolean create= false;
- charset = Utilities.getCharset(storage);
- //If this diff is an addition, make sure that it doesn't already exist
- boolean exists = targetExists(storage);
- if (fDiff.getDiffType(getConfiguration().isReversed()) == Differencer.ADDITION) {
- if ((!exists || isEmpty(storage)) && canCreateTarget(storage)) {
- fMatches= true;
- } else {
- // file already exists
- fDiffProblem= true;
- fErrorMessage= PatchMessages.PreviewPatchPage_FileExists_error;
- }
- create= true;
- } else { //This diff is not an addition, try to find a match for it
- //Ensure that the file described by the path exists and is modifiable
- if (exists) {
- fMatches= true;
- } else {
- // file doesn't exist
- fDiffProblem= true;
- fErrorMessage= PatchMessages.PreviewPatchPage_FileDoesNotExist_error;
- }
- }
-
- if (fDiffProblem) {
- // We couldn't find the target file or the patch is trying to add a
- // file that already exists but we need to initialize the hunk
- // results for display
- fBeforeLines = new ArrayList(getLines(storage, false));
- fAfterLines = fMatches ? new ArrayList() : fBeforeLines;
- Hunk[] hunks = fDiff.getHunks();
- for (int i = 0; i < hunks.length; i++) {
- Hunk hunk = hunks[i];
- HunkResult result = getHunkResult(hunk);
- result.setMatches(false);
- }
- } else {
- // If this diff has no problems discovered so far, try applying the patch
- patch(getLines(storage, create), monitor);
- }
-
- if (containsProblems()) {
- if (fMatches) {
- // Check to see if we have at least one hunk that matches
- fMatches = false;
- Hunk[] hunks = fDiff.getHunks();
- for (int i = 0; i < hunks.length; i++) {
- Hunk hunk = hunks[i];
- HunkResult result = getHunkResult(hunk);
- if (result.isOK()) {
- fMatches = true;
- break;
- }
- }
- }
- }
- }
-
- protected boolean canCreateTarget(IStorage storage) {
- return true;
- }
-
- protected boolean targetExists(IStorage storage) {
- return storage != null;
- }
-
- protected List getLines(IStorage storage, boolean create) {
- List lines = Patcher.load(storage, create);
- return lines;
- }
-
- protected boolean isEmpty(IStorage storage) {
- if (storage == null)
- return true;
- return Patcher.load(storage, false).isEmpty();
- }
-
- /*
- * Tries to patch the given lines with the specified Diff.
- * Any hunk that couldn't be applied is returned in the list failedHunks.
- */
- public void patch(List lines, IProgressMonitor monitor) {
- fBeforeLines = new ArrayList();
- fBeforeLines.addAll(lines);
- if (getConfiguration().getFuzz() != 0) {
- calculateFuzz(fBeforeLines, monitor);
- }
- int shift= 0;
- Hunk[] hunks = fDiff.getHunks();
- for (int i = 0; i < hunks.length; i++) {
- Hunk hunk = hunks[i];
- HunkResult result = getHunkResult(hunk);
- result.setShift(shift);
- if (result.patch(lines)) {
- shift = result.getShift();
- }
- }
- fAfterLines = lines;
- }
-
- protected boolean getDiffProblem() {
- return fDiffProblem;
- }
-
- /**
- * Returns whether this Diff has any problems
- * @return true if this Diff or any of its children Hunks have a problem, false if it doesn't
- */
- protected boolean containsProblems() {
- if (fDiffProblem)
- return true;
- for (Iterator iterator = fHunkResults.values().iterator(); iterator.hasNext();) {
- HunkResult result = (HunkResult) iterator.next();
- if (!result.isOK())
- return true;
- }
- return false;
- }
-
- public String getLabel() {
- String label= getTargetPath().toString();
- if (this.fDiffProblem)
- return NLS.bind(PatchMessages.Diff_2Args, new String[] {label, fErrorMessage});
- return label;
- }
-
- public boolean hasMatches() {
- return fMatches;
- }
-
- /**
- * Return the lines of the target file with all matched hunks applied.
- * @return the lines of the target file with all matched hunks applied
- */
- public List getLines() {
- return fAfterLines;
- }
-
- /**
- * Calculate the fuzz factor that will allow the most hunks to be matched.
- * @param lines the lines of the target file
- * @param monitor a progress monitor
- * @return the fuzz factor or <code>-1</code> if no hunks could be matched
- */
- public int calculateFuzz(List lines, IProgressMonitor monitor) {
- if (monitor == null)
- monitor = new NullProgressMonitor();
- fBeforeLines = new ArrayList(lines);
- // TODO: What about deletions?
- if (fDiff.getDiffType(getConfiguration().isReversed()) == Differencer.ADDITION) {
- // Additions don't need to adjust the fuzz factor
- // TODO: What about the after lines?
- return -1;
- }
- int shift= 0;
- int highestFuzz = -1; // the maximum fuzz factor for all hunks
- String name = getTargetPath() != null ? getTargetPath().lastSegment() : ""; //$NON-NLS-1$
- Hunk[] hunks = fDiff.getHunks();
- for (int j = 0; j < hunks.length; j++) {
- Hunk h = hunks[j];
- monitor.subTask(NLS.bind(PatchMessages.PreviewPatchPage_GuessFuzzProgress_format, new String[] {name, Integer.toString(j + 1)}));
- HunkResult result = getHunkResult(h);
- result.setShift(shift);
- int fuzz = result.calculateFuzz(lines, monitor);
- shift = result.getShift();
- if (fuzz > highestFuzz)
- highestFuzz = fuzz;
- monitor.worked(1);
- }
- fAfterLines = lines;
- return highestFuzz;
- }
-
- public IPath getTargetPath() {
- return fDiff.getStrippedPath(getConfiguration().getPrefixSegmentStripCount(), getConfiguration().isReversed());
- }
-
- private HunkResult getHunkResult(Hunk hunk) {
- HunkResult result = (HunkResult)fHunkResults.get(hunk);
- if (result == null) {
- result = new HunkResult(this, hunk);
- fHunkResults .put(hunk, result);
- }
- return result;
- }
-
- List getFailedHunks() {
- List failedHunks = new ArrayList();
- for (Iterator iterator = fHunkResults.values().iterator(); iterator.hasNext();) {
- HunkResult result = (HunkResult) iterator.next();
- if (!result.isOK())
- failedHunks.add(result.getHunk());
- }
- return failedHunks;
- }
-
- private HunkResult[] getFailedHunkResults() {
- List failedHunks = new ArrayList();
- for (Iterator iterator = fHunkResults.values().iterator(); iterator.hasNext();) {
- HunkResult result = (HunkResult) iterator.next();
- if (!result.isOK())
- failedHunks.add(result);
- }
- return (HunkResult[]) failedHunks.toArray(new HunkResult[failedHunks.size()]);
- }
-
- public FileDiff getDiff() {
- return fDiff;
- }
-
- List getBeforeLines() {
- return fBeforeLines;
- }
-
- List getAfterLines() {
- return fAfterLines;
- }
-
- public HunkResult[] getHunkResults() {
- return (HunkResult[]) fHunkResults.values().toArray(new HunkResult[fHunkResults.size()]);
- }
-
- public InputStream getOriginalContents() {
- String contents = Patcher.createString(isPreserveLineDelimeters(), getBeforeLines());
- return asInputStream(contents, getCharset());
- }
-
- public InputStream getPatchedContents() {
- String contents = Patcher.createString(isPreserveLineDelimeters(), getLines());
- return asInputStream(contents, getCharset());
- }
-
- public String getCharset() {
- return charset;
- }
-
- protected boolean isPreserveLineDelimeters() {
- return false;
- }
-
- public IHunk[] getRejects() {
- return getFailedHunkResults();
- }
-
- public boolean hasRejects() {
- return getFailedHunkResults().length > 0;
- }
-
- public static InputStream asInputStream(String contents, String charSet) {
- byte[] bytes = null;
- if (charSet != null) {
- try {
- bytes = contents.getBytes(charSet);
- } catch (UnsupportedEncodingException e) {
- CompareUIPlugin.log(e);
- }
- }
- if (bytes == null) {
- bytes = contents.getBytes();
- }
- return new ByteArrayInputStream(bytes);
- }
-
-}

Back to the top