diff --git a/org.abapgit.adt.backend/src/org/abapgit/adt/backend/IRepositoryService.java b/org.abapgit.adt.backend/src/org/abapgit/adt/backend/IRepositoryService.java index c059c1dd..2358224e 100644 --- a/org.abapgit.adt.backend/src/org/abapgit/adt/backend/IRepositoryService.java +++ b/org.abapgit.adt.backend/src/org/abapgit/adt/backend/IRepositoryService.java @@ -18,6 +18,7 @@ public interface IRepositoryService { String RELATION_PULL = "http://www.sap.com/adt/abapgit/relations/pull"; //$NON-NLS-1$ + String RELATION_PULL_WITH_BG_RUN = "http://www.sap.com/adt/abapgit/relations/pull/v2"; //$NON-NLS-1$ String RELATION_STATUS = "http://www.sap.com/adt/abapgit/relations/status"; //$NON-NLS-1$ String RELATION_LOG = "http://www.sap.com/adt/abapgit/relations/log"; //$NON-NLS-1$ String RELATION_STAGE = "http://www.sap.com/adt/abapgit/relations/stage"; //$NON-NLS-1$ diff --git a/org.abapgit.adt.backend/src/org/abapgit/adt/backend/internal/RepositoryService.java b/org.abapgit.adt.backend/src/org/abapgit/adt/backend/internal/RepositoryService.java index 9b0c593a..b80271ab 100644 --- a/org.abapgit.adt.backend/src/org/abapgit/adt/backend/internal/RepositoryService.java +++ b/org.abapgit.adt.backend/src/org/abapgit/adt/backend/internal/RepositoryService.java @@ -101,7 +101,8 @@ public IAbapObjects cloneRepository(String url, String branch, String targetPack IContentHandler responseContentHandlerV1 = new AbapObjectContentHandlerV1(); restResource.addContentHandler(responseContentHandlerV1); - IAdtCompatibleRestResourceFilter compatibilityFilter = AdtCompatibleRestResourceFilterFactory.createFilter(responseContentHandlerV1); + IAdtCompatibleRestResourceFilter compatibilityFilter = AdtCompatibleRestResourceFilterFactory + .createFilter(responseContentHandlerV1); restResource.addRequestFilter(compatibilityFilter); return restResource.post(monitor, IAbapObjects.class, repository); @@ -204,8 +205,7 @@ public void repositoryChecks(IProgressMonitor monitor, IExternalRepositoryInfoRe restResource.addRequestFilter(compatibilityFilter); restResource.addResponseFilter(compatibilityFilter); if (credentials != null) { - headers = getHttpHeadersForCredentials(credentials.getUser(), - credentials.getPassword()); + headers = getHttpHeadersForCredentials(credentials.getUser(), credentials.getPassword()); } restResource.post(monitor, headers, null); } @@ -267,8 +267,8 @@ public URI getURIFromAtomLink(IRepository repository, String relation) { } @Override - public IAbapGitPullModifiedObjects getModifiedObjects(IProgressMonitor monitor, IRepository currRepository, - String user, String password) throws OutDatedClientException { + public IAbapGitPullModifiedObjects getModifiedObjects(IProgressMonitor monitor, IRepository currRepository, String user, + String password) throws OutDatedClientException { URI uriToModifiedObjects = getURIFromAtomLink(currRepository, IRepositoryService.RELATION_MODIFIED_OBJECTS); IHeaders headers = null; @@ -277,8 +277,7 @@ public IAbapGitPullModifiedObjects getModifiedObjects(IProgressMonitor monitor, } IRestResource restResource = AdtRestResourceFactory.createRestResourceFactory() - .createResourceWithStatelessSession(uriToModifiedObjects, - this.destinationId); + .createResourceWithStatelessSession(uriToModifiedObjects, this.destinationId); IContentHandler responseContentHandlerV1 = new AbapGitPullModifiedObjectsContentHandlerV1(); restResource.addContentHandler(responseContentHandlerV1); @@ -295,10 +294,22 @@ public IAbapGitPullModifiedObjects getModifiedObjects(IProgressMonitor monitor, @Override public IAbapObjects pullRepository(IRepository existingRepository, String branch, String transportRequest, String user, String password, IAbapGitPullModifiedObjects selectedObjectsToPull, IProgressMonitor monitor) { - URI uriToRepo = getURIFromAtomLink(existingRepository, IRepositoryService.RELATION_PULL); - IRestResource restResource = AdtRestResourceFactory.createRestResourceFactory().createResourceWithStatelessSession(uriToRepo, - this.destinationId); - + IRestResource restResource = null; + URI uriToRepo = null; + if (isBackgroundJobSupported(monitor)) { + uriToRepo = getURIFromAtomLink(existingRepository, IRepositoryService.RELATION_PULL_WITH_BG_RUN); + if (uriToRepo != null) { + restResource = getBackgroundRestResource(uriToRepo.getPath(), this.destinationId, monitor); + } + } + if (restResource == null) { + uriToRepo = getURIFromAtomLink(existingRepository, IRepositoryService.RELATION_PULL); + restResource = AdtRestResourceFactory.createRestResourceFactory().createResourceWithStatelessSession(uriToRepo, + this.destinationId); + } + if (restResource == null) { + throw new IllegalStateException("Unable to create REST resource for pull operation."); //$NON-NLS-1$ + } IContentHandler requestContentHandlerV1 = new AbapGitPullRequestContentHandler(); restResource.addContentHandler(requestContentHandlerV1); @@ -316,9 +327,9 @@ public IAbapObjects pullRepository(IRepository existingRepository, String branch } if (selectedObjectsToPull != null) { - abapGitPullReq.setPackageWarningObjects(selectedObjectsToPull.getPackageWarningObjects()); - abapGitPullReq.setOverwriteObjects(selectedObjectsToPull.getOverwriteObjects()); - } + abapGitPullReq.setPackageWarningObjects(selectedObjectsToPull.getPackageWarningObjects()); + abapGitPullReq.setOverwriteObjects(selectedObjectsToPull.getOverwriteObjects()); + } IAdtCompatibleRestResourceFilter compatibilityFilter = AdtCompatibleRestResourceFilterFactory.createFilter(new IContentHandler[0]); restResource.addRequestFilter(compatibilityFilter); diff --git a/org.abapgit.adt.ui/src/org/abapgit/adt/ui/internal/repositories/AbapGitView.java b/org.abapgit.adt.ui/src/org/abapgit/adt/ui/internal/repositories/AbapGitView.java index 45cdc490..a2fd7f3e 100644 --- a/org.abapgit.adt.ui/src/org/abapgit/adt/ui/internal/repositories/AbapGitView.java +++ b/org.abapgit.adt.ui/src/org/abapgit/adt/ui/internal/repositories/AbapGitView.java @@ -561,11 +561,10 @@ public void run() { } WizardDialog wizardDialog = new WizardDialog(AbapGitView.this.viewer.getControl().getShell(), - new AbapGitWizardPull(AbapGitView.this.lastProject, this.selRepo, allRepositories)); + new AbapGitWizardPull(AbapGitView.this.lastProject, this.selRepo, allRepositories, AbapGitView.this)); wizardDialog.open(); - } - updateView(true); + } } }; this.actionPullWizard.setText(Messages.AbapGitView_context_pull); diff --git a/org.abapgit.adt.ui/src/org/abapgit/adt/ui/internal/wizards/AbapGitWizardPull.java b/org.abapgit.adt.ui/src/org/abapgit/adt/ui/internal/wizards/AbapGitWizardPull.java index bd5778a7..67ebc5c1 100644 --- a/org.abapgit.adt.ui/src/org/abapgit/adt/ui/internal/wizards/AbapGitWizardPull.java +++ b/org.abapgit.adt.ui/src/org/abapgit/adt/ui/internal/wizards/AbapGitWizardPull.java @@ -4,6 +4,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Set; import org.abapgit.adt.backend.IApackManifest; import org.abapgit.adt.backend.IApackManifest.IApackDependency; @@ -14,11 +15,16 @@ import org.abapgit.adt.backend.model.agitpullmodifiedobjects.IAbapGitPullModifiedObjects; import org.abapgit.adt.ui.AbapGitUIPlugin; import org.abapgit.adt.ui.internal.i18n.Messages; +import org.abapgit.adt.ui.internal.repositories.AbapGitView; +import org.abapgit.adt.ui.internal.repositories.IRepositoryModifiedObjects; import org.abapgit.adt.ui.internal.util.AbapGitUIServiceFactory; import org.abapgit.adt.ui.internal.wizards.AbapGitWizard.CloneData; import org.eclipse.core.resources.IProject; import org.eclipse.core.runtime.Assert; import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.core.runtime.IStatus; +import org.eclipse.core.runtime.Status; +import org.eclipse.core.runtime.jobs.Job; import org.eclipse.jface.dialogs.DialogPage; import org.eclipse.jface.dialogs.IMessageProvider; import org.eclipse.jface.dialogs.IPageChangingListener; @@ -63,11 +69,12 @@ public class AbapGitWizardPull extends Wizard { private AbapGitWizardPageObjectsSelectionForPull pageOverwriteObjectsSelection; private AbapGitWizardPageObjectsSelectionForPull pagePackageWarningObjectsSelection; public IAdtTransportService transportService; + private final AbapGitView abapGitView; public IAdtTransportSelectionWizardPage transportPage; public IRepository selRepoData; public List allRepositories; - public AbapGitWizardPull(IProject project, IRepository selRepo, List allRepositories) { + public AbapGitWizardPull(IProject project, IRepository selRepo, List allRepositories, AbapGitView view) { this.project = project; this.destination = AdtProjectServiceFactory.createProjectService().getDestinationId(project); this.cloneData = new CloneData(); @@ -76,7 +83,7 @@ public AbapGitWizardPull(IProject project, IRepository selRepo, List(); - + this.abapGitView = view; getPackageAndRepoType(); setWindowTitle(Messages.AbapGitWizardPull_title); @@ -148,61 +155,67 @@ public void addPages() { @Override public boolean performFinish() { - try { - getContainer().run(true, true, new IRunnableWithProgress() { + // Extracting variable earlier to ensure consistency in asynchronous code flow + Set overwriteObjects = AbapGitWizardPull.this.pageOverwriteObjectsSelection.getSelectedObjects(); + Set packageWarningObjects = AbapGitWizardPull.this.pagePackageWarningObjectsSelection + .getSelectedObjects(); - @Override - public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException { + Job pullRepoJob = new Job(Messages.AbapGitWizard_task_pulling_repository) { + @Override + protected IStatus run(IProgressMonitor monitor) { + try { monitor.beginTask(Messages.AbapGitWizard_task_pulling_repository, IProgressMonitor.UNKNOWN); + IRepositoryService repoService = RepositoryServiceFactory.createRepositoryService(AbapGitWizardPull.this.destination, monitor); - //get the selected objects to be pulled + // Get the selected objects to be pulled AbapGitWizardPull.this.repoToSelectedObjects = AbapGitUIServiceFactory.createAbapGitPullService() - .getSelectedObjectsToPullforRepo(AbapGitWizardPull.this.pageOverwriteObjectsSelection.getSelectedObjects(), - AbapGitWizardPull.this.pagePackageWarningObjectsSelection.getSelectedObjects()); + .getSelectedObjectsToPullforRepo(overwriteObjects, packageWarningObjects); - //pull the selected objects + // Pull the selected objects repoService.pullRepository(AbapGitWizardPull.this.selRepoData, AbapGitWizardPull.this.selRepoData.getBranchName(), AbapGitWizardPull.this.transportPage.getTransportRequestNumber(), AbapGitWizardPull.this.cloneData.user, AbapGitWizardPull.this.cloneData.pass, AbapGitWizardPull.this.repoToSelectedObjects.get(AbapGitWizardPull.this.selRepoData.getUrl()), monitor); + // Pull dependencies if any if (AbapGitWizardPull.this.cloneData.hasDependencies()) { pullDependencies(monitor, repoService); } + + return Status.OK_STATUS; + } catch (ResourceException e) { + return new Status(IStatus.ERROR, AbapGitUIPlugin.PLUGIN_ID, e.getMessage(), e); + } finally { + PlatformUI.getWorkbench().getDisplay().asyncExec(() -> { + AbapGitWizardPull.this.abapGitView.refresh(); + }); } + } - private void pullDependencies(IProgressMonitor monitor, IRepositoryService repoService) { - for (IApackDependency apackDependency : AbapGitWizardPull.this.cloneData.apackManifest.getDescriptor() - .getDependencies()) { - if (apackDependency.requiresSynchronization()) { - IRepository dependencyRepository = repoService.getRepositoryByURL(AbapGitWizardPull.this.cloneData.repositories, - apackDependency.getGitUrl()); - if (dependencyRepository != null) { - repoService.pullRepository(dependencyRepository, IApackManifest.MASTER_BRANCH, - AbapGitWizardPull.this.transportPage.getTransportRequestNumber(), - AbapGitWizardPull.this.cloneData.user, AbapGitWizardPull.this.cloneData.pass, - AbapGitWizardPull.this.repoToSelectedObjects.get(dependencyRepository.getUrl()), monitor); + private void pullDependencies(IProgressMonitor monitor, IRepositoryService repoService) { + for (IApackDependency apackDependency : AbapGitWizardPull.this.cloneData.apackManifest.getDescriptor().getDependencies()) { + if (apackDependency.requiresSynchronization()) { + IRepository dependencyRepository = repoService.getRepositoryByURL(AbapGitWizardPull.this.cloneData.repositories, + apackDependency.getGitUrl()); + if (dependencyRepository != null) { + repoService.pullRepository(dependencyRepository, IApackManifest.MASTER_BRANCH, + AbapGitWizardPull.this.transportPage.getTransportRequestNumber(), AbapGitWizardPull.this.cloneData.user, + AbapGitWizardPull.this.cloneData.pass, + AbapGitWizardPull.this.repoToSelectedObjects.get(dependencyRepository.getUrl()), monitor); + } } } } - } - }); - return true; + }; + + pullRepoJob.setUser(true); // Shows the job in progress view + pullRepoJob.schedule(); + + return true; - } catch (InterruptedException e) { - return false; - } catch (InvocationTargetException e) { - ((WizardPage) getContainer().getCurrentPage()).setPageComplete(false); - ((WizardPage) getContainer().getCurrentPage()).setMessage(e.getTargetException().getMessage(), DialogPage.ERROR); - return false; - } catch (ResourceException e) { - ((WizardPage) getContainer().getCurrentPage()).setPageComplete(false); - ((WizardPage) getContainer().getCurrentPage()).setMessage(e.getMessage(), DialogPage.ERROR); - return false; - } } @Override diff --git a/org.abapgit.adt.ui/src/org/abapgit/adt/ui/internal/wizards/AbapGitWizardSelectivePullAfterLink.java b/org.abapgit.adt.ui/src/org/abapgit/adt/ui/internal/wizards/AbapGitWizardSelectivePullAfterLink.java index 30c4b538..7b573878 100644 --- a/org.abapgit.adt.ui/src/org/abapgit/adt/ui/internal/wizards/AbapGitWizardSelectivePullAfterLink.java +++ b/org.abapgit.adt.ui/src/org/abapgit/adt/ui/internal/wizards/AbapGitWizardSelectivePullAfterLink.java @@ -1,8 +1,8 @@ package org.abapgit.adt.ui.internal.wizards; -import java.lang.reflect.InvocationTargetException; import java.util.HashMap; import java.util.Map; +import java.util.Set; import org.abapgit.adt.backend.IApackManifest; import org.abapgit.adt.backend.IApackManifest.IApackDependency; @@ -13,20 +13,24 @@ import org.abapgit.adt.backend.model.agitpullmodifiedobjects.IAbapGitPullModifiedObjects; import org.abapgit.adt.ui.AbapGitUIPlugin; import org.abapgit.adt.ui.internal.i18n.Messages; +import org.abapgit.adt.ui.internal.repositories.IRepositoryModifiedObjects; import org.abapgit.adt.ui.internal.util.AbapGitUIServiceFactory; import org.abapgit.adt.ui.internal.wizards.AbapGitWizard.CloneData; import org.eclipse.core.resources.IProject; import org.eclipse.core.runtime.Assert; import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.NullProgressMonitor; +import org.eclipse.core.runtime.Status; +import org.eclipse.core.runtime.jobs.Job; import org.eclipse.jface.dialogs.DialogPage; import org.eclipse.jface.dialogs.IMessageProvider; -import org.eclipse.jface.operation.IRunnableWithProgress; import org.eclipse.jface.wizard.IWizardContainer; import org.eclipse.jface.wizard.IWizardPage; import org.eclipse.jface.wizard.Wizard; import org.eclipse.jface.wizard.WizardDialog; import org.eclipse.jface.wizard.WizardPage; +import org.eclipse.ui.PlatformUI; import org.eclipse.ui.plugin.AbstractUIPlugin; import com.sap.adt.communication.resources.ResourceException; @@ -75,63 +79,72 @@ public void addPages() { @Override public boolean performFinish() { - try { - getContainer().run(true, true, new IRunnableWithProgress() { + Set overwriteObjects = AbapGitWizardSelectivePullAfterLink.this.pageOverwriteObjectsSelection + .getSelectedObjects(); + Set packageWarningObjects = AbapGitWizardSelectivePullAfterLink.this.pagePackageWarningObjectsSelection + .getSelectedObjects(); - @Override - public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException { - monitor.beginTask(Messages.AbapGitWizard_task_pulling_repository, IProgressMonitor.UNKNOWN); - IRepositories repositories = AbapGitWizardSelectivePullAfterLink.this.repoService.getRepositories(monitor); + String repoUrl = AbapGitWizardSelectivePullAfterLink.this.cloneData.url; + String user = AbapGitWizardSelectivePullAfterLink.this.cloneData.user; + String pass = AbapGitWizardSelectivePullAfterLink.this.cloneData.pass; + String transportRequest = AbapGitWizardSelectivePullAfterLink.this.transportRequest; + + Job pullRepoJob = new Job(Messages.AbapGitWizard_task_pulling_repository) { + @Override + protected IStatus run(IProgressMonitor monitor) { + try { + monitor.beginTask(Messages.AbapGitWizard_task_pulling_repository, IProgressMonitor.UNKNOWN); + IRepositoryService repoService = AbapGitWizardSelectivePullAfterLink.this.repoService; + IRepositories repositories = repoService.getRepositories(monitor); AbapGitWizardSelectivePullAfterLink.this.repoToSelectedObjectsMap = AbapGitUIServiceFactory.createAbapGitPullService() - .getSelectedObjectsToPullforRepo( - AbapGitWizardSelectivePullAfterLink.this.pageOverwriteObjectsSelection.getSelectedObjects(), - AbapGitWizardSelectivePullAfterLink.this.pagePackageWarningObjectsSelection.getSelectedObjects()); - - IRepository repository = AbapGitWizardSelectivePullAfterLink.this.repoService.getRepositoryByURL(repositories, - AbapGitWizardSelectivePullAfterLink.this.cloneData.url); - AbapGitWizardSelectivePullAfterLink.this.repoService.pullRepository(repository, repository.getBranchName(), - AbapGitWizardSelectivePullAfterLink.this.transportRequest, - AbapGitWizardSelectivePullAfterLink.this.cloneData.user, AbapGitWizardSelectivePullAfterLink.this.cloneData.pass, - AbapGitWizardSelectivePullAfterLink.this.repoToSelectedObjectsMap - .get(repository.getUrl()), - monitor); + .getSelectedObjectsToPullforRepo(overwriteObjects, packageWarningObjects); + IRepository repository = repoService.getRepositoryByURL(repositories, repoUrl); + repoService.pullRepository(repository, repository.getBranchName(), transportRequest, user, pass, + AbapGitWizardSelectivePullAfterLink.this.repoToSelectedObjectsMap.get(repository.getUrl()), monitor); + + // Pull dependencies if any if (AbapGitWizardSelectivePullAfterLink.this.cloneData.hasDependencies()) { - pullDependencies(monitor, AbapGitWizardSelectivePullAfterLink.this.repoService); + pullDependencies(monitor, repoService); } + + return Status.OK_STATUS; + } catch (Exception e) { + PlatformUI.getWorkbench().getDisplay().asyncExec(() -> { + WizardPage page = (WizardPage) AbapGitWizardSelectivePullAfterLink.this.getContainer().getCurrentPage(); + page.setPageComplete(false); + page.setMessage(e.getMessage(), DialogPage.ERROR); + }); + return new Status(IStatus.ERROR, AbapGitUIPlugin.PLUGIN_ID, e.getMessage(), e); } + } - private void pullDependencies(IProgressMonitor monitor, IRepositoryService repoService) { - for (IApackDependency apackDependency : AbapGitWizardSelectivePullAfterLink.this.cloneData.apackManifest.getDescriptor() - .getDependencies()) { - if (apackDependency.requiresSynchronization()) { - IRepository dependencyRepository = RepositoryServiceFactory.createRepositoryService(AbapGitWizardSelectivePullAfterLink.this.destination, - monitor).getRepositoryByURL(repoService.getRepositories(monitor), apackDependency.getGitUrl()); - if (dependencyRepository != null) { - repoService.pullRepository(dependencyRepository, IApackManifest.MASTER_BRANCH, - AbapGitWizardSelectivePullAfterLink.this.transportRequest, - AbapGitWizardSelectivePullAfterLink.this.cloneData.user, - AbapGitWizardSelectivePullAfterLink.this.cloneData.pass, - AbapGitWizardSelectivePullAfterLink.this.repoToSelectedObjectsMap.get(dependencyRepository.getUrl()), - monitor); - } - } + private void pullDependencies(IProgressMonitor monitor, IRepositoryService repoService) { + for (IApackDependency apackDependency : AbapGitWizardSelectivePullAfterLink.this.cloneData.apackManifest.getDescriptor() + .getDependencies()) { + if (!apackDependency.requiresSynchronization()) { + continue; + } + IRepository dependencyRepository = RepositoryServiceFactory + .createRepositoryService(AbapGitWizardSelectivePullAfterLink.this.destination, monitor) + .getRepositoryByURL(repoService.getRepositories(monitor), apackDependency.getGitUrl()); + + if (dependencyRepository != null) { + repoService.pullRepository(dependencyRepository, IApackManifest.MASTER_BRANCH, transportRequest, user, pass, + AbapGitWizardSelectivePullAfterLink.this.repoToSelectedObjectsMap.get(dependencyRepository.getUrl()), + monitor); } } - }); - - return true; + } + }; - } catch (InterruptedException e) { - return false; - } catch (InvocationTargetException e) { - ((WizardPage) getContainer().getCurrentPage()).setPageComplete(false); - ((WizardPage) getContainer().getCurrentPage()).setMessage(e.getTargetException().getMessage(), DialogPage.ERROR); - return false; - } + pullRepoJob.setUser(true); // show in Progress View / UI + pullRepoJob.schedule(); + return true; } + @Override public void setContainer(IWizardContainer wizardContainer) { super.setContainer(wizardContainer);