From 5106fc7a237ce19ad42ee5fa44d7d256b3c5f622 Mon Sep 17 00:00:00 2001 From: krwong Date: Wed, 28 Aug 2024 13:40:17 -0400 Subject: [PATCH 1/8] list_projects service and command --- pom.xml | 3 + .../unc/lib/boxc/migration/cdm/CLIMain.java | 3 +- .../migration/cdm/ListProjectsCommand.java | 69 ++++++++ .../cdm/services/ListProjectsService.java | 148 +++++++++++++++++ .../migration/cdm/ListProjectsCommandIT.java | 62 +++++++ .../cdm/services/ListProjectsServiceTest.java | 157 ++++++++++++++++++ 6 files changed, 441 insertions(+), 1 deletion(-) create mode 100644 src/main/java/edu/unc/lib/boxc/migration/cdm/ListProjectsCommand.java create mode 100644 src/main/java/edu/unc/lib/boxc/migration/cdm/services/ListProjectsService.java create mode 100644 src/test/java/edu/unc/lib/boxc/migration/cdm/ListProjectsCommandIT.java create mode 100644 src/test/java/edu/unc/lib/boxc/migration/cdm/services/ListProjectsServiceTest.java diff --git a/pom.xml b/pom.xml index 4471bc1d..c8da0e9e 100644 --- a/pom.xml +++ b/pom.xml @@ -24,6 +24,7 @@ 5.9.2 8.10.1 0.7.3 + 2.17.2 @@ -141,10 +142,12 @@ com.fasterxml.jackson.core jackson-core + ${jackson.version} com.fasterxml.jackson.core jackson-databind + ${jackson.version} com.fasterxml.jackson.datatype diff --git a/src/main/java/edu/unc/lib/boxc/migration/cdm/CLIMain.java b/src/main/java/edu/unc/lib/boxc/migration/cdm/CLIMain.java index 8eef1f1d..3ea791c6 100644 --- a/src/main/java/edu/unc/lib/boxc/migration/cdm/CLIMain.java +++ b/src/main/java/edu/unc/lib/boxc/migration/cdm/CLIMain.java @@ -41,7 +41,8 @@ FilterIndexCommand.class, AggregateFilesCommand.class, PermissionsCommand.class, - ExportObjectsCommand.class + ExportObjectsCommand.class, + ListProjectsCommand.class }) public class CLIMain implements Callable { @Option(names = { "-w", "--work-dir" }, diff --git a/src/main/java/edu/unc/lib/boxc/migration/cdm/ListProjectsCommand.java b/src/main/java/edu/unc/lib/boxc/migration/cdm/ListProjectsCommand.java new file mode 100644 index 00000000..96b6671f --- /dev/null +++ b/src/main/java/edu/unc/lib/boxc/migration/cdm/ListProjectsCommand.java @@ -0,0 +1,69 @@ +package edu.unc.lib.boxc.migration.cdm; + +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import edu.unc.lib.boxc.migration.cdm.exceptions.MigrationException; +import edu.unc.lib.boxc.migration.cdm.services.CdmFieldService; +import edu.unc.lib.boxc.migration.cdm.services.CdmIndexService; +import edu.unc.lib.boxc.migration.cdm.services.ListProjectsService; +import edu.unc.lib.boxc.migration.cdm.services.ProjectPropertiesService; +import edu.unc.lib.boxc.migration.cdm.services.SourceFileService; +import org.slf4j.Logger; +import picocli.CommandLine.Command; +import picocli.CommandLine.ParentCommand; + +import java.io.IOException; +import java.util.concurrent.Callable; + +import static edu.unc.lib.boxc.migration.cdm.util.CLIConstants.outputLogger; +import static org.slf4j.LoggerFactory.getLogger; + +/** + * @author krwong + */ +@Command(name = "list_projects", + description = "List all chompb projects in a directory.") +public class ListProjectsCommand implements Callable { + private static final Logger log = getLogger(ListProjectsCommand.class); + + @ParentCommand + private CLIMain parentCommand; + + private CdmFieldService fieldService; + private CdmIndexService indexService; + private ProjectPropertiesService propertiesService; + private SourceFileService sourceFileService; + private ListProjectsService listProjectsService; + + @Override + public Integer call() { + try { + initialize(); + ObjectMapper mapper = new ObjectMapper(); + JsonNode listProjects = listProjectsService.listProjects(parentCommand.getWorkingDirectory()); + mapper.writerFor(listProjects.getClass()).withDefaultPrettyPrinter(); + return 0; + } catch(MigrationException | IllegalArgumentException e) { + outputLogger.info("List projects failed: {}", e.getMessage()); + return 1; + } catch(Exception e) { + log.error("Failed to list projects", e); + outputLogger.info("List projects failed: {}", e.getMessage(), e); + return 1; + } + } + + private void initialize() throws IOException { + fieldService = new CdmFieldService(); + indexService = new CdmIndexService(); + indexService.setFieldService(fieldService); + sourceFileService = new SourceFileService(); + sourceFileService.setIndexService(indexService); + propertiesService = new ProjectPropertiesService(); + listProjectsService = new ListProjectsService(); + listProjectsService.setFieldService(fieldService); + listProjectsService.setIndexService(indexService); + listProjectsService.setSourceFileService(sourceFileService); + listProjectsService.setPropertiesService(propertiesService); + } +} diff --git a/src/main/java/edu/unc/lib/boxc/migration/cdm/services/ListProjectsService.java b/src/main/java/edu/unc/lib/boxc/migration/cdm/services/ListProjectsService.java new file mode 100644 index 00000000..f6dfd741 --- /dev/null +++ b/src/main/java/edu/unc/lib/boxc/migration/cdm/services/ListProjectsService.java @@ -0,0 +1,148 @@ +package edu.unc.lib.boxc.migration.cdm.services; + +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.SerializationFeature; +import com.fasterxml.jackson.databind.node.ArrayNode; +import com.fasterxml.jackson.databind.node.ObjectNode; +import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; +import edu.unc.lib.boxc.migration.cdm.exceptions.InvalidProjectStateException; +import edu.unc.lib.boxc.migration.cdm.model.MigrationProject; +import edu.unc.lib.boxc.migration.cdm.model.SourceFilesInfo; +import org.apache.commons.io.FilenameUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.File; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.Arrays; +import java.util.List; + +/** + * Service for listing all chompb projects in a given directory + * @author krwong + */ +public class ListProjectsService { + private static final Logger log = LoggerFactory.getLogger(ListProjectsService.class); + + private CdmFieldService fieldService; + private CdmIndexService indexService; + private ProjectPropertiesService propertiesService; + private SourceFileService sourceFileService; + + public static final String PROJECT_PATH = "projectPath"; + public static final String STATUS = "status"; + public static final String ALLOWED_ACTIONS = "allowedActions"; + + /** + * List projects in given directory + * @return jsonNode of projects + */ + public JsonNode listProjects(Path directory) throws Exception { + if (Files.notExists(directory)) { + throw new InvalidProjectStateException("Path " + directory + " does not exist"); + } + + // create JSON + ObjectMapper mapper = new ObjectMapper(); + mapper.registerModule(new JavaTimeModule()); + mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false); + ArrayNode arrayNode = mapper.createArrayNode(); + + for (File file : directory.toFile().listFiles()) { + if (file.isDirectory()) { + MigrationProject project = initializeProject(file.toPath()); + + Path projectPath = directory.toAbsolutePath(); + String projectStatus = status(project); + String allowedActions = allowedActions(project); + JsonNode projectProperties = mapper.readTree(project.getProjectPropertiesPath().toFile()); + + // add project info to JSON + ObjectNode objectNode = mapper.createObjectNode(); + objectNode.put(PROJECT_PATH, projectPath.toString()); + objectNode.put(STATUS, projectStatus); + objectNode.put(ALLOWED_ACTIONS, allowedActions); + objectNode.set("projectProperties", projectProperties); + arrayNode.add(objectNode); + } + } + log.debug(arrayNode.toString()); + + return arrayNode; + } + + /** + * Condensed representation of the phase a project is in + * possible values: initialized, indexed, sources_mapped, sips_generated, ingested, archived + * @return project status + */ + private String status(MigrationProject project) { + String status = null; + +// TODO: add archived state +// if () { +// status = "archived"; +// } + if (!project.getProjectProperties().getSipsSubmitted().isEmpty()) { + status = "ingested"; + } else if (project.getProjectProperties().getSipsGeneratedDate() != null) { + status = "sips_generated"; + } else if (project.getProjectProperties().getSourceFilesUpdatedDate() != null) { + status = "sources_mapped"; + } else if (project.getProjectProperties().getIndexedDate() != null) { + status = "indexed"; + } else if (Files.exists(project.getProjectPropertiesPath())) { + status = "initialized"; + } + + return status; + } + + /** + * Tell other applications (boxc) what processes are supported by the project + * crop_color_bars: populated if source files are mapped and if project contains any images (based off source file extensions) + * @return allowed_actions + */ + private String allowedActions(MigrationProject project) throws Exception { + String allowedActions = null; + List imageFormats = Arrays.asList("tif", "jpeg", "png", "gif", "pict", "bmp", + "psd", "jp2", "nef", "crw", "cr2", "dng", "raf"); + + if (project.getProjectProperties().getSourceFilesUpdatedDate() != null) { + SourceFilesInfo info = sourceFileService.loadMappings(); + if (info.getMappings().stream().map(entry -> + FilenameUtils.getExtension(entry.getFirstSourcePath().toString())).anyMatch(imageFormats::contains)) { + allowedActions = "crop_color_bars"; + } + } + return allowedActions; + } + + public MigrationProject initializeProject(Path path) throws Exception { + MigrationProject project = MigrationProjectFactory.loadMigrationProject(path); + propertiesService.setProject(project); + sourceFileService.setProject(project); + indexService.setProject(project); + fieldService.setProject(project); + + return project; + } + + public void setFieldService(CdmFieldService fieldService) { + this.fieldService = fieldService; + } + + public void setIndexService(CdmIndexService indexService) { + this.indexService = indexService; + } + + public void setPropertiesService(ProjectPropertiesService propertiesService) { + this.propertiesService = propertiesService; + } + + public void setSourceFileService(SourceFileService sourceFileService) { + this.sourceFileService = sourceFileService; + } +} diff --git a/src/test/java/edu/unc/lib/boxc/migration/cdm/ListProjectsCommandIT.java b/src/test/java/edu/unc/lib/boxc/migration/cdm/ListProjectsCommandIT.java new file mode 100644 index 00000000..a5d6b2ec --- /dev/null +++ b/src/test/java/edu/unc/lib/boxc/migration/cdm/ListProjectsCommandIT.java @@ -0,0 +1,62 @@ +package edu.unc.lib.boxc.migration.cdm; + +import edu.unc.lib.boxc.migration.cdm.model.MigrationProject; +import edu.unc.lib.boxc.migration.cdm.services.ListProjectsService; +import edu.unc.lib.boxc.migration.cdm.services.MigrationProjectFactory; +import edu.unc.lib.boxc.migration.cdm.test.BxcEnvironmentHelper; +import edu.unc.lib.boxc.migration.cdm.test.CdmEnvironmentHelper; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import java.nio.file.Path; + +public class ListProjectsCommandIT extends AbstractCommandIT { + private static final String PROJECT_ID_2 = "proj2"; + + @BeforeEach + public void setup() throws Exception { + initProjectAndHelper(); + setupChompbConfig(); + } + + @Test + public void invalidDirectoryTest() throws Exception { + String[] args = new String[] { + "-w", String.valueOf(Path.of("test")), + "list_projects" }; + executeExpectFailure(args); + + assertOutputContains("does not exist"); + } + + @Test + public void listProjectsTest() throws Exception { + String[] args = new String[] { + "-w", String.valueOf(baseDir), + "list_projects" }; + executeExpectSuccess(args); + + assertOutputContains("{\"" + ListProjectsService.PROJECT_PATH + "\":\"" + baseDir + "\""); + assertOutputContains("\""+ ListProjectsService.STATUS + "\":\"initialized\""); + assertOutputContains("\"" + ListProjectsService.ALLOWED_ACTIONS + "\":null"); + assertOutputContains("{\"name\":\"" + PROJECT_ID + "\""); + } + + @Test + public void listMultipleProjectsTest() throws Exception { + project = MigrationProjectFactory.createMigrationProject( + tmpFolder, PROJECT_ID_2, null, "user", CdmEnvironmentHelper.DEFAULT_ENV_ID, + BxcEnvironmentHelper.DEFAULT_ENV_ID, MigrationProject.PROJECT_SOURCE_CDM); + + String[] args = new String[] { + "-w", String.valueOf(baseDir), + "list_projects" }; + executeExpectSuccess(args); + + assertOutputContains("{\"" + ListProjectsService.PROJECT_PATH + "\":\"" + baseDir + "\""); + assertOutputContains("\""+ ListProjectsService.STATUS + "\":\"initialized\""); + assertOutputContains("\"" + ListProjectsService.ALLOWED_ACTIONS + "\":null"); + assertOutputContains("{\"name\":\"" + PROJECT_ID + "\""); + assertOutputContains("{\"name\":\"" + PROJECT_ID_2 + "\""); + } +} diff --git a/src/test/java/edu/unc/lib/boxc/migration/cdm/services/ListProjectsServiceTest.java b/src/test/java/edu/unc/lib/boxc/migration/cdm/services/ListProjectsServiceTest.java new file mode 100644 index 00000000..1c4eb054 --- /dev/null +++ b/src/test/java/edu/unc/lib/boxc/migration/cdm/services/ListProjectsServiceTest.java @@ -0,0 +1,157 @@ +package edu.unc.lib.boxc.migration.cdm.services; + +import com.fasterxml.jackson.databind.JsonNode; +import edu.unc.lib.boxc.migration.cdm.model.MigrationProject; +import edu.unc.lib.boxc.migration.cdm.test.BxcEnvironmentHelper; +import edu.unc.lib.boxc.migration.cdm.test.CdmEnvironmentHelper; +import edu.unc.lib.boxc.migration.cdm.test.SipServiceHelper; +import edu.unc.lib.boxc.migration.cdm.util.ProjectPropertiesSerialization; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.io.TempDir; + +import java.nio.file.Path; +import java.time.Instant; +import java.util.Collections; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.junit.jupiter.api.Assertions.fail; +import static org.mockito.MockitoAnnotations.openMocks; + +public class ListProjectsServiceTest { + private static final String PROJECT_NAME = "proj"; + private static final String PROJECT_NAME_2 = "proj2"; + + @TempDir + public Path tmpFolder; + + private SipServiceHelper testHelper; + private MigrationProject project; + private ListProjectsService service; + private CdmFieldService fieldService; + private CdmIndexService indexService; + private ProjectPropertiesService projectPropertiesService; + private SourceFileService sourceFileService; + + private AutoCloseable closeable; + + @BeforeEach + public void setup() throws Exception { + closeable = openMocks(this); + project = MigrationProjectFactory.createMigrationProject( + tmpFolder, PROJECT_NAME, null, "user", CdmEnvironmentHelper.DEFAULT_ENV_ID, + BxcEnvironmentHelper.DEFAULT_ENV_ID, MigrationProject.PROJECT_SOURCE_CDM); + testHelper = new SipServiceHelper(project, tmpFolder); + + fieldService = new CdmFieldService(); + indexService = new CdmIndexService(); + indexService.setFieldService(fieldService); + sourceFileService = new SourceFileService(); + sourceFileService.setIndexService(indexService); + projectPropertiesService = new ProjectPropertiesService(); + service = new ListProjectsService(); + service.setFieldService(fieldService); + service.setIndexService(indexService); + service.setPropertiesService(projectPropertiesService); + service.setSourceFileService(sourceFileService); + } + + @AfterEach + void closeService() throws Exception { + closeable.close(); + } + + @Test + public void invalidDirectoryTest() throws Exception { + try { + service.listProjects(Path.of("test")); + fail(); + } catch (Exception e) { + assertTrue(e.getMessage().contains("Path test does not exist")); + } + } + + @Test + public void listProjectsInitializedTest() throws Exception { + JsonNode list = service.listProjects(tmpFolder); + + assertEquals(tmpFolder.toString(), list.findValue(ListProjectsService.PROJECT_PATH).asText()); + assertEquals("initialized", list.findValue(ListProjectsService.STATUS).asText()); + assertEquals("null", list.findValue(ListProjectsService.ALLOWED_ACTIONS).asText()); + assertEquals(PROJECT_NAME, list.findValue("name").asText()); + } + + @Test + public void listProjectsIndexedTest() throws Exception { + project.getProjectProperties().setIndexedDate(Instant.now()); + ProjectPropertiesSerialization.write(project); + JsonNode list = service.listProjects(tmpFolder); + + assertEquals(tmpFolder.toString(), list.findValue(ListProjectsService.PROJECT_PATH).asText()); + assertEquals("indexed", list.findValue(ListProjectsService.STATUS).asText()); + assertEquals("null", list.findValue(ListProjectsService.ALLOWED_ACTIONS).asText()); + assertEquals(PROJECT_NAME, list.findValue("name").asText()); + } + + @Test + public void listProjectsSourcesMappedTest() throws Exception { + project.getProjectProperties().setSourceFilesUpdatedDate(Instant.now()); + ProjectPropertiesSerialization.write(project); + JsonNode list = service.listProjects(tmpFolder); + + assertEquals(tmpFolder.toString(), list.findValue(ListProjectsService.PROJECT_PATH).asText()); + assertEquals("sources_mapped", list.findValue(ListProjectsService.STATUS).asText()); + assertEquals("null", list.findValue(ListProjectsService.ALLOWED_ACTIONS).asText()); + assertEquals(PROJECT_NAME, list.findValue("name").asText()); + } + + @Test + public void listProjectsSipsGeneratedTest() throws Exception { + project.getProjectProperties().setSourceFilesUpdatedDate(Instant.now()); + project.getProjectProperties().setSipsGeneratedDate(Instant.now()); + ProjectPropertiesSerialization.write(project); + JsonNode list = service.listProjects(tmpFolder); + + assertEquals(tmpFolder.toString(), list.findValue(ListProjectsService.PROJECT_PATH).asText()); + assertEquals("sips_generated", list.findValue(ListProjectsService.STATUS).asText()); + assertEquals("null", list.findValue(ListProjectsService.ALLOWED_ACTIONS).asText()); + assertEquals(PROJECT_NAME, list.findValue("name").asText()); + } + + @Test + public void listProjectsSipsSubmittedTest() throws Exception { + project.getProjectProperties().setSipsGeneratedDate(Instant.now()); + project.getProjectProperties().setSipsSubmitted(Collections.singleton("test")); + ProjectPropertiesSerialization.write(project); + JsonNode list = service.listProjects(tmpFolder); + + assertEquals(tmpFolder.toString(), list.findValue(ListProjectsService.PROJECT_PATH).asText()); + assertEquals("ingested", list.findValue(ListProjectsService.STATUS).asText()); + assertEquals("null", list.findValue(ListProjectsService.ALLOWED_ACTIONS).asText()); + assertEquals(PROJECT_NAME, list.findValue("name").asText()); + } + + @Test + public void listProjectsMultipleProjectsTest() throws Exception { + // project one ingested + project.getProjectProperties().setSipsGeneratedDate(Instant.now()); + project.getProjectProperties().setSipsSubmitted(Collections.singleton("test")); + ProjectPropertiesSerialization.write(project); + + // project two initialized + project = MigrationProjectFactory.createMigrationProject( + tmpFolder, PROJECT_NAME_2, null, "user", CdmEnvironmentHelper.DEFAULT_ENV_ID, + BxcEnvironmentHelper.DEFAULT_ENV_ID, MigrationProject.PROJECT_SOURCE_CDM); + + JsonNode list = service.listProjects(tmpFolder); + + assertEquals(tmpFolder.toString(), list.findValue(ListProjectsService.PROJECT_PATH).asText()); + assertTrue(list.findValues(ListProjectsService.STATUS).toString().contains("initialized")); + assertTrue(list.findValues(ListProjectsService.STATUS).toString().contains("ingested")); + assertEquals("null", list.findValue(ListProjectsService.ALLOWED_ACTIONS).asText()); + assertTrue(list.findValues("name").toString().contains(PROJECT_NAME_2)); + assertTrue(list.findValues("name").toString().contains(PROJECT_NAME)); + } +} From 7d99adf6433c31343361c79fead05f48d6a16bf2 Mon Sep 17 00:00:00 2001 From: krwong Date: Wed, 28 Aug 2024 14:45:48 -0400 Subject: [PATCH 2/8] fix tests --- .../migration/cdm/ListProjectsCommand.java | 3 ++- .../migration/cdm/ListProjectsCommandIT.java | 18 +++++++++--------- 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/src/main/java/edu/unc/lib/boxc/migration/cdm/ListProjectsCommand.java b/src/main/java/edu/unc/lib/boxc/migration/cdm/ListProjectsCommand.java index 96b6671f..3e422c72 100644 --- a/src/main/java/edu/unc/lib/boxc/migration/cdm/ListProjectsCommand.java +++ b/src/main/java/edu/unc/lib/boxc/migration/cdm/ListProjectsCommand.java @@ -41,7 +41,8 @@ public Integer call() { initialize(); ObjectMapper mapper = new ObjectMapper(); JsonNode listProjects = listProjectsService.listProjects(parentCommand.getWorkingDirectory()); - mapper.writerFor(listProjects.getClass()).withDefaultPrettyPrinter(); + String prettyPrintList = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(listProjects); + outputLogger.info(prettyPrintList); return 0; } catch(MigrationException | IllegalArgumentException e) { outputLogger.info("List projects failed: {}", e.getMessage()); diff --git a/src/test/java/edu/unc/lib/boxc/migration/cdm/ListProjectsCommandIT.java b/src/test/java/edu/unc/lib/boxc/migration/cdm/ListProjectsCommandIT.java index a5d6b2ec..6d332827 100644 --- a/src/test/java/edu/unc/lib/boxc/migration/cdm/ListProjectsCommandIT.java +++ b/src/test/java/edu/unc/lib/boxc/migration/cdm/ListProjectsCommandIT.java @@ -36,10 +36,10 @@ public void listProjectsTest() throws Exception { "list_projects" }; executeExpectSuccess(args); - assertOutputContains("{\"" + ListProjectsService.PROJECT_PATH + "\":\"" + baseDir + "\""); - assertOutputContains("\""+ ListProjectsService.STATUS + "\":\"initialized\""); - assertOutputContains("\"" + ListProjectsService.ALLOWED_ACTIONS + "\":null"); - assertOutputContains("{\"name\":\"" + PROJECT_ID + "\""); + assertOutputContains("\"" + ListProjectsService.PROJECT_PATH + "\" : \"" + baseDir + "\""); + assertOutputContains("\"" + ListProjectsService.STATUS + "\" : \"initialized\""); + assertOutputContains("\"" + ListProjectsService.ALLOWED_ACTIONS + "\" : null"); + assertOutputContains("\"name\" : \"" + PROJECT_ID + "\""); } @Test @@ -53,10 +53,10 @@ public void listMultipleProjectsTest() throws Exception { "list_projects" }; executeExpectSuccess(args); - assertOutputContains("{\"" + ListProjectsService.PROJECT_PATH + "\":\"" + baseDir + "\""); - assertOutputContains("\""+ ListProjectsService.STATUS + "\":\"initialized\""); - assertOutputContains("\"" + ListProjectsService.ALLOWED_ACTIONS + "\":null"); - assertOutputContains("{\"name\":\"" + PROJECT_ID + "\""); - assertOutputContains("{\"name\":\"" + PROJECT_ID_2 + "\""); + assertOutputContains("\"" + ListProjectsService.PROJECT_PATH + "\" : \"" + baseDir + "\""); + assertOutputContains("\""+ ListProjectsService.STATUS + "\" : \"initialized\""); + assertOutputContains("\"" + ListProjectsService.ALLOWED_ACTIONS + "\" : null"); + assertOutputContains("\"name\" : \"" + PROJECT_ID + "\""); + assertOutputContains("\"name\" : \"" + PROJECT_ID_2 + "\""); } } From f080b96bd1e6c89bc3e556acf4c98f6f9800bb67 Mon Sep 17 00:00:00 2001 From: krwong Date: Thu, 29 Aug 2024 11:41:09 -0400 Subject: [PATCH 3/8] imageFormats constant, add image formats, lowercase file extension, allowedActions return list, add test, remove jackson.version --- pom.xml | 3 -- .../cdm/services/ListProjectsService.java | 24 ++++++++---- .../migration/cdm/ListProjectsCommandIT.java | 4 +- .../cdm/services/ListProjectsServiceTest.java | 39 ++++++++++++++++--- 4 files changed, 51 insertions(+), 19 deletions(-) diff --git a/pom.xml b/pom.xml index c8da0e9e..4471bc1d 100644 --- a/pom.xml +++ b/pom.xml @@ -24,7 +24,6 @@ 5.9.2 8.10.1 0.7.3 - 2.17.2 @@ -142,12 +141,10 @@ com.fasterxml.jackson.core jackson-core - ${jackson.version} com.fasterxml.jackson.core jackson-databind - ${jackson.version} com.fasterxml.jackson.datatype diff --git a/src/main/java/edu/unc/lib/boxc/migration/cdm/services/ListProjectsService.java b/src/main/java/edu/unc/lib/boxc/migration/cdm/services/ListProjectsService.java index f6dfd741..6e86b18e 100644 --- a/src/main/java/edu/unc/lib/boxc/migration/cdm/services/ListProjectsService.java +++ b/src/main/java/edu/unc/lib/boxc/migration/cdm/services/ListProjectsService.java @@ -16,8 +16,11 @@ import java.io.File; import java.nio.file.Files; import java.nio.file.Path; +import java.util.ArrayList; import java.util.Arrays; +import java.util.HashSet; import java.util.List; +import java.util.Set; /** * Service for listing all chompb projects in a given directory @@ -34,6 +37,12 @@ public class ListProjectsService { public static final String PROJECT_PATH = "projectPath"; public static final String STATUS = "status"; public static final String ALLOWED_ACTIONS = "allowedActions"; + private static final Set IMAGE_FORMATS = new HashSet<>(); + // accepted file types are listed in imageFormats below + static { + IMAGE_FORMATS.addAll(Arrays.asList("tif", "tiff", "jpeg", "jpg", "png", "gif", "pict", "bmp", + "psd", "jp2", "nef", "crw", "cr2", "dng", "raf")); + } /** * List projects in given directory @@ -56,14 +65,14 @@ public JsonNode listProjects(Path directory) throws Exception { Path projectPath = directory.toAbsolutePath(); String projectStatus = status(project); - String allowedActions = allowedActions(project); + List allowedActions = allowedActions(project); JsonNode projectProperties = mapper.readTree(project.getProjectPropertiesPath().toFile()); // add project info to JSON ObjectNode objectNode = mapper.createObjectNode(); objectNode.put(PROJECT_PATH, projectPath.toString()); objectNode.put(STATUS, projectStatus); - objectNode.put(ALLOWED_ACTIONS, allowedActions); + objectNode.put(ALLOWED_ACTIONS, String.valueOf(allowedActions)); objectNode.set("projectProperties", projectProperties); arrayNode.add(objectNode); } @@ -105,16 +114,15 @@ private String status(MigrationProject project) { * crop_color_bars: populated if source files are mapped and if project contains any images (based off source file extensions) * @return allowed_actions */ - private String allowedActions(MigrationProject project) throws Exception { - String allowedActions = null; - List imageFormats = Arrays.asList("tif", "jpeg", "png", "gif", "pict", "bmp", - "psd", "jp2", "nef", "crw", "cr2", "dng", "raf"); + private List allowedActions(MigrationProject project) throws Exception { + List allowedActions = new ArrayList<>(); if (project.getProjectProperties().getSourceFilesUpdatedDate() != null) { SourceFilesInfo info = sourceFileService.loadMappings(); if (info.getMappings().stream().map(entry -> - FilenameUtils.getExtension(entry.getFirstSourcePath().toString())).anyMatch(imageFormats::contains)) { - allowedActions = "crop_color_bars"; + FilenameUtils.getExtension(entry.getFirstSourcePath().toString().toLowerCase())) + .anyMatch(IMAGE_FORMATS::contains)) { + allowedActions.add("crop_color_bars"); } } return allowedActions; diff --git a/src/test/java/edu/unc/lib/boxc/migration/cdm/ListProjectsCommandIT.java b/src/test/java/edu/unc/lib/boxc/migration/cdm/ListProjectsCommandIT.java index 6d332827..e21190b2 100644 --- a/src/test/java/edu/unc/lib/boxc/migration/cdm/ListProjectsCommandIT.java +++ b/src/test/java/edu/unc/lib/boxc/migration/cdm/ListProjectsCommandIT.java @@ -38,7 +38,7 @@ public void listProjectsTest() throws Exception { assertOutputContains("\"" + ListProjectsService.PROJECT_PATH + "\" : \"" + baseDir + "\""); assertOutputContains("\"" + ListProjectsService.STATUS + "\" : \"initialized\""); - assertOutputContains("\"" + ListProjectsService.ALLOWED_ACTIONS + "\" : null"); + assertOutputContains("\"" + ListProjectsService.ALLOWED_ACTIONS + "\" : \"[]\""); assertOutputContains("\"name\" : \"" + PROJECT_ID + "\""); } @@ -55,7 +55,7 @@ public void listMultipleProjectsTest() throws Exception { assertOutputContains("\"" + ListProjectsService.PROJECT_PATH + "\" : \"" + baseDir + "\""); assertOutputContains("\""+ ListProjectsService.STATUS + "\" : \"initialized\""); - assertOutputContains("\"" + ListProjectsService.ALLOWED_ACTIONS + "\" : null"); + assertOutputContains("\"" + ListProjectsService.ALLOWED_ACTIONS + "\" : \"[]\""); assertOutputContains("\"name\" : \"" + PROJECT_ID + "\""); assertOutputContains("\"name\" : \"" + PROJECT_ID_2 + "\""); } diff --git a/src/test/java/edu/unc/lib/boxc/migration/cdm/services/ListProjectsServiceTest.java b/src/test/java/edu/unc/lib/boxc/migration/cdm/services/ListProjectsServiceTest.java index 1c4eb054..b3636c8e 100644 --- a/src/test/java/edu/unc/lib/boxc/migration/cdm/services/ListProjectsServiceTest.java +++ b/src/test/java/edu/unc/lib/boxc/migration/cdm/services/ListProjectsServiceTest.java @@ -2,15 +2,19 @@ import com.fasterxml.jackson.databind.JsonNode; import edu.unc.lib.boxc.migration.cdm.model.MigrationProject; +import edu.unc.lib.boxc.migration.cdm.model.SourceFilesInfo; import edu.unc.lib.boxc.migration.cdm.test.BxcEnvironmentHelper; import edu.unc.lib.boxc.migration.cdm.test.CdmEnvironmentHelper; import edu.unc.lib.boxc.migration.cdm.test.SipServiceHelper; import edu.unc.lib.boxc.migration.cdm.util.ProjectPropertiesSerialization; +import org.apache.commons.io.FileUtils; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.io.TempDir; +import java.io.IOException; +import java.nio.charset.StandardCharsets; import java.nio.file.Path; import java.time.Instant; import java.util.Collections; @@ -73,13 +77,24 @@ public void invalidDirectoryTest() throws Exception { } } + @Test + public void allowedActionTest() throws Exception { + writeSourceFilesCsv(mappingBody("test,," + Path.of("test.tif") + ",")); + JsonNode list = service.listProjects(tmpFolder); + + assertEquals(tmpFolder.toString(), list.findValue(ListProjectsService.PROJECT_PATH).asText()); + assertEquals("sources_mapped", list.findValue(ListProjectsService.STATUS).asText()); + assertEquals("[crop_color_bars]", list.findValue(ListProjectsService.ALLOWED_ACTIONS).asText()); + assertEquals(PROJECT_NAME, list.findValue("name").asText()); + } + @Test public void listProjectsInitializedTest() throws Exception { JsonNode list = service.listProjects(tmpFolder); assertEquals(tmpFolder.toString(), list.findValue(ListProjectsService.PROJECT_PATH).asText()); assertEquals("initialized", list.findValue(ListProjectsService.STATUS).asText()); - assertEquals("null", list.findValue(ListProjectsService.ALLOWED_ACTIONS).asText()); + assertEquals("[]", list.findValue(ListProjectsService.ALLOWED_ACTIONS).asText()); assertEquals(PROJECT_NAME, list.findValue("name").asText()); } @@ -91,7 +106,7 @@ public void listProjectsIndexedTest() throws Exception { assertEquals(tmpFolder.toString(), list.findValue(ListProjectsService.PROJECT_PATH).asText()); assertEquals("indexed", list.findValue(ListProjectsService.STATUS).asText()); - assertEquals("null", list.findValue(ListProjectsService.ALLOWED_ACTIONS).asText()); + assertEquals("[]", list.findValue(ListProjectsService.ALLOWED_ACTIONS).asText()); assertEquals(PROJECT_NAME, list.findValue("name").asText()); } @@ -103,7 +118,7 @@ public void listProjectsSourcesMappedTest() throws Exception { assertEquals(tmpFolder.toString(), list.findValue(ListProjectsService.PROJECT_PATH).asText()); assertEquals("sources_mapped", list.findValue(ListProjectsService.STATUS).asText()); - assertEquals("null", list.findValue(ListProjectsService.ALLOWED_ACTIONS).asText()); + assertEquals("[]", list.findValue(ListProjectsService.ALLOWED_ACTIONS).asText()); assertEquals(PROJECT_NAME, list.findValue("name").asText()); } @@ -116,7 +131,7 @@ public void listProjectsSipsGeneratedTest() throws Exception { assertEquals(tmpFolder.toString(), list.findValue(ListProjectsService.PROJECT_PATH).asText()); assertEquals("sips_generated", list.findValue(ListProjectsService.STATUS).asText()); - assertEquals("null", list.findValue(ListProjectsService.ALLOWED_ACTIONS).asText()); + assertEquals("[]", list.findValue(ListProjectsService.ALLOWED_ACTIONS).asText()); assertEquals(PROJECT_NAME, list.findValue("name").asText()); } @@ -129,7 +144,7 @@ public void listProjectsSipsSubmittedTest() throws Exception { assertEquals(tmpFolder.toString(), list.findValue(ListProjectsService.PROJECT_PATH).asText()); assertEquals("ingested", list.findValue(ListProjectsService.STATUS).asText()); - assertEquals("null", list.findValue(ListProjectsService.ALLOWED_ACTIONS).asText()); + assertEquals("[]", list.findValue(ListProjectsService.ALLOWED_ACTIONS).asText()); assertEquals(PROJECT_NAME, list.findValue("name").asText()); } @@ -150,8 +165,20 @@ public void listProjectsMultipleProjectsTest() throws Exception { assertEquals(tmpFolder.toString(), list.findValue(ListProjectsService.PROJECT_PATH).asText()); assertTrue(list.findValues(ListProjectsService.STATUS).toString().contains("initialized")); assertTrue(list.findValues(ListProjectsService.STATUS).toString().contains("ingested")); - assertEquals("null", list.findValue(ListProjectsService.ALLOWED_ACTIONS).asText()); + assertEquals("[]", list.findValue(ListProjectsService.ALLOWED_ACTIONS).asText()); assertTrue(list.findValues("name").toString().contains(PROJECT_NAME_2)); assertTrue(list.findValues("name").toString().contains(PROJECT_NAME)); } + + private String mappingBody(String... rows) { + return String.join(",", SourceFilesInfo.CSV_HEADERS) + "\n" + + String.join("\n", rows); + } + + private void writeSourceFilesCsv(String mappingBody) throws IOException { + FileUtils.write(project.getSourceFilesMappingPath().toFile(), + mappingBody, StandardCharsets.UTF_8); + project.getProjectProperties().setSourceFilesUpdatedDate(Instant.now()); + ProjectPropertiesSerialization.write(project); + } } From 453177f36ca91a3e21169b583c6ee544004f5092 Mon Sep 17 00:00:00 2001 From: krwong Date: Thu, 29 Aug 2024 12:17:03 -0400 Subject: [PATCH 4/8] allowedAction JsonArray, fix imageFormats, fix test --- .../migration/cdm/services/ListProjectsService.java | 12 ++++-------- .../cdm/services/ListProjectsServiceTest.java | 4 +++- 2 files changed, 7 insertions(+), 9 deletions(-) diff --git a/src/main/java/edu/unc/lib/boxc/migration/cdm/services/ListProjectsService.java b/src/main/java/edu/unc/lib/boxc/migration/cdm/services/ListProjectsService.java index 6e86b18e..7b7c5bec 100644 --- a/src/main/java/edu/unc/lib/boxc/migration/cdm/services/ListProjectsService.java +++ b/src/main/java/edu/unc/lib/boxc/migration/cdm/services/ListProjectsService.java @@ -37,12 +37,8 @@ public class ListProjectsService { public static final String PROJECT_PATH = "projectPath"; public static final String STATUS = "status"; public static final String ALLOWED_ACTIONS = "allowedActions"; - private static final Set IMAGE_FORMATS = new HashSet<>(); - // accepted file types are listed in imageFormats below - static { - IMAGE_FORMATS.addAll(Arrays.asList("tif", "tiff", "jpeg", "jpg", "png", "gif", "pict", "bmp", - "psd", "jp2", "nef", "crw", "cr2", "dng", "raf")); - } + private static final Set IMAGE_FORMATS = new HashSet<>(Arrays.asList("tif", "tiff", "jpeg", "jpg", "png", + "gif", "pict", "bmp", "psd", "jp2", "nef", "crw", "cr2", "dng", "raf")); /** * List projects in given directory @@ -65,14 +61,14 @@ public JsonNode listProjects(Path directory) throws Exception { Path projectPath = directory.toAbsolutePath(); String projectStatus = status(project); - List allowedActions = allowedActions(project); + String allowedActions = mapper.writeValueAsString(allowedActions(project)); JsonNode projectProperties = mapper.readTree(project.getProjectPropertiesPath().toFile()); // add project info to JSON ObjectNode objectNode = mapper.createObjectNode(); objectNode.put(PROJECT_PATH, projectPath.toString()); objectNode.put(STATUS, projectStatus); - objectNode.put(ALLOWED_ACTIONS, String.valueOf(allowedActions)); + objectNode.put(ALLOWED_ACTIONS, allowedActions); objectNode.set("projectProperties", projectProperties); arrayNode.add(objectNode); } diff --git a/src/test/java/edu/unc/lib/boxc/migration/cdm/services/ListProjectsServiceTest.java b/src/test/java/edu/unc/lib/boxc/migration/cdm/services/ListProjectsServiceTest.java index b3636c8e..b34c6c4d 100644 --- a/src/test/java/edu/unc/lib/boxc/migration/cdm/services/ListProjectsServiceTest.java +++ b/src/test/java/edu/unc/lib/boxc/migration/cdm/services/ListProjectsServiceTest.java @@ -17,6 +17,8 @@ import java.nio.charset.StandardCharsets; import java.nio.file.Path; import java.time.Instant; +import java.util.ArrayList; +import java.util.Arrays; import java.util.Collections; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -84,7 +86,7 @@ public void allowedActionTest() throws Exception { assertEquals(tmpFolder.toString(), list.findValue(ListProjectsService.PROJECT_PATH).asText()); assertEquals("sources_mapped", list.findValue(ListProjectsService.STATUS).asText()); - assertEquals("[crop_color_bars]", list.findValue(ListProjectsService.ALLOWED_ACTIONS).asText()); + assertEquals("[\"crop_color_bars\"]", list.findValue(ListProjectsService.ALLOWED_ACTIONS).asText()); assertEquals(PROJECT_NAME, list.findValue("name").asText()); } From b0f8816922ee7003af8298938384a5583a4f61f3 Mon Sep 17 00:00:00 2001 From: krwong Date: Thu, 29 Aug 2024 13:12:48 -0400 Subject: [PATCH 5/8] allowedActions ArrayNode, fix tests --- .../cdm/services/ListProjectsService.java | 4 ++-- .../migration/cdm/ListProjectsCommandIT.java | 4 ++-- .../cdm/services/ListProjectsServiceTest.java | 24 ++++++++++++------- 3 files changed, 20 insertions(+), 12 deletions(-) diff --git a/src/main/java/edu/unc/lib/boxc/migration/cdm/services/ListProjectsService.java b/src/main/java/edu/unc/lib/boxc/migration/cdm/services/ListProjectsService.java index 7b7c5bec..5e96dc9b 100644 --- a/src/main/java/edu/unc/lib/boxc/migration/cdm/services/ListProjectsService.java +++ b/src/main/java/edu/unc/lib/boxc/migration/cdm/services/ListProjectsService.java @@ -61,14 +61,14 @@ public JsonNode listProjects(Path directory) throws Exception { Path projectPath = directory.toAbsolutePath(); String projectStatus = status(project); - String allowedActions = mapper.writeValueAsString(allowedActions(project)); + ArrayNode allowedActions = mapper.valueToTree(allowedActions(project)); JsonNode projectProperties = mapper.readTree(project.getProjectPropertiesPath().toFile()); // add project info to JSON ObjectNode objectNode = mapper.createObjectNode(); objectNode.put(PROJECT_PATH, projectPath.toString()); objectNode.put(STATUS, projectStatus); - objectNode.put(ALLOWED_ACTIONS, allowedActions); + objectNode.putArray(ALLOWED_ACTIONS).addAll(allowedActions); objectNode.set("projectProperties", projectProperties); arrayNode.add(objectNode); } diff --git a/src/test/java/edu/unc/lib/boxc/migration/cdm/ListProjectsCommandIT.java b/src/test/java/edu/unc/lib/boxc/migration/cdm/ListProjectsCommandIT.java index e21190b2..be2c754e 100644 --- a/src/test/java/edu/unc/lib/boxc/migration/cdm/ListProjectsCommandIT.java +++ b/src/test/java/edu/unc/lib/boxc/migration/cdm/ListProjectsCommandIT.java @@ -38,7 +38,7 @@ public void listProjectsTest() throws Exception { assertOutputContains("\"" + ListProjectsService.PROJECT_PATH + "\" : \"" + baseDir + "\""); assertOutputContains("\"" + ListProjectsService.STATUS + "\" : \"initialized\""); - assertOutputContains("\"" + ListProjectsService.ALLOWED_ACTIONS + "\" : \"[]\""); + assertOutputContains("\"" + ListProjectsService.ALLOWED_ACTIONS + "\" : [ ]"); assertOutputContains("\"name\" : \"" + PROJECT_ID + "\""); } @@ -55,7 +55,7 @@ public void listMultipleProjectsTest() throws Exception { assertOutputContains("\"" + ListProjectsService.PROJECT_PATH + "\" : \"" + baseDir + "\""); assertOutputContains("\""+ ListProjectsService.STATUS + "\" : \"initialized\""); - assertOutputContains("\"" + ListProjectsService.ALLOWED_ACTIONS + "\" : \"[]\""); + assertOutputContains("\"" + ListProjectsService.ALLOWED_ACTIONS + "\" : [ ]"); assertOutputContains("\"name\" : \"" + PROJECT_ID + "\""); assertOutputContains("\"name\" : \"" + PROJECT_ID_2 + "\""); } diff --git a/src/test/java/edu/unc/lib/boxc/migration/cdm/services/ListProjectsServiceTest.java b/src/test/java/edu/unc/lib/boxc/migration/cdm/services/ListProjectsServiceTest.java index b34c6c4d..6001c684 100644 --- a/src/test/java/edu/unc/lib/boxc/migration/cdm/services/ListProjectsServiceTest.java +++ b/src/test/java/edu/unc/lib/boxc/migration/cdm/services/ListProjectsServiceTest.java @@ -1,6 +1,8 @@ package edu.unc.lib.boxc.migration.cdm.services; import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.node.ArrayNode; import edu.unc.lib.boxc.migration.cdm.model.MigrationProject; import edu.unc.lib.boxc.migration.cdm.model.SourceFilesInfo; import edu.unc.lib.boxc.migration.cdm.test.BxcEnvironmentHelper; @@ -17,9 +19,9 @@ import java.nio.charset.StandardCharsets; import java.nio.file.Path; import java.time.Instant; -import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; +import java.util.List; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertTrue; @@ -86,7 +88,7 @@ public void allowedActionTest() throws Exception { assertEquals(tmpFolder.toString(), list.findValue(ListProjectsService.PROJECT_PATH).asText()); assertEquals("sources_mapped", list.findValue(ListProjectsService.STATUS).asText()); - assertEquals("[\"crop_color_bars\"]", list.findValue(ListProjectsService.ALLOWED_ACTIONS).asText()); + assertEquals(jsonArray(Arrays.asList("crop_color_bars")), list.findValue(ListProjectsService.ALLOWED_ACTIONS)); assertEquals(PROJECT_NAME, list.findValue("name").asText()); } @@ -96,7 +98,7 @@ public void listProjectsInitializedTest() throws Exception { assertEquals(tmpFolder.toString(), list.findValue(ListProjectsService.PROJECT_PATH).asText()); assertEquals("initialized", list.findValue(ListProjectsService.STATUS).asText()); - assertEquals("[]", list.findValue(ListProjectsService.ALLOWED_ACTIONS).asText()); + assertEquals(jsonArray(Arrays.asList()), list.findValue(ListProjectsService.ALLOWED_ACTIONS)); assertEquals(PROJECT_NAME, list.findValue("name").asText()); } @@ -108,7 +110,7 @@ public void listProjectsIndexedTest() throws Exception { assertEquals(tmpFolder.toString(), list.findValue(ListProjectsService.PROJECT_PATH).asText()); assertEquals("indexed", list.findValue(ListProjectsService.STATUS).asText()); - assertEquals("[]", list.findValue(ListProjectsService.ALLOWED_ACTIONS).asText()); + assertEquals(jsonArray(Arrays.asList()), list.findValue(ListProjectsService.ALLOWED_ACTIONS)); assertEquals(PROJECT_NAME, list.findValue("name").asText()); } @@ -120,7 +122,7 @@ public void listProjectsSourcesMappedTest() throws Exception { assertEquals(tmpFolder.toString(), list.findValue(ListProjectsService.PROJECT_PATH).asText()); assertEquals("sources_mapped", list.findValue(ListProjectsService.STATUS).asText()); - assertEquals("[]", list.findValue(ListProjectsService.ALLOWED_ACTIONS).asText()); + assertEquals(jsonArray(Arrays.asList()), list.findValue(ListProjectsService.ALLOWED_ACTIONS)); assertEquals(PROJECT_NAME, list.findValue("name").asText()); } @@ -133,7 +135,7 @@ public void listProjectsSipsGeneratedTest() throws Exception { assertEquals(tmpFolder.toString(), list.findValue(ListProjectsService.PROJECT_PATH).asText()); assertEquals("sips_generated", list.findValue(ListProjectsService.STATUS).asText()); - assertEquals("[]", list.findValue(ListProjectsService.ALLOWED_ACTIONS).asText()); + assertEquals(jsonArray(Arrays.asList()), list.findValue(ListProjectsService.ALLOWED_ACTIONS)); assertEquals(PROJECT_NAME, list.findValue("name").asText()); } @@ -146,7 +148,7 @@ public void listProjectsSipsSubmittedTest() throws Exception { assertEquals(tmpFolder.toString(), list.findValue(ListProjectsService.PROJECT_PATH).asText()); assertEquals("ingested", list.findValue(ListProjectsService.STATUS).asText()); - assertEquals("[]", list.findValue(ListProjectsService.ALLOWED_ACTIONS).asText()); + assertEquals(jsonArray(Arrays.asList()), list.findValue(ListProjectsService.ALLOWED_ACTIONS)); assertEquals(PROJECT_NAME, list.findValue("name").asText()); } @@ -167,7 +169,7 @@ public void listProjectsMultipleProjectsTest() throws Exception { assertEquals(tmpFolder.toString(), list.findValue(ListProjectsService.PROJECT_PATH).asText()); assertTrue(list.findValues(ListProjectsService.STATUS).toString().contains("initialized")); assertTrue(list.findValues(ListProjectsService.STATUS).toString().contains("ingested")); - assertEquals("[]", list.findValue(ListProjectsService.ALLOWED_ACTIONS).asText()); + assertEquals(jsonArray(Arrays.asList()), list.findValue(ListProjectsService.ALLOWED_ACTIONS)); assertTrue(list.findValues("name").toString().contains(PROJECT_NAME_2)); assertTrue(list.findValues("name").toString().contains(PROJECT_NAME)); } @@ -183,4 +185,10 @@ private void writeSourceFilesCsv(String mappingBody) throws IOException { project.getProjectProperties().setSourceFilesUpdatedDate(Instant.now()); ProjectPropertiesSerialization.write(project); } + + private ArrayNode jsonArray(List values) { + ObjectMapper mapper = new ObjectMapper(); + ArrayNode arrayNode = mapper.valueToTree(values); + return arrayNode; + } } From 60bd504c80ec5938c3ffb007be4434750182edc7 Mon Sep 17 00:00:00 2001 From: krwong Date: Thu, 29 Aug 2024 14:31:20 -0400 Subject: [PATCH 6/8] add try/catch --- .../cdm/services/ListProjectsService.java | 32 +++++++++++-------- 1 file changed, 18 insertions(+), 14 deletions(-) diff --git a/src/main/java/edu/unc/lib/boxc/migration/cdm/services/ListProjectsService.java b/src/main/java/edu/unc/lib/boxc/migration/cdm/services/ListProjectsService.java index 5e96dc9b..03737e91 100644 --- a/src/main/java/edu/unc/lib/boxc/migration/cdm/services/ListProjectsService.java +++ b/src/main/java/edu/unc/lib/boxc/migration/cdm/services/ListProjectsService.java @@ -57,20 +57,24 @@ public JsonNode listProjects(Path directory) throws Exception { for (File file : directory.toFile().listFiles()) { if (file.isDirectory()) { - MigrationProject project = initializeProject(file.toPath()); - - Path projectPath = directory.toAbsolutePath(); - String projectStatus = status(project); - ArrayNode allowedActions = mapper.valueToTree(allowedActions(project)); - JsonNode projectProperties = mapper.readTree(project.getProjectPropertiesPath().toFile()); - - // add project info to JSON - ObjectNode objectNode = mapper.createObjectNode(); - objectNode.put(PROJECT_PATH, projectPath.toString()); - objectNode.put(STATUS, projectStatus); - objectNode.putArray(ALLOWED_ACTIONS).addAll(allowedActions); - objectNode.set("projectProperties", projectProperties); - arrayNode.add(objectNode); + try { + MigrationProject project = initializeProject(file.toPath()); + + Path projectPath = directory.toAbsolutePath(); + String projectStatus = status(project); + ArrayNode allowedActions = mapper.valueToTree(allowedActions(project)); + JsonNode projectProperties = mapper.readTree(project.getProjectPropertiesPath().toFile()); + + // add project info to JSON + ObjectNode objectNode = mapper.createObjectNode(); + objectNode.put(PROJECT_PATH, projectPath.toString()); + objectNode.put(STATUS, projectStatus); + objectNode.putArray(ALLOWED_ACTIONS).addAll(allowedActions); + objectNode.set("projectProperties", projectProperties); + arrayNode.add(objectNode); + } catch (Exception e) { + log.error(e.getMessage()); + } } } log.debug(arrayNode.toString()); From 0c2e90055870e43a56f0e50d10e51d01c92cb487 Mon Sep 17 00:00:00 2001 From: krwong Date: Thu, 29 Aug 2024 15:09:59 -0400 Subject: [PATCH 7/8] fix project path --- .../lib/boxc/migration/cdm/services/ListProjectsService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/edu/unc/lib/boxc/migration/cdm/services/ListProjectsService.java b/src/main/java/edu/unc/lib/boxc/migration/cdm/services/ListProjectsService.java index 03737e91..b479eb39 100644 --- a/src/main/java/edu/unc/lib/boxc/migration/cdm/services/ListProjectsService.java +++ b/src/main/java/edu/unc/lib/boxc/migration/cdm/services/ListProjectsService.java @@ -60,7 +60,7 @@ public JsonNode listProjects(Path directory) throws Exception { try { MigrationProject project = initializeProject(file.toPath()); - Path projectPath = directory.toAbsolutePath(); + Path projectPath = file.toPath().toAbsolutePath(); String projectStatus = status(project); ArrayNode allowedActions = mapper.valueToTree(allowedActions(project)); JsonNode projectProperties = mapper.readTree(project.getProjectPropertiesPath().toFile()); From 9aa94e233a6643ffeb35607115c8e782f7811301 Mon Sep 17 00:00:00 2001 From: krwong Date: Thu, 29 Aug 2024 15:27:27 -0400 Subject: [PATCH 8/8] fix tests --- .../migration/cdm/ListProjectsCommandIT.java | 7 +++++-- .../cdm/services/ListProjectsServiceTest.java | 21 ++++++++++++------- 2 files changed, 19 insertions(+), 9 deletions(-) diff --git a/src/test/java/edu/unc/lib/boxc/migration/cdm/ListProjectsCommandIT.java b/src/test/java/edu/unc/lib/boxc/migration/cdm/ListProjectsCommandIT.java index be2c754e..83e96c20 100644 --- a/src/test/java/edu/unc/lib/boxc/migration/cdm/ListProjectsCommandIT.java +++ b/src/test/java/edu/unc/lib/boxc/migration/cdm/ListProjectsCommandIT.java @@ -36,7 +36,7 @@ public void listProjectsTest() throws Exception { "list_projects" }; executeExpectSuccess(args); - assertOutputContains("\"" + ListProjectsService.PROJECT_PATH + "\" : \"" + baseDir + "\""); + assertOutputContains("\"" + ListProjectsService.PROJECT_PATH + "\" : \"" + Path.of(baseDir + "/" + PROJECT_ID) + "\""); assertOutputContains("\"" + ListProjectsService.STATUS + "\" : \"initialized\""); assertOutputContains("\"" + ListProjectsService.ALLOWED_ACTIONS + "\" : [ ]"); assertOutputContains("\"name\" : \"" + PROJECT_ID + "\""); @@ -53,7 +53,10 @@ public void listMultipleProjectsTest() throws Exception { "list_projects" }; executeExpectSuccess(args); - assertOutputContains("\"" + ListProjectsService.PROJECT_PATH + "\" : \"" + baseDir + "\""); + assertOutputContains("\"" + ListProjectsService.PROJECT_PATH + "\" : \"" + + Path.of(baseDir + "/" + PROJECT_ID) + "\""); + assertOutputContains("\"" + ListProjectsService.PROJECT_PATH + "\" : \"" + + Path.of(baseDir + "/" + PROJECT_ID_2) + "\""); assertOutputContains("\""+ ListProjectsService.STATUS + "\" : \"initialized\""); assertOutputContains("\"" + ListProjectsService.ALLOWED_ACTIONS + "\" : [ ]"); assertOutputContains("\"name\" : \"" + PROJECT_ID + "\""); diff --git a/src/test/java/edu/unc/lib/boxc/migration/cdm/services/ListProjectsServiceTest.java b/src/test/java/edu/unc/lib/boxc/migration/cdm/services/ListProjectsServiceTest.java index 6001c684..86edccd2 100644 --- a/src/test/java/edu/unc/lib/boxc/migration/cdm/services/ListProjectsServiceTest.java +++ b/src/test/java/edu/unc/lib/boxc/migration/cdm/services/ListProjectsServiceTest.java @@ -86,7 +86,8 @@ public void allowedActionTest() throws Exception { writeSourceFilesCsv(mappingBody("test,," + Path.of("test.tif") + ",")); JsonNode list = service.listProjects(tmpFolder); - assertEquals(tmpFolder.toString(), list.findValue(ListProjectsService.PROJECT_PATH).asText()); + assertEquals(Path.of(tmpFolder + "/" + PROJECT_NAME).toString(), + list.findValue(ListProjectsService.PROJECT_PATH).asText()); assertEquals("sources_mapped", list.findValue(ListProjectsService.STATUS).asText()); assertEquals(jsonArray(Arrays.asList("crop_color_bars")), list.findValue(ListProjectsService.ALLOWED_ACTIONS)); assertEquals(PROJECT_NAME, list.findValue("name").asText()); @@ -96,7 +97,8 @@ public void allowedActionTest() throws Exception { public void listProjectsInitializedTest() throws Exception { JsonNode list = service.listProjects(tmpFolder); - assertEquals(tmpFolder.toString(), list.findValue(ListProjectsService.PROJECT_PATH).asText()); + assertEquals(Path.of(tmpFolder + "/" + PROJECT_NAME).toString(), + list.findValue(ListProjectsService.PROJECT_PATH).asText()); assertEquals("initialized", list.findValue(ListProjectsService.STATUS).asText()); assertEquals(jsonArray(Arrays.asList()), list.findValue(ListProjectsService.ALLOWED_ACTIONS)); assertEquals(PROJECT_NAME, list.findValue("name").asText()); @@ -108,7 +110,8 @@ public void listProjectsIndexedTest() throws Exception { ProjectPropertiesSerialization.write(project); JsonNode list = service.listProjects(tmpFolder); - assertEquals(tmpFolder.toString(), list.findValue(ListProjectsService.PROJECT_PATH).asText()); + assertEquals(Path.of(tmpFolder + "/" + PROJECT_NAME).toString(), + list.findValue(ListProjectsService.PROJECT_PATH).asText()); assertEquals("indexed", list.findValue(ListProjectsService.STATUS).asText()); assertEquals(jsonArray(Arrays.asList()), list.findValue(ListProjectsService.ALLOWED_ACTIONS)); assertEquals(PROJECT_NAME, list.findValue("name").asText()); @@ -120,7 +123,8 @@ public void listProjectsSourcesMappedTest() throws Exception { ProjectPropertiesSerialization.write(project); JsonNode list = service.listProjects(tmpFolder); - assertEquals(tmpFolder.toString(), list.findValue(ListProjectsService.PROJECT_PATH).asText()); + assertEquals(Path.of(tmpFolder + "/" + PROJECT_NAME).toString(), + list.findValue(ListProjectsService.PROJECT_PATH).asText()); assertEquals("sources_mapped", list.findValue(ListProjectsService.STATUS).asText()); assertEquals(jsonArray(Arrays.asList()), list.findValue(ListProjectsService.ALLOWED_ACTIONS)); assertEquals(PROJECT_NAME, list.findValue("name").asText()); @@ -133,7 +137,8 @@ public void listProjectsSipsGeneratedTest() throws Exception { ProjectPropertiesSerialization.write(project); JsonNode list = service.listProjects(tmpFolder); - assertEquals(tmpFolder.toString(), list.findValue(ListProjectsService.PROJECT_PATH).asText()); + assertEquals(Path.of(tmpFolder + "/" + PROJECT_NAME).toString(), + list.findValue(ListProjectsService.PROJECT_PATH).asText()); assertEquals("sips_generated", list.findValue(ListProjectsService.STATUS).asText()); assertEquals(jsonArray(Arrays.asList()), list.findValue(ListProjectsService.ALLOWED_ACTIONS)); assertEquals(PROJECT_NAME, list.findValue("name").asText()); @@ -146,7 +151,8 @@ public void listProjectsSipsSubmittedTest() throws Exception { ProjectPropertiesSerialization.write(project); JsonNode list = service.listProjects(tmpFolder); - assertEquals(tmpFolder.toString(), list.findValue(ListProjectsService.PROJECT_PATH).asText()); + assertEquals(Path.of(tmpFolder + "/" + PROJECT_NAME).toString(), + list.findValue(ListProjectsService.PROJECT_PATH).asText()); assertEquals("ingested", list.findValue(ListProjectsService.STATUS).asText()); assertEquals(jsonArray(Arrays.asList()), list.findValue(ListProjectsService.ALLOWED_ACTIONS)); assertEquals(PROJECT_NAME, list.findValue("name").asText()); @@ -166,7 +172,8 @@ public void listProjectsMultipleProjectsTest() throws Exception { JsonNode list = service.listProjects(tmpFolder); - assertEquals(tmpFolder.toString(), list.findValue(ListProjectsService.PROJECT_PATH).asText()); + assertTrue(list.findValues(ListProjectsService.PROJECT_PATH).toString().contains(tmpFolder + "/" + PROJECT_NAME_2)); + assertTrue(list.findValues(ListProjectsService.PROJECT_PATH).toString().contains(tmpFolder + "/" + PROJECT_NAME)); assertTrue(list.findValues(ListProjectsService.STATUS).toString().contains("initialized")); assertTrue(list.findValues(ListProjectsService.STATUS).toString().contains("ingested")); assertEquals(jsonArray(Arrays.asList()), list.findValue(ListProjectsService.ALLOWED_ACTIONS));