diff --git a/pom.xml b/pom.xml index 50ce3e5..51125d4 100644 --- a/pom.xml +++ b/pom.xml @@ -10,7 +10,7 @@ com.cloud NetworkCloudDrive - 0.4.8 + 0.4.9-SNAPSHOT NetworkCloudDrive NetworkCloudDrive project built with Spring Boot diff --git a/reset.sh b/reset.sh deleted file mode 100755 index 17fa77f..0000000 --- a/reset.sh +++ /dev/null @@ -1,8 +0,0 @@ -#/bin/bash -rm -rf ./root #remove entire folder and contents -echo "removed root folder" - -rm filedatabase.db -echo "removed db file" - -#can combine rm command into single line: rm -rf ./root filedatabase.db \ No newline at end of file diff --git a/src/main/java/com/cloud/NetworkCloudDrive/DAO/SQLiteDAO.java b/src/main/java/com/cloud/NetworkCloudDrive/DAO/SQLiteDAO.java index 23ac419..4d96a85 100644 --- a/src/main/java/com/cloud/NetworkCloudDrive/DAO/SQLiteDAO.java +++ b/src/main/java/com/cloud/NetworkCloudDrive/DAO/SQLiteDAO.java @@ -19,7 +19,6 @@ import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; -import java.io.FileNotFoundException; import java.nio.file.FileSystemException; import java.sql.SQLException; import java.util.List; @@ -333,7 +332,7 @@ public FolderMetadata getFolderMetadataFromIdPathAndName(String idPath, String n dummyFolderMetadata.setPath(idPath); dummyFolderMetadata.setId(null); dummyFolderMetadata.setCreatedAt(null); - dummyFolderMetadata.setUserid(userId); //current logged in user id + dummyFolderMetadata.setUserid(userId); //current logged-in user id Example folderMetadataExample = Example.of(dummyFolderMetadata); Optional optionalFolderMetadata = sqLiteFolderRepository.findOne(folderMetadataExample); if (optionalFolderMetadata.isEmpty()) diff --git a/src/main/java/com/cloud/NetworkCloudDrive/Models/DTO/FileListItemDTO.java b/src/main/java/com/cloud/NetworkCloudDrive/Models/DTO/FileListItemDTO.java index 17ba7f9..b49d30c 100644 --- a/src/main/java/com/cloud/NetworkCloudDrive/Models/DTO/FileListItemDTO.java +++ b/src/main/java/com/cloud/NetworkCloudDrive/Models/DTO/FileListItemDTO.java @@ -1,10 +1,11 @@ package com.cloud.NetworkCloudDrive.Models.DTO; import com.cloud.NetworkCloudDrive.Models.FileMetadata; +import com.cloud.NetworkCloudDrive.Models.Implementations.AlphanumericalSorter; import java.time.Instant; -public class FileListItemDTO { +public class FileListItemDTO extends AlphanumericalSorter implements Comparable { private long id; private String name; private String mimeType; @@ -60,4 +61,9 @@ public boolean isHasThumbnail() { public void setHasThumbnail(boolean hasThumbnail) { this.hasThumbnail = hasThumbnail; } + + @Override + public int compareTo(FileListItemDTO fl2) { + return Integer.compare(calculateRank(this.name.toLowerCase()), calculateRank(fl2.getName().toLowerCase())); + } } diff --git a/src/main/java/com/cloud/NetworkCloudDrive/Models/DTO/FolderListItemDTO.java b/src/main/java/com/cloud/NetworkCloudDrive/Models/DTO/FolderListItemDTO.java index 20c96c9..cc41d0f 100644 --- a/src/main/java/com/cloud/NetworkCloudDrive/Models/DTO/FolderListItemDTO.java +++ b/src/main/java/com/cloud/NetworkCloudDrive/Models/DTO/FolderListItemDTO.java @@ -1,10 +1,11 @@ package com.cloud.NetworkCloudDrive.Models.DTO; import com.cloud.NetworkCloudDrive.Models.FolderMetadata; +import com.cloud.NetworkCloudDrive.Models.Implementations.AlphanumericalSorter; import java.time.Instant; -public class FolderListItemDTO { +public class FolderListItemDTO extends AlphanumericalSorter implements Comparable { private long id; private String name; private String path; @@ -43,4 +44,10 @@ public Instant getCreatedAt() { public void setCreatedAt(Instant createdAt) { this.createdAt = createdAt; } + + @Override + public int compareTo(FolderListItemDTO f2) { + return Integer.compare(calculateRank(this.name.toLowerCase()), calculateRank(f2.getName().toLowerCase())); + } } + diff --git a/src/main/java/com/cloud/NetworkCloudDrive/Models/Implementations/ASCIIRanker.java b/src/main/java/com/cloud/NetworkCloudDrive/Models/Implementations/ASCIIRanker.java new file mode 100644 index 0000000..ccec34e --- /dev/null +++ b/src/main/java/com/cloud/NetworkCloudDrive/Models/Implementations/ASCIIRanker.java @@ -0,0 +1,54 @@ +package com.cloud.NetworkCloudDrive.Models.Implementations; + +import java.util.ArrayList; +import java.util.List; + +public class ASCIIRanker { + + public int compareByGroups(String firstItem, String secondItem) { + boolean secondIsBigger = false; + int length; + if (firstItem.length() > secondItem.length()) { + length = secondItem.length(); + } else { + secondIsBigger = true; + length = firstItem.length(); + } + + List digits = new ArrayList<>(); + List characters = new ArrayList<>(); + + for (int i = 0; i < length; i++) { + /* + file1.txt !^ + fil2.txt <-- *** ^^^ + + fil2.txt + file1.txt + + file1.txt + file2.txt + file12.txt + */ + char firstStringChar = firstItem.charAt(i); + char secondStringChar = secondItem.charAt(i); + if (Character.isDigit(firstStringChar)) { + + } + } + return 1; + } + + /* + should only be used when all characters in comparing strings are same + then can be used to rank them between each other using ASCII scores + */ + public int calculateRank(String word) { + int rank = 0; + for (int i = 0; i < word.length(); i++) { + char ch = word.charAt(i); + rank += ch; + } + return rank; + } +} diff --git a/src/main/java/com/cloud/NetworkCloudDrive/Models/Implementations/AlphanumericalSorter.java b/src/main/java/com/cloud/NetworkCloudDrive/Models/Implementations/AlphanumericalSorter.java new file mode 100644 index 0000000..80c35e5 --- /dev/null +++ b/src/main/java/com/cloud/NetworkCloudDrive/Models/Implementations/AlphanumericalSorter.java @@ -0,0 +1,64 @@ +package com.cloud.NetworkCloudDrive.Models.Implementations; + +import java.util.ArrayList; +import java.util.List; + +public class AlphanumericalSorter { + + public int compareByGroups(String firstItem, String secondItem) { + boolean secondIsBigger = false; + int length; + if (firstItem.length() > secondItem.length()) { + length = secondItem.length(); + } else { + secondIsBigger = true; + length = firstItem.length(); + } + + List digits = new ArrayList<>(); + List characters = new ArrayList<>(); + + for (int i = 0; i < length; i++) { + /* + file1.txt !^ + fil2.txt <-- *** ^^^ + + fil2.txt + file1.txt + + file1.txt + file2.txt + file12.txt + */ + char firstStringChar = firstItem.charAt(i); + char secondStringChar = secondItem.charAt(i); + if (Character.isDigit(firstStringChar)) { + digits.add(firstStringChar - '0'); + continue; + } + characters.add(new Character[]{firstStringChar, secondStringChar}); + } + return 1; + } + + private boolean handleStrings(char[] firstChars, char[] secondChars) { + for (int i = 0; i < firstChars.length; i++) { + int j = i + 1; + + } + return false; + } + + /* + should only be used when all characters in comparing strings are same + then can be used to rank them between each other using ASCII scores + */ + public int calculateRank(String word) { + int rank = 0; + for (int i = 0; i < word.length(); i++) { + char ch = word.charAt(i); + rank += ch; + } + return rank; + } +} diff --git a/src/main/java/com/cloud/NetworkCloudDrive/Services/FileSystemService.java b/src/main/java/com/cloud/NetworkCloudDrive/Services/FileSystemService.java index 328c3b1..0441b39 100644 --- a/src/main/java/com/cloud/NetworkCloudDrive/Services/FileSystemService.java +++ b/src/main/java/com/cloud/NetworkCloudDrive/Services/FileSystemService.java @@ -100,8 +100,8 @@ public Map> getListOfMetadataFromPath(List filePaths, Sort List> results = checkAndCollectFilesAndFolders(filePaths); return sortAndFilterUtility.sortFileList( sortListEnum, - (Stream) results.get(0).stream(), - (Stream) results.get(1).stream() + (List) results.get(0), + (List) results.get(1) ); } diff --git a/src/main/java/com/cloud/NetworkCloudDrive/Services/Tasks/MaintenanceService.java b/src/main/java/com/cloud/NetworkCloudDrive/Services/Tasks/MaintenanceService.java index b38ffa2..177952d 100644 --- a/src/main/java/com/cloud/NetworkCloudDrive/Services/Tasks/MaintenanceService.java +++ b/src/main/java/com/cloud/NetworkCloudDrive/Services/Tasks/MaintenanceService.java @@ -146,8 +146,6 @@ public boolean scanDirectory(Path startingPath, Predicate filter, boolean public ThumbnailScanResults recursiveThumbnailScanInvoker(long folderId) throws SQLException { ThumbnailScanResults thumbnailScanResults = new ThumbnailScanResults(); List folderMetadataContainingPath = sqLiteDAO.findAllStartsWithIdPathReturnsLongList(sqLiteDAO.getIdPath(folderId)); - logger.info("size {}", folderMetadataContainingPath.size()); - folderMetadataContainingPath.forEach(l -> logger.info("item {}", l)); //temp if (folderId == 0) { folderMetadataContainingPath.add(0L); diff --git a/src/main/java/com/cloud/NetworkCloudDrive/Utilities/SortAndFilterUtility.java b/src/main/java/com/cloud/NetworkCloudDrive/Utilities/SortAndFilterUtility.java index efcae25..9caff89 100644 --- a/src/main/java/com/cloud/NetworkCloudDrive/Utilities/SortAndFilterUtility.java +++ b/src/main/java/com/cloud/NetworkCloudDrive/Utilities/SortAndFilterUtility.java @@ -6,11 +6,9 @@ import com.cloud.NetworkCloudDrive.Models.Enum.SortListEnum; import org.springframework.stereotype.Component; -import java.util.Comparator; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.function.Predicate; +import java.util.stream.Collectors; import java.util.stream.Stream; @Component @@ -18,49 +16,55 @@ public class SortAndFilterUtility { public SortAndFilterUtility() {} - public Map> sortFileList(SortListEnum sortListEnum, Stream fileList, Stream folderList) { - Comparator fileListItemDTOComparator = null; - Comparator folderListItemDTOComparator = null; + public Map> sortFileList(SortListEnum sortListEnum, List fileList, List folderList) { switch (sortListEnum) { - case ALPHABETICAL: - fileListItemDTOComparator = Comparator.comparing(f -> f.getName().toLowerCase()); - folderListItemDTOComparator = Comparator.comparing(fl -> fl.getName().toLowerCase()); - break; - case REVERSE_ALPHABETICAL: - fileListItemDTOComparator = Comparator.comparing(f -> f.getName().toLowerCase(), Comparator.reverseOrder()); - folderListItemDTOComparator = Comparator.comparing(fl -> fl.getName().toLowerCase(), Comparator.reverseOrder()); - break; + case ALPHABETICAL, REVERSE_ALPHABETICAL: + return sortName(sortListEnum, fileList, folderList); case NEWEST: - fileListItemDTOComparator = Comparator.comparing(FileListItemDTO::getCreatedAt, Comparator.reverseOrder()); - folderListItemDTOComparator = Comparator.comparing(FolderListItemDTO::getCreatedAt, Comparator.reverseOrder()); + fileList.sort(Comparator.comparing(FileListItemDTO::getCreatedAt).reversed()); + folderList.sort(Comparator.comparing(FolderListItemDTO::getCreatedAt).reversed()); break; case OLDEST: - fileListItemDTOComparator = Comparator.comparing(FileListItemDTO::getCreatedAt); - folderListItemDTOComparator = Comparator.comparing(FolderListItemDTO::getCreatedAt); + fileList.sort(Comparator.comparing(FileListItemDTO::getCreatedAt)); + folderList.sort(Comparator.comparing(FolderListItemDTO::getCreatedAt)); break; case FOLDERS_FIRST: LinkedHashMap> linkedHashMap = new LinkedHashMap<>(); - linkedHashMap.put("folders", folderList.toList()); - linkedHashMap.put("files", fileList.toList()); + linkedHashMap.put("folders", folderList); + linkedHashMap.put("files", fileList); return linkedHashMap; case SIZE: - fileListItemDTOComparator = Comparator.comparingLong(FileListItemDTO::getSize).reversed(); + fileList.sort(Comparator.comparing(FileListItemDTO::getCreatedAt).reversed()); break; case SIZE_LOWEST: - fileListItemDTOComparator = Comparator.comparingLong(FileListItemDTO::getSize); + fileList.sort(Comparator.comparing(FileListItemDTO::getCreatedAt)); break; - default: - return Map.of( - "files", fileList.toList(), - "folders", folderList.toList() - ); } + return returnMappedLists(fileList, folderList); + } + + private Map> returnMappedLists(List fileListItemDTO, List folderListItemDTO) { return Map.of( - "files", (fileListItemDTOComparator != null ? fileList.sorted(fileListItemDTOComparator).toList() : fileList.toList()), - "folders", (folderListItemDTOComparator != null ? folderList.sorted(folderListItemDTOComparator).toList() : folderList.toList()) + "files", fileListItemDTO, + "folders", folderListItemDTO ); } + private Map> sortName(SortListEnum sortOption, List fileListItemDTO, List folderListItemDTO) { + + switch (sortOption) { + case ALPHABETICAL: + fileListItemDTO.sort(Comparator.naturalOrder()); + folderListItemDTO.sort(Comparator.naturalOrder()); + break; + case REVERSE_ALPHABETICAL: + fileListItemDTO.sort(Comparator.reverseOrder()); + folderListItemDTO.sort(Comparator.reverseOrder()); + break; + } + return returnMappedLists(fileListItemDTO, folderListItemDTO); + } + public Map> filterFileList(FilterListEnum filterListEnum, Stream fileList, Stream folderList, String filterCase) { Predicate fileListItemDTOPredicate = null; Predicate folderListItemDTOPredicate = null;