Skip to content

Commit

Permalink
refactor: Align naming for tenant information
Browse files Browse the repository at this point in the history
Signed-off-by: Thomas Vitale <[email protected]>
  • Loading branch information
ThomasVitale committed Jan 27, 2024
1 parent 844ec15 commit efb151b
Show file tree
Hide file tree
Showing 30 changed files with 139 additions and 137 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ public final class DefaultTenantKeyGenerator implements TenantKeyGenerator {

@Override
public Object generate(Object target, Method method, Object... params) {
return SimpleKeyGenerator.generateKey(TenantContextHolder.getRequiredTenantId(), params);
return SimpleKeyGenerator.generateKey(TenantContextHolder.getRequiredTenantIdentifier(), params);
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -17,33 +17,33 @@ public final class TenantContextHolder {

private static final Logger log = LoggerFactory.getLogger(TenantContextHolder.class);

private static final ThreadLocal<String> tenantId = new ThreadLocal<>();
private static final ThreadLocal<String> tenantIdentifier = new ThreadLocal<>();

private TenantContextHolder() {
}

public static void setTenantId(final String tenant) {
Assert.hasText(tenant, "tenantId cannot be empty");
public static void setTenantIdentifier(String tenant) {
Assert.hasText(tenant, "tenant cannot be empty");
log.trace("Setting current tenant to: {}", tenant);
tenantId.set(tenant);
tenantIdentifier.set(tenant);
}

@Nullable
public static String getTenantId() {
return tenantId.get();
public static String getTenantIdentifier() {
return tenantIdentifier.get();
}

public static String getRequiredTenantId() {
var tenantId = getTenantId();
if (!StringUtils.hasText(tenantId)) {
public static String getRequiredTenantIdentifier() {
var tenant = getTenantIdentifier();
if (!StringUtils.hasText(tenant)) {
throw new TenantNotFoundException("No tenant found in the current context");
}
return tenantId;
return tenant;
}

public static void clear() {
log.trace("Clearing current tenant");
tenantId.remove();
tenantIdentifier.remove();
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ public final class HolderTenantContextEventListener implements TenantEventListen
@Override
public void onApplicationEvent(TenantEvent tenantEvent) {
if (tenantEvent instanceof TenantContextAttachedEvent event) {
TenantContextHolder.setTenantId(event.getTenantId());
TenantContextHolder.setTenantIdentifier(event.getTenantIdentifier());
}
else if (tenantEvent instanceof TenantContextClosedEvent) {
TenantContextHolder.clear();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,26 +14,26 @@
*/
public final class MdcTenantContextEventListener implements TenantEventListener {

public static final String DEFAULT_TENANT_ID_KEY = "tenantId";
public static final String DEFAULT_TENANT_IDENTIFIER_KEY = "tenantId";

private final String tenantIdKey;
private final String tenantIdentifierKey;

public MdcTenantContextEventListener() {
this(DEFAULT_TENANT_ID_KEY);
this(DEFAULT_TENANT_IDENTIFIER_KEY);
}

public MdcTenantContextEventListener(String tenantIdKey) {
Assert.hasText(tenantIdKey, "tenantIdKey cannot be empty");
this.tenantIdKey = tenantIdKey;
public MdcTenantContextEventListener(String tenantIdentifierKey) {
Assert.hasText(tenantIdentifierKey, "tenantIdentifierKey cannot be empty");
this.tenantIdentifierKey = tenantIdentifierKey;
}

@Override
public void onApplicationEvent(TenantEvent tenantEvent) {
if (tenantEvent instanceof TenantContextAttachedEvent event) {
MDC.put(tenantIdKey, event.getTenantId());
MDC.put(tenantIdentifierKey, event.getTenantIdentifier());
}
else if (tenantEvent instanceof TenantContextClosedEvent) {
MDC.remove(tenantIdKey);
MDC.remove(tenantIdentifierKey);
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,20 +18,20 @@ public class ObservationTenantContextEventListener implements TenantEventListene

public static final Cardinality DEFAULT_CARDINALITY = Cardinality.HIGH;

public static final String DEFAULT_TENANT_ID_KEY = "tenant.id";
public static final String DEFAULT_TENANT_IDENTIFIER_KEY = "tenant.id";

private final Cardinality cardinality;

private final String tenantIdKey;
private final String tenantIdentifierKey;

public ObservationTenantContextEventListener() {
this(DEFAULT_TENANT_ID_KEY, DEFAULT_CARDINALITY);
this(DEFAULT_TENANT_IDENTIFIER_KEY, DEFAULT_CARDINALITY);
}

public ObservationTenantContextEventListener(String tenantIdKey, Cardinality cardinality) {
Assert.hasText(tenantIdKey, "tenantIdKey cannot be empty");
public ObservationTenantContextEventListener(String tenantIdentifierKey, Cardinality cardinality) {
Assert.hasText(tenantIdentifierKey, "tenantIdentifierKey cannot be empty");
Assert.notNull(cardinality, "cardinality cannot be null");
this.tenantIdKey = tenantIdKey;
this.tenantIdentifierKey = tenantIdentifierKey;
this.cardinality = cardinality;
}

Expand All @@ -48,10 +48,10 @@ private void onTenantContextAttached(TenantContextAttachedEvent event) {
}

switch (cardinality) {
case LOW ->
event.getObservationContext().addLowCardinalityKeyValue(KeyValue.of(tenantIdKey, event.getTenantId()));
case HIGH ->
event.getObservationContext().addHighCardinalityKeyValue(KeyValue.of(tenantIdKey, event.getTenantId()));
case LOW -> event.getObservationContext()
.addLowCardinalityKeyValue(KeyValue.of(tenantIdentifierKey, event.getTenantIdentifier()));
case HIGH -> event.getObservationContext()
.addHighCardinalityKeyValue(KeyValue.of(tenantIdentifierKey, event.getTenantIdentifier()));
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,8 @@ public final class TenantContextAttachedEvent extends TenantEvent {
@Nullable
private Observation.Context observationContext;

public TenantContextAttachedEvent(String tenantId, Object object) {
super(tenantId, object);
public TenantContextAttachedEvent(String tenantIdentifier, Object object) {
super(tenantIdentifier, object);
}

@Nullable
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,8 @@
*/
public final class TenantContextClosedEvent extends TenantEvent {

public TenantContextClosedEvent(String tenantId, Object object) {
super(tenantId, object);
public TenantContextClosedEvent(String tenantIdentifier, Object object) {
super(tenantIdentifier, object);
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -10,23 +10,23 @@
*/
public final class FixedTenantResolver implements TenantResolver<Object> {

public static final String DEFAULT_FIXED_TENANT = "default";
public static final String DEFAULT_FIXED_TENANT_IDENTIFIER = "default";

private final String fixedTenantName;
private final String fixedTenantIdentifier;

public FixedTenantResolver() {
fixedTenantName = DEFAULT_FIXED_TENANT;
fixedTenantIdentifier = DEFAULT_FIXED_TENANT_IDENTIFIER;
}

public FixedTenantResolver(String tenantName) {
Assert.hasText(tenantName, "tenantName cannot be empty");
this.fixedTenantName = tenantName;
public FixedTenantResolver(String tenantIdentifier) {
Assert.hasText(tenantIdentifier, "tenantIdentifier cannot be empty");
this.fixedTenantIdentifier = tenantIdentifier;
}

@Override
@NonNull
public String resolveTenantId(Object source) {
return fixedTenantName;
public String resolveTenantIdentifier(Object source) {
return fixedTenantIdentifier;
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,6 @@ public interface TenantResolver<T> {
* Resolves a tenant identifier from the given source.
*/
@Nullable
String resolveTenantId(T source);
String resolveTenantIdentifier(T source);

}
Original file line number Diff line number Diff line change
Expand Up @@ -10,16 +10,16 @@
*/
public abstract class TenantEvent extends ApplicationEvent {

private final String tenantId;
private final String tenantIdentifier;

public TenantEvent(String tenantId, Object source) {
public TenantEvent(String tenantIdentifier, Object source) {
super(source);
Assert.hasText(tenantId, "tenantId cannot be empty");
this.tenantId = tenantId;
Assert.hasText(tenantIdentifier, "tenantIdentifier cannot be empty");
this.tenantIdentifier = tenantIdentifier;
}

public String getTenantId() {
return tenantId;
public String getTenantIdentifier() {
return tenantIdentifier;
}

}
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
package io.arconia.core.multitenancy.exceptions;

/**
* Thrown when the source of the operation didn't provide any tenant information.
* Thrown when an error occurred during the tenant resolution process.
*
* @author Thomas Vitale
*/
public class TenantResolutionException extends IllegalStateException {

public TenantResolutionException() {
super("A tenant must be specified for the current operation");
super("Error when trying to resolve the current tenant");
}

public TenantResolutionException(String message) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,12 +22,12 @@ class DefaultTenantKeyGeneratorTests {
void whenTenantContextDefinedThenGenerateCacheKey() {
var objectToCache = new Object[] { "something" };

TenantContextHolder.setTenantId("tenant1");
TenantContextHolder.setTenantIdentifier("tenant1");
Object key1 = generateCacheKey(objectToCache);
Object key2 = generateCacheKey(objectToCache);
TenantContextHolder.clear();

TenantContextHolder.setTenantId("tenant2");
TenantContextHolder.setTenantIdentifier("tenant2");
Object key3 = generateCacheKey(objectToCache);
TenantContextHolder.clear();

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,41 +16,43 @@ class TenantContextHolderTests {

@Test
void setValidTenantContext() {
var tenantId = "acme";
TenantContextHolder.setTenantId(tenantId);
assertThat(TenantContextHolder.getTenantId()).isEqualTo(tenantId);
var tenantIdentifier = "acme";
TenantContextHolder.setTenantIdentifier(tenantIdentifier);
assertThat(TenantContextHolder.getTenantIdentifier()).isEqualTo(tenantIdentifier);
}

@Test
void setNullTenantContext() {
assertThatThrownBy(() -> TenantContextHolder.setTenantId(null)).isInstanceOf(IllegalArgumentException.class)
.hasMessageContaining("tenantId cannot be empty");
assertThatThrownBy(() -> TenantContextHolder.setTenantIdentifier(null))
.isInstanceOf(IllegalArgumentException.class)
.hasMessageContaining("tenant cannot be empty");
}

@Test
void setEmptyTenantContext() {
assertThatThrownBy(() -> TenantContextHolder.setTenantId("")).isInstanceOf(IllegalArgumentException.class)
.hasMessageContaining("tenantId cannot be empty");
assertThatThrownBy(() -> TenantContextHolder.setTenantIdentifier(""))
.isInstanceOf(IllegalArgumentException.class)
.hasMessageContaining("tenant cannot be empty");
}

@Test
void clearTenantContext() {
var tenantId = "acme";
TenantContextHolder.setTenantId(tenantId);
var tenantIdentifier = "acme";
TenantContextHolder.setTenantIdentifier(tenantIdentifier);
TenantContextHolder.clear();
assertThat(TenantContextHolder.getTenantId()).isNull();
assertThat(TenantContextHolder.getTenantIdentifier()).isNull();
}

@Test
void whenRequiredTenantContextPresentThenReturn() {
var tenantId = "acme";
TenantContextHolder.setTenantId(tenantId);
assertThat(TenantContextHolder.getRequiredTenantId()).isEqualTo(tenantId);
var tenantIdentifier = "acme";
TenantContextHolder.setTenantIdentifier(tenantIdentifier);
assertThat(TenantContextHolder.getRequiredTenantIdentifier()).isEqualTo(tenantIdentifier);
}

@Test
void whenRequiredTenantContextMissingThenThrow() {
assertThatThrownBy(TenantContextHolder::getRequiredTenantId).isInstanceOf(TenantNotFoundException.class)
assertThatThrownBy(TenantContextHolder::getRequiredTenantIdentifier).isInstanceOf(TenantNotFoundException.class)
.hasMessageContaining("No tenant found in the current context");
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,22 +16,22 @@ class HolderTenantContextEventListenerTests {
@Test
void whenContextIsAttached() {
var listener = new HolderTenantContextEventListener();
var tenantId = "acme";
var tenantIdentifier = "acme";

listener.onApplicationEvent(new TenantContextAttachedEvent(tenantId, this));
listener.onApplicationEvent(new TenantContextAttachedEvent(tenantIdentifier, this));

assertThat(TenantContextHolder.getTenantId()).isEqualTo(tenantId);
assertThat(TenantContextHolder.getTenantIdentifier()).isEqualTo(tenantIdentifier);
}

@Test
void whenContextIsClosed() {
var listener = new HolderTenantContextEventListener();
var tenantId = "acme";
var tenantIdentifier = "acme";

listener.onApplicationEvent(new TenantContextAttachedEvent(tenantId, this));
listener.onApplicationEvent(new TenantContextClosedEvent(tenantId, this));
listener.onApplicationEvent(new TenantContextAttachedEvent(tenantIdentifier, this));
listener.onApplicationEvent(new TenantContextClosedEvent(tenantIdentifier, this));

assertThat(TenantContextHolder.getTenantId()).isNull();
assertThat(TenantContextHolder.getTenantIdentifier()).isNull();
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -16,13 +16,13 @@ class MdcTenantContextEventListenerTests {
@Test
void whenNullCustomValueThenThrow() {
assertThatThrownBy(() -> new MdcTenantContextEventListener(null)).isInstanceOf(IllegalArgumentException.class)
.hasMessageContaining("tenantIdKey cannot be empty");
.hasMessageContaining("tenantIdentifierKey cannot be empty");
}

@Test
void whenEmptyCustomValueThenThrow() {
assertThatThrownBy(() -> new MdcTenantContextEventListener("")).isInstanceOf(IllegalArgumentException.class)
.hasMessageContaining("tenantIdKey cannot be empty");
.hasMessageContaining("tenantIdentifierKey cannot be empty");
}

@Test
Expand Down
Loading

0 comments on commit efb151b

Please sign in to comment.