Skip to content

Commit fc98dab

Browse files
Get modified object list for selective pull using background jobs (#278)
1 parent 9becb9a commit fc98dab

File tree

5 files changed

+166
-12
lines changed

5 files changed

+166
-12
lines changed

org.abapgit.adt.backend/src/org/abapgit/adt/backend/IRepositoryService.java

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,22 @@ void repositoryChecks(IProgressMonitor monitor, IExternalRepositoryInfoRequest c
121121
IAbapGitPullModifiedObjects getModifiedObjects(IProgressMonitor monitor, IRepository currRepository,
122122
String user, String password);
123123

124+
/**
125+
* Returns the locally modified objects for the given repository via background job
126+
*
127+
* @param currRepository
128+
* Repository for which the modified Objects are to be fetched
129+
* @param user
130+
* User
131+
* @param password
132+
* Repository Password
133+
* @param monitor
134+
* Progress monitor
135+
* @return Modified Objects for the given repository
136+
*/
137+
IAbapGitPullModifiedObjects getModifiedObjectsWithBackgroundJob(IProgressMonitor monitor, IRepository currRepository, String user,
138+
String password);
139+
124140
//Valid for older backend before 2105 where selective pull feature is not supported
125141
/*
126142
* TODO: To be deleted after 2105 back end release with selective pull feature reaches all customers
@@ -169,4 +185,12 @@ IAbapObjects pullRepository(IRepository existingRepository, String branch, Strin
169185
IAbapObjects pullRepository(IRepository existingRepository, String branch, String transportRequest, String user, String password,
170186
IAbapGitPullModifiedObjects selectedObjectsToPull, IProgressMonitor monitor);
171187

188+
/**
189+
* Check if background jobs is supported
190+
*
191+
* @param monitor
192+
* Progress Monitor
193+
* @return If background job is possible or not.
194+
*/
195+
boolean isBackgroundJobSupported(IProgressMonitor monitor);
172196
}

org.abapgit.adt.backend/src/org/abapgit/adt/backend/internal/RepositoryService.java

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,12 +16,14 @@
1616
import org.abapgit.adt.backend.model.agitpullmodifiedobjects.IAbapGitPullModifiedObjects;
1717
import org.eclipse.core.runtime.IProgressMonitor;
1818

19+
import com.sap.adt.communication.background.AdtBackgroundRestResourceFactory;
1920
import com.sap.adt.communication.content.IContentHandler;
2021
import com.sap.adt.communication.message.HeadersFactory;
2122
import com.sap.adt.communication.message.IHeaders;
2223
import com.sap.adt.communication.resources.AdtRestResourceFactory;
2324
import com.sap.adt.communication.resources.IRestResource;
2425
import com.sap.adt.communication.resources.UriBuilder;
26+
import com.sap.adt.compatibility.background.AdtBackgroundRunUriDiscoveryFactory;
2527
import com.sap.adt.compatibility.exceptions.OutDatedClientException;
2628
import com.sap.adt.compatibility.filter.AdtCompatibleRestResourceFilterFactory;
2729
import com.sap.adt.compatibility.filter.IAdtCompatibleRestResourceFilter;
@@ -331,4 +333,48 @@ public IAbapObjects pullRepository(IRepository existingRepository, String branch
331333
return restResource.post(monitor, IAbapObjects.class, abapGitPullReq);
332334
}
333335

336+
@Override
337+
public boolean isBackgroundJobSupported(IProgressMonitor monitor) {
338+
// check whether background job framework is available and is accessible by the user.
339+
// if not available or not authorized the uri would be null.
340+
if (AdtBackgroundRunUriDiscoveryFactory.createBackgroundRunUriDiscovery(this.destinationId)
341+
.getBackgroundRunUriIfAuthorized(monitor) != null) {
342+
return true;
343+
}
344+
return false;
345+
}
346+
347+
private IRestResource getBackgroundRestResource(String uri, String destinationId, IProgressMonitor monitor) {
348+
URI backgroundUri = AdtBackgroundRunUriDiscoveryFactory.createBackgroundRunUriDiscovery(destinationId)
349+
.getBackgroundRunUriIfAuthorized(monitor);
350+
if (backgroundUri != null) {
351+
return AdtBackgroundRestResourceFactory.createBackgroundRestResourceFactory().createResourceWithStatelessSession(backgroundUri,
352+
URI.create(uri), destinationId);
353+
}
354+
return AdtRestResourceFactory.createRestResourceFactory().createResourceWithStatelessSession(URI.create(uri), destinationId);
355+
}
356+
357+
@Override
358+
public IAbapGitPullModifiedObjects getModifiedObjectsWithBackgroundJob(IProgressMonitor monitor, IRepository currRepository,
359+
String user, String password) {
360+
URI uriToModifiedObjects = getURIFromAtomLink(currRepository, IRepositoryService.RELATION_MODIFIED_OBJECTS);
361+
362+
IHeaders headers = null;
363+
if (user != null && password != null) {
364+
headers = getHttpHeadersForCredentials(user, password);
365+
}
366+
367+
IRestResource restResource = getBackgroundRestResource(uriToModifiedObjects.getPath(), this.destinationId, monitor);
368+
369+
IContentHandler<IAbapGitPullModifiedObjects> responseContentHandlerV1 = new AbapGitPullModifiedObjectsContentHandlerV1();
370+
restResource.addContentHandler(responseContentHandlerV1);
371+
372+
IAdtCompatibleRestResourceFilter compatibilityFilter = AdtCompatibleRestResourceFilterFactory
373+
.createFilter(responseContentHandlerV1);
374+
restResource.addRequestFilter(compatibilityFilter);
375+
restResource.addResponseFilter(compatibilityFilter);
376+
377+
return restResource.get(monitor, headers, IAbapGitPullModifiedObjects.class);
378+
}
379+
334380
}

org.abapgit.adt.ui/src/org/abapgit/adt/ui/internal/i18n/messages.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ AbapGitWizardPageBranchAndPackage_chbox_activate_tooltip=Try to activate all obj
7373
AbapGitWizardPageBranchAndPackage_btn_browse=Browse...
7474
AbapGitWizardPageBranchAndPackage_combobox_branch_message=Specify a branch
7575
AbapGitWizardPageBranchAndPackage_description=Select repository branch, target ABAP package
76-
AbapGitWizardPageBranchAndPackage_FetchingModifiedObjectsForPull=Fetching objects differing between local and remote repository.
76+
AbapGitWizardPageBranchAndPackage_FetchingModifiedObjectsForPull=Fetching objects differing between local and remote repository...
7777
AbapGitWizardPageBranchAndPackageAndFolderLogic_description=Select repository branch, target ABAP package and folder logic
7878
AbapGitWizardPageBranchAndPackage_label_branch=Branch\:
7979
AbapGitWizardPageBranchAndPackage_label_package=Package\:

org.abapgit.adt.ui/src/org/abapgit/adt/ui/internal/util/RepositoryUtil.java

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,8 +58,14 @@ public static String getBranchNameFromRef(String branchRef) {
5858
*/
5959

6060
public static void fetchAndExtractModifiedObjectsToPull(IRepository repository, IRepositoryService repoService, CloneData cloneData) {
61-
IAbapGitPullModifiedObjects abapPullModifiedObjects = repoService.getModifiedObjects(new NullProgressMonitor(), repository,
62-
cloneData.user, cloneData.pass);
61+
IAbapGitPullModifiedObjects abapPullModifiedObjects;
62+
if (repoService.isBackgroundJobSupported(new NullProgressMonitor())) {
63+
abapPullModifiedObjects = repoService.getModifiedObjectsWithBackgroundJob(new NullProgressMonitor(), repository, cloneData.user,
64+
cloneData.pass);
65+
}else {
66+
abapPullModifiedObjects = repoService.getModifiedObjects(new NullProgressMonitor(), repository,
67+
cloneData.user, cloneData.pass);
68+
}
6369

6470
//Client side adjustment to the overwrite objects, and remove any objects from the package warning objects.
6571
//TODO Fix this in the backend.

org.abapgit.adt.ui/src/org/abapgit/adt/ui/internal/wizards/AbapGitWizardPageBranchAndPackage.java

Lines changed: 87 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -16,14 +16,19 @@
1616
import org.abapgit.adt.backend.model.abapgitexternalrepo.IBranch;
1717
import org.abapgit.adt.backend.model.abapgitrepositories.IRepository;
1818
import org.abapgit.adt.backend.model.abapgitrepositories.IRepository.FolderLogic;
19+
import org.abapgit.adt.ui.AbapGitUIPlugin;
1920
import org.abapgit.adt.ui.internal.i18n.Messages;
2021
import org.abapgit.adt.ui.internal.util.AbapGitUIServiceFactory;
2122
import org.abapgit.adt.ui.internal.util.IAbapGitService;
2223
import org.abapgit.adt.ui.internal.util.RepositoryUtil;
2324
import org.abapgit.adt.ui.internal.wizards.AbapGitWizard.CloneData;
2425
import org.eclipse.core.resources.IProject;
2526
import org.eclipse.core.runtime.IProgressMonitor;
27+
import org.eclipse.core.runtime.IStatus;
2628
import org.eclipse.core.runtime.NullProgressMonitor;
29+
import org.eclipse.core.runtime.OperationCanceledException;
30+
import org.eclipse.core.runtime.Status;
31+
import org.eclipse.core.runtime.jobs.Job;
2732
import org.eclipse.jface.dialogs.DialogPage;
2833
import org.eclipse.jface.layout.GridDataFactory;
2934
import org.eclipse.jface.operation.IRunnableWithProgress;
@@ -38,11 +43,16 @@
3843
import org.eclipse.swt.SWT;
3944
import org.eclipse.swt.events.SelectionAdapter;
4045
import org.eclipse.swt.events.SelectionEvent;
46+
import org.eclipse.swt.layout.GridData;
4147
import org.eclipse.swt.layout.GridLayout;
4248
import org.eclipse.swt.widgets.Button;
4349
import org.eclipse.swt.widgets.Composite;
50+
import org.eclipse.swt.widgets.Display;
4451
import org.eclipse.swt.widgets.Label;
52+
import org.eclipse.swt.widgets.ProgressBar;
4553

54+
import com.sap.adt.communication.exceptions.CommunicationException;
55+
import com.sap.adt.communication.resources.ResourceException;
4656
import com.sap.adt.tools.core.model.adtcore.IAdtObjectReference;
4757
import com.sap.adt.tools.core.ui.packages.AdtPackageProposalProviderFactory;
4858
import com.sap.adt.tools.core.ui.packages.AdtPackageServiceUIFactory;
@@ -68,6 +78,10 @@ public class AbapGitWizardPageBranchAndPackage extends WizardPage {
6878
private boolean backButtonEnabled = true;
6979
private final ApackParameters lastApackCall;
7080

81+
private ProgressBar progressBar;
82+
83+
private Label progressBarLabel;
84+
7185
public AbapGitWizardPageBranchAndPackage(IProject project, String destination, CloneData cloneData, Boolean pullAction) {
7286
super(PAGE_NAME);
7387
this.project = project;
@@ -175,6 +189,8 @@ public void widgetSelected(SelectionEvent event) {
175189
});
176190
}
177191

192+
createProgressBarComposite(container);
193+
178194
setControl(container);
179195

180196
if (this.cloneData.url != null) {
@@ -197,6 +213,35 @@ public void widgetSelected(SelectionEvent event) {
197213
}
198214
}
199215

216+
private void createProgressBarComposite(Composite container) {
217+
Composite progressBarComposite = new Composite(container, SWT.NONE);
218+
progressBarComposite.setLayout(new GridLayout(1, false)); // 1 column layout
219+
220+
this.progressBarLabel = new Label(progressBarComposite, SWT.NONE);
221+
this.progressBarLabel.setText(Messages.AbapGitWizardPageBranchAndPackage_FetchingModifiedObjectsForPull);
222+
this.progressBarLabel.setLayoutData(new GridData(SWT.BEGINNING, SWT.END, true, false));
223+
224+
this.progressBar = new ProgressBar(progressBarComposite, SWT.INDETERMINATE);
225+
GridData pBGD = new GridData(SWT.FILL, SWT.END, true, false);
226+
this.progressBar.setLayoutData(pBGD);
227+
228+
GridData pbCompGD = new GridData(SWT.FILL, SWT.END, true, true);
229+
pbCompGD.horizontalSpan = 3;
230+
progressBarComposite.setLayoutData(pbCompGD);
231+
232+
setProgressVisible(false);
233+
}
234+
235+
public void setProgressVisible(boolean visible) {
236+
if (this.progressBar != null && !this.progressBar.isDisposed()) {
237+
this.progressBar.setVisible(visible);
238+
}
239+
240+
if (this.progressBarLabel != null && !this.progressBarLabel.isDisposed()) {
241+
this.progressBarLabel.setVisible(visible);
242+
}
243+
}
244+
200245
private void setLnpSequence(boolean chboxValue) {
201246
this.chboxLinkAndPull = chboxValue;
202247
}
@@ -302,7 +347,7 @@ public void setVisible(boolean visible) {
302347

303348
@Override
304349
public boolean canFlipToNextPage() {
305-
return true;
350+
return true && isPageComplete();
306351
}
307352

308353
@Override
@@ -316,18 +361,51 @@ public IWizardPage getNextPage() {
316361
// This is valid only for back end versions from 2105 where selective pull is supported.
317362
// If selectivePull is not supported, fetching modified objects is not required and all objects are to be pulled
318363
if (abapGitService.isSelectivePullSupported(repository)) {
319-
try {
320-
getContainer().run(true, true, new IRunnableWithProgress() {
364+
setPageComplete(false);
365+
setProgressVisible(true);
321366

322-
@Override
323-
public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
324-
monitor.beginTask(Messages.AbapGitWizardPageBranchAndPackage_FetchingModifiedObjectsForPull, IProgressMonitor.UNKNOWN);
367+
Job myRequestJob = new Job(Messages.AbapGitWizardPageBranchAndPackage_FetchingModifiedObjectsForPull) {
368+
369+
@Override
370+
protected IStatus run(IProgressMonitor monitor) {
371+
try {
372+
if (monitor.isCanceled()) {
373+
return Status.CANCEL_STATUS;
374+
}
325375
RepositoryUtil.fetchAndExtractModifiedObjectsToPull(repository, repoService,
326376
AbapGitWizardPageBranchAndPackage.this.cloneData);
377+
378+
if (monitor.isCanceled()) {
379+
return Status.CANCEL_STATUS;
380+
}
381+
} catch (CommunicationException e) {
382+
return new Status(IStatus.ERROR, AbapGitUIPlugin.PLUGIN_ID, e.getLocalizedMessage(), e);
383+
} catch (ResourceException e) {
384+
return new Status(IStatus.ERROR, AbapGitUIPlugin.PLUGIN_ID, e.getLocalizedMessage(), e);
385+
} catch (OperationCanceledException e) {
386+
return new Status(IStatus.ERROR, AbapGitUIPlugin.PLUGIN_ID, e.getLocalizedMessage(), e);
387+
} finally {
388+
monitor.done();
327389
}
328-
});
329-
} catch (InvocationTargetException | InterruptedException e) {
330-
setMessage(e.getMessage(), DialogPage.ERROR);
390+
return Status.OK_STATUS;
391+
}
392+
};
393+
394+
myRequestJob.setUser(true);
395+
myRequestJob.schedule();
396+
397+
// wait for the job to finish
398+
Display display = Display.getDefault();
399+
while (myRequestJob.getResult() == null) {
400+
if (!display.readAndDispatch()) {
401+
display.sleep();
402+
}
403+
}
404+
405+
setProgressVisible(false);
406+
407+
if (myRequestJob.getResult().getSeverity() != Status.OK && myRequestJob.getResult().getSeverity() != Status.INFO) {
408+
setErrorMessage(myRequestJob.getResult().getMessage());
331409
setPageComplete(false);
332410
return null;
333411
}

0 commit comments

Comments
 (0)