From cc5bcf7a162bf2a1bef86b44bc15f40ed40e4b8f Mon Sep 17 00:00:00 2001 From: Krishna Nikhil Vedurumudi Date: Thu, 27 Jan 2022 23:02:00 +0530 Subject: [PATCH 1/7] Redis poc --- .../osdu/azure/cache/IRedisClientFactory.java | 19 +++++ .../osdu/azure/cache/RedisAzureCache.java | 74 +++++++++++++++++++ .../osdu/azure/cache/RedisClientFactory.java | 70 ++++++++++++++++++ 3 files changed, 163 insertions(+) create mode 100644 src/main/java/org/opengroup/osdu/azure/cache/IRedisClientFactory.java create mode 100644 src/main/java/org/opengroup/osdu/azure/cache/RedisAzureCache.java create mode 100644 src/main/java/org/opengroup/osdu/azure/cache/RedisClientFactory.java diff --git a/src/main/java/org/opengroup/osdu/azure/cache/IRedisClientFactory.java b/src/main/java/org/opengroup/osdu/azure/cache/IRedisClientFactory.java new file mode 100644 index 00000000..e1ff74d2 --- /dev/null +++ b/src/main/java/org/opengroup/osdu/azure/cache/IRedisClientFactory.java @@ -0,0 +1,19 @@ +package org.opengroup.osdu.azure.cache; + +import org.opengroup.osdu.core.common.cache.RedisCache; + +/** + * Redis client creator. + * @param + * @param + */ +public interface IRedisClientFactory { + + /** + * Retrieve redis client. Creates a new client if not exists. + * @param keyClass key class type + * @param valueClass value class type + * @return redis cache client instance. + */ + RedisCache getClient(Class keyClass, Class valueClass); +} diff --git a/src/main/java/org/opengroup/osdu/azure/cache/RedisAzureCache.java b/src/main/java/org/opengroup/osdu/azure/cache/RedisAzureCache.java new file mode 100644 index 00000000..a5d3d45d --- /dev/null +++ b/src/main/java/org/opengroup/osdu/azure/cache/RedisAzureCache.java @@ -0,0 +1,74 @@ +package org.opengroup.osdu.azure.cache; + +import org.opengroup.osdu.core.common.cache.ICache; +import org.opengroup.osdu.core.common.cache.RedisCache; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * Redis implementation for Azure. + * @param key class + * @param value class + */ +public class RedisAzureCache implements ICache { + + // Add Exception handling + // Add database number + private static final String LOGGER_NAME = RedisAzureCache.class.getName(); + + private Class keyClass; + private Class valueClass; + + @Autowired + private IRedisClientFactory redisClientFactory; + + /** + * Constructor. + * @param keyClassType key class type + * @param valueClassType value class type + */ + public RedisAzureCache(final Class keyClassType, final Class valueClassType) { + this.keyClass = keyClassType; + this.valueClass = valueClassType; + } + + /** + * Put value in cache. + * @param key key to use + * @param value value to save + */ + @Override + public void put(final K key, final V value) { + RedisCache redisCache = redisClientFactory.getClient(keyClass, valueClass); + redisCache.put(key, value); + } + + /** + * Get value from cache. + * @param key key + * @return value + */ + @Override + public V get(final K key) { + RedisCache redisCache = redisClientFactory.getClient(keyClass, valueClass); + return redisCache.get(key); + } + + /** + * Delete value from cache. + * @param key key + */ + @Override + public void delete(final K key) { + RedisCache redisCache = redisClientFactory.getClient(keyClass, valueClass); + redisCache.delete(key); + } + + /** + * Clear all entries from cache. + */ + @Override + public void clearAll() { + RedisCache redisCache = redisClientFactory.getClient(keyClass, valueClass); + redisCache.clearAll(); + } +} diff --git a/src/main/java/org/opengroup/osdu/azure/cache/RedisClientFactory.java b/src/main/java/org/opengroup/osdu/azure/cache/RedisClientFactory.java new file mode 100644 index 00000000..ab256cd9 --- /dev/null +++ b/src/main/java/org/opengroup/osdu/azure/cache/RedisClientFactory.java @@ -0,0 +1,70 @@ +package org.opengroup.osdu.azure.cache; + +import com.azure.security.keyvault.secrets.SecretClient; +import org.opengroup.osdu.azure.KeyVaultFacade; +import org.opengroup.osdu.core.common.cache.RedisCache; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Lazy; +import org.springframework.stereotype.Component; + +import javax.annotation.PostConstruct; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +/** + * Redis client factory. + * @param + * @param + */ +@Component +@Lazy +public class RedisClientFactory implements IRedisClientFactory { + @Autowired + private SecretClient secretClient; + + private Map redisClientMap; + /** + * Initializes the private variables as required. + */ + @PostConstruct + public void initialize() { + redisClientMap = new ConcurrentHashMap<>(); + } + + /** + * Get redis client. + * @param keyClass Class type for key + * @param valueClass Class type for value + * @return Redis client + */ + @Override + public RedisCache getClient(final Class keyClass, final Class valueClass) { + String cacheKey = String.format("%s-%s", keyClass.toString(), valueClass.toString()); + if (this.redisClientMap.containsKey(cacheKey)) { + return this.redisClientMap.get(cacheKey); + } + + return this.redisClientMap.computeIfAbsent(cacheKey, cosmosClient -> createRedisClient(keyClass, valueClass)); + } + + /** + * Create redis client object. + * @param keyClass Class type for key + * @param valueClass Class type for value + * @return redis client + */ + private RedisCache createRedisClient(final Class keyClass, final Class valueClass) { + final String host = getSecret("redis-hostname"); + final String password = getSecret("redis-password"); + return new RedisCache(host, 6380, password, 60, keyClass, valueClass); + } + + /** + * Get secret from Key vault. + * @param keyName name of the secret + * @return Secret value + */ + private String getSecret(final String keyName) { + return KeyVaultFacade.getSecretWithValidation(secretClient, keyName); + } +} -- GitLab From 35f485f5cbdfa099269e0c616b2e36c62d675133 Mon Sep 17 00:00:00 2001 From: Krishna Nikhil Vedurumudi Date: Thu, 27 Jan 2022 23:36:37 +0530 Subject: [PATCH 2/7] Added NoOp Redis Cache --- .../osdu/azure/cache/IRedisClientFactory.java | 4 +-- .../osdu/azure/cache/NoOpRedisCache.java | 35 +++++++++++++++++++ .../osdu/azure/cache/RedisAzureCache.java | 9 +++-- .../osdu/azure/cache/RedisClientFactory.java | 32 ++++++++++++----- 4 files changed, 65 insertions(+), 15 deletions(-) create mode 100644 src/main/java/org/opengroup/osdu/azure/cache/NoOpRedisCache.java diff --git a/src/main/java/org/opengroup/osdu/azure/cache/IRedisClientFactory.java b/src/main/java/org/opengroup/osdu/azure/cache/IRedisClientFactory.java index e1ff74d2..dcc17f5f 100644 --- a/src/main/java/org/opengroup/osdu/azure/cache/IRedisClientFactory.java +++ b/src/main/java/org/opengroup/osdu/azure/cache/IRedisClientFactory.java @@ -1,6 +1,6 @@ package org.opengroup.osdu.azure.cache; -import org.opengroup.osdu.core.common.cache.RedisCache; +import org.opengroup.osdu.core.common.cache.ICache; /** * Redis client creator. @@ -15,5 +15,5 @@ public interface IRedisClientFactory { * @param valueClass value class type * @return redis cache client instance. */ - RedisCache getClient(Class keyClass, Class valueClass); + ICache getClient(Class keyClass, Class valueClass); } diff --git a/src/main/java/org/opengroup/osdu/azure/cache/NoOpRedisCache.java b/src/main/java/org/opengroup/osdu/azure/cache/NoOpRedisCache.java new file mode 100644 index 00000000..dbb86e9c --- /dev/null +++ b/src/main/java/org/opengroup/osdu/azure/cache/NoOpRedisCache.java @@ -0,0 +1,35 @@ +package org.opengroup.osdu.azure.cache; + +import org.opengroup.osdu.azure.logging.CoreLoggerFactory; +import org.opengroup.osdu.core.common.cache.ICache; + +/** + * Redis cache client that does nothing! + * @param keyClass + * @param valueClass + */ +public final class NoOpRedisCache implements ICache { + + private static final String LOGGER_NAME = NoOpRedisCache.class.getName(); + + @Override + public void put(final K k, final V o) { + CoreLoggerFactory.getInstance().getLogger(LOGGER_NAME).info("NoOpRedisCache - put"); + } + + @Override + public V get(final K k) { + CoreLoggerFactory.getInstance().getLogger(LOGGER_NAME).info("NoOpRedisCache - get"); + return null; + } + + @Override + public void delete(final K k) { + CoreLoggerFactory.getInstance().getLogger(LOGGER_NAME).info("NoOpRedisCache - delete"); + } + + @Override + public void clearAll() { + CoreLoggerFactory.getInstance().getLogger(LOGGER_NAME).info("NoOpRedisCache - clearAll"); + } +} diff --git a/src/main/java/org/opengroup/osdu/azure/cache/RedisAzureCache.java b/src/main/java/org/opengroup/osdu/azure/cache/RedisAzureCache.java index a5d3d45d..c4a71832 100644 --- a/src/main/java/org/opengroup/osdu/azure/cache/RedisAzureCache.java +++ b/src/main/java/org/opengroup/osdu/azure/cache/RedisAzureCache.java @@ -1,7 +1,6 @@ package org.opengroup.osdu.azure.cache; import org.opengroup.osdu.core.common.cache.ICache; -import org.opengroup.osdu.core.common.cache.RedisCache; import org.springframework.beans.factory.annotation.Autowired; /** @@ -38,7 +37,7 @@ public class RedisAzureCache implements ICache { */ @Override public void put(final K key, final V value) { - RedisCache redisCache = redisClientFactory.getClient(keyClass, valueClass); + ICache redisCache = redisClientFactory.getClient(keyClass, valueClass); redisCache.put(key, value); } @@ -49,7 +48,7 @@ public class RedisAzureCache implements ICache { */ @Override public V get(final K key) { - RedisCache redisCache = redisClientFactory.getClient(keyClass, valueClass); + ICache redisCache = redisClientFactory.getClient(keyClass, valueClass); return redisCache.get(key); } @@ -59,7 +58,7 @@ public class RedisAzureCache implements ICache { */ @Override public void delete(final K key) { - RedisCache redisCache = redisClientFactory.getClient(keyClass, valueClass); + ICache redisCache = redisClientFactory.getClient(keyClass, valueClass); redisCache.delete(key); } @@ -68,7 +67,7 @@ public class RedisAzureCache implements ICache { */ @Override public void clearAll() { - RedisCache redisCache = redisClientFactory.getClient(keyClass, valueClass); + ICache redisCache = redisClientFactory.getClient(keyClass, valueClass); redisCache.clearAll(); } } diff --git a/src/main/java/org/opengroup/osdu/azure/cache/RedisClientFactory.java b/src/main/java/org/opengroup/osdu/azure/cache/RedisClientFactory.java index ab256cd9..c089b754 100644 --- a/src/main/java/org/opengroup/osdu/azure/cache/RedisClientFactory.java +++ b/src/main/java/org/opengroup/osdu/azure/cache/RedisClientFactory.java @@ -2,6 +2,8 @@ package org.opengroup.osdu.azure.cache; import com.azure.security.keyvault.secrets.SecretClient; import org.opengroup.osdu.azure.KeyVaultFacade; +import org.opengroup.osdu.azure.logging.CoreLoggerFactory; +import org.opengroup.osdu.core.common.cache.ICache; import org.opengroup.osdu.core.common.cache.RedisCache; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Lazy; @@ -19,10 +21,12 @@ import java.util.concurrent.ConcurrentHashMap; @Component @Lazy public class RedisClientFactory implements IRedisClientFactory { + private static final String LOGGER_NAME = RedisClientFactory.class.getName(); + @Autowired private SecretClient secretClient; - private Map redisClientMap; + private Map redisClientMap; /** * Initializes the private variables as required. */ @@ -38,13 +42,19 @@ public class RedisClientFactory implements IRedisClientFactory { * @return Redis client */ @Override - public RedisCache getClient(final Class keyClass, final Class valueClass) { + public ICache getClient(final Class keyClass, final Class valueClass) { String cacheKey = String.format("%s-%s", keyClass.toString(), valueClass.toString()); if (this.redisClientMap.containsKey(cacheKey)) { - return this.redisClientMap.get(cacheKey); + ICache cacheObject = this.redisClientMap.get(cacheKey); + if (cacheObject instanceof RedisCache) { + return cacheObject; + } else { + // No Op cache it is. Re-try to initialize cache. + CoreLoggerFactory.getInstance().getLogger(LOGGER_NAME).info("The client is of NoOpRedisCache. Re-checking if Redis is available."); + } } - return this.redisClientMap.computeIfAbsent(cacheKey, cosmosClient -> createRedisClient(keyClass, valueClass)); + return this.redisClientMap.computeIfAbsent(cacheKey, cacheObject -> createRedisClient(keyClass, valueClass)); } /** @@ -53,10 +63,16 @@ public class RedisClientFactory implements IRedisClientFactory { * @param valueClass Class type for value * @return redis client */ - private RedisCache createRedisClient(final Class keyClass, final Class valueClass) { - final String host = getSecret("redis-hostname"); - final String password = getSecret("redis-password"); - return new RedisCache(host, 6380, password, 60, keyClass, valueClass); + private ICache createRedisClient(final Class keyClass, final Class valueClass) { + try { + final String host = getSecret("redis-hostname"); + final String password = getSecret("redis-password"); + return new RedisCache(host, 6380, password, 60, keyClass, valueClass); + } catch (IllegalArgumentException iae) { + // Secret does not exist. Redis may not be available yet. + CoreLoggerFactory.getInstance().getLogger(LOGGER_NAME).warn("Required secrets does not exist. Redis is not available yet."); + return new NoOpRedisCache(); + } } /** -- GitLab From c196bec9e5b932654094a93bcb481d10713f5b33 Mon Sep 17 00:00:00 2001 From: Krishna Nikhil Vedurumudi Date: Wed, 16 Feb 2022 12:15:12 +0530 Subject: [PATCH 3/7] Using IRedisCache interface --- pom.xml | 2 +- .../osdu/azure/cache/IRedisClientFactory.java | 4 +- .../osdu/azure/cache/NoOpRedisCache.java | 51 +++++++++++++++- .../osdu/azure/cache/RedisAzureCache.java | 61 +++++++++++++++++-- .../osdu/azure/cache/RedisClientFactory.java | 10 +-- 5 files changed, 112 insertions(+), 16 deletions(-) diff --git a/pom.xml b/pom.xml index d229224c..3a685975 100644 --- a/pom.xml +++ b/pom.xml @@ -37,7 +37,7 @@ 2.6.4 3.4.0 1.18.16 - 0.13.0 + 0.14.0-rc1 1.0.0-beta-3 4.2.3 2.12.0 diff --git a/src/main/java/org/opengroup/osdu/azure/cache/IRedisClientFactory.java b/src/main/java/org/opengroup/osdu/azure/cache/IRedisClientFactory.java index dcc17f5f..cffd7ab1 100644 --- a/src/main/java/org/opengroup/osdu/azure/cache/IRedisClientFactory.java +++ b/src/main/java/org/opengroup/osdu/azure/cache/IRedisClientFactory.java @@ -1,6 +1,6 @@ package org.opengroup.osdu.azure.cache; -import org.opengroup.osdu.core.common.cache.ICache; +import org.opengroup.osdu.core.common.cache.IRedisCache; /** * Redis client creator. @@ -15,5 +15,5 @@ public interface IRedisClientFactory { * @param valueClass value class type * @return redis cache client instance. */ - ICache getClient(Class keyClass, Class valueClass); + IRedisCache getClient(Class keyClass, Class valueClass); } diff --git a/src/main/java/org/opengroup/osdu/azure/cache/NoOpRedisCache.java b/src/main/java/org/opengroup/osdu/azure/cache/NoOpRedisCache.java index dbb86e9c..732389c4 100644 --- a/src/main/java/org/opengroup/osdu/azure/cache/NoOpRedisCache.java +++ b/src/main/java/org/opengroup/osdu/azure/cache/NoOpRedisCache.java @@ -1,14 +1,14 @@ package org.opengroup.osdu.azure.cache; import org.opengroup.osdu.azure.logging.CoreLoggerFactory; -import org.opengroup.osdu.core.common.cache.ICache; +import org.opengroup.osdu.core.common.cache.IRedisCache; /** * Redis cache client that does nothing! * @param keyClass * @param valueClass */ -public final class NoOpRedisCache implements ICache { +public final class NoOpRedisCache implements IRedisCache { private static final String LOGGER_NAME = NoOpRedisCache.class.getName(); @@ -32,4 +32,51 @@ public final class NoOpRedisCache implements ICache { public void clearAll() { CoreLoggerFactory.getInstance().getLogger(LOGGER_NAME).info("NoOpRedisCache - clearAll"); } + + @Override + public void put(final K k, final long l, final V o) { + CoreLoggerFactory.getInstance().getLogger(LOGGER_NAME).info("NoOpRedisCache - put with ttl"); + } + + @Override + public boolean updateTtl(final K k, final long l) { + CoreLoggerFactory.getInstance().getLogger(LOGGER_NAME).info("NoOpRedisCache - updateTtl"); + return false; + } + + @Override + public long getTtl(final K k) { + CoreLoggerFactory.getInstance().getLogger(LOGGER_NAME).info("NoOpRedisCache - getTtl"); + return 0; + } + + @Override + public String info() { + CoreLoggerFactory.getInstance().getLogger(LOGGER_NAME).info("NoOpRedisCache - info"); + return null; + } + + @Override + public Long increment(final K k) { + CoreLoggerFactory.getInstance().getLogger(LOGGER_NAME).info("NoOpRedisCache - increment"); + return null; + } + + @Override + public Long incrementBy(final K k, final long l) { + CoreLoggerFactory.getInstance().getLogger(LOGGER_NAME).info("NoOpRedisCache - incrementBy"); + return null; + } + + @Override + public Long decrement(final K k) { + CoreLoggerFactory.getInstance().getLogger(LOGGER_NAME).info("NoOpRedisCache - decrement"); + return null; + } + + @Override + public Long decrementBy(final K k, final long l) { + CoreLoggerFactory.getInstance().getLogger(LOGGER_NAME).info("NoOpRedisCache - decrementBy"); + return null; + } } diff --git a/src/main/java/org/opengroup/osdu/azure/cache/RedisAzureCache.java b/src/main/java/org/opengroup/osdu/azure/cache/RedisAzureCache.java index c4a71832..c4acff89 100644 --- a/src/main/java/org/opengroup/osdu/azure/cache/RedisAzureCache.java +++ b/src/main/java/org/opengroup/osdu/azure/cache/RedisAzureCache.java @@ -1,6 +1,6 @@ package org.opengroup.osdu.azure.cache; -import org.opengroup.osdu.core.common.cache.ICache; +import org.opengroup.osdu.core.common.cache.IRedisCache; import org.springframework.beans.factory.annotation.Autowired; /** @@ -8,7 +8,7 @@ import org.springframework.beans.factory.annotation.Autowired; * @param key class * @param value class */ -public class RedisAzureCache implements ICache { +public final class RedisAzureCache implements IRedisCache { // Add Exception handling // Add database number @@ -37,7 +37,7 @@ public class RedisAzureCache implements ICache { */ @Override public void put(final K key, final V value) { - ICache redisCache = redisClientFactory.getClient(keyClass, valueClass); + IRedisCache redisCache = redisClientFactory.getClient(keyClass, valueClass); redisCache.put(key, value); } @@ -48,7 +48,7 @@ public class RedisAzureCache implements ICache { */ @Override public V get(final K key) { - ICache redisCache = redisClientFactory.getClient(keyClass, valueClass); + IRedisCache redisCache = redisClientFactory.getClient(keyClass, valueClass); return redisCache.get(key); } @@ -58,16 +58,65 @@ public class RedisAzureCache implements ICache { */ @Override public void delete(final K key) { - ICache redisCache = redisClientFactory.getClient(keyClass, valueClass); + IRedisCache redisCache = redisClientFactory.getClient(keyClass, valueClass); redisCache.delete(key); } /** + * * Clear all entries from cache. */ @Override public void clearAll() { - ICache redisCache = redisClientFactory.getClient(keyClass, valueClass); + IRedisCache redisCache = redisClientFactory.getClient(keyClass, valueClass); redisCache.clearAll(); } + + @Override + public void put(final K k, final long l, final V o) { + IRedisCache redisCache = redisClientFactory.getClient(keyClass, valueClass); + redisCache.put(k, l, o); + } + + @Override + public boolean updateTtl(final K k, final long l) { + IRedisCache redisCache = redisClientFactory.getClient(keyClass, valueClass); + return redisCache.updateTtl(k, l); + } + + @Override + public long getTtl(final K k) { + IRedisCache redisCache = redisClientFactory.getClient(keyClass, valueClass); + return redisCache.getTtl(k); + } + + @Override + public String info() { + IRedisCache redisCache = redisClientFactory.getClient(keyClass, valueClass); + return redisCache.info(); + } + + @Override + public Long increment(final K k) { + IRedisCache redisCache = redisClientFactory.getClient(keyClass, valueClass); + return redisCache.increment(k); + } + + @Override + public Long incrementBy(final K k, final long l) { + IRedisCache redisCache = redisClientFactory.getClient(keyClass, valueClass); + return redisCache.incrementBy(k, l); + } + + @Override + public Long decrement(final K k) { + IRedisCache redisCache = redisClientFactory.getClient(keyClass, valueClass); + return redisCache.decrement(k); + } + + @Override + public Long decrementBy(final K k, final long l) { + IRedisCache redisCache = redisClientFactory.getClient(keyClass, valueClass); + return redisCache.decrementBy(k, l); + } } diff --git a/src/main/java/org/opengroup/osdu/azure/cache/RedisClientFactory.java b/src/main/java/org/opengroup/osdu/azure/cache/RedisClientFactory.java index c089b754..2b2b507c 100644 --- a/src/main/java/org/opengroup/osdu/azure/cache/RedisClientFactory.java +++ b/src/main/java/org/opengroup/osdu/azure/cache/RedisClientFactory.java @@ -3,7 +3,7 @@ package org.opengroup.osdu.azure.cache; import com.azure.security.keyvault.secrets.SecretClient; import org.opengroup.osdu.azure.KeyVaultFacade; import org.opengroup.osdu.azure.logging.CoreLoggerFactory; -import org.opengroup.osdu.core.common.cache.ICache; +import org.opengroup.osdu.core.common.cache.IRedisCache; import org.opengroup.osdu.core.common.cache.RedisCache; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Lazy; @@ -26,7 +26,7 @@ public class RedisClientFactory implements IRedisClientFactory { @Autowired private SecretClient secretClient; - private Map redisClientMap; + private Map redisClientMap; /** * Initializes the private variables as required. */ @@ -42,10 +42,10 @@ public class RedisClientFactory implements IRedisClientFactory { * @return Redis client */ @Override - public ICache getClient(final Class keyClass, final Class valueClass) { + public IRedisCache getClient(final Class keyClass, final Class valueClass) { String cacheKey = String.format("%s-%s", keyClass.toString(), valueClass.toString()); if (this.redisClientMap.containsKey(cacheKey)) { - ICache cacheObject = this.redisClientMap.get(cacheKey); + IRedisCache cacheObject = this.redisClientMap.get(cacheKey); if (cacheObject instanceof RedisCache) { return cacheObject; } else { @@ -63,7 +63,7 @@ public class RedisClientFactory implements IRedisClientFactory { * @param valueClass Class type for value * @return redis client */ - private ICache createRedisClient(final Class keyClass, final Class valueClass) { + private IRedisCache createRedisClient(final Class keyClass, final Class valueClass) { try { final String host = getSecret("redis-hostname"); final String password = getSecret("redis-password"); -- GitLab From 3f9adbc1618bea29bfdabb629113026bed72d30d Mon Sep 17 00:00:00 2001 From: Shiv Singh Date: Wed, 16 Mar 2022 05:28:18 +0000 Subject: [PATCH 4/7] Adding RedisAzureConfiguration for RedisAzureCache --- .../opengroup/osdu/azure/KeyVaultFacade.java | 31 ++++++++++ .../osdu/azure/cache/IRedisClientFactory.java | 4 +- .../osdu/azure/cache/RedisAzureCache.java | 56 ++++++++++++++----- .../osdu/azure/cache/RedisClientFactory.java | 41 ++++++++++---- .../azure/di/RedisAzureConfiguration.java | 18 ++++++ 5 files changed, 125 insertions(+), 25 deletions(-) create mode 100644 src/main/java/org/opengroup/osdu/azure/di/RedisAzureConfiguration.java diff --git a/src/main/java/org/opengroup/osdu/azure/KeyVaultFacade.java b/src/main/java/org/opengroup/osdu/azure/KeyVaultFacade.java index cff943a4..067fcf27 100644 --- a/src/main/java/org/opengroup/osdu/azure/KeyVaultFacade.java +++ b/src/main/java/org/opengroup/osdu/azure/KeyVaultFacade.java @@ -14,6 +14,7 @@ package org.opengroup.osdu.azure; +import com.azure.core.exception.ResourceModifiedException; import com.azure.core.exception.ResourceNotFoundException; import com.azure.security.keyvault.secrets.SecretClient; import com.azure.security.keyvault.secrets.models.KeyVaultSecret; @@ -91,6 +92,36 @@ public final class KeyVaultFacade { return secret.getValue(); } + /** + * Check if given secret exists in the vault. + * + * @param kv Client configured to the correct vault + * @param secretName name of secret + * @return Status of secret existence in the vault. + */ + public static boolean checkIfSecretExists(final SecretClient kv, final String secretName) { + Validators.checkNotNull(secretName, "Secret with name " + secretName); + + final long start = System.currentTimeMillis(); + int statusCode = HttpStatus.SC_OK; + try { + kv.getSecret(secretName); + CoreLoggerFactory.getInstance().getLogger(LOGGER_NAME).info("Successfully retrieved {}.", secretName); + } catch (ResourceNotFoundException secretNotFound) { + statusCode = HttpStatus.SC_NOT_FOUND; + CoreLoggerFactory.getInstance().getLogger(LOGGER_NAME).warn("Failed to retrieve {}. Not found.", secretName); + return false; + } catch (ResourceModifiedException secretDisabled) { + statusCode = HttpStatus.SC_FORBIDDEN; + CoreLoggerFactory.getInstance().getLogger(LOGGER_NAME).warn("Failed to retrieve {}. Secret disabled.", secretName); + return false; + } finally { + final long timeTaken = System.currentTimeMillis() - start; + logDependency("GET_SECRET", secretName, kv.getVaultUrl(), timeTaken, statusCode); + } + return true; + } + /** * Log dependency. * diff --git a/src/main/java/org/opengroup/osdu/azure/cache/IRedisClientFactory.java b/src/main/java/org/opengroup/osdu/azure/cache/IRedisClientFactory.java index cffd7ab1..5d54ed77 100644 --- a/src/main/java/org/opengroup/osdu/azure/cache/IRedisClientFactory.java +++ b/src/main/java/org/opengroup/osdu/azure/cache/IRedisClientFactory.java @@ -1,5 +1,6 @@ package org.opengroup.osdu.azure.cache; +import org.opengroup.osdu.azure.di.RedisAzureConfiguration; import org.opengroup.osdu.core.common.cache.IRedisCache; /** @@ -13,7 +14,8 @@ public interface IRedisClientFactory { * Retrieve redis client. Creates a new client if not exists. * @param keyClass key class type * @param valueClass value class type + * @param redisConfiguration configuration for redis client * @return redis cache client instance. */ - IRedisCache getClient(Class keyClass, Class valueClass); + IRedisCache getClient(Class keyClass, Class valueClass, RedisAzureConfiguration redisConfiguration); } diff --git a/src/main/java/org/opengroup/osdu/azure/cache/RedisAzureCache.java b/src/main/java/org/opengroup/osdu/azure/cache/RedisAzureCache.java index c4acff89..da96f84e 100644 --- a/src/main/java/org/opengroup/osdu/azure/cache/RedisAzureCache.java +++ b/src/main/java/org/opengroup/osdu/azure/cache/RedisAzureCache.java @@ -1,5 +1,6 @@ package org.opengroup.osdu.azure.cache; +import org.opengroup.osdu.azure.di.RedisAzureConfiguration; import org.opengroup.osdu.core.common.cache.IRedisCache; import org.springframework.beans.factory.annotation.Autowired; @@ -8,7 +9,7 @@ import org.springframework.beans.factory.annotation.Autowired; * @param key class * @param value class */ -public final class RedisAzureCache implements IRedisCache { +public class RedisAzureCache implements IRedisCache { // Add Exception handling // Add database number @@ -16,6 +17,7 @@ public final class RedisAzureCache implements IRedisCache { private Class keyClass; private Class valueClass; + private RedisAzureConfiguration redisConfiguration; @Autowired private IRedisClientFactory redisClientFactory; @@ -24,10 +26,12 @@ public final class RedisAzureCache implements IRedisCache { * Constructor. * @param keyClassType key class type * @param valueClassType value class type + * @param redisAzureConfiguration configuration for redis client */ - public RedisAzureCache(final Class keyClassType, final Class valueClassType) { + public RedisAzureCache(final Class keyClassType, final Class valueClassType, final RedisAzureConfiguration redisAzureConfiguration) { this.keyClass = keyClassType; this.valueClass = valueClassType; + this.redisConfiguration = redisAzureConfiguration; } /** @@ -37,7 +41,7 @@ public final class RedisAzureCache implements IRedisCache { */ @Override public void put(final K key, final V value) { - IRedisCache redisCache = redisClientFactory.getClient(keyClass, valueClass); + IRedisCache redisCache = redisClientFactory.getClient(keyClass, valueClass, redisConfiguration); redisCache.put(key, value); } @@ -48,7 +52,7 @@ public final class RedisAzureCache implements IRedisCache { */ @Override public V get(final K key) { - IRedisCache redisCache = redisClientFactory.getClient(keyClass, valueClass); + IRedisCache redisCache = redisClientFactory.getClient(keyClass, valueClass, redisConfiguration); return redisCache.get(key); } @@ -58,7 +62,7 @@ public final class RedisAzureCache implements IRedisCache { */ @Override public void delete(final K key) { - IRedisCache redisCache = redisClientFactory.getClient(keyClass, valueClass); + IRedisCache redisCache = redisClientFactory.getClient(keyClass, valueClass, redisConfiguration); redisCache.delete(key); } @@ -68,55 +72,79 @@ public final class RedisAzureCache implements IRedisCache { */ @Override public void clearAll() { - IRedisCache redisCache = redisClientFactory.getClient(keyClass, valueClass); + IRedisCache redisCache = redisClientFactory.getClient(keyClass, valueClass, redisConfiguration); redisCache.clearAll(); } + /** + * Puts entry in cache with ttl measured in milliseconds. + */ @Override public void put(final K k, final long l, final V o) { - IRedisCache redisCache = redisClientFactory.getClient(keyClass, valueClass); + IRedisCache redisCache = redisClientFactory.getClient(keyClass, valueClass, redisConfiguration); redisCache.put(k, l, o); } + /** + * Updates a key's ttl in milliseconds. + */ @Override public boolean updateTtl(final K k, final long l) { - IRedisCache redisCache = redisClientFactory.getClient(keyClass, valueClass); + IRedisCache redisCache = redisClientFactory.getClient(keyClass, valueClass, redisConfiguration); return redisCache.updateTtl(k, l); } + /** + * Gets the ttl for a key in milliseconds. + */ @Override public long getTtl(final K k) { - IRedisCache redisCache = redisClientFactory.getClient(keyClass, valueClass); + IRedisCache redisCache = redisClientFactory.getClient(keyClass, valueClass, redisConfiguration); return redisCache.getTtl(k); } + /** + * Get redis INFO. + */ @Override public String info() { - IRedisCache redisCache = redisClientFactory.getClient(keyClass, valueClass); + IRedisCache redisCache = redisClientFactory.getClient(keyClass, valueClass, redisConfiguration); return redisCache.info(); } + /** + * Increment the integer value of a key by one. + */ @Override public Long increment(final K k) { - IRedisCache redisCache = redisClientFactory.getClient(keyClass, valueClass); + IRedisCache redisCache = redisClientFactory.getClient(keyClass, valueClass, redisConfiguration); return redisCache.increment(k); } + /** + * Increment the integer value of a key by the given amount. + */ @Override public Long incrementBy(final K k, final long l) { - IRedisCache redisCache = redisClientFactory.getClient(keyClass, valueClass); + IRedisCache redisCache = redisClientFactory.getClient(keyClass, valueClass, redisConfiguration); return redisCache.incrementBy(k, l); } + /** + * Decrement the integer value of a key by one. + */ @Override public Long decrement(final K k) { - IRedisCache redisCache = redisClientFactory.getClient(keyClass, valueClass); + IRedisCache redisCache = redisClientFactory.getClient(keyClass, valueClass, redisConfiguration); return redisCache.decrement(k); } + /** + * Decrement the integer value of a key by the given amount. + */ @Override public Long decrementBy(final K k, final long l) { - IRedisCache redisCache = redisClientFactory.getClient(keyClass, valueClass); + IRedisCache redisCache = redisClientFactory.getClient(keyClass, valueClass, redisConfiguration); return redisCache.decrementBy(k, l); } } diff --git a/src/main/java/org/opengroup/osdu/azure/cache/RedisClientFactory.java b/src/main/java/org/opengroup/osdu/azure/cache/RedisClientFactory.java index 2b2b507c..a0dae846 100644 --- a/src/main/java/org/opengroup/osdu/azure/cache/RedisClientFactory.java +++ b/src/main/java/org/opengroup/osdu/azure/cache/RedisClientFactory.java @@ -1,7 +1,10 @@ package org.opengroup.osdu.azure.cache; import com.azure.security.keyvault.secrets.SecretClient; +import com.lambdaworks.redis.ClientOptions; +import com.lambdaworks.redis.SocketOptions; import org.opengroup.osdu.azure.KeyVaultFacade; +import org.opengroup.osdu.azure.di.RedisAzureConfiguration; import org.opengroup.osdu.azure.logging.CoreLoggerFactory; import org.opengroup.osdu.core.common.cache.IRedisCache; import org.opengroup.osdu.core.common.cache.RedisCache; @@ -10,8 +13,10 @@ import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Component; import javax.annotation.PostConstruct; + import java.util.Map; import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.TimeUnit; /** * Redis client factory. @@ -39,10 +44,11 @@ public class RedisClientFactory implements IRedisClientFactory { * Get redis client. * @param keyClass Class type for key * @param valueClass Class type for value + * @param redisConfiguration configuration for redis client * @return Redis client */ @Override - public IRedisCache getClient(final Class keyClass, final Class valueClass) { + public IRedisCache getClient(final Class keyClass, final Class valueClass, final RedisAzureConfiguration redisConfiguration) { String cacheKey = String.format("%s-%s", keyClass.toString(), valueClass.toString()); if (this.redisClientMap.containsKey(cacheKey)) { IRedisCache cacheObject = this.redisClientMap.get(cacheKey); @@ -54,25 +60,32 @@ public class RedisClientFactory implements IRedisClientFactory { } } - return this.redisClientMap.computeIfAbsent(cacheKey, cacheObject -> createRedisClient(keyClass, valueClass)); + IRedisCache redisCache = this.redisClientMap.computeIfAbsent(cacheKey, cacheObject -> createRedisClient(keyClass, valueClass, redisConfiguration)); + return redisCache == null ? new NoOpRedisCache<>() : redisCache; } /** * Create redis client object. * @param keyClass Class type for key * @param valueClass Class type for value + * @param redisConfiguration configuration for redis client * @return redis client */ - private IRedisCache createRedisClient(final Class keyClass, final Class valueClass) { - try { - final String host = getSecret("redis-hostname"); - final String password = getSecret("redis-password"); - return new RedisCache(host, 6380, password, 60, keyClass, valueClass); - } catch (IllegalArgumentException iae) { - // Secret does not exist. Redis may not be available yet. + private IRedisCache createRedisClient(final Class keyClass, final Class valueClass, final RedisAzureConfiguration redisConfiguration) { + final String hostKey = "redis-hostname"; + final String passwordKey = "redis-password"; + + if (!secretExists(hostKey) || !secretExists(passwordKey)) { CoreLoggerFactory.getInstance().getLogger(LOGGER_NAME).warn("Required secrets does not exist. Redis is not available yet."); - return new NoOpRedisCache(); + return null; } + + final String host = getSecret(hostKey); + final String password = getSecret(passwordKey); + ClientOptions clientOptions = ClientOptions.builder() + .socketOptions(SocketOptions.builder().connectTimeout(redisConfiguration.getTimeout(), TimeUnit.SECONDS).build()) + .build(); + return new RedisCache(host, redisConfiguration.getPort(), password, redisConfiguration.getExpiration(), redisConfiguration.getDatabase(), keyClass, valueClass); } /** @@ -83,4 +96,12 @@ public class RedisClientFactory implements IRedisClientFactory { private String getSecret(final String keyName) { return KeyVaultFacade.getSecretWithValidation(secretClient, keyName); } + + /** + * @param keyName name of the secret + * @return status if secret exists + */ + private boolean secretExists(final String keyName) { + return KeyVaultFacade.checkIfSecretExists(secretClient, keyName); + } } diff --git a/src/main/java/org/opengroup/osdu/azure/di/RedisAzureConfiguration.java b/src/main/java/org/opengroup/osdu/azure/di/RedisAzureConfiguration.java new file mode 100644 index 00000000..f2e38b53 --- /dev/null +++ b/src/main/java/org/opengroup/osdu/azure/di/RedisAzureConfiguration.java @@ -0,0 +1,18 @@ +package org.opengroup.osdu.azure.di; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import org.springframework.boot.context.properties.ConfigurationProperties; + +/** + * A configuration bean class to set up redis cache related variables. + */ +@ConfigurationProperties +@AllArgsConstructor +@Getter +public class RedisAzureConfiguration { + private int database; + private int expiration; + private int port; + private long timeout; +} -- GitLab From f45759fc23700f8123c79a34250ec526f99079c3 Mon Sep 17 00:00:00 2001 From: Shiv Singh Date: Tue, 22 Mar 2022 07:14:55 +0000 Subject: [PATCH 5/7] Adding tests for KeyVaultFacade and RedisClientFactory --- .../osdu/azure/KeyVaultFacadeTest.java | 27 +++- .../azure/cache/RedisClientFactoryTest.java | 116 ++++++++++++++++++ 2 files changed, 141 insertions(+), 2 deletions(-) create mode 100644 src/test/java/org/opengroup/osdu/azure/cache/RedisClientFactoryTest.java diff --git a/src/test/java/org/opengroup/osdu/azure/KeyVaultFacadeTest.java b/src/test/java/org/opengroup/osdu/azure/KeyVaultFacadeTest.java index 9b5b87f5..171365e8 100644 --- a/src/test/java/org/opengroup/osdu/azure/KeyVaultFacadeTest.java +++ b/src/test/java/org/opengroup/osdu/azure/KeyVaultFacadeTest.java @@ -14,6 +14,8 @@ package org.opengroup.osdu.azure; +import com.azure.core.exception.ResourceModifiedException; +import com.azure.core.exception.ResourceNotFoundException; import com.azure.security.keyvault.secrets.SecretClient; import com.azure.security.keyvault.secrets.models.KeyVaultSecret; import org.junit.jupiter.api.AfterEach; @@ -28,8 +30,7 @@ import org.opengroup.osdu.azure.logging.CoreLoggerFactory; import java.lang.reflect.Field; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.*; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyMap; import static org.mockito.ArgumentMatchers.anyString; @@ -117,4 +118,26 @@ class KeyVaultFacadeTest { String secretValue = KeyVaultFacade.getSecretWithValidation(kv, "secret-name"); assertEquals("secret-value", secretValue); } + + @Test + void checkIfSecretExists_returnsFalseWhenSecretNotExists() { + doThrow(new ResourceNotFoundException("Secret not found", null)).when(kv).getSecret("secret-name"); + + assertFalse(KeyVaultFacade.checkIfSecretExists(kv, "secret-name")); + } + + @Test + void checkIfSecretExists_returnsFalseWhenSecretIsDisabled() { + doThrow(new ResourceModifiedException("Secret is disabled", null)).when(kv).getSecret("secret-name"); + + assertFalse(KeyVaultFacade.checkIfSecretExists(kv, "secret-name")); + } + + @Test + void checkIfSecretExists_returnsTrueWhenSecretExists() { + KeyVaultSecret secret = mock(KeyVaultSecret.class); + doReturn(secret).when(kv).getSecret("secret-name"); + + assertTrue(KeyVaultFacade.checkIfSecretExists(kv, "secret-name")); + } } diff --git a/src/test/java/org/opengroup/osdu/azure/cache/RedisClientFactoryTest.java b/src/test/java/org/opengroup/osdu/azure/cache/RedisClientFactoryTest.java new file mode 100644 index 00000000..164f577d --- /dev/null +++ b/src/test/java/org/opengroup/osdu/azure/cache/RedisClientFactoryTest.java @@ -0,0 +1,116 @@ +package org.opengroup.osdu.azure.cache; + +import org.junit.jupiter.api.*; +import org.opengroup.osdu.azure.logging.CoreLogger; +import org.opengroup.osdu.azure.logging.CoreLoggerFactory; +import org.opengroup.osdu.core.common.cache.RedisCache; +import com.azure.security.keyvault.secrets.SecretClient; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; +import org.opengroup.osdu.azure.di.RedisAzureConfiguration; +import org.opengroup.osdu.core.common.cache.IRedisCache; + +import java.lang.reflect.Field; +import java.util.List; +import java.util.Map; + +import static org.junit.jupiter.api.Assertions.assertSame; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.mockito.Mockito.*; +import static org.mockito.MockitoAnnotations.openMocks; + +@ExtendWith(MockitoExtension.class) +public class RedisClientFactoryTest { + + @Mock + private SecretClient secretClient; + @Mock + private Map redisClientMap; + @Mock + private RedisAzureConfiguration redisConfiguration; + @Mock + private CoreLoggerFactory coreLoggerFactory; + @Mock + private CoreLogger coreLogger; + @InjectMocks + private RedisClientFactory redisClientFactory; + + /** + * Workaround for inability to mock static methods like getInstance(). + * + * @param mock CoreLoggerFactory mock instance + */ + private void mockSingleton(CoreLoggerFactory mock) { + try { + Field instance = CoreLoggerFactory.class.getDeclaredField("instance"); + instance.setAccessible(true); + instance.set(null, mock); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + /** + * Reset workaround for inability to mock static methods like getInstance(). + */ + private void resetSingleton() { + try { + Field instance = CoreLoggerFactory.class.getDeclaredField("instance"); + instance.setAccessible(true); + instance.set(null, null); + instance.setAccessible(false); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + @BeforeEach + void setUp() { + openMocks(this); + } + + @Test + public void should_return_cachedClient_when_cachedEarlier() { + RedisCache redisCache = mock(RedisCache.class); + final String cacheKey = String.format("%s-%s", String.class, List.class); + when(this.redisClientMap.containsKey(cacheKey)).thenReturn(true); + when(this.redisClientMap.get(cacheKey)).thenReturn(redisCache); + + IRedisCache redisClient = this.redisClientFactory.getClient(String.class, List.class, redisConfiguration); + + assertSame(redisCache, redisClient); + } + + @Test + public void should_return_NoOpRedisCache_when_computeIfAbsent_returns_null() { + final String cacheKey = String.format("%s-%s", String.class, List.class); + when(this.redisClientMap.containsKey(cacheKey)).thenReturn(false); + when(this.redisClientMap.computeIfAbsent(any(), any())).thenReturn(null); + + IRedisCache redisClient = this.redisClientFactory.getClient(String.class, List.class, redisConfiguration); + + assertTrue(redisClient instanceof NoOpRedisCache); + } + + @Test + public void should_again_create_redisClient_if_cachedclient_instanceof_noOpRedisCache() { + NoOpRedisCache noOpRedisCache = mock(NoOpRedisCache.class); + RedisCache redisCache = mock(RedisCache.class); + final String cacheKey = String.format("%s-%s", String.class, List.class); + + mockSingleton(coreLoggerFactory); + when(coreLoggerFactory.getLogger(anyString())).thenReturn(coreLogger); + + when(this.redisClientMap.containsKey(cacheKey)).thenReturn(true); + when(this.redisClientMap.get(cacheKey)).thenReturn(noOpRedisCache); + when(this.redisClientMap.computeIfAbsent(any(), any())).thenReturn(redisCache); + + IRedisCache redisClient = this.redisClientFactory.getClient(String.class, List.class, redisConfiguration); + resetSingleton(); + + assert(redisClient instanceof RedisCache); + + } +} -- GitLab From 8d003576e74f068bffcad300610dfc389c4109e1 Mon Sep 17 00:00:00 2001 From: Shiv Singh Date: Wed, 23 Mar 2022 13:08:51 +0530 Subject: [PATCH 6/7] [+] resolved comments --- .../osdu/azure/cache/RedisClientFactory.java | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/src/main/java/org/opengroup/osdu/azure/cache/RedisClientFactory.java b/src/main/java/org/opengroup/osdu/azure/cache/RedisClientFactory.java index a0dae846..07286b1d 100644 --- a/src/main/java/org/opengroup/osdu/azure/cache/RedisClientFactory.java +++ b/src/main/java/org/opengroup/osdu/azure/cache/RedisClientFactory.java @@ -27,6 +27,8 @@ import java.util.concurrent.TimeUnit; @Lazy public class RedisClientFactory implements IRedisClientFactory { private static final String LOGGER_NAME = RedisClientFactory.class.getName(); + private static final String HOST_KEY = "redis-hostname"; + private static final String PASSWORD_KEY = "redis-password"; @Autowired private SecretClient secretClient; @@ -72,16 +74,13 @@ public class RedisClientFactory implements IRedisClientFactory { * @return redis client */ private IRedisCache createRedisClient(final Class keyClass, final Class valueClass, final RedisAzureConfiguration redisConfiguration) { - final String hostKey = "redis-hostname"; - final String passwordKey = "redis-password"; - - if (!secretExists(hostKey) || !secretExists(passwordKey)) { + if (!secretExists(HOST_KEY) || !secretExists(PASSWORD_KEY)) { CoreLoggerFactory.getInstance().getLogger(LOGGER_NAME).warn("Required secrets does not exist. Redis is not available yet."); return null; } - final String host = getSecret(hostKey); - final String password = getSecret(passwordKey); + final String host = getSecret(HOST_KEY); + final String password = getSecret(PASSWORD_KEY); ClientOptions clientOptions = ClientOptions.builder() .socketOptions(SocketOptions.builder().connectTimeout(redisConfiguration.getTimeout(), TimeUnit.SECONDS).build()) .build(); -- GitLab From f1bd7177f09a4870ee1fe68d25a0b374022e6759 Mon Sep 17 00:00:00 2001 From: Shiv Singh Date: Wed, 23 Mar 2022 13:17:52 +0530 Subject: [PATCH 7/7] Updating NOTICE --- NOTICE | 524 ++++++++++++++++++++++++++++----------------------------- 1 file changed, 262 insertions(+), 262 deletions(-) diff --git a/NOTICE b/NOTICE index 059a8a96..bef27db3 100644 --- a/NOTICE +++ b/NOTICE @@ -1,262 +1,262 @@ -# 3rd-Party Software License Notice -Generated by fossa-cli (https://github.com/fossas/fossa-cli). -Formatted by fossa-with-cache (https://community.opengroup.org/divido/fossa-with-cache). -This software includes the following software and licenses: - -======================================================================== -Apache-2.0 -======================================================================== -The following software have components provided under the terms of this license: - -- ASM based accessors helper used by json-smart (from https://urielch.github.io/) -- Apache Commons Codec (from https://commons.apache.org/proper/commons-codec/) -- Apache Commons Collections (from http://commons.apache.org/proper/commons-collections/) -- Apache Commons Lang (from http://commons.apache.org/proper/commons-lang/) -- Apache Commons Logging (from http://commons.apache.org/logging/, http://commons.apache.org/proper/commons-logging/) -- Apache HttpCore (from http://hc.apache.org/httpcomponents-core-ga, http://hc.apache.org/httpcomponents-core-ga/) -- Bean Validation API (from http://beanvalidation.org) -- Brave (from https://repo1.maven.org/maven2/io/zipkin/brave/brave) -- Brave Instrumentation: Http Adapters (from https://repo1.maven.org/maven2/io/zipkin/brave/brave-instrumentation-http) -- Byte Buddy (without dependencies) (from https://repo1.maven.org/maven2/net/bytebuddy/byte-buddy) -- Byte Buddy Java agent (from https://repo1.maven.org/maven2/net/bytebuddy/byte-buddy-agent) -- ClassMate (from http://github.com/cowtowncoder/java-classmate) -- FindBugs-jsr305 (from http://findbugs.sourceforge.net/) -- Guava InternalFutureFailureAccess and InternalFutures (from https://repo1.maven.org/maven2/com/google/guava/failureaccess) -- Guava: Google Core Libraries for Java (from http://code.google.com/p/guava-libraries, https://github.com/google/guava, https://repo1.maven.org/maven2/com/google/guava/guava) -- HttpClient (from http://hc.apache.org/httpcomponents-client) -- J2ObjC Annotations (from https://github.com/google/j2objc/) -- JCIP Annotations under Apache License (from http://stephenc.github.com/jcip-annotations) -- JSON Small and Fast Parser (from https://repo1.maven.org/maven2/net/minidev/json-smart, https://urielch.github.io/) -- JSR107 API and SPI (from https://github.com/jsr107/jsr107spec) -- Jackson datatype: JSR310 (from http://wiki.fasterxml.com/JacksonModuleJSR310, https://repo1.maven.org/maven2/com/fasterxml/jackson/datatype/jackson-datatype-jsr310) -- Jackson datatype: jdk8 (from https://repo1.maven.org/maven2/com/fasterxml/jackson/datatype/jackson-datatype-jdk8) -- Jackson-annotations (from http://github.com/FasterXML/jackson, http://wiki.fasterxml.com/JacksonHome) -- Jackson-core (from http://wiki.fasterxml.com/JacksonHome, https://github.com/FasterXML/jackson-core) -- Jackson-module-parameter-names (from https://repo1.maven.org/maven2/com/fasterxml/jackson/module/jackson-module-parameter-names) -- Jakarta Bean Validation API (from https://beanvalidation.org) -- Java Native Access (from https://github.com/java-native-access/jna, https://github.com/twall/jna) -- Java UUID Generator (from http://wiki.fasterxml.com/JugHome) -- Javassist (from http://www.javassist.org/) -- Joda-Time (from http://joda-time.sourceforge.net, http://www.joda.org/joda-time/, https://www.joda.org/joda-time/) -- Metrics Core (from https://repo1.maven.org/maven2/io/dropwizard/metrics/metrics-core) -- Microsoft Azure SDK for SQL API of Azure Cosmos DB Service (from https://github.com/Azure/azure-sdk-for-java) -- Mockito (from http://mockito.org, https://github.com/mockito/mockito) -- Netty Reactive Streams Implementation (from https://repo1.maven.org/maven2/com/typesafe/netty/netty-reactive-streams) -- Nimbus Content Type (from https://bitbucket.org/connect2id/nimbus-content-type) -- Nimbus LangTag (from https://bitbucket.org/connect2id/nimbus-language-tags) -- OAuth 2.0 SDK with OpenID Connect extensions (from https://bitbucket.org/connect2id/oauth-2.0-sdk-with-openid-connect-extensions) -- Objenesis (from http://objenesis.org) -- OkHttp (from https://repo1.maven.org/maven2/com/squareup/okhttp3/okhttp, https://square.github.io/okhttp/) -- Okio (from https://github.com/square/okio/, https://repo1.maven.org/maven2/com/squareup/okio/okio) -- SnakeYAML (from http://code.google.com/p/snakeyaml/, http://www.snakeyaml.org) -- Spring Boot AutoConfigure (from https://projects.spring.io/spring-boot/#/spring-boot-parent/spring-boot-autoconfigure, https://spring.io/projects/spring-boot) -- Woodstox (from https://github.com/FasterXML/woodstox) -- Zipkin Reporter Brave (from https://repo1.maven.org/maven2/io/zipkin/reporter2/zipkin-reporter-brave) -- Zipkin Reporter: Core (from https://repo1.maven.org/maven2/io/zipkin/reporter2/zipkin-reporter) -- Zipkin v2 (from https://repo1.maven.org/maven2/io/zipkin/zipkin2/zipkin) -- aalto-xml (from https://github.com/FasterXML/aalto-xml, https://repo1.maven.org/maven2/com/fasterxml/aalto-xml) -- error-prone annotations (from https://repo1.maven.org/maven2/com/google/errorprone/error_prone_annotations) -- jackson-databind (from http://github.com/FasterXML/jackson, http://wiki.fasterxml.com/JacksonHome) -- javax.inject (from http://code.google.com/p/atinject/) -- org.apiguardian:apiguardian-api (from https://github.com/apiguardian-team/apiguardian) -- org.opentest4j:opentest4j (from https://github.com/ota4j-team/opentest4j) -- rxjava (from https://github.com/ReactiveX/RxJava) -- tomcat-embed-core (from http://tomcat.apache.org/) - -======================================================================== -BSD-2-Clause -======================================================================== -The following software have components provided under the terms of this license: - -- HdrHistogram (from http://hdrhistogram.github.io/HdrHistogram/) -- Reflections (from http://code.google.com/p/reflections/, http://github.com/ronmamo/reflections) -- Stax2 API (from http://github.com/FasterXML/stax2-api) - -======================================================================== -BSD-3-Clause -======================================================================== -The following software have components provided under the terms of this license: - -- ASM Core (from http://asm.ow2.io/, http://asm.ow2.org/) -- Apache Commons Codec (from https://commons.apache.org/proper/commons-codec/) -- HdrHistogram (from http://hdrhistogram.github.io/HdrHistogram/) -- Jakarta Activation API (from https://github.com/eclipse-ee4j/jaf) -- Jakarta XML Binding API (from https://repo1.maven.org/maven2/jakarta/xml/bind/jakarta.xml.bind-api, https://repo1.maven.org/maven2/org/jboss/spec/javax/xml/bind/jboss-jaxb-api_2.3_spec) -- Reflections (from http://code.google.com/p/reflections/, http://github.com/ronmamo/reflections) -- SnakeYAML (from http://code.google.com/p/snakeyaml/, http://www.snakeyaml.org) - -======================================================================== -CC-BY-2.5 -======================================================================== -The following software have components provided under the terms of this license: - -- FindBugs-jsr305 (from http://findbugs.sourceforge.net/) - -======================================================================== -CC0-1.0 -======================================================================== -The following software have components provided under the terms of this license: - -- reactive-streams (from http://www.reactive-streams.org/) - -======================================================================== -CDDL-1.1 -======================================================================== -The following software have components provided under the terms of this license: - -- JavaBeans Activation Framework -- javax.annotation-api (from http://jcp.org/en/jsr/detail?id=250) -- tomcat-embed-core (from http://tomcat.apache.org/) - -======================================================================== -EPL-1.0 -======================================================================== -The following software have components provided under the terms of this license: - -- JUnit Jupiter (Aggregator) (from https://junit.org/junit5/) -- JUnit Jupiter API (from http://junit.org/junit5/, https://junit.org/junit5/) -- JUnit Jupiter Engine (from http://junit.org/junit5/, https://junit.org/junit5/) -- JUnit Jupiter Params (from http://junit.org/junit5/, https://junit.org/junit5/) -- JUnit Platform Commons (from http://junit.org/junit5/, https://junit.org/junit5/) -- JUnit Platform Engine API (from http://junit.org/junit5/, https://junit.org/junit5/) -- Jakarta Annotations API (from https://projects.eclipse.org/projects/ee4j.ca) -- SnakeYAML (from http://code.google.com/p/snakeyaml/, http://www.snakeyaml.org) - -======================================================================== -EPL-2.0 -======================================================================== -The following software have components provided under the terms of this license: - -- JUnit Jupiter (Aggregator) (from https://junit.org/junit5/) -- JUnit Jupiter API (from http://junit.org/junit5/, https://junit.org/junit5/) -- JUnit Jupiter Engine (from http://junit.org/junit5/, https://junit.org/junit5/) -- JUnit Jupiter Params (from http://junit.org/junit5/, https://junit.org/junit5/) -- JUnit Platform Commons (from http://junit.org/junit5/, https://junit.org/junit5/) -- JUnit Platform Engine API (from http://junit.org/junit5/, https://junit.org/junit5/) -- Jakarta Annotations API (from https://projects.eclipse.org/projects/ee4j.ca) - -======================================================================== -GPL-2.0-only -======================================================================== -The following software have components provided under the terms of this license: - -- JavaBeans Activation Framework -- javax.annotation-api (from http://jcp.org/en/jsr/detail?id=250) -- tomcat-embed-core (from http://tomcat.apache.org/) - -======================================================================== -GPL-2.0-or-later -======================================================================== -The following software have components provided under the terms of this license: - -- SnakeYAML (from http://code.google.com/p/snakeyaml/, http://www.snakeyaml.org) - -======================================================================== -GPL-2.0-with-classpath-exception -======================================================================== -The following software have components provided under the terms of this license: - -- Jakarta Annotations API (from https://projects.eclipse.org/projects/ee4j.ca) -- JavaBeans Activation Framework -- javax.annotation-api (from http://jcp.org/en/jsr/detail?id=250) -- tomcat-embed-core (from http://tomcat.apache.org/) - -======================================================================== -GPL-3.0-only -======================================================================== -The following software have components provided under the terms of this license: - -- Jakarta Annotations API (from https://projects.eclipse.org/projects/ee4j.ca) -- Project Lombok (from http://projectlombok.org, https://projectlombok.org) - -======================================================================== -JSON -======================================================================== -The following software have components provided under the terms of this license: - -- JSON in Java (from https://github.com/douglascrockford/JSON-java) - -======================================================================== -LGPL-2.1-only -======================================================================== -The following software have components provided under the terms of this license: - -- Java Native Access (from https://github.com/java-native-access/jna, https://github.com/twall/jna) -- Javassist (from http://www.javassist.org/) - -======================================================================== -LGPL-2.1-or-later -======================================================================== -The following software have components provided under the terms of this license: - -- Javassist (from http://www.javassist.org/) -- SnakeYAML (from http://code.google.com/p/snakeyaml/, http://www.snakeyaml.org) - -======================================================================== -MIT -======================================================================== -The following software have components provided under the terms of this license: - -- Checker Qual (from https://checkerframework.org) -- Microsoft Azure SDK for SQL API of Azure Cosmos DB Service (from https://github.com/Azure/azure-sdk-for-java) -- Mockito (from http://mockito.org, https://github.com/mockito/mockito) -- Project Lombok (from http://projectlombok.org, https://projectlombok.org) -- mockito-junit-jupiter (from https://github.com/mockito/mockito) - -======================================================================== -MPL-1.1 -======================================================================== -The following software have components provided under the terms of this license: - -- Javassist (from http://www.javassist.org/) - -======================================================================== -MPL-2.0 -======================================================================== -The following software have components provided under the terms of this license: - -- Javassist (from http://www.javassist.org/) -- OkHttp (from https://repo1.maven.org/maven2/com/squareup/okhttp3/okhttp, https://square.github.io/okhttp/) - -======================================================================== -PHP-3.01 -======================================================================== -The following software have components provided under the terms of this license: - -- Jakarta Activation API (from https://github.com/eclipse-ee4j/jaf) -- Jakarta XML Binding API (from https://repo1.maven.org/maven2/jakarta/xml/bind/jakarta.xml.bind-api, https://repo1.maven.org/maven2/org/jboss/spec/javax/xml/bind/jboss-jaxb-api_2.3_spec) - -======================================================================== -WTFPL -======================================================================== -The following software have components provided under the terms of this license: - -- Reflections (from http://code.google.com/p/reflections/, http://github.com/ronmamo/reflections) - -======================================================================== -public-domain -======================================================================== -The following software have components provided under the terms of this license: - -- Guava: Google Core Libraries for Java (from http://code.google.com/p/guava-libraries, https://github.com/google/guava, https://repo1.maven.org/maven2/com/google/guava/guava) -- HdrHistogram (from http://hdrhistogram.github.io/HdrHistogram/) -- LatencyUtils (from http://latencyutils.github.io/LatencyUtils/) -- Project Lombok (from http://projectlombok.org, https://projectlombok.org) -- reactive-streams (from http://www.reactive-streams.org/) - -======================================================================== -unknown -======================================================================== -The following software have components provided under the terms of this license: - -- Byte Buddy (without dependencies) (from https://repo1.maven.org/maven2/net/bytebuddy/byte-buddy) -- Checker Qual (from https://checkerframework.org) -- JSON in Java (from https://github.com/douglascrockford/JSON-java) -- JUnit Jupiter (Aggregator) (from https://junit.org/junit5/) -- JUnit Jupiter API (from http://junit.org/junit5/, https://junit.org/junit5/) -- JUnit Jupiter Engine (from http://junit.org/junit5/, https://junit.org/junit5/) -- JUnit Jupiter Params (from http://junit.org/junit5/, https://junit.org/junit5/) -- JUnit Platform Commons (from http://junit.org/junit5/, https://junit.org/junit5/) -- JUnit Platform Engine API (from http://junit.org/junit5/, https://junit.org/junit5/) -- Jakarta Activation API (from https://github.com/eclipse-ee4j/jaf) -- Jakarta XML Binding API (from https://repo1.maven.org/maven2/jakarta/xml/bind/jakarta.xml.bind-api, https://repo1.maven.org/maven2/org/jboss/spec/javax/xml/bind/jboss-jaxb-api_2.3_spec) +# 3rd-Party Software License Notice +Generated by fossa-cli (https://github.com/fossas/fossa-cli). +Formatted by fossa-with-cache (https://community.opengroup.org/divido/fossa-with-cache). +This software includes the following software and licenses: + +======================================================================== +Apache-2.0 +======================================================================== +The following software have components provided under the terms of this license: + +- ASM based accessors helper used by json-smart (from https://urielch.github.io/) +- Apache Commons Codec (from http://commons.apache.org/proper/commons-codec/, https://commons.apache.org/proper/commons-codec/) +- Apache Commons Collections (from http://commons.apache.org/proper/commons-collections/) +- Apache Commons Lang (from http://commons.apache.org/proper/commons-lang/) +- Apache Commons Logging (from http://commons.apache.org/logging/, http://commons.apache.org/proper/commons-logging/) +- Apache HttpClient (from http://hc.apache.org/httpcomponents-client) +- Apache HttpCore (from http://hc.apache.org/httpcomponents-core-ga, http://hc.apache.org/httpcomponents-core-ga/) +- Bean Validation API (from http://beanvalidation.org) +- Brave (from https://repo1.maven.org/maven2/io/zipkin/brave/brave) +- Brave Instrumentation: Http Adapters (from https://repo1.maven.org/maven2/io/zipkin/brave/brave-instrumentation-http) +- Byte Buddy (without dependencies) (from https://repo1.maven.org/maven2/net/bytebuddy/byte-buddy) +- Byte Buddy Java agent (from https://repo1.maven.org/maven2/net/bytebuddy/byte-buddy-agent) +- ClassMate (from http://github.com/cowtowncoder/java-classmate) +- FindBugs-jsr305 (from http://findbugs.sourceforge.net/) +- Guava InternalFutureFailureAccess and InternalFutures (from https://repo1.maven.org/maven2/com/google/guava/failureaccess) +- Guava: Google Core Libraries for Java (from http://code.google.com/p/guava-libraries, https://github.com/google/guava, https://repo1.maven.org/maven2/com/google/guava/guava) +- J2ObjC Annotations (from https://github.com/google/j2objc/) +- JCIP Annotations under Apache License (from http://stephenc.github.com/jcip-annotations) +- JSON Small and Fast Parser (from https://repo1.maven.org/maven2/net/minidev/json-smart, https://urielch.github.io/) +- JSR107 API and SPI (from https://github.com/jsr107/jsr107spec) +- Jackson datatype: JSR310 (from http://wiki.fasterxml.com/JacksonModuleJSR310, https://repo1.maven.org/maven2/com/fasterxml/jackson/datatype/jackson-datatype-jsr310) +- Jackson datatype: jdk8 (from https://repo1.maven.org/maven2/com/fasterxml/jackson/datatype/jackson-datatype-jdk8) +- Jackson-annotations (from http://github.com/FasterXML/jackson, http://wiki.fasterxml.com/JacksonHome) +- Jackson-core (from http://wiki.fasterxml.com/JacksonHome, https://github.com/FasterXML/jackson-core) +- Jackson-module-parameter-names (from https://repo1.maven.org/maven2/com/fasterxml/jackson/module/jackson-module-parameter-names) +- Jakarta Bean Validation API (from https://beanvalidation.org) +- Java Native Access (from https://github.com/java-native-access/jna, https://github.com/twall/jna, https://repo1.maven.org/maven2/net/java/dev/jna/jna) +- Java UUID Generator (from http://wiki.fasterxml.com/JugHome) +- Javassist (from http://www.javassist.org/) +- Joda-Time (from http://joda-time.sourceforge.net, http://www.joda.org/joda-time/, https://www.joda.org/joda-time/) +- Metrics Core (from https://repo1.maven.org/maven2/io/dropwizard/metrics/metrics-core) +- Microsoft Azure SDK for SQL API of Azure Cosmos DB Service (from https://github.com/Azure/azure-sdk-for-java) +- Mockito (from http://mockito.org, https://github.com/mockito/mockito) +- Netty Reactive Streams Implementation (from https://repo1.maven.org/maven2/com/typesafe/netty/netty-reactive-streams) +- Nimbus Content Type (from https://bitbucket.org/connect2id/nimbus-content-type) +- Nimbus LangTag (from https://bitbucket.org/connect2id/nimbus-language-tags) +- OAuth 2.0 SDK with OpenID Connect extensions (from https://bitbucket.org/connect2id/oauth-2.0-sdk-with-openid-connect-extensions) +- Objenesis (from http://objenesis.org) +- OkHttp (from https://repo1.maven.org/maven2/com/squareup/okhttp3/okhttp, https://square.github.io/okhttp/) +- Okio (from https://github.com/square/okio/, https://repo1.maven.org/maven2/com/squareup/okio/okio) +- RxJava (from https://github.com/ReactiveX/RxJava) +- SnakeYAML (from http://code.google.com/p/snakeyaml/, http://www.snakeyaml.org) +- Spring Boot AutoConfigure (from https://projects.spring.io/spring-boot/#/spring-boot-parent/spring-boot-autoconfigure, https://spring.io/projects/spring-boot) +- Woodstox (from https://github.com/FasterXML/woodstox) +- Zipkin Reporter Brave (from https://repo1.maven.org/maven2/io/zipkin/reporter2/zipkin-reporter-brave) +- Zipkin Reporter: Core (from https://repo1.maven.org/maven2/io/zipkin/reporter2/zipkin-reporter) +- Zipkin v2 (from https://repo1.maven.org/maven2/io/zipkin/zipkin2/zipkin) +- aalto-xml (from https://github.com/FasterXML/aalto-xml, https://repo1.maven.org/maven2/com/fasterxml/aalto-xml) +- error-prone annotations (from https://repo1.maven.org/maven2/com/google/errorprone/error_prone_annotations) +- jackson-databind (from http://github.com/FasterXML/jackson, http://wiki.fasterxml.com/JacksonHome) +- javax.inject (from http://code.google.com/p/atinject/, https://repo1.maven.org/maven2/org/glassfish/hk2/external/javax.inject) +- org.apiguardian:apiguardian-api (from https://github.com/apiguardian-team/apiguardian) +- org.opentest4j:opentest4j (from https://github.com/ota4j-team/opentest4j) +- tomcat-embed-core (from http://tomcat.apache.org/) + +======================================================================== +BSD-2-Clause +======================================================================== +The following software have components provided under the terms of this license: + +- HdrHistogram (from http://hdrhistogram.github.io/HdrHistogram/) +- Reflections (from http://code.google.com/p/reflections/, http://github.com/ronmamo/reflections) +- Stax2 API (from http://github.com/FasterXML/stax2-api) + +======================================================================== +BSD-3-Clause +======================================================================== +The following software have components provided under the terms of this license: + +- ASM Core (from http://asm.ow2.io/, http://asm.ow2.org/) +- Apache Commons Codec (from http://commons.apache.org/proper/commons-codec/, https://commons.apache.org/proper/commons-codec/) +- HdrHistogram (from http://hdrhistogram.github.io/HdrHistogram/) +- Jakarta Activation API (from https://github.com/eclipse-ee4j/jaf, https://repo1.maven.org/maven2/jakarta/activation/jakarta.activation-api) +- Jakarta XML Binding API (from https://repo1.maven.org/maven2/jakarta/xml/bind/jakarta.xml.bind-api, https://repo1.maven.org/maven2/org/jboss/spec/javax/xml/bind/jboss-jaxb-api_2.3_spec) +- Reflections (from http://code.google.com/p/reflections/, http://github.com/ronmamo/reflections) +- SnakeYAML (from http://code.google.com/p/snakeyaml/, http://www.snakeyaml.org) + +======================================================================== +CC-BY-2.5 +======================================================================== +The following software have components provided under the terms of this license: + +- FindBugs-jsr305 (from http://findbugs.sourceforge.net/) + +======================================================================== +CC0-1.0 +======================================================================== +The following software have components provided under the terms of this license: + +- reactive-streams (from http://www.reactive-streams.org/) + +======================================================================== +CDDL-1.1 +======================================================================== +The following software have components provided under the terms of this license: + +- JavaBeans Activation Framework +- javax.annotation-api (from http://jcp.org/en/jsr/detail?id=250) +- tomcat-embed-core (from http://tomcat.apache.org/) + +======================================================================== +EPL-1.0 +======================================================================== +The following software have components provided under the terms of this license: + +- JUnit Jupiter (Aggregator) (from https://junit.org/junit5/) +- JUnit Jupiter API (from http://junit.org/junit5/, https://junit.org/junit5/) +- JUnit Jupiter Engine (from http://junit.org/junit5/, https://junit.org/junit5/) +- JUnit Jupiter Params (from http://junit.org/junit5/, https://junit.org/junit5/) +- JUnit Platform Commons (from http://junit.org/junit5/, https://junit.org/junit5/) +- JUnit Platform Engine API (from http://junit.org/junit5/, https://junit.org/junit5/) +- Jakarta Annotations API (from https://projects.eclipse.org/projects/ee4j.ca) +- SnakeYAML (from http://code.google.com/p/snakeyaml/, http://www.snakeyaml.org) + +======================================================================== +EPL-2.0 +======================================================================== +The following software have components provided under the terms of this license: + +- JUnit Jupiter (Aggregator) (from https://junit.org/junit5/) +- JUnit Jupiter API (from http://junit.org/junit5/, https://junit.org/junit5/) +- JUnit Jupiter Engine (from http://junit.org/junit5/, https://junit.org/junit5/) +- JUnit Jupiter Params (from http://junit.org/junit5/, https://junit.org/junit5/) +- JUnit Platform Commons (from http://junit.org/junit5/, https://junit.org/junit5/) +- JUnit Platform Engine API (from http://junit.org/junit5/, https://junit.org/junit5/) +- Jakarta Annotations API (from https://projects.eclipse.org/projects/ee4j.ca) + +======================================================================== +GPL-2.0-only +======================================================================== +The following software have components provided under the terms of this license: + +- JavaBeans Activation Framework +- javax.annotation-api (from http://jcp.org/en/jsr/detail?id=250) +- tomcat-embed-core (from http://tomcat.apache.org/) + +======================================================================== +GPL-2.0-or-later +======================================================================== +The following software have components provided under the terms of this license: + +- SnakeYAML (from http://code.google.com/p/snakeyaml/, http://www.snakeyaml.org) + +======================================================================== +GPL-2.0-with-classpath-exception +======================================================================== +The following software have components provided under the terms of this license: + +- Jakarta Annotations API (from https://projects.eclipse.org/projects/ee4j.ca) +- JavaBeans Activation Framework +- javax.annotation-api (from http://jcp.org/en/jsr/detail?id=250) +- tomcat-embed-core (from http://tomcat.apache.org/) + +======================================================================== +GPL-3.0-only +======================================================================== +The following software have components provided under the terms of this license: + +- Jakarta Annotations API (from https://projects.eclipse.org/projects/ee4j.ca) +- Project Lombok (from http://projectlombok.org, https://projectlombok.org) + +======================================================================== +JSON +======================================================================== +The following software have components provided under the terms of this license: + +- JSON in Java (from https://github.com/douglascrockford/JSON-java) + +======================================================================== +LGPL-2.1-only +======================================================================== +The following software have components provided under the terms of this license: + +- Java Native Access (from https://github.com/java-native-access/jna, https://github.com/twall/jna, https://repo1.maven.org/maven2/net/java/dev/jna/jna) +- Javassist (from http://www.javassist.org/) + +======================================================================== +LGPL-2.1-or-later +======================================================================== +The following software have components provided under the terms of this license: + +- Javassist (from http://www.javassist.org/) +- SnakeYAML (from http://code.google.com/p/snakeyaml/, http://www.snakeyaml.org) + +======================================================================== +MIT +======================================================================== +The following software have components provided under the terms of this license: + +- Checker Qual (from https://checkerframework.org) +- Microsoft Azure SDK for SQL API of Azure Cosmos DB Service (from https://github.com/Azure/azure-sdk-for-java) +- Mockito (from http://mockito.org, https://github.com/mockito/mockito) +- Project Lombok (from http://projectlombok.org, https://projectlombok.org) +- mockito-junit-jupiter (from https://github.com/mockito/mockito) + +======================================================================== +MPL-1.1 +======================================================================== +The following software have components provided under the terms of this license: + +- Javassist (from http://www.javassist.org/) + +======================================================================== +MPL-2.0 +======================================================================== +The following software have components provided under the terms of this license: + +- Javassist (from http://www.javassist.org/) +- OkHttp (from https://repo1.maven.org/maven2/com/squareup/okhttp3/okhttp, https://square.github.io/okhttp/) + +======================================================================== +PHP-3.01 +======================================================================== +The following software have components provided under the terms of this license: + +- Jakarta Activation API (from https://github.com/eclipse-ee4j/jaf, https://repo1.maven.org/maven2/jakarta/activation/jakarta.activation-api) +- Jakarta XML Binding API (from https://repo1.maven.org/maven2/jakarta/xml/bind/jakarta.xml.bind-api, https://repo1.maven.org/maven2/org/jboss/spec/javax/xml/bind/jboss-jaxb-api_2.3_spec) + +======================================================================== +WTFPL +======================================================================== +The following software have components provided under the terms of this license: + +- Reflections (from http://code.google.com/p/reflections/, http://github.com/ronmamo/reflections) + +======================================================================== +public-domain +======================================================================== +The following software have components provided under the terms of this license: + +- Guava: Google Core Libraries for Java (from http://code.google.com/p/guava-libraries, https://github.com/google/guava, https://repo1.maven.org/maven2/com/google/guava/guava) +- HdrHistogram (from http://hdrhistogram.github.io/HdrHistogram/) +- LatencyUtils (from http://latencyutils.github.io/LatencyUtils/) +- Project Lombok (from http://projectlombok.org, https://projectlombok.org) +- reactive-streams (from http://www.reactive-streams.org/) + +======================================================================== +unknown +======================================================================== +The following software have components provided under the terms of this license: + +- Byte Buddy (without dependencies) (from https://repo1.maven.org/maven2/net/bytebuddy/byte-buddy) +- Checker Qual (from https://checkerframework.org) +- JSON in Java (from https://github.com/douglascrockford/JSON-java) +- JUnit Jupiter (Aggregator) (from https://junit.org/junit5/) +- JUnit Jupiter API (from http://junit.org/junit5/, https://junit.org/junit5/) +- JUnit Jupiter Engine (from http://junit.org/junit5/, https://junit.org/junit5/) +- JUnit Jupiter Params (from http://junit.org/junit5/, https://junit.org/junit5/) +- JUnit Platform Commons (from http://junit.org/junit5/, https://junit.org/junit5/) +- JUnit Platform Engine API (from http://junit.org/junit5/, https://junit.org/junit5/) +- Jakarta Activation API (from https://github.com/eclipse-ee4j/jaf, https://repo1.maven.org/maven2/jakarta/activation/jakarta.activation-api) +- Jakarta XML Binding API (from https://repo1.maven.org/maven2/jakarta/xml/bind/jakarta.xml.bind-api, https://repo1.maven.org/maven2/org/jboss/spec/javax/xml/bind/jboss-jaxb-api_2.3_spec) -- GitLab