Copyright (c) 2000, 2017 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) 2000, 2017 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.core.variants; import org.eclipse.core.resources.IResource; import org.eclipse.team.core.TeamException; import org.eclipse.team.internal.core.TeamPlugin;
A resource comparator that uses the ThreeWaySynchronizer to compare local resources to their resource variants. The local state is determined using the local modification state and the remote state is determined by comparing the base bytes to the remote bytes obtained from the synchronizer.
Since:3.0
/** * A resource comparator that uses the <code>ThreeWaySynchronizer</code> * to compare local resources to their resource variants. The local state * is determined using the local modification state and the remote state * is determined by comparing the base bytes to the remote bytes obtained * from the synchronizer. * * @since 3.0 */
public class ThreeWayResourceComparator implements IResourceVariantComparator { private ThreeWaySynchronizer synchronizer;
Create a three-way resource comparator that uses the ThreeWaySynchronizer to compare a local resource to a resource variant.
Params:
  • synchronizer – The synchronizer to use.
/** * Create a three-way resource comparator that uses the * <code>ThreeWaySynchronizer</code> to compare a local resource to a resource * variant. * * @param synchronizer The synchronizer to use. */
public ThreeWayResourceComparator(ThreeWaySynchronizer synchronizer) { this.synchronizer = synchronizer; } @Override public boolean compare(IResource local, IResourceVariant remote) { // First, ensure the resources are the same gender if ((local.getType() == IResource.FILE) == remote.isContainer()) { return false; } try { // If the file is locally modified, it cannot be in sync if (local.getType() == IResource.FILE && getSynchronizer().isLocallyModified(local)) { return false; } // If there is no base, the local cannot match the remote if (getSynchronizer().getBaseBytes(local) == null) return false; // Otherwise, assume they are the same if the remote equals the base return equals(getSynchronizer().getBaseBytes(local), getBytes(remote)); } catch (TeamException e) { TeamPlugin.log(e); return false; } } @Override public boolean compare(IResourceVariant base, IResourceVariant remote) { byte[] bytes1 = getBytes(base); byte[] bytes2 = getBytes(remote); return equals(bytes1, bytes2); } @Override public boolean isThreeWay() { return true; } private ThreeWaySynchronizer getSynchronizer() { return synchronizer; } private byte[] getBytes(IResourceVariant remote) { return remote.asBytes(); } private boolean equals(byte[] syncBytes, byte[] oldBytes) { if (syncBytes.length != oldBytes.length) return false; for (int i = 0; i < oldBytes.length; i++) { if (oldBytes[i] != syncBytes[i]) return false; } return true; } }