org.eclipse.team.svn.ui.operation.CorrectRevisionOperation.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.team.svn.ui.operation.CorrectRevisionOperation.java

Source

/*******************************************************************************
 * Copyright (c) 2005-2008 Polarion Software.
 * 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:
 *    Alexander Gurov (Polarion Software) - initial API and implementation
 *******************************************************************************/

package org.eclipse.team.svn.ui.operation;

import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.team.svn.core.connector.SVNRevision;
import org.eclipse.team.svn.core.operation.AbstractActionOperation;
import org.eclipse.team.svn.core.operation.remote.GetLogMessagesOperation;
import org.eclipse.team.svn.core.resource.ILocalResource;
import org.eclipse.team.svn.core.resource.IRepositoryResource;
import org.eclipse.team.svn.core.svnstorage.SVNRemoteStorage;
import org.eclipse.team.svn.ui.SVNUIMessages;
import org.eclipse.team.svn.ui.utility.UIMonitorUtility;

/**
 * Corrects Log Message revision
 * 
 * @author Alexander Gurov
 */
public class CorrectRevisionOperation extends AbstractActionOperation {
    protected IRepositoryResource[] repositoryResources;
    protected long[] knownRevisions;
    protected GetLogMessagesOperation[] msgsOps;
    protected IResource[] resources;
    protected boolean hasWarning;
    protected boolean isCancel;

    public CorrectRevisionOperation(GetLogMessagesOperation msgsOp, IRepositoryResource repositoryResource,
            long knownRevision, IResource resource) {
        this(msgsOp == null ? null : new GetLogMessagesOperation[] { msgsOp },
                new IRepositoryResource[] { repositoryResource }, new long[] { knownRevision },
                new IResource[] { resource });
    }

    public CorrectRevisionOperation(GetLogMessagesOperation[] msgsOps, IRepositoryResource[] repositoryResources,
            long[] knownRevisions, IResource[] resources) {
        super("Operation_CorrectRevision", SVNUIMessages.class); //$NON-NLS-1$
        this.repositoryResources = repositoryResources;
        this.knownRevisions = knownRevisions;
        this.msgsOps = msgsOps;
        this.resources = resources;
    }

    public int getOperationWeight() {
        if (this.msgsOps == null) {
            return 0;
        }
        return super.getOperationWeight();
    }

    protected void runImpl(final IProgressMonitor monitor) throws Exception {
        for (int i = 0; i < this.repositoryResources.length; i++) {
            if (!this.repositoryResources[i].exists() && this.resources != null && this.resources[i] != null
                    && this.resources[i].getType() != IResource.PROJECT) {
                // calculate peg revision for the repository resource
                ILocalResource parent = SVNRemoteStorage.instance()
                        .asLocalResourceAccessible(this.resources[i].getParent());
                ILocalResource self = SVNRemoteStorage.instance().asLocalResourceAccessible(this.resources[i]);
                boolean switchedStateEquals = (parent.getChangeMask()
                        & ILocalResource.IS_SWITCHED) == (self.getChangeMask() & ILocalResource.IS_SWITCHED);
                if (switchedStateEquals) {
                    long parentRevision = parent.getRevision();
                    long selfRevision = self.getRevision();
                    long revision = parentRevision > selfRevision ? parentRevision : selfRevision;
                    if (revision != SVNRevision.INVALID_REVISION_NUMBER) {
                        this.repositoryResources[i].setPegRevision(SVNRevision.fromNumber(revision));
                    }
                } else {
                    this.repositoryResources[i].setPegRevision(SVNRevision.fromNumber(self.getRevision()));
                }
            }
            if (!this.repositoryResources[i].exists()
                    && this.knownRevisions[i] != SVNRevision.INVALID_REVISION_NUMBER) {
                this.hasWarning = true;
                SVNRevision rev = SVNRevision.fromNumber(this.knownRevisions[i]);
                this.repositoryResources[i].setSelectedRevision(rev);
                this.repositoryResources[i].setPegRevision(rev);
                if (this.msgsOps != null) {
                    this.msgsOps[i].setStartRevision(rev);
                }
            }
        }
        if (this.hasWarning) {
            UIMonitorUtility.getDisplay().syncExec(new Runnable() {
                public void run() {
                    boolean one = CorrectRevisionOperation.this.repositoryResources.length == 1;
                    MessageDialog dlg = new MessageDialog(UIMonitorUtility.getShell(),
                            CorrectRevisionOperation.this
                                    .getOperationResource(one ? "Title_Single" : "Title_Multi"), //$NON-NLS-1$ //$NON-NLS-2$
                            null,
                            CorrectRevisionOperation.this
                                    .getOperationResource(one ? "Message_Single" : "Message_Multi"), //$NON-NLS-1$ //$NON-NLS-2$
                            MessageDialog.WARNING,
                            new String[] { IDialogConstants.YES_LABEL, IDialogConstants.NO_LABEL }, 0);
                    if (dlg.open() != 0) {
                        monitor.setCanceled(true);
                        CorrectRevisionOperation.this.isCancel = true;
                    }
                }
            });
        }
    }

    public boolean hasWarning() {
        return this.hasWarning;
    }

    public boolean isCancel() {
        return this.isCancel;
    }

}