Copyright (c) 2011 IBM Corporation and others. This program and the accompanying materials are made available under the terms of the Eclipse Public License 2.0 which accompanies this distribution, and is available at https://www.eclipse.org/legal/epl-2.0/ SPDX-License-Identifier: EPL-2.0 Contributors: IBM Corporation - initial API and implementation
/******************************************************************************* * Copyright (c) 2011 IBM Corporation and others. * * This program and the accompanying materials * are made available under the terms of the Eclipse Public License 2.0 * which accompanies this distribution, and is available at * https://www.eclipse.org/legal/epl-2.0/ * * SPDX-License-Identifier: EPL-2.0 * * Contributors: * IBM Corporation - initial API and implementation *******************************************************************************/
package org.eclipse.team.internal.core.subscribers; import java.io.BufferedInputStream; import java.io.IOException; import java.io.InputStream; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IResource; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.team.core.TeamException; import org.eclipse.team.core.history.IFileRevision; import org.eclipse.team.core.variants.IResourceVariant; import org.eclipse.team.internal.core.Policy; import org.eclipse.team.internal.core.TeamPlugin;
Compare local and remote contents. This comparator makes use of the IStorage provided by an IResourceVariant or an IFileRevisionto obtain the remote contents. This means that the comparison may contact the server unless the contents were cached locally by a previous operation. The caching of remote contents is subscriber specific.
/** * Compare local and remote contents. * * This comparator makes use of the <code>IStorage</code> provided by * an <code>IResourceVariant</code> or an <code>IFileRevision</code>to obtain the remote contents. * This means that the comparison may contact the server unless the contents * were cached locally by a previous operation. The caching of remote * contents is subscriber specific. */
public abstract class AbstractContentComparator { private boolean ignoreWhitespace = false; public AbstractContentComparator(boolean ignoreWhitespace) { this.ignoreWhitespace = ignoreWhitespace; } public boolean compare(IResource e1, IResourceVariant e2, IProgressMonitor monitor) { return compareObjects(e1, e2, monitor); } public boolean compare(IResource e1, IFileRevision e2, IProgressMonitor monitor) { return compareObjects(e1, e2, monitor); } private boolean compareObjects(Object e1, Object e2, IProgressMonitor monitor) { InputStream is1 = null; InputStream is2 = null; try { monitor.beginTask(null, 100); is1 = getContents(e1, Policy.subMonitorFor(monitor, 30)); is2 = getContents(e2, Policy.subMonitorFor(monitor, 30)); return contentsEqual(Policy.subMonitorFor(monitor, 40), is1, is2, shouldIgnoreWhitespace()); } catch (TeamException e) { TeamPlugin.log(e); return false; } finally { try { try { if (is1 != null) { is1.close(); } } finally { if (is2 != null) { is2.close(); } } } catch (IOException e) { // Ignore } monitor.done(); } } protected boolean shouldIgnoreWhitespace() { return ignoreWhitespace; } abstract protected boolean contentsEqual(IProgressMonitor monitor, InputStream is1, InputStream is2, boolean ignoreWhitespace); private InputStream getContents(Object resource, IProgressMonitor monitor) throws TeamException { try { if (resource instanceof IFile) { return new BufferedInputStream(((IFile) resource).getContents()); } else if (resource instanceof IResourceVariant) { IResourceVariant remote = (IResourceVariant) resource; if (!remote.isContainer()) { return new BufferedInputStream(remote.getStorage(monitor) .getContents()); } } else if (resource instanceof IFileRevision) { IFileRevision remote = (IFileRevision) resource; return new BufferedInputStream(remote.getStorage(monitor) .getContents()); } return null; } catch (CoreException e) { throw TeamException.asTeamException(e); } } }