/** * The contents of this file are subject to the license and copyright * detailed in the LICENSE file at the root of the source * tree and available online at * * https://github.com/keeps/roda */ package org.roda.core.util; import java.nio.file.Path; import java.util.List; import java.util.UUID; import org.roda.core.data.utils.URNUtils; import org.roda.core.data.v2.ip.DIPFile; import org.roda.core.data.v2.ip.File; import org.roda.core.data.v2.ip.FileLink; import org.roda.core.data.v2.ip.Representation; import org.roda.core.data.v2.ip.RepresentationLink; import org.roda.core.data.v2.ip.metadata.PreservationMetadata.PreservationMetadataType; public final class IdUtils { private static final String ID_SEPARATOR = "-"; /** Private empty constructor */ private IdUtils() { // do nothing } public static String createUUID() { return UUID.randomUUID().toString(); } /** * This function will not verify if given string is null **/ public static String createUUID(String fromString) { return UUID.nameUUIDFromBytes(fromString.getBytes()).toString(); } public static String getRepresentationId(Representation representation) { return getRepresentationId(representation.getAipId(), representation.getId()); } public static String getRepresentationId(RepresentationLink link) { return getRepresentationId(link.getAipId(), link.getRepresentationId()); } public static String getRepresentationId(String aipId, String representationId) { StringBuilder idBuilder = new StringBuilder(); idBuilder.append(aipId); idBuilder.append(ID_SEPARATOR); idBuilder.append(representationId); return IdUtils.createUUID(idBuilder.toString()); } public static String getFileId(String aipId, String representationId, List<String> fileDirectoryPath, String fileId) { StringBuilder idBuilder = new StringBuilder(); idBuilder.append(aipId); idBuilder.append(ID_SEPARATOR); if (representationId != null) { idBuilder.append(representationId); idBuilder.append(ID_SEPARATOR); } if (fileDirectoryPath != null) { for (String dir : fileDirectoryPath) { idBuilder.append(dir); idBuilder.append(ID_SEPARATOR); } } idBuilder.append(fileId); return IdUtils.createUUID(idBuilder.toString()); } public static String getFileId(FileLink link) { return getFileId(link.getAipId(), link.getRepresentationId(), link.getPath(), link.getFileId()); } public static String getFileId(File file) { return getFileId(file.getAipId(), file.getRepresentationId(), file.getPath(), file.getId()); } public static String getDIPFileId(String dipId, List<String> fileDirectoryPath, String fileId) { StringBuilder idBuilder = new StringBuilder(); idBuilder.append(dipId); idBuilder.append(ID_SEPARATOR); for (String dir : fileDirectoryPath) { idBuilder.append(dir); idBuilder.append(ID_SEPARATOR); } idBuilder.append(fileId); return IdUtils.createUUID(idBuilder.toString()); } public static String getDIPFileId(DIPFile file) { return getDIPFileId(file.getDipId(), file.getPath(), file.getId()); } public static String getOtherMetadataId(String aipId, String representationId, List<String> fileDirectoryPath, String fileId) { return getFileId(aipId, representationId, fileDirectoryPath, fileId, ID_SEPARATOR); } public static String getJobReportId(String jobId, String aipId) { return jobId + ID_SEPARATOR + aipId; } // FIXME 20160809 hsilva: type is not being used. but should it??? private static String getFileId(String aipId, String representationId, List<String> fileDirectoryPath, String fileId, String separator) { StringBuilder idBuilder = new StringBuilder(); addNonNullStringToBuilder(idBuilder, aipId, separator); addNonNullStringToBuilder(idBuilder, representationId, separator); addNonNullStringToBuilder(idBuilder, fileDirectoryPath, separator); addNonNullStringToBuilder(idBuilder, fileId, separator); return idBuilder.toString(); } private static StringBuilder addNonNullStringToBuilder(StringBuilder idBuilder, String string, String separator) { if (string != null) { if (idBuilder.length() > 0) { idBuilder.append(separator); } idBuilder.append(string); } return idBuilder; } private static StringBuilder addNonNullStringToBuilder(StringBuilder idBuilder, List<String> strings, String separator) { if (strings != null) { for (String string : strings) { idBuilder.append(separator).append(string); } } return idBuilder; } public static String getRiskId(String prefix, String suffix) { return prefix + ID_SEPARATOR + suffix; } public static String getPluginAgentId(String pluginClassName, String version) { return URNUtils.createRodaPreservationURN(PreservationMetadataType.AGENT, pluginClassName + "@" + version); } public static String getUserAgentId(String username) { return URNUtils.createRodaPreservationURN(PreservationMetadataType.AGENT, username); } public static String createPreservationMetadataId(PreservationMetadataType type) { return URNUtils.createRodaPreservationURN(type, IdUtils.createUUID()); } public static String getRepresentationPreservationId(String aipId, String representationId) { return getPreservationId(PreservationMetadataType.REPRESENTATION, aipId, representationId, null, null); } public static String getPreservationId(PreservationMetadataType type, String aipId, String representationId, List<String> fileDirectoryPath, String fileId) { return URNUtils.createRodaPreservationURN(type, IdUtils.createUUID(getFileId(aipId, representationId, fileDirectoryPath, fileId, ID_SEPARATOR))); } public static String getPreservationFileId(String fileId) { return URNUtils.createRodaPreservationURN(PreservationMetadataType.FILE, fileId); } public static PreservationMetadataType getPreservationTypeFromId(String id) { return URNUtils.getPreservationMetadataTypeFromId(id); } public static String getTransferredResourceUUID(Path relativeToBase) { return getTransferredResourceUUID(relativeToBase.toString()); } public static String getTransferredResourceUUID(String relativeToBase) { return IdUtils.createUUID(relativeToBase); } }