Skip to content
Snippets Groups Projects
Commit 70dc37a3 authored by Nicola Fulvio Calabria's avatar Nicola Fulvio Calabria
Browse files

Refactored common parent calculation + tests for archive generation

parent 2f9bbc25
No related branches found
No related tags found
No related merge requests found
Pipeline #8790 passed
...@@ -11,6 +11,7 @@ import it.inaf.ia2.transfer.auth.TokenPrincipal; ...@@ -11,6 +11,7 @@ import it.inaf.ia2.transfer.auth.TokenPrincipal;
import it.inaf.ia2.transfer.persistence.FileDAO; import it.inaf.ia2.transfer.persistence.FileDAO;
import it.inaf.ia2.transfer.persistence.JobDAO; import it.inaf.ia2.transfer.persistence.JobDAO;
import it.inaf.ia2.transfer.persistence.model.FileInfo; import it.inaf.ia2.transfer.persistence.model.FileInfo;
import it.inaf.oats.vospace.datamodel.NodeUtils;
import it.inaf.oats.vospace.exception.InternalFaultException; import it.inaf.oats.vospace.exception.InternalFaultException;
import it.inaf.oats.vospace.exception.PermissionDeniedException; import it.inaf.oats.vospace.exception.PermissionDeniedException;
import it.inaf.oats.vospace.exception.QuotaExceededException; import it.inaf.oats.vospace.exception.QuotaExceededException;
...@@ -26,8 +27,8 @@ import java.io.OutputStream; ...@@ -26,8 +27,8 @@ import java.io.OutputStream;
import java.io.UncheckedIOException; import java.io.UncheckedIOException;
import java.nio.file.Files; import java.nio.file.Files;
import java.security.Principal; import java.security.Principal;
import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Map;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import java.util.zip.ZipEntry; import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream; import java.util.zip.ZipOutputStream;
...@@ -236,28 +237,45 @@ public class ArchiveService { ...@@ -236,28 +237,45 @@ public class ArchiveService {
private String getCommonParent(List<ArchiveEntryDescriptor> entryDescriptors) { private String getCommonParent(List<ArchiveEntryDescriptor> entryDescriptors) {
List<String> vosPaths = entryDescriptors.stream().map(ed -> ed.getVosPath()) if(entryDescriptors.isEmpty()) {
throw new IllegalArgumentException("Empty descriptors list");
} else if(entryDescriptors.size() == 1) {
return NodeUtils.getParentPath(entryDescriptors.get(0).getVosPath());
}
// Get list of parent paths
List<String[]> vosParentPaths = entryDescriptors.stream().map(
ed -> NodeUtils.getParentPath(ed.getVosPath()).split("/"))
.collect(Collectors.toList()); .collect(Collectors.toList());
String commonParent = null; // Get minimum size of split vosParentPaths arrays
for (String vosPath : vosPaths) {
if (commonParent == null) { int minSize = vosParentPaths.stream()
commonParent = vosPath.substring(0, vosPath.lastIndexOf("/")); .mapToInt(v->v.length).min().orElseThrow();
} else {
StringBuilder newCommonParent = new StringBuilder(); switch(minSize) {
boolean same = true; case 0:
int lastSlashPos = vosPath.lastIndexOf("/"); return "/";
for (int i = 0; same && i < Math.min(commonParent.length(), vosPath.length()) && i <= lastSlashPos; i++) {
if (commonParent.charAt(i) == vosPath.charAt(i)) { case 1:
newCommonParent.append(commonParent.charAt(i)); // this should never happen
} else { throw new IllegalArgumentException("Invalid vosPath");
same = false;
}
} }
commonParent = newCommonParent.toString();
StringBuilder sb = new StringBuilder();
for(int i = 1; i < minSize; i++) {
List<String> elements = new ArrayList<>();
for(String[] s : vosParentPaths) {
elements.add(s[i]);
} }
String sample = elements.get(0);
if(elements.stream().allMatch(e->e.equals(sample)))
sb.append("/").append(sample);
} }
return commonParent.substring(0, commonParent.lastIndexOf("/"));
return sb.toString();
} }
private abstract class ArchiveHandler<O extends OutputStream, E> implements AutoCloseable { private abstract class ArchiveHandler<O extends OutputStream, E> implements AutoCloseable {
......
...@@ -11,7 +11,6 @@ import it.inaf.ia2.transfer.persistence.JobDAO; ...@@ -11,7 +11,6 @@ import it.inaf.ia2.transfer.persistence.JobDAO;
import it.inaf.ia2.transfer.persistence.model.FileInfo; import it.inaf.ia2.transfer.persistence.model.FileInfo;
import it.inaf.oats.vospace.exception.QuotaExceededException; import it.inaf.oats.vospace.exception.QuotaExceededException;
import it.inaf.oats.vospace.parent.exchange.ArchiveEntryDescriptor; import it.inaf.oats.vospace.parent.exchange.ArchiveEntryDescriptor;
import java.io.ByteArrayInputStream;
import java.io.File; import java.io.File;
import java.io.FileInputStream; import java.io.FileInputStream;
import java.io.FileOutputStream; import java.io.FileOutputStream;
...@@ -22,7 +21,6 @@ import java.nio.file.Files; ...@@ -22,7 +21,6 @@ import java.nio.file.Files;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.List; import java.util.List;
import java.util.Map;
import java.util.function.Function; import java.util.function.Function;
import java.util.zip.ZipEntry; import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream; import java.util.zip.ZipInputStream;
...@@ -37,10 +35,7 @@ import org.junit.jupiter.api.Test; ...@@ -37,10 +35,7 @@ import org.junit.jupiter.api.Test;
import org.kamranzafar.jtar.TarEntry; import org.kamranzafar.jtar.TarEntry;
import org.kamranzafar.jtar.TarInputStream; import org.kamranzafar.jtar.TarInputStream;
import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.eq;
import org.mockito.Mockito; import org.mockito.Mockito;
import static org.mockito.Mockito.doAnswer;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when; import static org.mockito.Mockito.when;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.context.SpringBootTest;
...@@ -48,12 +43,8 @@ import org.springframework.boot.test.mock.mockito.MockBean; ...@@ -48,12 +43,8 @@ import org.springframework.boot.test.mock.mockito.MockBean;
import org.springframework.boot.test.util.TestPropertyValues; import org.springframework.boot.test.util.TestPropertyValues;
import org.springframework.context.ApplicationContextInitializer; import org.springframework.context.ApplicationContextInitializer;
import org.springframework.context.ConfigurableApplicationContext; import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.http.HttpMethod;
import org.springframework.http.client.ClientHttpResponse;
import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.ContextConfiguration;
import org.springframework.util.FileSystemUtils; import org.springframework.util.FileSystemUtils;
import org.springframework.web.client.RequestCallback;
import org.springframework.web.client.ResponseExtractor;
import org.springframework.web.client.RestTemplate; import org.springframework.web.client.RestTemplate;
@SpringBootTest @SpringBootTest
...@@ -87,7 +78,6 @@ public class ArchiveServiceTest { ...@@ -87,7 +78,6 @@ public class ArchiveServiceTest {
FileSystemUtils.deleteRecursively(tmpDir); FileSystemUtils.deleteRecursively(tmpDir);
} }
// TODO: refactor tests
@Test @Test
public void testTarGeneration() throws Exception { public void testTarGeneration() throws Exception {
...@@ -242,7 +232,9 @@ public class ArchiveServiceTest { ...@@ -242,7 +232,9 @@ public class ArchiveServiceTest {
E entry; E entry;
while ((entry = testArchiveHandler.getNextEntry()) != null) { while ((entry = testArchiveHandler.getNextEntry()) != null) {
assertFalse(i >= expectedSequence.size(), "Found more entries than in expected sequence"); assertFalse(i >= expectedSequence.size(), "Found more entries than in expected sequence");
assertEquals(expectedSequence.get(i), testArchiveHandler.getName(entry)); assertEquals(type.equals(ArchiveJob.Type.ZIP) ?
"/" + expectedSequence.get(i) : expectedSequence.get(i),
testArchiveHandler.getName(entry));
if (!testArchiveHandler.isDirectory(entry)) { if (!testArchiveHandler.isDirectory(entry)) {
assertEquals("some data", new String(is.readAllBytes())); assertEquals("some data", new String(is.readAllBytes()));
} }
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment