All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.apache.nifi.util.ComponentIdGenerator Maven / Gradle / Ivy

Go to download

This nifi-utils module should be a general purpose place to store widely and generally useful functions that any component might want to leverage. NO DEPENDENCIES should be added. This module is likely to be leveraged by every extension and should not bring along any other dependencies. The only dependency intended is the nifi-api and even this is expected to be already provided in any case where it would be used. The typical place this util would be found is within a nar and all nars already have nifi-api as a parent dependency. The nifi-api can be thought of as a NiFi Application Container level dependency.

There is a newer version: 2.0.0
Show newest version
/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You 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.apache.nifi.util;

import java.security.SecureRandom;
import java.util.UUID;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * IMPORTANT: This component is not part of public API!
 * ====================================================
 * 

* This component generates type-one UUID. It is used for generating ID of all * NiFi components. Giving the 128-bit UUID structure which consists of Least * Significant Bits (LSB) and Most Significant Bits (MSB) this component * provides support for generating and maintaining INCEPTION ID of the component * (MSB) as well as its INSTANCE ID (LSB). *

*

* It is also important to understand that while this component does seed itself * from current time which could be extracted from the resulting UUID via call * to {@link UUID#timestamp()} operation, one should not be relying on such time * as the exact time when such ID was generated since in the event the same time * is passed to one of the {@link #generateId()} operation it will be * incremented by 1 since the goal of this component to only ensure uniqueness * and type-one semantics where each UUID generated by this component is * comparable and each subsequent ID is > then previous ID. *

*

* For more details on how it is interacted with please see * org.apache.nifi.web.util.SnippetUtils as well as * org.apache.nifi.web.util.SnippetUtilsTest which contain additional * documentation on its usage as well as ID generation contracts defined in * NiFi. *

*/ public class ComponentIdGenerator { private static final Logger logger = LoggerFactory.getLogger(ComponentIdGenerator.class); public static final Object lock = new Object(); private static long lastTime; private static long clockSequence = 0; private static final SecureRandom randomGenerator = new SecureRandom(); /** * Will generate unique time based UUID where the next UUID is always * greater then the previous. */ public final static UUID generateId() { return generateId(System.currentTimeMillis()); } /** * */ public final static UUID generateId(long currentTime) { return generateId(currentTime, randomGenerator.nextLong(), true); } /** * */ public final static UUID generateId(long msb, long lsb, boolean ensureUnique) { long time; synchronized (lock) { if (ensureUnique && msb <= lastTime) { msb = ++lastTime; } lastTime = msb; } time = msb; // low Time time = msb << 32; // mid Time time |= ((msb & 0xFFFF00000000L) >> 16); // hi Time time |= 0x1000 | ((msb >> 48) & 0x0FFF); long clockSequenceHi = clockSequence; clockSequenceHi <<= 48; lsb = clockSequenceHi | lsb; final UUID uuid = new UUID(time, lsb); logger.debug("Generating UUID {} for msb={}, lsb={}, ensureUnique={}", uuid, msb, lsb, ensureUnique); return uuid; } }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy