diff --git a/scm-core/src/main/java/sonia/scm/repository/api/LookupCommandBuilder.java b/scm-core/src/main/java/sonia/scm/repository/api/LookupCommandBuilder.java index bc083521ac..61f4be80a8 100644 --- a/scm-core/src/main/java/sonia/scm/repository/api/LookupCommandBuilder.java +++ b/scm-core/src/main/java/sonia/scm/repository/api/LookupCommandBuilder.java @@ -27,6 +27,8 @@ package sonia.scm.repository.api; import sonia.scm.repository.spi.LookupCommand; import sonia.scm.repository.spi.LookupCommandRequest; +import java.util.Optional; + /** * The lookup command executes a lookup for additional repository information. * @@ -41,7 +43,7 @@ public class LookupCommandBuilder { this.lookupCommand = lookupCommand; } - public T lookup(Class type, String... args) { + public Optional lookup(Class type, String... args) { request.setType(type); request.setArgs(args); return lookupCommand.lookup(request); diff --git a/scm-core/src/main/java/sonia/scm/repository/spi/LookupCommand.java b/scm-core/src/main/java/sonia/scm/repository/spi/LookupCommand.java index 5d9cf64060..57cf4f7851 100644 --- a/scm-core/src/main/java/sonia/scm/repository/spi/LookupCommand.java +++ b/scm-core/src/main/java/sonia/scm/repository/spi/LookupCommand.java @@ -24,12 +24,15 @@ package sonia.scm.repository.spi; +import java.util.Optional; + public interface LookupCommand { /** * Executes lookup for given parameters. + * * @param request Arguments provided for the lookup. * @return Result of provided type. */ - T lookup(LookupCommandRequest request); + Optional lookup(LookupCommandRequest request); } diff --git a/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/repository/spi/SvnLookupCommand.java b/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/repository/spi/SvnLookupCommand.java index 908d618bec..336950e8cb 100644 --- a/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/repository/spi/SvnLookupCommand.java +++ b/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/repository/spi/SvnLookupCommand.java @@ -29,6 +29,7 @@ import org.tmatesoft.svn.core.SVNException; import org.tmatesoft.svn.core.io.SVNRepository; import java.util.Arrays; +import java.util.Optional; @Slf4j public class SvnLookupCommand extends AbstractSvnCommand implements LookupCommand { @@ -38,18 +39,28 @@ public class SvnLookupCommand extends AbstractSvnCommand implements LookupComman } @Override - public T lookup(LookupCommandRequest request) { + public Optional lookup(LookupCommandRequest request) { try { - SVNRepository repository = context.open(); - if (request.getArgs()[0].equalsIgnoreCase("props")) { - if (Arrays.stream(request.getArgs()).anyMatch(a -> a.equalsIgnoreCase("uuid"))) { - return (T) repository.getRepositoryUUID(false); - } + if (requestContainsArg(request, "props")) { + return lookupProps(request); } - } catch (SVNException | ClassCastException e) { - log.error("Invalid lookup request", e); + } catch (SVNException e) { + log.error("Lookup failed: ", e); } - return null; + return Optional.empty(); + } + + private Optional lookupProps(LookupCommandRequest request) throws SVNException { + if (requestContainsArg(request, "uuid")) { + SVNRepository repository = context.open(); + return Optional.of((T) repository.getRepositoryUUID(true)); + } + log.debug("No result found on lookup"); + return Optional.empty(); + } + + private boolean requestContainsArg(LookupCommandRequest request, String props) { + return Arrays.stream(request.getArgs()).anyMatch(a -> a.equalsIgnoreCase(props)); } } diff --git a/scm-plugins/scm-svn-plugin/src/test/java/sonia/scm/repository/spi/SvnLookupCommandTest.java b/scm-plugins/scm-svn-plugin/src/test/java/sonia/scm/repository/spi/SvnLookupCommandTest.java new file mode 100644 index 0000000000..a9c3925954 --- /dev/null +++ b/scm-plugins/scm-svn-plugin/src/test/java/sonia/scm/repository/spi/SvnLookupCommandTest.java @@ -0,0 +1,80 @@ +/* + * MIT License + * + * Copyright (c) 2020-present Cloudogu GmbH and Contributors + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +package sonia.scm.repository.spi; + +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; +import org.tmatesoft.svn.core.SVNException; +import org.tmatesoft.svn.core.io.SVNRepository; + +import java.util.Optional; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.when; + +@ExtendWith(MockitoExtension.class) +class SvnLookupCommandTest { + + @Mock + SvnContext context; + + @Mock + SVNRepository svnRepository; + + @InjectMocks + SvnLookupCommand command; + + @Test + void shouldReturnEmptyOptional() { + LookupCommandRequest request = new LookupCommandRequest(); + request.setType(String.class); + request.setArgs(new String[]{"props"}); + + Optional result = command.lookup(request); + + assertThat(result).isNotPresent(); + } + + @Test + void shouldReturnRepositoryUUID() throws SVNException { + String uuid = "trillian-hitchhiker-42"; + when(context.open()).thenReturn(svnRepository); + when(svnRepository.getRepositoryUUID(true)).thenReturn(uuid); + + LookupCommandRequest request = new LookupCommandRequest(); + request.setType(String.class); + request.setArgs(new String[]{"props", "uuid"}); + + Optional result = command.lookup(request); + + assertThat(result).isPresent(); + assertThat(result.get()) + .isInstanceOf(String.class) + .isEqualTo(uuid); + } +}