| /******************************************************************************* |
| * Copyright (c) 2013, 2014 Obeo. |
| * 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: |
| * Obeo - initial API and implementation |
| *******************************************************************************/ |
| package org.eclipse.emf.compare.rcp.ui.internal.contentmergeviewer.accessor.impl; |
| |
| import static org.eclipse.emf.compare.merge.AbstractMerger.isInTerminalState; |
| |
| import com.google.common.collect.ImmutableList; |
| |
| import org.eclipse.emf.common.notify.AdapterFactory; |
| import org.eclipse.emf.compare.Comparison; |
| import org.eclipse.emf.compare.Diff; |
| import org.eclipse.emf.compare.DifferenceKind; |
| import org.eclipse.emf.compare.DifferenceSource; |
| import org.eclipse.emf.compare.Match; |
| import org.eclipse.emf.compare.ResourceAttachmentChange; |
| import org.eclipse.emf.compare.rcp.ui.contentmergeviewer.accessor.IResourceContentsAccessor; |
| import org.eclipse.emf.compare.rcp.ui.contentmergeviewer.accessor.legacy.impl.AbstractTypedElementAdapter; |
| import org.eclipse.emf.compare.rcp.ui.internal.contentmergeviewer.TypeConstants; |
| import org.eclipse.emf.compare.rcp.ui.internal.mergeviewer.item.impl.MergeViewerItem; |
| import org.eclipse.emf.compare.rcp.ui.internal.mergeviewer.item.impl.ResourceAttachmentChangeMergeViewerItem; |
| import org.eclipse.emf.compare.rcp.ui.internal.util.MergeViewerUtil; |
| import org.eclipse.emf.compare.rcp.ui.mergeviewer.IMergeViewer.MergeViewerSide; |
| import org.eclipse.emf.compare.rcp.ui.mergeviewer.item.IMergeViewerItem; |
| import org.eclipse.emf.ecore.EObject; |
| import org.eclipse.emf.ecore.provider.EcoreEditPlugin; |
| import org.eclipse.emf.ecore.resource.Resource; |
| import org.eclipse.emf.edit.ui.provider.ExtendedImageRegistry; |
| import org.eclipse.swt.graphics.Image; |
| |
| /** |
| * A specific {@link IResourceContentsAccessor} for {@link ResourceAttachmentChange} objects. |
| * |
| * @author <a href="mailto:axel.richard@obeo.fr">Axel Richard</a> |
| * @since 4.0 |
| */ |
| public class ResourceContentsAccessorImpl extends AbstractTypedElementAdapter implements IResourceContentsAccessor { |
| |
| /** The difference performed. */ |
| private final Diff fDiff; |
| |
| /** The side on which the difference is located. */ |
| private final MergeViewerSide fSide; |
| |
| /** The match associated to the performed difference. */ |
| private final Match fOwnerMatch; |
| |
| /** |
| * Default constructor. |
| * |
| * @param adapterFactory |
| * the adapter factory used to create the accessor. |
| * @param diff |
| * The difference performed. |
| * @param side |
| * The side on which the difference is located. |
| */ |
| public ResourceContentsAccessorImpl(AdapterFactory adapterFactory, Diff diff, MergeViewerSide side) { |
| super(adapterFactory); |
| fDiff = diff; |
| fSide = side; |
| fOwnerMatch = diff.getMatch(); |
| } |
| |
| /** |
| * {@inheritDoc} |
| * |
| * @see org.eclipse.emf.compare.rcp.ui.contentmergeviewer.accessor.IResourceContentsAccessor#getComparison() |
| */ |
| public Comparison getComparison() { |
| return fOwnerMatch.getComparison(); |
| } |
| |
| /** |
| * {@inheritDoc} |
| * |
| * @see org.eclipse.emf.compare.rcp.ui.contentmergeviewer.accessor.IResourceContentsAccessor#getInitialItem() |
| */ |
| public IMergeViewerItem getInitialItem() { |
| Diff initialDiff = fDiff; |
| EObject diffValue = (EObject)MergeViewerUtil |
| .getResourceAttachmentChangeValue((ResourceAttachmentChange)initialDiff, getSide()); |
| if (isInTerminalState(initialDiff)) { |
| Object left = MergeViewerUtil.getValueFromResourceAttachmentChange( |
| (ResourceAttachmentChange)initialDiff, getComparison(), MergeViewerSide.LEFT); |
| Object right = MergeViewerUtil.getValueFromResourceAttachmentChange( |
| (ResourceAttachmentChange)initialDiff, getComparison(), MergeViewerSide.RIGHT); |
| DifferenceSource source = initialDiff.getSource(); |
| DifferenceKind kind = initialDiff.getKind(); |
| boolean b5 = source == DifferenceSource.LEFT && kind == DifferenceKind.ADD && right == null; |
| boolean b6 = source == DifferenceSource.LEFT && kind == DifferenceKind.DELETE && left == null; |
| boolean b7 = source == DifferenceSource.RIGHT && kind == DifferenceKind.ADD && left == null; |
| boolean b8 = source == DifferenceSource.RIGHT && kind == DifferenceKind.DELETE && right == null; |
| if (b5 || b8) { |
| left = null; |
| } |
| if (b6 || b7) { |
| right = null; |
| } |
| if (b5 || b8 || b6 || b7) { |
| Object ancestor = MergeViewerUtil.getValueFromResourceAttachmentChange( |
| (ResourceAttachmentChange)initialDiff, getComparison(), MergeViewerSide.ANCESTOR); |
| return new MergeViewerItem.Container(getComparison(), initialDiff, left, right, ancestor, |
| getSide(), getRootAdapterFactory()); |
| } |
| |
| } |
| if (diffValue == null && MergeViewerSide.ANCESTOR != getSide()) { |
| if (MergeViewerSide.LEFT == getSide()) { |
| diffValue = (EObject)MergeViewerUtil.getResourceAttachmentChangeValue( |
| (ResourceAttachmentChange)initialDiff, MergeViewerSide.RIGHT); |
| } else { |
| diffValue = (EObject)MergeViewerUtil.getResourceAttachmentChangeValue( |
| (ResourceAttachmentChange)initialDiff, MergeViewerSide.LEFT); |
| } |
| if (diffValue == null) { |
| diffValue = (EObject)MergeViewerUtil.getResourceAttachmentChangeValue( |
| (ResourceAttachmentChange)initialDiff, MergeViewerSide.ANCESTOR); |
| } |
| } |
| Match match = getComparison().getMatch(diffValue); |
| |
| if (match != null) { |
| Object left = match.getLeft(); |
| Object right = match.getRight(); |
| Object ancestor = match.getOrigin(); |
| // Manage case where the resource attachment change is between an existing resource and an unknown |
| // resource |
| if (MergeViewerUtil.getResource(getComparison(), MergeViewerSide.LEFT, initialDiff) == null) { |
| left = null; |
| } |
| if (MergeViewerUtil.getResource(getComparison(), MergeViewerSide.RIGHT, initialDiff) == null) { |
| right = null; |
| } |
| if (MergeViewerUtil.getResource(getComparison(), MergeViewerSide.ANCESTOR, initialDiff) == null) { |
| ancestor = null; |
| } |
| |
| return new MergeViewerItem.Container(getComparison(), initialDiff, left, right, ancestor, |
| getSide(), getRootAdapterFactory()); |
| } |
| return null; |
| } |
| |
| /** |
| * {@inheritDoc} |
| * |
| * @see org.eclipse.emf.compare.rcp.ui.contentmergeviewer.accessor.IResourceContentsAccessor#getItems() |
| */ |
| public ImmutableList<? extends IMergeViewerItem> getItems() { |
| final ImmutableList<? extends IMergeViewerItem> ret = ImmutableList |
| .of(new ResourceAttachmentChangeMergeViewerItem(getComparison(), null, |
| getResource(MergeViewerSide.LEFT), getResource(MergeViewerSide.RIGHT), |
| getResource(MergeViewerSide.ANCESTOR), getSide(), getRootAdapterFactory())); |
| return ret; |
| } |
| |
| /** |
| * {@inheritDoc} |
| * |
| * @see org.eclipse.emf.compare.rcp.ui.contentmergeviewer.accessor.IResourceContentsAccessor#getResource(org.eclipse.emf.compare.rcp.ui.mergeviewer.IMergeViewer.MergeViewerSide) |
| */ |
| public Resource getResource(MergeViewerSide side) { |
| return MergeViewerUtil.getResource(fOwnerMatch.getComparison(), side, fDiff); |
| } |
| |
| /** |
| * Returns the side of the content merge viewer on which the difference is performed. |
| * |
| * @return The side of the content merge viewer on which the difference is performed. |
| */ |
| protected final MergeViewerSide getSide() { |
| return fSide; |
| } |
| |
| /** |
| * {@inheritDoc} |
| * |
| * @see org.eclipse.emf.compare.rcp.ui.contentmergeviewer.accessor.legacy.ITypedElement#getName() |
| */ |
| public String getName() { |
| return ResourceContentsAccessorImpl.class.getName(); |
| } |
| |
| /** |
| * {@inheritDoc} |
| * |
| * @see org.eclipse.emf.compare.rcp.ui.contentmergeviewer.accessor.legacy.ITypedElement#getImage() |
| */ |
| public Image getImage() { |
| return ExtendedImageRegistry.getInstance() |
| .getImage(EcoreEditPlugin.getPlugin().getImage("full/obj16/EObject")); //$NON-NLS-1$ |
| } |
| |
| /** |
| * {@inheritDoc} |
| * |
| * @see org.eclipse.emf.compare.rcp.ui.contentmergeviewer.accessor.legacy.ITypedElement#getType() |
| */ |
| public String getType() { |
| return TypeConstants.TYPE_ERESOURCE_DIFF; |
| } |
| } |