diff --git a/wsmaster/che-core-api-factory/src/main/java/org/eclipse/che/api/factory/server/FactoryService.java b/wsmaster/che-core-api-factory/src/main/java/org/eclipse/che/api/factory/server/FactoryService.java index 3dc449de97..8d09b866f5 100644 --- a/wsmaster/che-core-api-factory/src/main/java/org/eclipse/che/api/factory/server/FactoryService.java +++ b/wsmaster/che-core-api-factory/src/main/java/org/eclipse/che/api/factory/server/FactoryService.java @@ -43,6 +43,8 @@ import org.eclipse.che.api.factory.server.scm.exception.UnknownScmProviderExcept import org.eclipse.che.api.factory.server.scm.exception.UnsatisfiedScmPreconditionException; import org.eclipse.che.api.factory.shared.dto.FactoryMetaDto; import org.eclipse.che.security.oauth.AuthorisationRequestManager; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; /** * Defines Factory REST API. @@ -61,6 +63,8 @@ public class FactoryService extends Service { /** Validate query parameter. If true, factory will be validated */ public static final String VALIDATE_QUERY_PARAMETER = "validate"; + private static final Logger LOG = LoggerFactory.getLogger(FactoryService.class); + private final FactoryAcceptValidator acceptValidator; private final FactoryParametersResolverHolder factoryParametersResolverHolder; private final AdditionalFilenamesProvider additionalFilenamesProvider; @@ -160,7 +164,8 @@ public class FactoryService extends Service { | ScmConfigurationPersistenceException | UnknownScmProviderException | UnsatisfiedScmPreconditionException e) { - throw new ApiException(e); + // Do not throw an exception here, proceed the workspace start. + LOG.debug("Failed to update the OAuth token", e); } catch (ScmUnauthorizedException e) { throw toApiException(e); } diff --git a/wsmaster/che-core-api-factory/src/test/java/org/eclipse/che/api/factory/server/FactoryServiceTest.java b/wsmaster/che-core-api-factory/src/test/java/org/eclipse/che/api/factory/server/FactoryServiceTest.java index 0f9fd72867..51b42cb3bd 100644 --- a/wsmaster/che-core-api-factory/src/test/java/org/eclipse/che/api/factory/server/FactoryServiceTest.java +++ b/wsmaster/che-core-api-factory/src/test/java/org/eclipse/che/api/factory/server/FactoryServiceTest.java @@ -55,6 +55,10 @@ import org.eclipse.che.api.factory.server.FactoryService.FactoryParametersResolv import org.eclipse.che.api.factory.server.builder.FactoryBuilder; import org.eclipse.che.api.factory.server.impl.SourceStorageParametersValidator; import org.eclipse.che.api.factory.server.scm.PersonalAccessTokenManager; +import org.eclipse.che.api.factory.server.scm.exception.ScmCommunicationException; +import org.eclipse.che.api.factory.server.scm.exception.ScmConfigurationPersistenceException; +import org.eclipse.che.api.factory.server.scm.exception.UnknownScmProviderException; +import org.eclipse.che.api.factory.server.scm.exception.UnsatisfiedScmPreconditionException; import org.eclipse.che.api.factory.server.urlfactory.RemoteFactoryUrl; import org.eclipse.che.api.factory.shared.dto.FactoryDto; import org.eclipse.che.api.user.server.PreferenceManager; @@ -72,6 +76,7 @@ import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.testng.MockitoTestNGListener; import org.testng.annotations.BeforeMethod; +import org.testng.annotations.DataProvider; import org.testng.annotations.Listeners; import org.testng.annotations.Test; @@ -309,6 +314,48 @@ public class FactoryServiceTest { "Factory url required"); } + @Test(dataProvider = "exceptionProvider") + public void shouldNotThrowExceptionOtherThenScmUnauthorizedException( + Class throwableClass) throws Exception { + // given + final FactoryParametersResolverHolder dummyHolder = spy(factoryParametersResolverHolder); + FactoryParametersResolver factoryParametersResolver = mock(FactoryParametersResolver.class); + doReturn(factoryParametersResolver).when(dummyHolder).getFactoryParametersResolver(anyMap()); + RemoteFactoryUrl remoteFactoryUrl = mock(RemoteFactoryUrl.class); + when(factoryParametersResolver.parseFactoryUrl(eq("someUrl"))).thenReturn(remoteFactoryUrl); + when(remoteFactoryUrl.getProviderUrl()).thenReturn(scmServerUrl); + when(authorisationRequestManager.isStored(any())).thenReturn(false); + when(personalAccessTokenManager.getAndStore(any())).thenThrow(throwableClass); + service = + new FactoryService( + acceptValidator, + dummyHolder, + additionalFilenamesProvider, + personalAccessTokenManager, + authorisationRequestManager); + + // when + Response response = + given() + .contentType(ContentType.JSON) + .when() + .queryParam("url", "someUrl") + .post(SERVICE_PATH + "/token/refresh"); + + // then + assertEquals(response.getStatusCode(), 204); + } + + @DataProvider(name = "exceptionProvider") + private Object[] exceptionClasses() { + return new Class[] { + ScmCommunicationException.class, + ScmConfigurationPersistenceException.class, + UnknownScmProviderException.class, + UnsatisfiedScmPreconditionException.class + }; + } + @Test public void shouldReturnDefaultFactoryParameterResolver() throws Exception { // given