diff --git a/file-repository-core/src/main/java/org/genesys/filerepository/NoSuchRepositoryFolderException.java b/file-repository-core/src/main/java/org/genesys/filerepository/NoSuchRepositoryFolderException.java new file mode 100644 index 0000000000000000000000000000000000000000..fc1420d9ac72bbbd8bea243a60b94ae7b6bc40e5 --- /dev/null +++ b/file-repository-core/src/main/java/org/genesys/filerepository/NoSuchRepositoryFolderException.java @@ -0,0 +1,41 @@ +/* + * Copyright 2018 Global Crop Diversity Trust + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.genesys.filerepository; + +/** + * The Class NoSuchRepositoryFileException. + */ +public class NoSuchRepositoryFolderException extends FileRepositoryException { + /** The Constant serialVersionUID. */ + private static final long serialVersionUID = 1L; + + /** + * Instantiates a new no such repository file exception. + */ + public NoSuchRepositoryFolderException() { + } + + /** + * Instantiates a new no such repository file exception. + * + * @param message the message + */ + public NoSuchRepositoryFolderException(final String message) { + super(message); + } + +} diff --git a/file-repository-core/src/main/java/org/genesys/filerepository/model/ImageGallery.java b/file-repository-core/src/main/java/org/genesys/filerepository/model/ImageGallery.java index ebd36730e970a1959ce6d1c20c043a4704a5301b..12540236db096433f5bdc231d2bfbee1bb8b3f06 100644 --- a/file-repository-core/src/main/java/org/genesys/filerepository/model/ImageGallery.java +++ b/file-repository-core/src/main/java/org/genesys/filerepository/model/ImageGallery.java @@ -33,6 +33,7 @@ import javax.persistence.Table; import org.genesys.blocks.model.AuditedVersionedModel; import org.genesys.blocks.model.Copyable; +import org.genesys.blocks.model.JsonViews; import org.genesys.blocks.security.model.AclAwareModel; import org.hibernate.annotations.Type; @@ -40,6 +41,7 @@ import com.fasterxml.jackson.annotation.JsonIdentityInfo; import com.fasterxml.jackson.annotation.JsonIdentityReference; import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonView; import com.fasterxml.jackson.annotation.JsonProperty.Access; import com.fasterxml.jackson.annotation.ObjectIdGenerators; @@ -86,6 +88,7 @@ public class ImageGallery extends AuditedVersionedModel implements AclAwareModel @ManyToMany(cascade = { CascadeType.REFRESH }) @JoinTable(name = "repository_gallery_image", joinColumns = @JoinColumn(name = "galleryId"), inverseJoinColumns = @JoinColumn(name = "imageId")) @OrderColumn(name = "position") + @JsonView({ JsonViews.Root.class }) private List images; /** The folder. */ diff --git a/file-repository-core/src/main/java/org/genesys/filerepository/model/RepositoryFolder.java b/file-repository-core/src/main/java/org/genesys/filerepository/model/RepositoryFolder.java index f2a6fe99adb4fa112b3657972c3af2e3e1f4c41e..dff8779dd62af6e066ea90612a6541d689b867e1 100644 --- a/file-repository-core/src/main/java/org/genesys/filerepository/model/RepositoryFolder.java +++ b/file-repository-core/src/main/java/org/genesys/filerepository/model/RepositoryFolder.java @@ -32,6 +32,7 @@ import javax.persistence.PrePersist; import javax.persistence.Table; import javax.persistence.Transient; +import org.genesys.blocks.model.JsonViews; import org.genesys.blocks.model.UuidModel; import org.genesys.blocks.security.model.AclAwareModel; import org.genesys.filerepository.InvalidRepositoryPathException; @@ -41,6 +42,7 @@ import org.hibernate.annotations.Type; import com.fasterxml.jackson.annotation.JsonIdentityInfo; import com.fasterxml.jackson.annotation.JsonIdentityReference; import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonView; import com.fasterxml.jackson.annotation.ObjectIdGenerators; /** @@ -73,6 +75,7 @@ public class RepositoryFolder extends UuidModel implements AclAwareModel { @OneToMany(cascade = {}, fetch = FetchType.LAZY, mappedBy = "parent") @JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "path") @JsonIdentityReference(alwaysAsId = true) + @JsonView({ JsonViews.Root.class }) private List children; /** List of files in this folder. */ diff --git a/file-repository-core/src/main/java/org/genesys/filerepository/persistence/RepositoryFolderRepository.java b/file-repository-core/src/main/java/org/genesys/filerepository/persistence/RepositoryFolderRepository.java index 3c82fc96ed7844abf4c7bee026b1443776996eab..f1a675420e5f51f78040c3e14d976dda6276eaa5 100644 --- a/file-repository-core/src/main/java/org/genesys/filerepository/persistence/RepositoryFolderRepository.java +++ b/file-repository-core/src/main/java/org/genesys/filerepository/persistence/RepositoryFolderRepository.java @@ -64,4 +64,13 @@ public interface RepositoryFolderRepository extends RepositoryPersistence findByPathStartingWith(String prefix, Pageable pageable); + + /** + * Find by uuid and version. + * + * @param uuid the uuid + * @param version the version + * @return the repository folder + */ + RepositoryFolder findByUuidAndVersion(UUID uuid, int version); } diff --git a/file-repository-core/src/main/java/org/genesys/filerepository/service/RepositoryService.java b/file-repository-core/src/main/java/org/genesys/filerepository/service/RepositoryService.java index 21103b93aa1ef10c47ab2d12d7f4fc0bd8e9a74c..19674f878683ee9da6f84c1c8234d5316d9511a1 100644 --- a/file-repository-core/src/main/java/org/genesys/filerepository/service/RepositoryService.java +++ b/file-repository-core/src/main/java/org/genesys/filerepository/service/RepositoryService.java @@ -26,6 +26,7 @@ import org.genesys.filerepository.FolderNotEmptyException; import org.genesys.filerepository.InvalidRepositoryFileDataException; import org.genesys.filerepository.InvalidRepositoryPathException; import org.genesys.filerepository.NoSuchRepositoryFileException; +import org.genesys.filerepository.NoSuchRepositoryFolderException; import org.genesys.filerepository.metadata.ImageMetadata; import org.genesys.filerepository.model.RepositoryFile; import org.genesys.filerepository.model.RepositoryFolder; @@ -246,6 +247,14 @@ public interface RepositoryService { */ RepositoryImage removeImage(RepositoryImage repositoryImage) throws NoSuchRepositoryFileException, IOException; + /** + * Get folder by UUID + * + * @param uuid folder UUID + * @return the folder + */ + RepositoryFolder getFolder(UUID uuid); + /** * Gets the folder by path * @@ -255,6 +264,15 @@ public interface RepositoryService { */ RepositoryFolder getFolder(Path folderPath) throws InvalidRepositoryPathException; + /** + * Update folder metadata. Note that path and name are immutable. + * + * @param folder the folder + * @return the updated repository folder + * @throws NoSuchRepositoryFolderException + */ + RepositoryFolder updateFolder(RepositoryFolder folder) throws NoSuchRepositoryFolderException; + /** * Test if repository contains the path. * diff --git a/file-repository-core/src/main/java/org/genesys/filerepository/service/impl/RepositoryServiceImpl.java b/file-repository-core/src/main/java/org/genesys/filerepository/service/impl/RepositoryServiceImpl.java index e918fb28ae9e90a23506dc502ae3ad2e98faa5b1..4fef613af03e9971d50c181ee2a6b1fff7208b3d 100644 --- a/file-repository-core/src/main/java/org/genesys/filerepository/service/impl/RepositoryServiceImpl.java +++ b/file-repository-core/src/main/java/org/genesys/filerepository/service/impl/RepositoryServiceImpl.java @@ -38,6 +38,7 @@ import org.genesys.filerepository.FolderNotEmptyException; import org.genesys.filerepository.InvalidRepositoryFileDataException; import org.genesys.filerepository.InvalidRepositoryPathException; import org.genesys.filerepository.NoSuchRepositoryFileException; +import org.genesys.filerepository.NoSuchRepositoryFolderException; import org.genesys.filerepository.model.QRepositoryFile; import org.genesys.filerepository.model.QRepositoryFolder; import org.genesys.filerepository.model.RepositoryFile; @@ -68,6 +69,10 @@ import com.querydsl.core.types.dsl.BooleanExpression; * @author Matija Obreza * */ +/** + * @author Matija Obreza + * + */ @Service @Transactional(readOnly = true) public class RepositoryServiceImpl implements RepositoryService, InitializingBean { @@ -375,12 +380,32 @@ public class RepositoryServiceImpl implements RepositoryService, InitializingBea } } + @Override + public RepositoryFolder getFolder(UUID uuid) { + return folderRepository.findByUuid(uuid); + } + @Override public RepositoryFolder getFolder(Path folderPath) throws InvalidRepositoryPathException { PathValidator.checkValidPath(folderPath); return folderRepository.findByPath(folderPath.normalize().toAbsolutePath().toString()); } + /* (non-Javadoc) + * @see org.genesys.filerepository.service.RepositoryService#updateFolder(org.genesys.filerepository.model.RepositoryFolder) + */ + @Override + @Transactional + public RepositoryFolder updateFolder(RepositoryFolder folder) throws NoSuchRepositoryFolderException { + RepositoryFolder databaseFolder = folderRepository.findByUuidAndVersion(folder.getUuid(), folder.getVersion()); + if (databaseFolder == null) { + throw new NoSuchRepositoryFolderException("Folder version doesn't match or folder not found"); + } + databaseFolder.setTitle(folder.getTitle()); + databaseFolder.setDescription(folder.getDescription()); + return folderRepository.save(databaseFolder); + } + /* * (non-Javadoc) * @see diff --git a/file-repository-core/src/test/java/org/genesys/filerepository/service/RepositoryFolderTest.java b/file-repository-core/src/test/java/org/genesys/filerepository/service/RepositoryFolderTest.java index 65d5ecf3f394473c0ef8488e12dde1eb9402b103..abcb601ec3dad2549962c9027ddc377673e01ade 100644 --- a/file-repository-core/src/test/java/org/genesys/filerepository/service/RepositoryFolderTest.java +++ b/file-repository-core/src/test/java/org/genesys/filerepository/service/RepositoryFolderTest.java @@ -25,6 +25,7 @@ import java.util.List; import org.genesys.filerepository.FolderNotEmptyException; import org.genesys.filerepository.InvalidRepositoryPathException; +import org.genesys.filerepository.NoSuchRepositoryFolderException; import org.genesys.filerepository.model.RepositoryFolder; import org.junit.Test; import org.springframework.security.test.context.support.WithMockUser; @@ -119,7 +120,7 @@ public class RepositoryFolderTest extends RepositoryServiceTest { Path newPath = path.getRoot().resolve("bbbb"); repositoryService.renamePath(path, newPath); } - + @Test(expected = InvalidRepositoryPathException.class) public void failRenamePathToExisting2() throws InvalidRepositoryPathException { Path path = Paths.get("/bbbb/cccc/dddd/eeee"); @@ -130,14 +131,54 @@ public class RepositoryFolderTest extends RepositoryServiceTest { Path newPath = path.getParent().getParent().resolve("dddd"); repositoryService.renamePath(path, newPath); } - + @Test public void deleteEmptyFolder() throws InvalidRepositoryPathException, FolderNotEmptyException { Path path = Paths.get("/bbbb/cccc/dddd/eeee"); RepositoryFolder folder = repositoryService.ensureFolder(path); assertThat(folder, notNullValue()); - + RepositoryFolder deleted = repositoryService.deleteFolder(path); assertThat(deleted, notNullValue()); } + + @Test + public void getFolderByUuid() throws InvalidRepositoryPathException { + Path path = Paths.get("/eeee/" + System.currentTimeMillis()); + RepositoryFolder folder = repositoryService.ensureFolder(path); + RepositoryFolder folderByUuid = repositoryService.getFolder(folder.getUuid()); + assertThat(folder.getUuid(), equalTo(folderByUuid.getUuid())); + } + + @Test + public void updateTest() throws InvalidRepositoryPathException, NoSuchRepositoryFolderException { + Path path = Paths.get("/eeee/" + System.currentTimeMillis()); + RepositoryFolder folder = repositoryService.ensureFolder(path); + assertThat(folder.getTitle(), nullValue()); + assertThat(folder.getDescription(), nullValue()); + + folder.setTitle("Folder name"); + folder.setDescription("Folder description"); + RepositoryFolder folderUpdated = repositoryService.updateFolder(folder); + + assertThat(folderUpdated.getUuid(), equalTo(folder.getUuid())); + assertThat(folderUpdated.getVersion(), equalTo(folder.getVersion() + 1)); + assertThat(folderUpdated.getTitle(), equalTo(folder.getTitle())); + assertThat(folderUpdated.getDescription(), equalTo(folder.getDescription())); + } + + @Test + public void updateTestNoNameChange() throws InvalidRepositoryPathException, NoSuchRepositoryFolderException { + String folderName = "" + System.currentTimeMillis(); + Path path = Paths.get("/eeee/" + folderName); + RepositoryFolder folder = repositoryService.ensureFolder(path); + + folder.setName("New name"); + RepositoryFolder folderUpdated = repositoryService.updateFolder(folder); + + assertThat(folderUpdated.getUuid(), equalTo(folder.getUuid())); + assertThat(folderUpdated.getVersion(), equalTo(folder.getVersion())); + assertThat(folderUpdated.getName(), equalTo(folderName)); + } + }