AttachmentStreamConnector { public <T> InputStream getAttachmentStream(AttachmentContent attachment, User user, T context) throws TException { assertNotNull(attachment); assertNotNull(context); if(!PermissionUtils.makePermission(context, user) .isAllowedToDownload(attachment)){ String msg = "The user=["+user.getEmail()+"] tried to download attachment=["+ attachment.getId()+ "] without attachment permissions"; log.warn(msg); throw new SW360Exception(msg); } return unsafeGetAttachmentStream(attachment); } AttachmentStreamConnector(Duration downloadTimeout);  AttachmentStreamConnector(DatabaseConnector connector, Duration downloadTimeout);  AttachmentStreamConnector(DatabaseConnector connector, AttachmentContentDownloader attachmentContentDownloader, Duration downloadTimeout); InputStream getAttachmentStream(AttachmentContent attachment, User user, T context); InputStream unsafeGetAttachmentStream(AttachmentContent attachment); InputStream getAttachmentBundleStream(Set<AttachmentContent> attachments, User user, T context); void uploadAttachment(AttachmentContent attachment, InputStream stream); void uploadAttachmentPart(AttachmentContent attachmentContent, int part, InputStream stream); InputStream getAttachmentPartStream(AttachmentContent attachment, int part);  }
@Test public void testGetFullStream() throws Exception { AttachmentContent attachment = mock(AttachmentContent.class); when(attachment.isOnlyRemote()).thenReturn(false); when(attachment.isSetPartsCount()).thenReturn(false); when(attachment.getFilename()).thenReturn("fil"); String attachmentId = "id"; when(attachment.getId()).thenReturn(attachmentId); AttachmentInputStream full = mock(AttachmentInputStream.class); when(connector.getAttachment(attachmentId, "fil")).thenReturn(full); when(full.read()).thenReturn(1, 2, -1); InputStream attachmentStream = attachmentStreamConnector.getAttachmentStream(attachment, dummyUser, new Project() .setVisbility(Visibility.ME_AND_MODERATORS) .setCreatedBy(dummyUser.getEmail()) .setAttachments(Collections.singleton(new Attachment().setAttachmentContentId(attachmentId)))); assertThat(attachmentStream.read(), is(1)); assertThat(attachmentStream.read(), is(2)); assertThat(attachmentStream.read(), is(-1)); }
@Test public void testGetConcatenatedStream() throws Exception { AttachmentContent attachment = mock(AttachmentContent.class); when(attachment.isOnlyRemote()).thenReturn(false); when(attachment.isSetPartsCount()).thenReturn(true); when(attachment.getPartsCount()).thenReturn("2"); when(attachment.getFilename()).thenReturn("fil"); String attachmentId = "id"; when(attachment.getId()).thenReturn(attachmentId); AttachmentInputStream part1 = mock(AttachmentInputStream.class); when(connector.getAttachment(attachmentId, "fil_part1")).thenReturn(part1); AttachmentInputStream part2 = mock(AttachmentInputStream.class); when(connector.getAttachment(attachmentId, "fil_part2")).thenReturn(part2); when(part1.read()).thenReturn(1, -1); when(part2.read()).thenReturn(2, -1); InputStream attachmentStream = attachmentStreamConnector.getAttachmentStream(attachment, dummyUser, new Project() .setVisbility(Visibility.ME_AND_MODERATORS) .setCreatedBy(dummyUser.getEmail()) .setAttachments(Collections.singleton(new Attachment().setAttachmentContentId(attachmentId)))); verifyZeroInteractions(part2); assertThat(attachmentStream.read(), is(1)); assertThat(attachmentStream.read(), is(2)); verify(part1).close(); assertThat(attachmentStream.read(), is(-1)); verify(part2).close(); }
@Test public void testGetConcatenatedStreamReadThrowsOnNonExistent() throws Exception { AttachmentContent attachment = mock(AttachmentContent.class); when(attachment.isOnlyRemote()).thenReturn(false); when(attachment.isSetPartsCount()).thenReturn(true); when(attachment.getPartsCount()).thenReturn("2"); when(attachment.getFilename()).thenReturn("fil"); String attachmentId = "id"; when(attachment.getId()).thenReturn(attachmentId); AttachmentInputStream part1 = mock(AttachmentInputStream.class); when(connector.getAttachment(attachmentId, "fil_part1")).thenReturn(part1); when(connector.getAttachment(attachmentId, "fil_part2")).thenThrow(new DocumentNotFoundException("")); when(part1.read()).thenReturn(1, -1); InputStream attachmentStream = attachmentStreamConnector.getAttachmentStream(attachment, dummyUser, new Project() .setVisbility(Visibility.ME_AND_MODERATORS) .setCreatedBy(dummyUser.getEmail()) .setAttachments(Collections.singleton(new Attachment().setAttachmentContentId(attachmentId)))); assertThat(attachmentStream.read(), is(1)); try { assertThat(attachmentStream.read(), is(2)); fail("expected Exception not thrown"); } catch (IOException ignored) { } verify(part1).close(); }