PageRenderTime 41ms CodeModel.GetById 20ms RepoModel.GetById 0ms app.codeStats 0ms

/src/main/java/com/atlassian/jira/plugins/bitbucket/DefaultSynchronizer.java

https://bitbucket.org/atlassian/jira-bitbucket-connector/
Java | 96 lines | 78 code | 12 blank | 6 comment | 1 complexity | 97746e17b047b0fe467cd8ca97eb1f2f MD5 | raw file
  1. package com.atlassian.jira.plugins.bitbucket;
  2. import java.util.List;
  3. import java.util.concurrent.ConcurrentMap;
  4. import java.util.concurrent.ExecutorService;
  5. import org.slf4j.Logger;
  6. import org.slf4j.LoggerFactory;
  7. import org.springframework.beans.factory.annotation.Qualifier;
  8. import com.atlassian.jira.plugins.bitbucket.api.Changeset;
  9. import com.atlassian.jira.plugins.bitbucket.api.Progress;
  10. import com.atlassian.jira.plugins.bitbucket.api.SourceControlRepository;
  11. import com.atlassian.jira.plugins.bitbucket.api.SynchronizationKey;
  12. import com.atlassian.jira.plugins.bitbucket.spi.RepositoryManager;
  13. import com.atlassian.jira.plugins.bitbucket.spi.SynchronisationOperation;
  14. import com.google.common.base.Function;
  15. import com.google.common.collect.MapMaker;
  16. /**
  17. * Synchronization services
  18. */
  19. public class DefaultSynchronizer implements Synchronizer
  20. {
  21. private final Logger log = LoggerFactory.getLogger(DefaultSynchronizer.class);
  22. private final ExecutorService executorService;
  23. private final RepositoryManager globalRepositoryManager;
  24. public DefaultSynchronizer(ExecutorService executorService, @Qualifier("globalRepositoryManager") RepositoryManager globalRepositoryManager)
  25. {
  26. this.executorService = executorService;
  27. this.globalRepositoryManager = globalRepositoryManager;
  28. }
  29. // map of ALL Synchronisation Progresses - running and finished ones
  30. private final ConcurrentMap<SynchronizationKey, DefaultProgress> progressMap = new MapMaker().makeMap();
  31. // map of currently running Synchronisations
  32. private final ConcurrentMap<SynchronizationKey, DefaultProgress> operations = new MapMaker()
  33. .makeComputingMap(new Function<SynchronizationKey, DefaultProgress>()
  34. {
  35. @Override
  36. public DefaultProgress apply(final SynchronizationKey from)
  37. {
  38. final DefaultProgress progress = new DefaultProgress();
  39. progressMap.put(from, progress);
  40. Runnable runnable = new Runnable()
  41. {
  42. @Override
  43. public void run()
  44. {
  45. try
  46. {
  47. progress.start();
  48. SynchronisationOperation synchronisationOperation = globalRepositoryManager
  49. .getSynchronisationOperation(from, progress);
  50. synchronisationOperation.synchronise();
  51. } catch (Throwable e)
  52. {
  53. String errorMessage = e.getMessage() == null ? e.toString() : e.getMessage();
  54. progress.setError(errorMessage);
  55. log.debug(e.getMessage(), e);
  56. } finally
  57. {
  58. progress.finish();
  59. // Removing sync operation from map of running progresses
  60. operations.remove(from);
  61. }
  62. }
  63. };
  64. executorService.submit(runnable);
  65. progress.queued();
  66. return progress;
  67. }
  68. });
  69. @Override
  70. public void synchronize(SourceControlRepository repository)
  71. {
  72. operations.get(new SynchronizationKey(repository));
  73. }
  74. @Override
  75. public void synchronize(SourceControlRepository repository, List<Changeset> changesets)
  76. {
  77. operations.get(new SynchronizationKey(repository, changesets));
  78. }
  79. @Override
  80. public Progress getProgress(final SourceControlRepository repository)
  81. {
  82. return progressMap.get(new SynchronizationKey(repository));
  83. }
  84. }