Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
39 commits
Select commit Hold shift + click to select a range
8e2ab4c
Added suffix parse changes
royrahulop Jun 16, 2025
0822539
Minor fix
royrahulop Jun 17, 2025
661c66e
Merged main branch
royrahulop Nov 17, 2025
08a7824
Remove unused code
royrahulop Nov 17, 2025
ce47dc2
Added changes + Fixed test
royrahulop Nov 17, 2025
ac921fd
Fix
royrahulop Nov 17, 2025
e7c9311
Added ranger id v2 changes
royrahulop Nov 20, 2025
36ccb0a
Remove extra items
royrahulop Nov 20, 2025
e44d54a
Remove unwanted files + Added domain version changes
royrahulop Nov 25, 2025
1ef09d3
Fix
royrahulop Nov 25, 2025
90fe29e
Remove extra changes
royrahulop Nov 25, 2025
9192a4e
Fixed tests
royrahulop Nov 25, 2025
09dc3db
Added hierarchial parsing changes
royrahulop Dec 10, 2025
476703a
Fix
royrahulop Dec 11, 2025
2797c56
Minor
royrahulop Dec 11, 2025
74bfbe6
Added Id Generation changes
royrahulop Dec 18, 2025
a8af285
Revert uncessary changes
royrahulop Dec 18, 2025
180324e
Minor fixes
royrahulop Dec 18, 2025
6c3a154
F
royrahulop Dec 22, 2025
876ebea
Added refactoring changes
royrahulop Jan 8, 2026
cf56b4a
Minor fixes
royrahulop Jan 8, 2026
757c069
Refactored changes
royrahulop Jan 16, 2026
187dbf1
Code refactors
royrahulop Jan 22, 2026
2a41d7a
Fix
royrahulop Jan 26, 2026
dbcf290
Fix
royrahulop Jan 26, 2026
8608a59
Bump version
royrahulop Jan 26, 2026
1bf32ae
Fix
royrahulop Apr 5, 2026
80d0102
Removed unused
royrahulop Apr 5, 2026
b8b2b55
Sonar
royrahulop Apr 6, 2026
69d84bf
Fix
royrahulop Apr 6, 2026
774c7f6
Revert version + group id
royrahulop Apr 6, 2026
3e1ce7c
Remove unused changes
royrahulop Apr 6, 2026
52c37ec
Fix sonar
royrahulop Apr 7, 2026
16afb7a
Sonar code dupliacte
royrahulop Apr 7, 2026
a005768
Fix nodeId issue
royrahulop Apr 7, 2026
6472ffa
Fix build
royrahulop Apr 7, 2026
d8d5fc7
Revert unwanted change
royrahulop Apr 7, 2026
0185f05
Fix
royrahulop Apr 7, 2026
c563522
Bump version
royrahulop Apr 7, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@
<groupId>io.appform.ranger</groupId>
<artifactId>ranger</artifactId>
<packaging>pom</packaging>
<version>1.1.3</version>
<version>ID-V2-RC0</version>
<name>Ranger Service Discovery</name>
<url>https://github.com/appform-io/ranger</url>
<description>Service Discovery for Java</description>
Expand Down
2 changes: 1 addition & 1 deletion ranger-bom/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
<parent>
<groupId>io.appform.ranger</groupId>
<artifactId>ranger</artifactId>
<version>1.1.3</version>
<version>ID-V2-RC0</version>
</parent>

<artifactId>ranger-bom</artifactId>
Expand Down
2 changes: 1 addition & 1 deletion ranger-client/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@
<parent>
<artifactId>ranger</artifactId>
<groupId>io.appform.ranger</groupId>
<version>1.1.3</version>
<version>ID-V2-RC0</version>
</parent>
<modelVersion>4.0.0</modelVersion>

Expand Down
2 changes: 1 addition & 1 deletion ranger-core/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@
<parent>
<artifactId>ranger</artifactId>
<groupId>io.appform.ranger</groupId>
<version>1.1.3</version>
<version>ID-V2-RC0</version>
</parent>
<modelVersion>4.0.0</modelVersion>

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,5 +4,5 @@
"iterations" : 4,
"threads" : 1,
"forks" : 3,
"mean_ops" : 790833.3039043081
"mean_ops" : 822999.279346419
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,5 +4,5 @@
"iterations" : 4,
"threads" : 1,
"forks" : 3,
"mean_ops" : 659366.963417932
"mean_ops" : 796715.1372742109
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
{
"name" : "io.appform.ranger.discovery.bundle.id.IdGeneratorPerfTest.testGenerateBase36Id",
"mode" : "Throughput",
"iterations" : 4,
"threads" : 1,
"forks" : 3,
"mean_ops" : 92975.41808701881
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
{
"name" : "io.appform.ranger.discovery.bundle.id.IdGeneratorPerfTest.testGenerateDefaultId",
"mode" : "Throughput",
"iterations" : 4,
"threads" : 1,
"forks" : 3,
"mean_ops" : 651472.4774831379
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
{
"name" : "io.appform.ranger.discovery.bundle.id.IdGeneratorPerfTest.testGenerateSuffixedId",
"mode" : "Throughput",
"iterations" : 4,
"threads" : 1,
"forks" : 3,
"mean_ops" : 653433.0813501836
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
{
"name" : "io.appform.ranger.discovery.bundle.id.IdGeneratorPerfV2Test.testGenerateBase36Id",
"mode" : "Throughput",
"iterations" : 4,
"threads" : 1,
"forks" : 3,
"mean_ops" : 433515.87378040206
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
{
"name" : "io.appform.ranger.discovery.bundle.id.IdGeneratorPerfV2Test.testGenerateSuffixedId",
"mode" : "Throughput",
"iterations" : 4,
"threads" : 1,
"forks" : 3,
"mean_ops" : 529535.7742132996
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
{
"name" : "io.appform.ranger.discovery.bundle.id.v2.IdGeneratorPerfTest.testGenerateBase36Id",
"mode" : "Throughput",
"iterations" : 4,
"threads" : 1,
"forks" : 3,
"mean_ops" : 474482.5359412401
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
{
"name" : "io.appform.ranger.discovery.bundle.id.v2.IdGeneratorPerfTest.testGenerateDefaultId",
"mode" : "Throughput",
"iterations" : 4,
"threads" : 1,
"forks" : 3,
"mean_ops" : 677710.7621924682
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
{
"name" : "io.appform.ranger.discovery.bundle.id.v2.IdGeneratorPerfTest.testGenerateSuffixedId",
"mode" : "Throughput",
"iterations" : 4,
"threads" : 1,
"forks" : 3,
"mean_ops" : 652154.1686645335
}
2 changes: 1 addition & 1 deletion ranger-discovery-bundle/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@
<parent>
<artifactId>ranger</artifactId>
<groupId>io.appform.ranger</groupId>
<version>1.1.3</version>
<version>ID-V2-RC0</version>
</parent>
<modelVersion>4.0.0</modelVersion>

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@
import io.appform.ranger.discovery.bundle.healthchecks.InternalHealthChecker;
import io.appform.ranger.discovery.bundle.healthchecks.RotationCheck;
import io.appform.ranger.discovery.bundle.id.IdGenerator;
import io.appform.ranger.discovery.bundle.id.IdGeneratorV2;
import io.appform.ranger.discovery.bundle.id.NodeIdManager;
import io.appform.ranger.discovery.bundle.id.constraints.IdValidationConstraint;
import io.appform.ranger.discovery.bundle.monitors.DropwizardHealthMonitor;
Expand All @@ -57,6 +58,7 @@
import io.appform.ranger.discovery.bundle.rotationstatus.RotationStatus;
import io.appform.ranger.discovery.bundle.selectors.HierarchicalEnvironmentAwareShardSelector;
import io.appform.ranger.discovery.bundle.util.ConfigurationUtils;
import io.appform.ranger.discovery.bundle.util.NodeUtils;
import io.appform.ranger.zookeeper.ServiceProviderBuilders;
import io.appform.ranger.zookeeper.serde.ZkNodeDataSerializer;
import io.dropwizard.Configuration;
Expand Down Expand Up @@ -342,7 +344,9 @@ public void start() {
serviceProvider.start();
serviceDiscoveryClient.start();
val nodeIdManager = new NodeIdManager(curator, serviceName);
IdGenerator.initialize(nodeIdManager.fixNodeId(), globalIdConstraints, Collections.emptyMap());
NodeUtils.setNode(nodeIdManager.fixNodeId());
IdGenerator.initialize(globalIdConstraints, Collections.emptyMap());
IdGeneratorV2.initialize(globalIdConstraints, Collections.emptyMap());
log.debug("Discovery manager has been successfully started.");
}

Expand All @@ -352,6 +356,7 @@ public void stop() {
serviceProvider.stop();
curator.close();
IdGenerator.cleanUp();
IdGeneratorV2.cleanUp();
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,9 +18,6 @@


import io.appform.ranger.discovery.bundle.id.constraints.IdValidationConstraint;
import io.appform.ranger.discovery.bundle.id.formatter.DefaultIdFormatter;
import io.appform.ranger.discovery.bundle.id.formatter.IdFormatter;
import io.appform.ranger.discovery.bundle.id.formatter.IdFormatters;
import lombok.Builder;
import lombok.Getter;
import lombok.NonNull;
Expand All @@ -34,24 +31,19 @@ public class Domain {
public static final String DEFAULT_DOMAIN_NAME = "__DEFAULT_DOMAIN__";
public static final Domain DEFAULT = new Domain(DEFAULT_DOMAIN_NAME,
List.of(),
new DefaultIdFormatter(),
TimeUnit.MILLISECONDS);

private final String domain;
private final List<IdValidationConstraint> constraints;
private final IdFormatter idFormatter;
private final CollisionChecker collisionChecker;


@Builder
public Domain(@NonNull String domain,
@NonNull List<IdValidationConstraint> constraints,
IdFormatter idFormatter,
TimeUnit resolution) {
this.domain = domain;
this.constraints = constraints;
this.idFormatter = Objects.requireNonNullElse(idFormatter, IdFormatters.original());
this.collisionChecker = new CollisionChecker(Objects.requireNonNullElse(resolution, TimeUnit.MILLISECONDS));
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,8 @@
@ToString
public class Id {
private String id;
private String prefix;
private String suffix;
private Date generatedDate;
private int node;
private int exponent;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,8 @@
import io.appform.ranger.discovery.bundle.id.formatter.IdParsers;
import io.appform.ranger.discovery.bundle.id.generator.IdGeneratorBase;
import io.appform.ranger.discovery.bundle.id.request.IdGenerationInput;
import io.appform.ranger.discovery.bundle.id.request.IdGenerationRequest;
import io.appform.ranger.discovery.bundle.id.request.IdGenerationInternalRequest;
import io.appform.ranger.discovery.bundle.util.NodeUtils;
import lombok.NonNull;
import lombok.experimental.UtilityClass;
import lombok.extern.slf4j.Slf4j;
Expand All @@ -32,30 +33,47 @@
import java.util.*;

/**
* Id generation
* Id generation utility for creating unique identifiers.
* Supports constraint-based validation, domain-specific configurations, and flexible formatting.
*
* Note: This class uses {@link NodeUtils} for managing node identifiers in a thread-safe manner.
*/
@SuppressWarnings("unused")
@Slf4j
@UtilityClass
public class IdGenerator {
private static final IdGeneratorBase baseGenerator = new IdGeneratorBase();

public static void initialize(int node) {
baseGenerator.setNodeId(node);
/**
* Initialize the ID generator using the default node ID from {@link NodeUtils}.
*/
public static void initialize() {
baseGenerator.setNodeId(NodeUtils.getNode());
}

/**
* Initialize the ID generator with a specific node ID.
* This method is provided for backward compatibility and convenience.
*
* @param node the node identifier to use
*/
public static void initialize(int node) {
Comment thread
r0goyal marked this conversation as resolved.
NodeUtils.setDefaultNode(node);
initialize();
}

public static synchronized void cleanUp() {
baseGenerator.cleanUp();
}

public static synchronized void initialize(
int node, List<IdValidationConstraint> globalConstraints,
List<IdValidationConstraint> globalConstraints,
Map<String, List<IdValidationConstraint>> domainSpecificConstraints) {
initialize(node);
if(null != globalConstraints && !globalConstraints.isEmpty() ) {
initialize();
if (null != globalConstraints && !globalConstraints.isEmpty()) {
baseGenerator.registerGlobalConstraints(globalConstraints);
}

if (null != domainSpecificConstraints) {
domainSpecificConstraints.forEach(baseGenerator::registerDomainSpecificConstraints);
}
Expand Down Expand Up @@ -124,14 +142,14 @@ public static Optional<Id> generateWithConstraints(String prefix, @NonNull Strin
* @param skipGlobal Skip global constrains and use only passed ones
* @return Id if it could be generated
*/
public static Optional<Id> generateWithConstraints(String prefix, @NonNull String domain, boolean skipGlobal) {
public static Optional<Id> generateWithConstraints(final String prefix, @NonNull final String domain, final boolean skipGlobal) {
val registeredDomain = baseGenerator.getRegisteredDomains().getOrDefault(domain, Domain.DEFAULT);
val request = IdGenerationRequest.builder()
val request = IdGenerationInternalRequest.builder()
.prefix(prefix)
.constraints(registeredDomain.getConstraints())
.skipGlobal(skipGlobal)
.domain(registeredDomain.getDomain())
.idFormatter(registeredDomain.getIdFormatter())
.idFormatter(IdFormatters.original())
.build();
return baseGenerator.generateWithConstraints(request, IdGenerator::getIdFromIdInfo).map(baseGenerator::getId);
}
Expand All @@ -157,8 +175,9 @@ public static Optional<Id> generateWithConstraints(
* @param idString String idString
* @return Id if it could be generated
*/
public static Optional<InternalId> parse(final String idString) {
return IdParsers.parse(idString);
public static Optional<Id> parse(final String idString) {
val parsedId = IdParsers.parse(idString).orElse(null);
return Optional.ofNullable(baseGenerator.getId(parsedId));
}

/**
Expand All @@ -175,56 +194,40 @@ public static Optional<Id> generateWithConstraints(
String prefix,
final List<IdValidationConstraint> inConstraints,
boolean skipGlobal) {
return generate(IdGenerationRequest.builder()
return generate(IdGenerationInternalRequest.builder()
.prefix(prefix)
.constraints(inConstraints)
.skipGlobal(skipGlobal)
.idFormatter(IdFormatters.original())
.build())
.map(baseGenerator::getId);
}

/**
* Generate id that matches all passed constraints.
* NOTE: There are performance implications for this.
* The evaluation of constraints will take it's toll on id generation rates. Tun rests to check speed.
*
* @param prefix String prefix
* @param skipGlobal Skip global constrains and use only passed ones
* @param domain Domain
* @return Id if it could be generated
*/
private static Optional<InternalId> generateWithConstraints(
String prefix,
final Domain domain,
boolean skipGlobal) {
return generate(IdGenerationRequest.builder()
.prefix(prefix)
.constraints(domain.getConstraints())
.skipGlobal(skipGlobal)
.domain(domain.getDomain())
.idFormatter(domain.getIdFormatter())
.build());
}

public static Optional<InternalId> generate(final IdGenerationRequest request) {

public static Optional<InternalId> generate(final IdGenerationInternalRequest request) {
return baseGenerator.generateWithConstraints(request, IdGenerator::getIdFromIdInfo);
}

private InternalId getIdFromIdInfo(final String namespace) {
return getIdFromIdInfo(namespace, IdFormatters.original(), null);
return getIdFromIdInfo(IdGenerationInternalRequest.builder()
.prefix(namespace)
.idFormatter(IdFormatters.original())
.build());
}

private InternalId getIdFromIdInfo(final String namespace, final IdFormatter idFormatter) {
return getIdFromIdInfo(namespace, idFormatter, null);
return getIdFromIdInfo(IdGenerationInternalRequest.builder()
.prefix(namespace)
.idFormatter(idFormatter)
.build());
}

private InternalId getIdFromIdInfo(final String namespace, final IdFormatter idFormatter, final Domain domain) {
private InternalId getIdFromIdInfo(final IdGenerationInternalRequest idGenerationRequest) {
val domain = idGenerationRequest.getDomain() != null ? baseGenerator.getRegisteredDomains().getOrDefault(idGenerationRequest.getDomain(), Domain.DEFAULT) : Domain.DEFAULT;
val idGenerationInput = IdGenerationInput.builder()
.domain(domain)
.build();
val formattedId = idFormatter.format(baseGenerator.getNodeId(), idGenerationInput);
val id = String.format("%s%s", namespace, formattedId.getId());
return baseGenerator.getIdFromIdInfo(id, formattedId);
val formattedId = idGenerationRequest.getIdFormatter().format(baseGenerator.getNodeId(), idGenerationInput);
val id = String.format("%s%s", idGenerationRequest.getPrefix(), formattedId.getId());
return baseGenerator.getIdFromIdInfo(id, idGenerationRequest.getPrefix(), null, formattedId);
}
}
Loading