| /******************************************************************************* |
| * Copyright (c) 2000, 2003 IBM Corporation and others. |
| * All rights reserved. This program and the accompanying materials |
| * are made available under the terms of the Common Public License v1.0 |
| * which accompanies this distribution, and is available at |
| * http://www.eclipse.org/legal/cpl-v10.html |
| * |
| * Contributors: |
| * IBM Corporation - initial API and implementation |
| *******************************************************************************/ |
| package org.eclipse.team.internal.ccvs.ui.subscriber; |
| |
| import java.util.ArrayList; |
| import java.util.List; |
| |
| import org.eclipse.core.resources.IResource; |
| import org.eclipse.core.resources.ResourcesPlugin; |
| import org.eclipse.core.runtime.*; |
| import org.eclipse.team.core.subscribers.Subscriber; |
| import org.eclipse.team.internal.ccvs.core.*; |
| import org.eclipse.team.internal.ccvs.ui.CVSUIPlugin; |
| import org.eclipse.team.internal.ccvs.ui.Policy; |
| import org.eclipse.team.ui.TeamUI; |
| import org.eclipse.team.ui.synchronize.*; |
| import org.eclipse.team.ui.synchronize.subscribers.SubscriberParticipant; |
| import org.eclipse.ui.IMemento; |
| import org.eclipse.ui.PartInitException; |
| |
| public class MergeSynchronizeParticipant extends SubscriberParticipant { |
| |
| private final static String CTX_ROOT = "root"; //$NON-NLS-1$ |
| private final static String CTX_ROOT_PATH = "root_resource"; //$NON-NLS-1$ |
| private final static String CTX_START_TAG = "start_tag"; //$NON-NLS-1$ |
| private final static String CTX_START_TAG_TYPE = "start_tag_type"; //$NON-NLS-1$ |
| private final static String CTX_END_TAG = "end_tag"; //$NON-NLS-1$ |
| private final static String CTX_END_TAG_TYPE = "end_tag_type"; //$NON-NLS-1$ |
| |
| public MergeSynchronizeParticipant() { |
| super(); |
| } |
| |
| public MergeSynchronizeParticipant(CVSMergeSubscriber subscriber) { |
| super(); |
| setSubscriber(subscriber); |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.team.ui.synchronize.subscriber.SubscriberParticipant#createSynchronizeViewerAdvisor(org.eclipse.team.ui.synchronize.ISynchronizeView) |
| */ |
| protected StructuredViewerAdvisor createSynchronizeViewerAdvisor(ISynchronizeView view) { |
| return new MergeSynchronizeAdvisor(view, this); |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.team.ui.sync.SubscriberParticipant#setSubscriber(org.eclipse.team.core.subscribers.TeamSubscriber) |
| */ |
| public void setSubscriber(Subscriber subscriber) { |
| super.setSubscriber(subscriber); |
| try { |
| ISynchronizeParticipantDescriptor descriptor = TeamUI.getSynchronizeManager().getParticipantDescriptor(CVSMergeSubscriber.ID); |
| setInitializationData(descriptor); |
| CVSMergeSubscriber s = (CVSMergeSubscriber)getSubscriber(); |
| setSecondaryId(s.getId().getLocalName()); |
| } catch (CoreException e) { |
| CVSUIPlugin.log(e); |
| } |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.team.ui.synchronize.ISynchronizeParticipant#init(org.eclipse.ui.IMemento) |
| */ |
| public void init(String secondayId, IMemento memento) throws PartInitException { |
| super.init(secondayId, memento); |
| if(memento != null) { |
| ISynchronizeParticipantDescriptor descriptor = TeamUI.getSynchronizeManager().getParticipantDescriptor(CVSMergeSubscriber.ID); |
| String qualifier = descriptor.getId(); |
| String localname = secondayId; |
| if(qualifier == null || localname == null) { |
| throw new PartInitException(Policy.bind("MergeSynchronizeParticipant.8")); //$NON-NLS-1$ |
| } |
| try { |
| setSubscriber(read(new QualifiedName(qualifier, localname), memento)); |
| } catch (CVSException e) { |
| throw new PartInitException(Policy.bind("MergeSynchronizeParticipant.9"), e); //$NON-NLS-1$ |
| } |
| } |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.team.ui.synchronize.ISynchronizeParticipant#init(org.eclipse.ui.IMemento) |
| */ |
| public void saveState(IMemento memento) { |
| super.saveState(memento); |
| CVSMergeSubscriber s = (CVSMergeSubscriber)getSubscriber(); |
| write(s, memento); |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.team.ui.sync.AbstractSynchronizeParticipant#dispose() |
| */ |
| public void dispose() { |
| super.dispose(); |
| if(TeamUI.getSynchronizeManager().get(getId(), getSecondaryId()) == null) { |
| // If the participant isn't managed by the synchronize manager then we |
| // must ensure that the state cached in the synchronizer is flushed. |
| flushStateCache(); |
| } |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.team.ui.synchronize.ISynchronizeParticipant#getName() |
| */ |
| public String getName() { |
| return ((CVSMergeSubscriber)getSubscriber()).getName(); |
| } |
| |
| private void write(CVSMergeSubscriber s, IMemento memento) { |
| // start and end tags |
| CVSTag start = s.getStartTag(); |
| CVSTag end = s.getEndTag(); |
| memento.putString(CTX_START_TAG, start.getName()); |
| memento.putInteger(CTX_START_TAG_TYPE, start.getType()); |
| memento.putString(CTX_END_TAG, end.getName()); |
| memento.putInteger(CTX_END_TAG_TYPE, end.getType()); |
| |
| // resource roots |
| IResource[] roots = s.roots(); |
| for (int i = 0; i < roots.length; i++) { |
| IResource resource = roots[i]; |
| IMemento rootNode = memento.createChild(CTX_ROOT); |
| rootNode.putString(CTX_ROOT_PATH, resource.getFullPath().toString()); |
| } |
| } |
| |
| private CVSMergeSubscriber read(QualifiedName id, IMemento memento) throws CVSException { |
| CVSTag start = new CVSTag(memento.getString(CTX_START_TAG), memento.getInteger(CTX_START_TAG_TYPE).intValue()); //$NON-NLS-1$ //$NON-NLS-2$ |
| CVSTag end = new CVSTag(memento.getString(CTX_END_TAG), memento.getInteger(CTX_END_TAG_TYPE).intValue()); //$NON-NLS-1$ //$NON-NLS-2$ |
| |
| IMemento[] rootNodes = memento.getChildren(CTX_ROOT); |
| if(rootNodes == null || rootNodes.length == 0) { |
| throw new CVSException(Policy.bind("MergeSynchronizeParticipant.10", id.toString())); //$NON-NLS-1$ |
| } |
| |
| List resources = new ArrayList(); |
| for (int i = 0; i < rootNodes.length; i++) { |
| IMemento rootNode = rootNodes[i]; |
| IPath path = new Path(rootNode.getString(CTX_ROOT_PATH)); //$NON-NLS-1$ |
| IResource resource = ResourcesPlugin.getWorkspace().getRoot().findMember(path, true /* include phantoms */); |
| if(resource != null) { |
| resources.add(resource); |
| } else { |
| // log that a resource previously in the merge set is no longer in the workspace |
| CVSProviderPlugin.log(CVSStatus.INFO, Policy.bind("MergeSynchronizeParticipant.11", path.toString()), null); //$NON-NLS-1$ |
| } |
| } |
| if(resources.isEmpty()) { |
| throw new CVSException(Policy.bind("MergeSynchronizeParticipant.12", id.toString())); //$NON-NLS-1$ |
| } |
| IResource[] roots = (IResource[]) resources.toArray(new IResource[resources.size()]); |
| return new CVSMergeSubscriber(id, roots, start, end); |
| } |
| |
| private void flushStateCache() { |
| ((CVSMergeSubscriber)getSubscriber()).cancel(); |
| } |
| } |