001/* 002 * Licensed to DuraSpace under one or more contributor license agreements. 003 * See the NOTICE file distributed with this work for additional information 004 * regarding copyright ownership. 005 * 006 * DuraSpace licenses this file to you under the Apache License, 007 * Version 2.0 (the "License"); you may not use this file except in 008 * compliance with the License. You may obtain a copy of the License at 009 * 010 * http://www.apache.org/licenses/LICENSE-2.0 011 * 012 * Unless required by applicable law or agreed to in writing, software 013 * distributed under the License is distributed on an "AS IS" BASIS, 014 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 015 * See the License for the specific language governing permissions and 016 * limitations under the License. 017 */ 018package org.fcrepo.kernel.api.services.functions; 019 020import static java.util.UUID.randomUUID; 021 022import java.util.StringJoiner; 023import java.util.stream.IntStream; 024 025/** 026 * Unique value minter that creates hierarchical IDs from a UUID 027 * 028 * @author rdfloyd 029 * @author whikloj 030 */ 031public class ConfigurableHierarchicalSupplier implements UniqueValueSupplier { 032 033 private static final int DEFAULT_LENGTH = 0; 034 private static final int DEFAULT_COUNT = 0; 035 036 private final int length; 037 private final int count; 038 039 040 /** 041 * Mint a hierarchical identifier with args to control length and count of the pairtree. A length or count of ZERO 042 * will return a non-hierarchical identifier. 043 * 044 * @param desiredLength the desired length of pairtree parts 045 * @param desiredCount the desired number of pairtree parts 046 */ 047 public ConfigurableHierarchicalSupplier(final int desiredLength, final int desiredCount) { 048 length = desiredLength; 049 count = desiredCount; 050 } 051 052 /** 053 * Mint a unique identifier by default using defaults 054 * 055 */ 056 public ConfigurableHierarchicalSupplier() { 057 length = DEFAULT_LENGTH; 058 count = DEFAULT_COUNT; 059 } 060 061 /** 062 * Mint a unique identifier as a UUID 063 * 064 * @return uuid 065 */ 066 @Override 067 public String get() { 068 069 final String s = randomUUID().toString(); 070 final String id; 071 072 if (count > 0 && length > 0) { 073 final StringJoiner joiner = new StringJoiner("/", "", "/" + s); 074 075 IntStream.rangeClosed(0, count - 1) 076 .forEach(x -> joiner.add(s.substring(x * length, (x + 1) * length))); 077 id = joiner.toString(); 078 } else { 079 id = s; 080 } 081 return id; 082 } 083}