diff --git a/src/main/java/at/ac/uibk/gitsearch/service/ZipRepackagingService.java b/src/main/java/at/ac/uibk/gitsearch/service/ZipRepackagingService.java index fde1b45e0fb34b416f6e0119c9ec791fb315633a..19d986c306d2ec58f21921c83a33751a7019ac2c 100644 --- a/src/main/java/at/ac/uibk/gitsearch/service/ZipRepackagingService.java +++ b/src/main/java/at/ac/uibk/gitsearch/service/ZipRepackagingService.java @@ -27,6 +27,9 @@ import org.springframework.util.StreamUtils; /** * service to re-package a gitlab zip. Chop off leading root directory and * filter out unpublished entries. + * TODO: Refactor this method + * - define, when dealing with initial slashes allowed/expected + * - define, when directories must contain trailing slashes * * @author Michael Breu */ @@ -77,6 +80,9 @@ public class ZipRepackagingService { while (zipInEntry != null) { String newName = filterAndNewName(zipInEntry, applicableFilters, exercisePath, prefix); if (newName != null) { + if (newName.startsWith("/")) { + newName = newName.substring(1); + } ZipEntry zipOutEntry = new ZipEntry(newName); if (zipInEntry.isDirectory()) { zipOut.putNextEntry(zipOutEntry); @@ -112,11 +118,17 @@ public class ZipRepackagingService { if (fileName.startsWith(gitlabPrefix)) { String rootProjectRelativeName = fileName.substring(gitlabPrefix.length()); String fileWithSubPath = getWithoutPathPrefix(rootProjectRelativeName, exerciseFolderPath); + // Fix for issue #415 if ( - fileWithSubPath != null && - !ObjectUtils.isEmpty(fileWithSubPath) && - !filterOut(rootProjectRelativeName, applicableFilters, isDirectory) + fileWithSubPath == null || + "/".equals(fileWithSubPath) || + exerciseFolderPath != null && + !exerciseFolderPath.endsWith("/") && + !fileWithSubPath.startsWith("/") ) { + return null; + } + if (!ObjectUtils.isEmpty(fileWithSubPath) && !filterOut(rootProjectRelativeName, applicableFilters, isDirectory)) { return fileWithSubPath; } } @@ -221,16 +233,18 @@ public class ZipRepackagingService { /** * gets all applicable filters for all nodes within current path * - * @param exercisePath the path to current exercise ( the item path is + * @param exercisePathF the path to current exercise ( the item path is * absolute (i.e. - * relativ to project root) and may or not start with a + * relative to project root) and may or not start with a * slash) * @param currentTreeNode (path to exercise). The path to the meta data file - * must be absolute relative to git project root. The exclusion pathes inside the current Treenode may be absolute (to current Exercise Path, or relative) + * must be absolute relative to git project root. The + * exclusion pathes inside the current Treenode may be + * absolute (to current Exercise Path, or relative) * @return */ - @SuppressWarnings({ "PMD.CognitiveComplexity", "PMD.CyclomaticComplexity" }) + @SuppressWarnings({ "PMD.CognitiveComplexity", "PMD.CyclomaticComplexity", "PMD.ExcessiveMethodLength" }) protected static List<String> getApplicableFilters(final String exercisePathF, TreeNode<SearchResultDTO> currentTreeNode) { if (exercisePathF == null) { return new ArrayList<>(); @@ -305,30 +319,35 @@ public class ZipRepackagingService { } } // - // if (currentTreeNode.getData().getMetadata().getPublicVisibility().getExcept() != null) { - // if ("".equals(dirPath)) { - // // if in root, just use the current filters - // Arrays.stream(currentTreeNode.getData().getMetadata().getPublicVisibility().getExcept()).forEach(result::add); - // } else { - // // if not in root, check prepending path - // Arrays - // .stream(currentTreeNode.getData().getMetadata().getPublicVisibility().getExcept()) - // .forEach(filterString -> { - // if (filterString.startsWith(Character.toString(FastIgnoreRule.PATH_SEPARATOR))) { - // result.add(FastIgnoreRule.PATH_SEPARATOR + dirPath + filterString); - // } else if (!filterString.startsWith("**") && filterString.indexOf(FastIgnoreRule.PATH_SEPARATOR) >= 0) { - // result.add(FastIgnoreRule.PATH_SEPARATOR + dirPath + FastIgnoreRule.PATH_SEPARATOR + filterString); - // } else { - // result.add(filterString); - // } - // }); - // } - // } + // if (currentTreeNode.getData().getMetadata().getPublicVisibility().getExcept() + // != null) { + // if ("".equals(dirPath)) { + // // if in root, just use the current filters + // Arrays.stream(currentTreeNode.getData().getMetadata().getPublicVisibility().getExcept()).forEach(result::add); + // } else { + // // if not in root, check prepending path + // Arrays + // .stream(currentTreeNode.getData().getMetadata().getPublicVisibility().getExcept()) + // .forEach(filterString -> { + // if + // (filterString.startsWith(Character.toString(FastIgnoreRule.PATH_SEPARATOR))) + // { + // result.add(FastIgnoreRule.PATH_SEPARATOR + dirPath + filterString); + // } else if (!filterString.startsWith("**") && + // filterString.indexOf(FastIgnoreRule.PATH_SEPARATOR) >= 0) { + // result.add(FastIgnoreRule.PATH_SEPARATOR + dirPath + + // FastIgnoreRule.PATH_SEPARATOR + filterString); + // } else { + // result.add(filterString); + // } + // }); + // } + // } currentTreeNode.getChildren().forEach(childNode -> result.addAll(getApplicableFilters(exercisePath, childNode))); return result; - // } else { - // return java.util.Collections.emptyList(); - // } + // } else { + // return java.util.Collections.emptyList(); + // } } protected static List<String> getApplicableOfCurrentAsParent(String exercisePath, TreeNode<SearchResultDTO> currentTreeNode) { diff --git a/src/test/java/at/ac/uibk/gitsearch/service/ZipRepackagingServiceIT.java b/src/test/java/at/ac/uibk/gitsearch/service/ZipRepackagingServiceIT.java index 68ea684470c90382a12cbdd926d6256f404bf5fa..5b6259beb9081ddfb02dfdfa724b91fe2181cd89 100644 --- a/src/test/java/at/ac/uibk/gitsearch/service/ZipRepackagingServiceIT.java +++ b/src/test/java/at/ac/uibk/gitsearch/service/ZipRepackagingServiceIT.java @@ -44,7 +44,7 @@ public class ZipRepackagingServiceIT { void testSimpleRepackage() throws IOException { final List<String> zippedEntries = getZippedEntries(new ZipInputStream(this.getClass().getResourceAsStream(TEST_ZIP_LOCATION))) .stream() - .map(s -> "/" + s.substring("junit-quality-tests-exercise-master".length() + 1)) + .map(s -> s.substring("junit-quality-tests-exercise-master".length() + 1)) .filter(s -> !StringUtil.isNullOrEmpty(s)) .collect(Collectors.toList()); @@ -152,33 +152,33 @@ public class ZipRepackagingServiceIT { MockedSingletonTreeNodeForFiltering root = new MockedSingletonTreeNodeForFiltering( "metadata.yml", true, - "/infrastructure", - "/SS21_Assignment1/SimplePrograms_HelloWorld/SimplePrograms_HelloWorld_mit_musterloesung.ipynb", - "/SS21_Assignment1/SimplePrograms_Variables/SimplePrograms_Variables_mit_musterloesung.ipynb", - "/SS21_Assignment1/SimplePrograms_AddedValueTax/SimplePrograms_AddedValueTax_mit_musterloesung.ipynb", - "/SS21_Assignment1/SimplePrograms_Calculations/SimplePrograms_Calculations_mit_musterloesung.ipynb", - "/SS21_Assignment1/SimplePrograms_OfferCreator/SimplePrograms_OfferCreator_mit_musterloesung.ipynb", - "/SS23_Assignment2/Conditions_LargestNumber/Conditions_LargestNumber_mit_musterloesung.ipynb", - "/SS23_Assignment2/Conditions_NegativePositiveZero/Conditions_NegativePositiveZero_mit_musterloesung.ipynb", - "/SS23_Assignment2/Conditions_DiscountCalculator/Conditions_DiscountCalculator_mit_musterloesung.ipynb", - "/SS23_Assignment2/Conditions_Quarter/Conditions_Quarter_mit_musterloesung.ipynb", - "/SS23_Assignment2/Conditions_Calculator/Conditions_Calculator_mit_musterloesung.ipynb", - "/SS23_Assignment2/Conditions_WageTax/Conditions_WageTax_mit_musterloesung.ipynb" + "infrastructure", + "SS21_Assignment1/SimplePrograms_HelloWorld/SimplePrograms_HelloWorld_mit_musterloesung.ipynb", + "SS21_Assignment1/SimplePrograms_Variables/SimplePrograms_Variables_mit_musterloesung.ipynb", + "SS21_Assignment1/SimplePrograms_AddedValueTax/SimplePrograms_AddedValueTax_mit_musterloesung.ipynb", + "SS21_Assignment1/SimplePrograms_Calculations/SimplePrograms_Calculations_mit_musterloesung.ipynb", + "SS21_Assignment1/SimplePrograms_OfferCreator/SimplePrograms_OfferCreator_mit_musterloesung.ipynb", + "SS23_Assignment2/Conditions_LargestNumber/Conditions_LargestNumber_mit_musterloesung.ipynb", + "SS23_Assignment2/Conditions_NegativePositiveZero/Conditions_NegativePositiveZero_mit_musterloesung.ipynb", + "SS23_Assignment2/Conditions_DiscountCalculator/Conditions_DiscountCalculator_mit_musterloesung.ipynb", + "SS23_Assignment2/Conditions_Quarter/Conditions_Quarter_mit_musterloesung.ipynb", + "SS23_Assignment2/Conditions_Calculator/Conditions_Calculator_mit_musterloesung.ipynb", + "SS23_Assignment2/Conditions_WageTax/Conditions_WageTax_mit_musterloesung.ipynb" ); MockedSingletonTreeNodeForFiltering assignment1 = new MockedSingletonTreeNodeForFiltering( "SS21_Assignment1/metadata.yml", true, - "/SimplePrograms_HelloWorld/SimplePrograms_HelloWorld_mit_musterloesung.ipynb", - "/SimplePrograms_Variables/SimplePrograms_Variables_mit_musterloesung.ipynb", - "/SimplePrograms_AddedValueTax/SimplePrograms_AddedValueTax_mit_musterloesung.ipynb", - "/SimplePrograms_Calculations/SimplePrograms_Calculations_mit_musterloesung.ipynb", - "/SimplePrograms_OfferCreator/SimplePrograms_OfferCreator_mit_musterloesung.ipynb" + "SimplePrograms_HelloWorld/SimplePrograms_HelloWorld_mit_musterloesung.ipynb", + "SimplePrograms_Variables/SimplePrograms_Variables_mit_musterloesung.ipynb", + "SimplePrograms_AddedValueTax/SimplePrograms_AddedValueTax_mit_musterloesung.ipynb", + "SimplePrograms_Calculations/SimplePrograms_Calculations_mit_musterloesung.ipynb", + "SimplePrograms_OfferCreator/SimplePrograms_OfferCreator_mit_musterloesung.ipynb" ); MockedSingletonTreeNodeForFiltering helloWorld = new MockedSingletonTreeNodeForFiltering( "SS21_Assignment1/SimplePrograms_HelloWorld/metadata.yml", true, - "/SimplePrograms_HelloWorld_mit_musterloesung.ipynb", - "/SS21_Assignment1/SimplePrograms_HelloWorld/SimplePrograms_HelloWorld_mit_musterloesung.ipynb" + "SimplePrograms_HelloWorld_mit_musterloesung.ipynb", + "SS21_Assignment1/SimplePrograms_HelloWorld/SimplePrograms_HelloWorld_mit_musterloesung.ipynb" ); assignment1.addChild(helloWorld); root.addChild(assignment1); @@ -187,69 +187,53 @@ public class ZipRepackagingServiceIT { } private static List<String> expectedEntriesAll = List.of( - "/README.md", - "/SS21_Assignment1/", - "/SS21_Assignment1/SimplePrograms_AddedValueTax/", - "/SS21_Assignment1/SimplePrograms_AddedValueTax/SimplePrograms_AddedValueTax.ipynb", - "/SS21_Assignment1/SimplePrograms_AddedValueTax/metadata.yaml", - "/SS21_Assignment1/SimplePrograms_Calculations/", - "/SS21_Assignment1/SimplePrograms_Calculations/SimplePrograms_Calculations.ipynb", - "/SS21_Assignment1/SimplePrograms_Calculations/metadata.yaml", - "/SS21_Assignment1/SimplePrograms_HelloWorld/", - "/SS21_Assignment1/SimplePrograms_HelloWorld/SimplePrograms_HelloWorld.ipynb", - "/SS21_Assignment1/SimplePrograms_HelloWorld/metadata.yaml", - "/SS21_Assignment1/SimplePrograms_OfferCreator/", - "/SS21_Assignment1/SimplePrograms_OfferCreator/SimplePrograms_OfferCreator.ipynb", - "/SS21_Assignment1/SimplePrograms_OfferCreator/metadata.yaml", - "/SS21_Assignment1/SimplePrograms_Variables/", - "/SS21_Assignment1/SimplePrograms_Variables/SimplePrograms_Variables.ipynb", - "/SS21_Assignment1/SimplePrograms_Variables/metadata.yaml", - "/SS21_Assignment1/metadata.yaml", - "/SS23_Assignment2/", - "/SS23_Assignment2/Conditions_Calculator/", - "/SS23_Assignment2/Conditions_Calculator/Conditions_Calculator.ipynb", - "/SS23_Assignment2/Conditions_Calculator/metadata.yaml", - "/SS23_Assignment2/Conditions_DiscountCalculator/", - "/SS23_Assignment2/Conditions_DiscountCalculator/Conditions_DiscountCalculator.ipynb", - "/SS23_Assignment2/Conditions_DiscountCalculator/metadata.yaml", - "/SS23_Assignment2/Conditions_LargestNumber/", - "/SS23_Assignment2/Conditions_LargestNumber/Conditions_LargestNumber.ipynb", - "/SS23_Assignment2/Conditions_LargestNumber/metadata.yaml", - "/SS23_Assignment2/Conditions_NegativePositiveZero/", - "/SS23_Assignment2/Conditions_NegativePositiveZero/Conditions_NegativePositiveZero.ipynb", - "/SS23_Assignment2/Conditions_NegativePositiveZero/metadata.yaml", - "/SS23_Assignment2/Conditions_Quarter/", - "/SS23_Assignment2/Conditions_Quarter/Conditions_Quarter.ipynb", - "/SS23_Assignment2/Conditions_Quarter/metadata.yaml", - "/SS23_Assignment2/Conditions_WageTax/", - "/SS23_Assignment2/Conditions_WageTax/Conditions_WageTax.ipynb", - "/SS23_Assignment2/Conditions_WageTax/metadata.yaml", - "/SS23_Assignment2/metadata.yaml", - "/jku.png", - "/jku.svg", - "/metadata.yaml", - "/requirements.txt" + "README.md", + "SS21_Assignment1/", + "SS21_Assignment1/SimplePrograms_AddedValueTax/SimplePrograms_AddedValueTax.ipynb", + "SS21_Assignment1/SimplePrograms_AddedValueTax/metadata.yaml", + "SS21_Assignment1/SimplePrograms_Calculations/SimplePrograms_Calculations.ipynb", + "SS21_Assignment1/SimplePrograms_Calculations/metadata.yaml", + "SS21_Assignment1/SimplePrograms_HelloWorld/SimplePrograms_HelloWorld.ipynb", + "SS21_Assignment1/SimplePrograms_HelloWorld/metadata.yaml", + "SS21_Assignment1/SimplePrograms_OfferCreator/SimplePrograms_OfferCreator.ipynb", + "SS21_Assignment1/SimplePrograms_OfferCreator/metadata.yaml", + "SS21_Assignment1/SimplePrograms_Variables/SimplePrograms_Variables.ipynb", + "SS21_Assignment1/SimplePrograms_Variables/metadata.yaml", + "SS21_Assignment1/metadata.yaml", + "SS23_Assignment2/", + "SS23_Assignment2/Conditions_Calculator/Conditions_Calculator.ipynb", + "SS23_Assignment2/Conditions_Calculator/metadata.yaml", + "SS23_Assignment2/Conditions_DiscountCalculator/Conditions_DiscountCalculator.ipynb", + "SS23_Assignment2/Conditions_DiscountCalculator/metadata.yaml", + "SS23_Assignment2/Conditions_LargestNumber/Conditions_LargestNumber.ipynb", + "SS23_Assignment2/Conditions_LargestNumber/metadata.yaml", + "SS23_Assignment2/Conditions_NegativePositiveZero/Conditions_NegativePositiveZero.ipynb", + "SS23_Assignment2/Conditions_NegativePositiveZero/metadata.yaml", + "SS23_Assignment2/Conditions_Quarter/Conditions_Quarter.ipynb", + "SS23_Assignment2/Conditions_Quarter/metadata.yaml", + "SS23_Assignment2/Conditions_WageTax/Conditions_WageTax.ipynb", + "SS23_Assignment2/Conditions_WageTax/metadata.yaml", + "SS23_Assignment2/metadata.yaml", + "jku.png", + "jku.svg", + "metadata.yaml", + "requirements.txt" ); private static List<String> expectedEntriesAssignment1 = List.of( - "/SimplePrograms_AddedValueTax/", - "/SimplePrograms_AddedValueTax/SimplePrograms_AddedValueTax.ipynb", - "/SimplePrograms_AddedValueTax/metadata.yaml", - "/SimplePrograms_Calculations/", - "/SimplePrograms_Calculations/SimplePrograms_Calculations.ipynb", - "/SimplePrograms_Calculations/metadata.yaml", - "/SimplePrograms_HelloWorld/", - "/SimplePrograms_HelloWorld/SimplePrograms_HelloWorld.ipynb", - "/SimplePrograms_HelloWorld/metadata.yaml", - "/SimplePrograms_OfferCreator/", - "/SimplePrograms_OfferCreator/SimplePrograms_OfferCreator.ipynb", - "/SimplePrograms_OfferCreator/metadata.yaml", - "/SimplePrograms_Variables/", - "/SimplePrograms_Variables/SimplePrograms_Variables.ipynb", - "/SimplePrograms_Variables/metadata.yaml", - "/metadata.yaml" + "SimplePrograms_AddedValueTax/SimplePrograms_AddedValueTax.ipynb", + "SimplePrograms_AddedValueTax/metadata.yaml", + "SimplePrograms_Calculations/SimplePrograms_Calculations.ipynb", + "SimplePrograms_Calculations/metadata.yaml", + "SimplePrograms_HelloWorld/SimplePrograms_HelloWorld.ipynb", + "SimplePrograms_HelloWorld/metadata.yaml", + "SimplePrograms_OfferCreator/SimplePrograms_OfferCreator.ipynb", + "SimplePrograms_OfferCreator/metadata.yaml", + "SimplePrograms_Variables/SimplePrograms_Variables.ipynb", + "SimplePrograms_Variables/metadata.yaml", + "metadata.yaml" ); - private static List<String> expectedEntriesHelloWorld = List.of("/SimplePrograms_HelloWorld.ipynb", "/metadata.yaml"); + private static List<String> expectedEntriesHelloWorld = List.of("SimplePrograms_HelloWorld.ipynb", "metadata.yaml"); static Stream<Arguments> checkExplicitMethodSourceArgs() { return Stream.of( @@ -270,22 +254,26 @@ public class ZipRepackagingServiceIT { ); assertThat(applicableFiltersAll) .containsAll( - List.of("/infrastructure", "/SS21_Assignment1/SimplePrograms_HelloWorld/SimplePrograms_HelloWorld_mit_musterloesung.ipynb") + List.of( + "**/infrastructure", + "/SS21_Assignment1/SimplePrograms_HelloWorld/SimplePrograms_HelloWorld_mit_musterloesung.ipynb" + ) ); assertThat(applicableFiltersAssignment) .containsAll( List.of( - "/infrastructure", + "**/infrastructure", "/SS21_Assignment1/SimplePrograms_HelloWorld/SimplePrograms_HelloWorld_mit_musterloesung.ipynb", - "/SS21_Assignment1/SimplePrograms_Variables/SimplePrograms_Variables_mit_musterloesung.ipynb" + "**/SS21_Assignment1/SimplePrograms_Variables/SimplePrograms_Variables_mit_musterloesung.ipynb" ) ); assertThat(applicableFiltersHelloWorld) .containsAll( List.of( - "/infrastructure", - "/SS21_Assignment1/SimplePrograms_HelloWorld/SimplePrograms_HelloWorld_mit_musterloesung.ipynb", - "/SS21_Assignment1/SimplePrograms_Variables/SimplePrograms_Variables_mit_musterloesung.ipynb" + "**/infrastructure", + "**/SS21_Assignment1/SimplePrograms_HelloWorld/SimplePrograms_HelloWorld_mit_musterloesung.ipynb", + "/SS21_Assignment1/**/SimplePrograms_Variables/SimplePrograms_Variables_mit_musterloesung.ipynb", + "**/SS21_Assignment1/SimplePrograms_Variables/SimplePrograms_Variables_mit_musterloesung.ipynb" ) ); } diff --git a/src/test/java/at/ac/uibk/gitsearch/service/ZipRepackagingServiceTest.java b/src/test/java/at/ac/uibk/gitsearch/service/ZipRepackagingServiceTest.java index 217e0d0e5aa9de69a43c38c5e90efd08ea14567a..190a0b5e603ce74e3b3759ba93b18a766e7066b8 100644 --- a/src/test/java/at/ac/uibk/gitsearch/service/ZipRepackagingServiceTest.java +++ b/src/test/java/at/ac/uibk/gitsearch/service/ZipRepackagingServiceTest.java @@ -60,15 +60,11 @@ class ZipRepackagingServiceTest { public String[] getFilterStrings() { return filterStrings; } - // Käse - // void addChild(String subPath, TreeNode<SearchResultDTO> nodeData) { - // super.addChild(nodeData); - // if(StringUtils.isEmpty(subPath)) { - // this.getData().getFile().setPath("metadata.yaml"); - // } else { - // this.getData().getFile().setPath(subPath + "/metadata.yaml"); - // } - // + + @Override + public String toString() { + return "MockedTreeNode[" + this.getData().getFile().getPath() + "]"; + } } private Optional<TreeNode<SearchResultDTO>> getMockedFilterTreeNode(String... filters) { diff --git a/webpack/webpack.custom.js b/webpack/webpack.custom.js index 14483210d9172960aeb41f7b403a857dde57933e..fc7ddfda3c7cc1794c0b2225787c9ae17543f479 100644 --- a/webpack/webpack.custom.js +++ b/webpack/webpack.custom.js @@ -115,10 +115,19 @@ module.exports = async (config, options, targetOptions) => { }) ); + config.externals = { + // only define the dependencies you are NOT using as externals! + canvg: "canvg", + html2canvas: "html2canvas", + dompurify: "dompurify" + } config = merge( config // jhipster-needle-add-webpack-config - JHipster will add custom config ); + + return config; }; +