From f56e539f3b3d912d7e2eac67fb0aa5dad6f3b83e Mon Sep 17 00:00:00 2001 From: Hegedus Date: Wed, 27 Jan 2021 14:27:20 +0100 Subject: [PATCH] add file list functionality --- README.md | 11 +++- .../artifactory/client/FolderHandle.java | 9 ++++ .../artifactory/client/RepositoryHandle.java | 2 +- .../artifactory/client/model/FileList.java | 11 ++++ .../artifactory/client/model/ListItem.java | 11 ++++ .../client/impl/FolderHandleImpl.java | 43 ++++++++++++++++ .../client/impl/RepositoryHandleImpl.groovy | 5 +- .../client/model/impl/FileListImpl.java | 39 +++++++++++++++ .../client/model/impl/ListItemImpl.java | 50 +++++++++++++++++++ .../artifactory.client.release.properties | 2 +- .../jfrog/artifactory/client/ItemTests.java | 19 +++++++ 11 files changed, 196 insertions(+), 6 deletions(-) create mode 100644 api/src/main/java/org/jfrog/artifactory/client/FolderHandle.java create mode 100644 api/src/main/java/org/jfrog/artifactory/client/model/FileList.java create mode 100644 api/src/main/java/org/jfrog/artifactory/client/model/ListItem.java create mode 100644 services/src/main/groovy/org/jfrog/artifactory/client/impl/FolderHandleImpl.java create mode 100644 services/src/main/java/org/jfrog/artifactory/client/model/impl/FileListImpl.java create mode 100644 services/src/main/java/org/jfrog/artifactory/client/model/impl/ListItemImpl.java diff --git a/README.md b/README.md index 7bc8481f..5c15d0ce 100644 --- a/README.md +++ b/README.md @@ -191,7 +191,16 @@ for (RepositorySummary repoSummary : artifactory.storage().getStorageInfo().getR ##### Getting Items ``` ItemHandle fileItem = artifactory.repository("RepoName").file("path/to/file.txt"); -ItemHandle folderItem = artifactory.repository("RepoName").folder("path/to/folder"); +FolderHandle folderItem = artifactory.repository("RepoName").folder("path/to/folder"); +``` + +##### Getting All Items Under A Folder +``` +FolderHandle folder = artifactory.repository("RepoName").folder("path/to/folder"); +boolean deep = true; +boolean listFolders = true; +boolean timeStamps = true; +FileList list = folder.list(deep, listFolders, timeStamps); ``` ##### Copying Items diff --git a/api/src/main/java/org/jfrog/artifactory/client/FolderHandle.java b/api/src/main/java/org/jfrog/artifactory/client/FolderHandle.java new file mode 100644 index 00000000..d74187a8 --- /dev/null +++ b/api/src/main/java/org/jfrog/artifactory/client/FolderHandle.java @@ -0,0 +1,9 @@ +package org.jfrog.artifactory.client; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import org.jfrog.artifactory.client.model.FileList; + +@JsonIgnoreProperties(ignoreUnknown = true) +public interface FolderHandle extends ItemHandle { + FileList list(boolean deep, boolean listFolders, boolean timestamps); +} \ No newline at end of file diff --git a/api/src/main/java/org/jfrog/artifactory/client/RepositoryHandle.java b/api/src/main/java/org/jfrog/artifactory/client/RepositoryHandle.java index 8e64ea9c..4b219836 100644 --- a/api/src/main/java/org/jfrog/artifactory/client/RepositoryHandle.java +++ b/api/src/main/java/org/jfrog/artifactory/client/RepositoryHandle.java @@ -16,7 +16,7 @@ @JsonIgnoreProperties(ignoreUnknown = true) public interface RepositoryHandle { - ItemHandle folder(String folderName); + FolderHandle folder(String folderName); ItemHandle file(String filePath); diff --git a/api/src/main/java/org/jfrog/artifactory/client/model/FileList.java b/api/src/main/java/org/jfrog/artifactory/client/model/FileList.java new file mode 100644 index 00000000..778b6a4d --- /dev/null +++ b/api/src/main/java/org/jfrog/artifactory/client/model/FileList.java @@ -0,0 +1,11 @@ +package org.jfrog.artifactory.client.model; + +import java.util.Date; +import java.util.List; + +public interface FileList { + + String getUri(); + Date getCreated(); + List getFiles(); +} diff --git a/api/src/main/java/org/jfrog/artifactory/client/model/ListItem.java b/api/src/main/java/org/jfrog/artifactory/client/model/ListItem.java new file mode 100644 index 00000000..c9b15976 --- /dev/null +++ b/api/src/main/java/org/jfrog/artifactory/client/model/ListItem.java @@ -0,0 +1,11 @@ +package org.jfrog.artifactory.client.model; + +import java.util.Date; + +public interface ListItem { + String getUri(); + Long getSize(); + Date getLastModified(); + Boolean isFolder(); + String getSha1(); +} diff --git a/services/src/main/groovy/org/jfrog/artifactory/client/impl/FolderHandleImpl.java b/services/src/main/groovy/org/jfrog/artifactory/client/impl/FolderHandleImpl.java new file mode 100644 index 00000000..f9b44837 --- /dev/null +++ b/services/src/main/groovy/org/jfrog/artifactory/client/impl/FolderHandleImpl.java @@ -0,0 +1,43 @@ +package org.jfrog.artifactory.client.impl; + +import org.jfrog.artifactory.client.FolderHandle; +import org.jfrog.artifactory.client.model.FileList; +import org.jfrog.artifactory.client.model.impl.FileListImpl; + +import java.io.IOException; + +public class FolderHandleImpl extends ItemHandleImpl implements FolderHandle { + + private final String baseApiPath; + + private final ArtifactoryImpl artifactory; + private final String repo; + private final String path; + + FolderHandleImpl(ArtifactoryImpl artifactory, String baseApiPath, String repo, String path, Class itemType) { + super(artifactory, baseApiPath, repo, path, itemType); + this.artifactory = artifactory; + this.repo = repo; + this.path = path; + this.baseApiPath = baseApiPath; + } + + public FileList list(boolean deep, boolean listFolders, boolean timestamps) { + String deepInt = toInt(deep); + String listFoldersInt = toInt(listFolders); + String timestampsInt = toInt(timestamps); + String url = String.format("%s/storage/%s/%s?list&deep=%s&listFolders=%s&mdTimestamps=%s", + baseApiPath, repo, path, deepInt, listFoldersInt, timestampsInt); + + FileListImpl fileListImpl = new FileListImpl(); + try { + return artifactory.get(url, fileListImpl.getClass(), null); + } catch (IOException e) { + return null; + } + } + + private String toInt(boolean b) { + return b?"1":"0"; + } +} diff --git a/services/src/main/groovy/org/jfrog/artifactory/client/impl/RepositoryHandleImpl.groovy b/services/src/main/groovy/org/jfrog/artifactory/client/impl/RepositoryHandleImpl.groovy index 4a0121c8..267a11ad 100644 --- a/services/src/main/groovy/org/jfrog/artifactory/client/impl/RepositoryHandleImpl.groovy +++ b/services/src/main/groovy/org/jfrog/artifactory/client/impl/RepositoryHandleImpl.groovy @@ -38,10 +38,9 @@ class RepositoryHandleImpl implements RepositoryHandle { this.repoKey = repoKey } - //TODO: [by yl] Use a FileHandler and a FolderHandler instead or returning Items @Override - ItemHandle folder(String folderName) { - new ItemHandleImpl(artifactory, baseApiPath, repoKey, folderName, FolderImpl) + FolderHandle folder(String folderName) { + new FolderHandleImpl(artifactory, baseApiPath, repoKey, folderName, FolderImpl) } @Override diff --git a/services/src/main/java/org/jfrog/artifactory/client/model/impl/FileListImpl.java b/services/src/main/java/org/jfrog/artifactory/client/model/impl/FileListImpl.java new file mode 100644 index 00000000..18fe8311 --- /dev/null +++ b/services/src/main/java/org/jfrog/artifactory/client/model/impl/FileListImpl.java @@ -0,0 +1,39 @@ +package org.jfrog.artifactory.client.model.impl; + +import org.jfrog.artifactory.client.model.FileList; +import org.jfrog.artifactory.client.model.ListItem; + +import java.util.Arrays; +import java.util.Date; +import java.util.List; + +public class FileListImpl implements FileList { + + String uri; + Date created; + ListItemImpl[] files; + + FileListImpl(String uri, Date created, ListItemImpl[] files) { + this.uri = uri; + this.created = created; + this.files = files; + } + + public FileListImpl() { + } + + @Override + public String getUri() { + return uri; + } + + @Override + public Date getCreated() { + return created; + } + + @Override + public List getFiles() { + return Arrays.asList(files); + } +} diff --git a/services/src/main/java/org/jfrog/artifactory/client/model/impl/ListItemImpl.java b/services/src/main/java/org/jfrog/artifactory/client/model/impl/ListItemImpl.java new file mode 100644 index 00000000..4a7a8013 --- /dev/null +++ b/services/src/main/java/org/jfrog/artifactory/client/model/impl/ListItemImpl.java @@ -0,0 +1,50 @@ +package org.jfrog.artifactory.client.model.impl; + +import org.jfrog.artifactory.client.model.File; +import org.jfrog.artifactory.client.model.ListItem; + +import java.util.Date; + +public class ListItemImpl implements ListItem { + String uri; + Long size; + Date lastModified; + Boolean folder; + String sha1; + + ListItemImpl(String uri, Long size, Date lastModified, Boolean folder) { + this.uri = uri; + this.size = size; + this.lastModified = lastModified; + this.folder = folder; + } + + ListItemImpl() { + } + + @Override + public String getUri() { + return uri; + } + + @Override + public Long getSize() { + return size; + } + + @Override + public Date getLastModified() { + return lastModified; + } + + @Override + public Boolean isFolder() { + return folder; + } + + @Override + public String getSha1() { + return sha1; + } + +} diff --git a/services/src/main/resources/artifactory.client.release.properties b/services/src/main/resources/artifactory.client.release.properties index 4629dffc..dca01175 100644 --- a/services/src/main/resources/artifactory.client.release.properties +++ b/services/src/main/resources/artifactory.client.release.properties @@ -1 +1 @@ -version=2.9.1 \ No newline at end of file +version=2.9.x-SNAPSHOT \ No newline at end of file diff --git a/services/src/test/java/org/jfrog/artifactory/client/ItemTests.java b/services/src/test/java/org/jfrog/artifactory/client/ItemTests.java index c8953052..e3435238 100644 --- a/services/src/test/java/org/jfrog/artifactory/client/ItemTests.java +++ b/services/src/test/java/org/jfrog/artifactory/client/ItemTests.java @@ -4,6 +4,7 @@ import org.jfrog.artifactory.client.impl.ArtifactoryRequestImpl; import org.jfrog.artifactory.client.impl.CopyMoveException; import org.jfrog.artifactory.client.model.File; +import org.jfrog.artifactory.client.model.FileList; import org.jfrog.artifactory.client.model.Folder; import org.jfrog.artifactory.client.model.Item; import org.jfrog.artifactory.client.model.LocalRepository; @@ -13,10 +14,12 @@ import java.io.IOException; import java.io.InputStream; +import java.util.Calendar; import java.util.HashMap; import java.util.List; import java.util.Map; + import static org.testng.Assert.*; /** @@ -29,6 +32,22 @@ public class ItemTests extends ArtifactoryTestsBase { protected static final String NEW_LOCAL_FROM = "new-local-from"; protected static final String NEW_LOCAL_TO = "new-local-to"; + @Test + public void testFolderList() throws IOException { + artifactory.repository(getJCenterRepoName()).download("junit/junit/4.10/junit-4.10-sources.jar").doDownload(); + + FileList list = artifactory.repository(getJcenterCacheName()).folder("junit").list(true,true,true); + assertNotNull(list); + assertEquals(list.getFiles().size(),3); + assertEquals(list.getFiles().get(2).getSha1(),"6c98d6766e72d5575f96c9479d1c1d3b865c6e25"); + Calendar calendar = Calendar.getInstance(); + calendar.setTimeInMillis(1317323539000L); + assertEquals(list.getFiles().get(2).getLastModified().getTime(),calendar.getTime().getTime()); + + FileList list2 = artifactory.repository(getJcenterCacheName()).folder("junit").list(true,false,false); + assertEquals(list2.getFiles().size(),1); + } + @Test public void testFolderInfo() throws IOException { // Get the folder to the cache