Code refactoring of hawkbit-core and hawkbit-autoconfigure (#2051)

Signed-off-by: Avgustin Marinov <Avgustin.Marinov@bosch.com>
This commit is contained in:
Avgustin Marinov
2024-11-16 17:56:23 +02:00
committed by GitHub
parent 1c40584733
commit 9b7606f68e
20 changed files with 174 additions and 184 deletions

View File

@@ -17,6 +17,7 @@
<artifactId>hawkbit-parent</artifactId> <artifactId>hawkbit-parent</artifactId>
<version>${revision}</version> <version>${revision}</version>
</parent> </parent>
<artifactId>hawkbit-autoconfigure</artifactId> <artifactId>hawkbit-autoconfigure</artifactId>
<name>hawkBit :: Core :: Spring Boot Auto-configurations</name> <name>hawkBit :: Core :: Spring Boot Auto-configurations</name>

View File

@@ -11,6 +11,7 @@ package org.eclipse.hawkbit.autoconfigure.cache;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.boot.context.properties.ConfigurationProperties;
/** /**
@@ -18,6 +19,7 @@ import org.springframework.boot.context.properties.ConfigurationProperties;
* is used for the lifetime limit of data in caches. After lifetime the data * is used for the lifetime limit of data in caches. After lifetime the data
* gets reloaded out of the database. * gets reloaded out of the database.
*/ */
@Data
@ConfigurationProperties("hawkbit.cache.global") @ConfigurationProperties("hawkbit.cache.global")
public class CacheProperties { public class CacheProperties {
@@ -31,23 +33,7 @@ public class CacheProperties {
*/ */
private int initialDelay; private int initialDelay;
public long getInitialDelay() {
return initialDelay;
}
public void setInitialDelay(final int initialDelay) {
this.initialDelay = initialDelay;
}
public int getTtl() {
return ttl;
}
public void setTtl(final int ttl) {
this.ttl = ttl;
}
public final TimeUnit getTtlUnit() { public final TimeUnit getTtlUnit() {
return TimeUnit.MILLISECONDS; return TimeUnit.MILLISECONDS;
} }
} }

View File

@@ -42,4 +42,4 @@ public class JpaRepositoryAutoConfiguration {
public LockRegistry lockRegistry() { public LockRegistry lockRegistry() {
return new DefaultLockRegistry(); return new DefaultLockRegistry();
} }
} }

View File

@@ -38,7 +38,7 @@ import org.springframework.core.ResolvableType;
import org.springframework.messaging.converter.MessageConverter; import org.springframework.messaging.converter.MessageConverter;
/** /**
* Auto configuration for the event bus. * Autoconfiguration for the event bus.
*/ */
@Configuration @Configuration
@RemoteApplicationEventScan(basePackages = "org.eclipse.hawkbit.repository.event.remote") @RemoteApplicationEventScan(basePackages = "org.eclipse.hawkbit.repository.event.remote")
@@ -47,14 +47,12 @@ import org.springframework.messaging.converter.MessageConverter;
public class EventPublisherAutoConfiguration { public class EventPublisherAutoConfiguration {
/** /**
* Server internal event publisher that allows parallel event processing if * Server internal event publisher that allows parallel event processing if the event listener is marked as so.
* the event listener is marked as so.
* *
* @return publisher bean * @return publisher bean
*/ */
@Bean(name = AbstractApplicationContext.APPLICATION_EVENT_MULTICASTER_BEAN_NAME) @Bean(name = AbstractApplicationContext.APPLICATION_EVENT_MULTICASTER_BEAN_NAME)
ApplicationEventMulticaster applicationEventMulticaster(@Qualifier("asyncExecutor") final Executor executor, ApplicationEventMulticaster applicationEventMulticaster(@Qualifier("asyncExecutor") final Executor executor, final TenantAware tenantAware) {
final TenantAware tenantAware) {
final SimpleApplicationEventMulticaster simpleApplicationEventMulticaster = new TenantAwareApplicationEventPublisher( final SimpleApplicationEventMulticaster simpleApplicationEventMulticaster = new TenantAwareApplicationEventPublisher(
tenantAware, applicationEventFilter()); tenantAware, applicationEventFilter());
simpleApplicationEventMulticaster.setTaskExecutor(executor); simpleApplicationEventMulticaster.setTaskExecutor(executor);
@@ -85,26 +83,18 @@ public class EventPublisherAutoConfiguration {
private static class TenantAwareApplicationEventPublisher extends SimpleApplicationEventMulticaster { private static class TenantAwareApplicationEventPublisher extends SimpleApplicationEventMulticaster {
private final TenantAware tenantAware; private final TenantAware tenantAware;
private final ApplicationEventFilter applicationEventFilter; private final ApplicationEventFilter applicationEventFilter;
@Autowired(required = false) @Autowired(required = false)
private ServiceMatcher serviceMatcher; private ServiceMatcher serviceMatcher;
/** protected TenantAwareApplicationEventPublisher(final TenantAware tenantAware, final ApplicationEventFilter applicationEventFilter) {
* Constructor.
*
* @param tenantAware the tenant ware
*/
protected TenantAwareApplicationEventPublisher(final TenantAware tenantAware,
final ApplicationEventFilter applicationEventFilter) {
this.tenantAware = tenantAware; this.tenantAware = tenantAware;
this.applicationEventFilter = applicationEventFilter; this.applicationEventFilter = applicationEventFilter;
} }
/** /**
* Was overridden that not every event has to run within a own * Was overridden that not every event has to run within an own tenantAware.
* tenantAware.
*/ */
@Override @Override
public void multicastEvent(final ApplicationEvent event, final ResolvableType eventType) { public void multicastEvent(final ApplicationEvent event, final ResolvableType eventType) {
@@ -112,11 +102,10 @@ public class EventPublisherAutoConfiguration {
return; return;
} }
if (serviceMatcher == null || !(event instanceof RemoteTenantAwareEvent)) { if (serviceMatcher == null || !(event instanceof final RemoteTenantAwareEvent remoteEvent)) {
super.multicastEvent(event, eventType); super.multicastEvent(event, eventType);
return; return;
} }
final RemoteTenantAwareEvent remoteEvent = (RemoteTenantAwareEvent) event;
if (serviceMatcher.isFromSelf(remoteEvent)) { if (serviceMatcher.isFromSelf(remoteEvent)) {
super.multicastEvent(event, eventType); super.multicastEvent(event, eventType);
@@ -128,7 +117,6 @@ public class EventPublisherAutoConfiguration {
return null; return null;
}); });
} }
} }
@ConditionalOnBusEnabled @ConditionalOnBusEnabled
@@ -142,7 +130,5 @@ public class EventPublisherAutoConfiguration {
public MessageConverter busProtoBufConverter() { public MessageConverter busProtoBufConverter() {
return new BusProtoStuffMessageConverter(); return new BusProtoStuffMessageConverter();
} }
} }
}
}

View File

@@ -44,4 +44,4 @@ public class AsyncConfigurerThreadPoolProperties {
* time that excess idle threads will wait for new tasks before terminating. * time that excess idle threads will wait for new tasks before terminating.
*/ */
private Long idleTimeout = 10000L; private Long idleTimeout = 10000L;
} }

View File

@@ -57,8 +57,8 @@ import org.springframework.util.CollectionUtils;
public class SecurityAutoConfiguration { public class SecurityAutoConfiguration {
/** /**
* Creates a {@link ContextAware} (hence {@link TenantAware}) bean based on the given * Creates a {@link ContextAware} (hence {@link TenantAware}) bean based on the given {@link UserAuthoritiesResolver} and
* {@link UserAuthoritiesResolver} and {@link SecurityContextSerializer}. * {@link SecurityContextSerializer}.
* *
* @param authoritiesResolver The user authorities/roles resolver * @param authoritiesResolver The user authorities/roles resolver
* @param securityContextSerializer The security context serializer. * @param securityContextSerializer The security context serializer.
@@ -73,8 +73,7 @@ public class SecurityAutoConfiguration {
} }
/** /**
* Creates a {@link UserAuthoritiesResolver} bean that is responsible for * Creates a {@link UserAuthoritiesResolver} bean that is responsible for resolving user authorities/roles.
* resolving user authorities/roles.
* *
* @param securityProperties The Spring {@link SecurityProperties} for the security user * @param securityProperties The Spring {@link SecurityProperties} for the security user
* @param tenantAwareUserProperties The {@link TenantAwareUserProperties} for the managed users * @param tenantAwareUserProperties The {@link TenantAwareUserProperties} for the managed users
@@ -82,7 +81,8 @@ public class SecurityAutoConfiguration {
*/ */
@Bean @Bean
@ConditionalOnMissingBean @ConditionalOnMissingBean
public UserAuthoritiesResolver inMemoryAuthoritiesResolver(final SecurityProperties securityProperties, public UserAuthoritiesResolver inMemoryAuthoritiesResolver(
final SecurityProperties securityProperties,
final TenantAwareUserProperties tenantAwareUserProperties) { final TenantAwareUserProperties tenantAwareUserProperties) {
final Map<String, User> tenantAwareUsers = tenantAwareUserProperties.getUser(); final Map<String, User> tenantAwareUsers = tenantAwareUserProperties.getUser();
final Map<String, List<String>> usersToPermissions; final Map<String, List<String>> usersToPermissions;
@@ -113,8 +113,7 @@ public class SecurityAutoConfiguration {
*/ */
@Bean @Bean
@ConditionalOnMissingBean @ConditionalOnMissingBean
public SystemSecurityContext systemSecurityContext( public SystemSecurityContext systemSecurityContext(final TenantAware tenantAware, final RoleHierarchy roleHierarchy) {
final TenantAware tenantAware, final RoleHierarchy roleHierarchy) {
return new SystemSecurityContext(tenantAware, roleHierarchy); return new SystemSecurityContext(tenantAware, roleHierarchy);
} }

View File

@@ -18,9 +18,8 @@ import org.springframework.cache.CacheManager;
public interface TenancyCacheManager extends CacheManager { public interface TenancyCacheManager extends CacheManager {
/** /**
* A direct-access for retrieving the cache without including the current * A direct-access for retrieving the cache without including the current tenant key. This is necessary e.g. for retrieving caches not for
* tenant key. This is necessary e.g. for retrieving caches not for the * the current tenant.
* current tenant.
* *
* @param name the name of the cache to retrieve directly * @param name the name of the cache to retrieve directly
* @return the cache associated with the name without tenancy separation * @return the cache associated with the name without tenancy separation
@@ -28,8 +27,7 @@ public interface TenancyCacheManager extends CacheManager {
Cache getDirectCache(String name); Cache getDirectCache(String name);
/** /**
* Evicts all caches for a given tenant. All caches under a certain tenant * Evicts all caches for a given tenant. All caches under a certain tenant gets evicted.
* gets evicted.
* *
* @param tenant the tenant to evict caches * @param tenant the tenant to evict caches
*/ */

View File

@@ -24,8 +24,7 @@ import org.springframework.cache.CacheManager;
* {@link TenantAware#getCurrentTenant()} when accessing a cache, so caches are * {@link TenantAware#getCurrentTenant()} when accessing a cache, so caches are
* seperated. * seperated.
* *
* Additionally it also provide functionality to retrieve all caches overall * Additionally, it also provides functionality to retrieve all caches overall tenants at once, for monitoring and system access.
* tenants at once, for monitoring and system access.
*/ */
public class TenantAwareCacheManager implements TenancyCacheManager { public class TenantAwareCacheManager implements TenancyCacheManager {
@@ -41,41 +40,28 @@ public class TenantAwareCacheManager implements TenancyCacheManager {
* @param tenantAware the tenant aware to retrieve the current tenant * @param tenantAware the tenant aware to retrieve the current tenant
*/ */
public TenantAwareCacheManager(final CacheManager delegate, final TenantAware tenantAware) { public TenantAwareCacheManager(final CacheManager delegate, final TenantAware tenantAware) {
this.tenantAware = tenantAware;
this.delegate = delegate; this.delegate = delegate;
this.tenantAware = tenantAware;
} }
@Override @Override
public Cache getCache(final String name) { public Cache getCache(final String name) {
String currentTenant = tenantAware.getCurrentTenant(); final String currentTenant = tenantAware.getCurrentTenant();
if (isTenantInvalid(currentTenant)) { if (isTenantInvalid(currentTenant)) {
return null; return null;
} }
currentTenant = currentTenant.toUpperCase(); return delegate.getCache(buildKey(currentTenant.toUpperCase(), name));
return delegate.getCache(buildKey(currentTenant, name));
} }
@Override @Override
public Collection<String> getCacheNames() { public Collection<String> getCacheNames() {
String currentTenant = tenantAware.getCurrentTenant(); final String currentTenant = tenantAware.getCurrentTenant();
if (isTenantInvalid(currentTenant)) { if (isTenantInvalid(currentTenant)) {
return Collections.emptyList(); return Collections.emptyList();
} }
currentTenant = currentTenant.toUpperCase(); return getCacheNames(currentTenant.toUpperCase());
return getCacheNames(currentTenant);
}
/**
* A direct-access for retrieving all cache names overall tenants.
*
* @return all cache names without tenant check
*/
public Collection<String> getDirectCacheNames() {
return delegate.getCacheNames();
} }
@Override @Override
@@ -88,6 +74,15 @@ public class TenantAwareCacheManager implements TenancyCacheManager {
getCacheNames(tenant).forEach(cacheName -> delegate.getCache(buildKey(tenant, cacheName)).clear()); getCacheNames(tenant).forEach(cacheName -> delegate.getCache(buildKey(tenant, cacheName)).clear());
} }
/**
* A direct-access for retrieving all cache names overall tenants.
*
* @return all cache names without tenant check
*/
public Collection<String> getDirectCacheNames() {
return delegate.getCacheNames();
}
private static boolean isTenantInvalid(final String tenant) { private static boolean isTenantInvalid(final String tenant) {
return tenant == null || tenant.contains(TENANT_CACHE_DELIMITER); return tenant == null || tenant.contains(TENANT_CACHE_DELIMITER);
} }

View File

@@ -12,9 +12,8 @@ package org.eclipse.hawkbit.exception;
import java.io.Serial; import java.io.Serial;
/** /**
* {@link GenericSpServerException} is thrown when a given entity in's actual * {@link GenericSpServerException} is thrown when a given entity in's actual and cannot be stored within the current session. Reason could be
* and cannot be stored within the current session. Reason could be that it has * that it has been changed within another session.
* been changed within another session.
*/ */
public class GenericSpServerException extends AbstractServerRtException { public class GenericSpServerException extends AbstractServerRtException {

View File

@@ -17,134 +17,167 @@ import lombok.Getter;
@Getter @Getter
public enum SpServerError { public enum SpServerError {
SP_REPO_GENERIC_ERROR("hawkbit.server.error.repo.genericError", "unknown error occurred"), SP_REPO_GENERIC_ERROR(
SP_REPO_ENTITY_ALREADY_EXISTS("hawkbit.server.error.repo.entitiyAlreayExists", "hawkbit.server.error.repo.genericError",
"unknown error occurred"),
SP_REPO_ENTITY_ALREADY_EXISTS(
"hawkbit.server.error.repo.entitiyAlreayExists",
"The given entity already exists in database"), "The given entity already exists in database"),
SP_REPO_AUTO_CONFIRMATION_ALREADY_ACTIVE("hawkbit.server.error.repo.autoConfAlreadyActive", SP_REPO_AUTO_CONFIRMATION_ALREADY_ACTIVE(
"hawkbit.server.error.repo.autoConfAlreadyActive",
"Auto confirmation is already active"), "Auto confirmation is already active"),
SP_CONFIRMATION_FEEDBACK_INVALID("hawkbit.server.confirmation.feedback.invalid", SP_CONFIRMATION_FEEDBACK_INVALID(
"hawkbit.server.confirmation.feedback.invalid",
"Confirmation feedback is not valid"), "Confirmation feedback is not valid"),
SP_REPO_CONSTRAINT_VIOLATION("hawkbit.server.error.repo.constraintViolation", SP_REPO_CONSTRAINT_VIOLATION(
"hawkbit.server.error.repo.constraintViolation",
"The given entity cannot be saved due to Constraint Violation"), "The given entity cannot be saved due to Constraint Violation"),
SP_REPO_INVALID_TARGET_ADDRESS("hawkbit.server.error.repo.invalidTargetAddress", SP_REPO_INVALID_TARGET_ADDRESS(
"hawkbit.server.error.repo.invalidTargetAddress",
"The target address is not well formed"), "The target address is not well formed"),
SP_REPO_ENTITY_NOT_EXISTS("hawkbit.server.error.repo.entitiyNotFound", SP_REPO_ENTITY_NOT_EXISTS(
"hawkbit.server.error.repo.entitiyNotFound",
"The given entity does not exist in the repository"), "The given entity does not exist in the repository"),
SP_REPO_CONCURRENT_MODIFICATION("hawkbit.server.error.repo.concurrentModification", SP_REPO_CONCURRENT_MODIFICATION(
"hawkbit.server.error.repo.concurrentModification",
"The given entity has been changed by another user/session"), "The given entity has been changed by another user/session"),
SP_TARGET_ATTRIBUTES_INVALID("hawkbit.server.error.repo.invalidTargetAttributes", SP_TARGET_ATTRIBUTES_INVALID(
"hawkbit.server.error.repo.invalidTargetAttributes",
"The given target attributes are invalid"), "The given target attributes are invalid"),
SP_REST_SORT_PARAM_SYNTAX("hawkbit.server.error.rest.param.sortParamSyntax", SP_REST_SORT_PARAM_SYNTAX(
"hawkbit.server.error.rest.param.sortParamSyntax",
"The given sort parameter is not well formed"), "The given sort parameter is not well formed"),
SP_REST_RSQL_SEARCH_PARAM_SYNTAX("hawkbit.server.error.rest.param.rsqlParamSyntax", SP_REST_RSQL_SEARCH_PARAM_SYNTAX(
"hawkbit.server.error.rest.param.rsqlParamSyntax",
"The given search parameter is not well formed"), "The given search parameter is not well formed"),
SP_REST_RSQL_PARAM_INVALID_FIELD("hawkbit.server.error.rest.param.rsqlInvalidField", SP_REST_RSQL_PARAM_INVALID_FIELD(
"hawkbit.server.error.rest.param.rsqlInvalidField",
"The given search parameter field does not exist"), "The given search parameter field does not exist"),
SP_REST_SORT_PARAM_INVALID_FIELD("hawkbit.server.error.rest.param.invalidField", SP_REST_SORT_PARAM_INVALID_FIELD(
"hawkbit.server.error.rest.param.invalidField",
"The given sort parameter field does not exist"), "The given sort parameter field does not exist"),
SP_REST_SORT_PARAM_INVALID_DIRECTION("hawkbit.server.error.rest.param.invalidDirection", SP_REST_SORT_PARAM_INVALID_DIRECTION(
"hawkbit.server.error.rest.param.invalidDirection",
"The given sort parameter direction does not exist"), "The given sort parameter direction does not exist"),
SP_REST_BODY_NOT_READABLE("hawkbit.server.error.rest.body.notReadable", SP_REST_BODY_NOT_READABLE(
"hawkbit.server.error.rest.body.notReadable",
"The given request body is not well formed"), "The given request body is not well formed"),
SP_ARTIFACT_UPLOAD_FAILED("hawkbit.server.error.artifact.uploadFailed", SP_ARTIFACT_UPLOAD_FAILED(
"hawkbit.server.error.artifact.uploadFailed",
"Upload of artifact failed with internal server error."), "Upload of artifact failed with internal server error."),
SP_ARTIFACT_ENCRYPTION_NOT_SUPPORTED("hawkbit.server.error.artifact.encryptionNotSupported", SP_ARTIFACT_ENCRYPTION_NOT_SUPPORTED(
"hawkbit.server.error.artifact.encryptionNotSupported",
"Artifact encryption is not supported."), "Artifact encryption is not supported."),
SP_ARTIFACT_ENCRYPTION_FAILED("hawkbit.server.error.artifact.encryptionFailed", SP_ARTIFACT_ENCRYPTION_FAILED(
"hawkbit.server.error.artifact.encryptionFailed",
"Artifact encryption operation failed."), "Artifact encryption operation failed."),
SP_ARTIFACT_UPLOAD_FAILED_MD5_MATCH("hawkbit.server.error.artifact.uploadFailed.checksum.md5.match", SP_ARTIFACT_UPLOAD_FAILED_MD5_MATCH(
"hawkbit.server.error.artifact.uploadFailed.checksum.md5.match",
"Upload of artifact failed as the provided MD5 checksum did not match with the provided artifact."), "Upload of artifact failed as the provided MD5 checksum did not match with the provided artifact."),
SP_ARTIFACT_UPLOAD_FAILED_SHA1_MATCH("hawkbit.server.error.artifact.uploadFailed.checksum.sha1.match", SP_ARTIFACT_UPLOAD_FAILED_SHA1_MATCH(
"hawkbit.server.error.artifact.uploadFailed.checksum.sha1.match",
"Upload of artifact failed as the provided SHA1 checksum did not match with the provided artifact."), "Upload of artifact failed as the provided SHA1 checksum did not match with the provided artifact."),
SP_ARTIFACT_UPLOAD_FAILED_SHA256_MATCH("hawkbit.server.error.artifact.uploadFailed.checksum.sha256.match", SP_ARTIFACT_UPLOAD_FAILED_SHA256_MATCH(
"hawkbit.server.error.artifact.uploadFailed.checksum.sha256.match",
"Upload of artifact failed as the provided SHA256 checksum did not match with the provided artifact."), "Upload of artifact failed as the provided SHA256 checksum did not match with the provided artifact."),
SP_DS_CREATION_FAILED_MISSING_MODULE("hawkbit.server.error.distributionset.creationFailed.missingModule", SP_DS_CREATION_FAILED_MISSING_MODULE(
"hawkbit.server.error.distributionset.creationFailed.missingModule",
"Creation if Distribution Set failed as module is missing that is configured as mandatory."), "Creation if Distribution Set failed as module is missing that is configured as mandatory."),
SP_INSUFFICIENT_PERMISSION("hawkbit.server.error.insufficientpermission", "Insufficient Permission"), SP_INSUFFICIENT_PERMISSION(
SP_ARTIFACT_DELETE_FAILED("hawkbit.server.error.artifact.deleteFailed", "hawkbit.server.error.insufficientpermission",
"Insufficient Permission"),
SP_ARTIFACT_DELETE_FAILED(
"hawkbit.server.error.artifact.deleteFailed",
"Deletion of artifact failed with internal server error."), "Deletion of artifact failed with internal server error."),
SP_ARTIFACT_LOAD_FAILED("hawkbit.server.error.artifact.loadFailed", SP_ARTIFACT_LOAD_FAILED(
"hawkbit.server.error.artifact.loadFailed",
"Load of artifact failed with internal server error."), "Load of artifact failed with internal server error."),
SP_ARTIFACT_BINARY_DELETED("hawkbit.server.error.artifact.binaryDeleted", SP_ARTIFACT_BINARY_DELETED(
"hawkbit.server.error.artifact.binaryDeleted",
"The artifact binary does not exist anymore."), "The artifact binary does not exist anymore."),
SP_QUOTA_EXCEEDED("hawkbit.server.error.quota.tooManyEntries", "Too many entries have been inserted."), SP_QUOTA_EXCEEDED(
/** "hawkbit.server.error.quota.tooManyEntries",
* error that describes that size of uploaded file exceeds size quota "Too many entries have been inserted."),
*/ SP_FILE_SIZE_QUOTA_EXCEEDED(
SP_FILE_SIZE_QUOTA_EXCEEDED("hawkbit.server.error.quota.fileSizeExceeded", "File exceeds size quota."), "hawkbit.server.error.quota.fileSizeExceeded",
/** "File exceeds size quota."),
* error that describes that size of uploaded file exceeds storage quota SP_STORAGE_QUOTA_EXCEEDED(
*/ "hawkbit.server.error.quota.storageExceeded",
SP_STORAGE_QUOTA_EXCEEDED("hawkbit.server.error.quota.storageExceeded",
"Storage quota will be exceeded if file is uploaded."), "Storage quota will be exceeded if file is uploaded."),
/** SP_ACTION_NOT_CANCELABLE(
* error message, which describes that the action can not be canceled cause "hawkbit.server.error.action.notcancelable",
* the action is inactive.
*/
SP_ACTION_NOT_CANCELABLE("hawkbit.server.error.action.notcancelable",
"Only active actions which are in status pending are cancelable."), "Only active actions which are in status pending are cancelable."),
/** SP_ACTION_NOT_FORCE_QUITABLE(
* error message, which describes that the action can not be force quit "hawkbit.server.error.action.notforcequitable",
* cause the action is inactive.
*/
SP_ACTION_NOT_FORCE_QUITABLE("hawkbit.server.error.action.notforcequitable",
"Only active actions which are in status pending can be force quit."), "Only active actions which are in status pending can be force quit."),
SP_DS_INCOMPLETE("hawkbit.server.error.distributionset.incomplete", SP_DS_INCOMPLETE(
"hawkbit.server.error.distributionset.incomplete",
"Distribution set is assigned/locked to a target that is incomplete (i.e. mandatory modules are missing)"), "Distribution set is assigned/locked to a target that is incomplete (i.e. mandatory modules are missing)"),
/** SP_LOCKED(
* error message, which describes that an entity is locked and can't be functionally modified "hawkbit.server.error.locked",
*/ "Entry is locked. Could not be functionally modified"),
SP_LOCKED("hawkbit.server.error.locked", "Entry is locked. Could not be functionally modified"), SP_DELETED(
/** "hawkbit.server.error.deleted",
* error message, which describes that an entity is locked and can't be functionally modified "Entry is soft deleted"),
*/ SP_DS_INVALID(
SP_DELETED("hawkbit.server.error.deleted", "Entry is soft deleted"), "hawkbit.server.error.distributionset.invalid",
SP_DS_INVALID("hawkbit.server.error.distributionset.invalid", "Invalid distribution set is assigned to a target"), "Invalid distribution set is assigned to a target"),
SP_DS_TYPE_UNDEFINED("hawkbit.server.error.distributionset.type.undefined", SP_DS_TYPE_UNDEFINED(
"hawkbit.server.error.distributionset.type.undefined",
"Distribution set type is not yet defined. Modules cannot be added until definition."), "Distribution set type is not yet defined. Modules cannot be added until definition."),
SP_DS_MODULE_UNSUPPORTED("hawkbit.server.error.distributionset.modules.unsupported", SP_DS_MODULE_UNSUPPORTED(
"hawkbit.server.error.distributionset.modules.unsupported",
"Distribution set type does not contain the given module, i.e. is incompatible."), "Distribution set type does not contain the given module, i.e. is incompatible."),
SP_REPO_TENANT_NOT_EXISTS("hawkbit.server.error.repo.tenantNotExists", SP_REPO_TENANT_NOT_EXISTS(
"hawkbit.server.error.repo.tenantNotExists",
"The entity cannot be inserted due the tenant does not exists"), "The entity cannot be inserted due the tenant does not exists"),
SP_ENTITY_LOCKED("hawkbit.server.error.entitiylocked", "The given entity is locked by the server."), SP_ENTITY_LOCKED(
SP_REPO_ENTITY_READ_ONLY("hawkbit.server.error.entityreadonly", "hawkbit.server.error.entitiylocked",
"The given entity is locked by the server."),
SP_REPO_ENTITY_READ_ONLY(
"hawkbit.server.error.entityreadonly",
"The given entity is read only and the change cannot be completed."), "The given entity is read only and the change cannot be completed."),
SP_CONFIGURATION_VALUE_INVALID("hawkbit.server.error.configValueInvalid", SP_CONFIGURATION_VALUE_INVALID(
"hawkbit.server.error.configValueInvalid",
"The given configuration value is invalid."), "The given configuration value is invalid."),
SP_CONFIGURATION_KEY_INVALID("hawkbit.server.error.configKeyInvalid", "The given configuration key is invalid."), SP_CONFIGURATION_KEY_INVALID(
SP_ROLLOUT_ILLEGAL_STATE("hawkbit.server.error.rollout.illegalstate", "hawkbit.server.error.configKeyInvalid",
"The given configuration key is invalid."),
SP_ROLLOUT_ILLEGAL_STATE(
"hawkbit.server.error.rollout.illegalstate",
"The rollout is in the wrong state for the requested operation"), "The rollout is in the wrong state for the requested operation"),
SP_ROLLOUT_VERIFICATION_FAILED("hawkbit.server.error.rollout.verificationFailed", SP_ROLLOUT_VERIFICATION_FAILED(
"hawkbit.server.error.rollout.verificationFailed",
"The rollout configuration could not be verified successfully"), "The rollout configuration could not be verified successfully"),
SP_REPO_OPERATION_NOT_SUPPORTED("hawkbit.server.error.operation.notSupported", SP_REPO_OPERATION_NOT_SUPPORTED(
"hawkbit.server.error.operation.notSupported",
"Operation or method is (no longer) supported by service."), "Operation or method is (no longer) supported by service."),
/** SP_MAINTENANCE_SCHEDULE_INVALID(
* Error message informing that the maintenance schedule is invalid. "hawkbit.server.error.maintenanceScheduleInvalid",
*/
SP_MAINTENANCE_SCHEDULE_INVALID("hawkbit.server.error.maintenanceScheduleInvalid",
"Information for schedule, duration or timezone is missing; or there is no valid maintenance window available in future."), "Information for schedule, duration or timezone is missing; or there is no valid maintenance window available in future."),
/** SP_AUTO_ASSIGN_ACTION_TYPE_INVALID(
* Error message informing that the action type for auto-assignment is "hawkbit.server.error.repo.invalidAutoAssignActionType",
* invalid.
*/
SP_AUTO_ASSIGN_ACTION_TYPE_INVALID("hawkbit.server.error.repo.invalidAutoAssignActionType",
"The given action type for auto-assignment is invalid: allowed values are ['forced', 'soft', 'downloadonly']"), "The given action type for auto-assignment is invalid: allowed values are ['forced', 'soft', 'downloadonly']"),
/** SP_CONFIGURATION_VALUE_CHANGE_NOT_ALLOWED(
* Error message informing the user that the requested tenant configuration "hawkbit.server.error.repo.tenantConfigurationValueChangeNotAllowed",
* change is not allowed.
*/
SP_CONFIGURATION_VALUE_CHANGE_NOT_ALLOWED("hawkbit.server.error.repo.tenantConfigurationValueChangeNotAllowed",
"The requested tenant configuration value modification is not allowed."), "The requested tenant configuration value modification is not allowed."),
SP_MULTIASSIGNMENT_NOT_ENABLED("hawkbit.server.error.multiassignmentNotEnabled", SP_MULTIASSIGNMENT_NOT_ENABLED(
"hawkbit.server.error.multiassignmentNotEnabled",
"The requested operation requires multi assignments to be enabled."), "The requested operation requires multi assignments to be enabled."),
SP_NO_WEIGHT_PROVIDED_IN_MULTIASSIGNMENT_MODE("hawkbit.server.error.noWeightProvidedInMultiAssignmentMode", SP_NO_WEIGHT_PROVIDED_IN_MULTIASSIGNMENT_MODE(
"hawkbit.server.error.noWeightProvidedInMultiAssignmentMode",
"The requested operation requires a weight to be specified when multi assignments is enabled."), "The requested operation requires a weight to be specified when multi assignments is enabled."),
SP_TARGET_TYPE_IN_USE("hawkbit.server.error.target.type.used", "Target type is still in use by a target."), SP_TARGET_TYPE_IN_USE(
SP_TARGET_TYPE_INCOMPATIBLE("hawkbit.server.error.target.type.incompatible", "hawkbit.server.error.target.type.used", "Target type is still in use by a target."),
SP_TARGET_TYPE_INCOMPATIBLE(
"hawkbit.server.error.target.type.incompatible",
"Target type of target is not compatible with distribution set."), "Target type of target is not compatible with distribution set."),
SP_TARGET_TYPE_KEY_OR_NAME_REQUIRED("hawkbit.server.error.target.type.keyOrNameRequired", SP_TARGET_TYPE_KEY_OR_NAME_REQUIRED(
"hawkbit.server.error.target.type.keyOrNameRequired",
"Target type key or name is required."), "Target type key or name is required."),
SP_STOP_ROLLOUT_FAILED("hawkbit.server.error.stopRolloutFailed", "Stopping the rollout failed."); SP_STOP_ROLLOUT_FAILED(
"hawkbit.server.error.stopRolloutFailed",
"Stopping the rollout failed.");
private final String key; private final String key;
private final String message; private final String message;

View File

@@ -26,9 +26,8 @@ public interface FieldValueConverter<T extends Enum<T>> {
* *
* @param e the enum to build the value for * @param e the enum to build the value for
* @param value the value in string representation * @param value the value in string representation
* @return the converted object or {@code null} if conversation fails, if * @return the converted object or {@code null} if conversation fails, if given enum does not need to be converted the
* given enum does not need to be converted the the unmodified * unmodified {@code value} is returned.
* {@code value} is returned.
*/ */
Object convertValue(final T e, final String value); Object convertValue(final T e, final String value);

View File

@@ -26,4 +26,4 @@ public enum RolloutGroupFields implements RsqlQueryField {
RolloutGroupFields(final String jpaEntityFieldName) { RolloutGroupFields(final String jpaEntityFieldName) {
this.jpaEntityFieldName = jpaEntityFieldName; this.jpaEntityFieldName = jpaEntityFieldName;
} }
} }

View File

@@ -31,4 +31,4 @@ public enum SoftwareModuleMetadataFields implements RsqlQueryField {
public String identifierFieldName() { public String identifierFieldName() {
return KEY.getJpaEntityFieldName(); return KEY.getJpaEntityFieldName();
} }
} }

View File

@@ -27,4 +27,4 @@ public enum TagFields implements RsqlQueryField {
TagFields(final String jpaEntityFieldName) { TagFields(final String jpaEntityFieldName) {
this.jpaEntityFieldName = jpaEntityFieldName; this.jpaEntityFieldName = jpaEntityFieldName;
} }
} }

View File

@@ -39,4 +39,4 @@ public enum TargetFilterQueryFields implements RsqlQueryField {
this.jpaEntityFieldName = jpaEntityFieldName; this.jpaEntityFieldName = jpaEntityFieldName;
this.subEntityAttributes = subEntityAttribues; this.subEntityAttributes = subEntityAttribues;
} }
} }

View File

@@ -30,4 +30,4 @@ public enum TargetMetadataFields implements RsqlQueryField {
public String identifierFieldName() { public String identifierFieldName() {
return KEY.getJpaEntityFieldName(); return KEY.getJpaEntityFieldName();
} }
} }

View File

@@ -27,4 +27,4 @@ public enum TargetTypeFields implements RsqlQueryField {
TargetTypeFields(final String jpaEntityFieldName) { TargetTypeFields(final String jpaEntityFieldName) {
this.jpaEntityFieldName = jpaEntityFieldName; this.jpaEntityFieldName = jpaEntityFieldName;
} }
} }

View File

@@ -15,8 +15,7 @@ package org.eclipse.hawkbit.tenancy;
public interface TenantAware { public interface TenantAware {
/** /**
* Implementation might retrieve the current tenant from a session or * Implementation might retrieve the current tenant from a session or thread-local.
* thread-local.
* *
* @return the current tenant * @return the current tenant
*/ */
@@ -28,11 +27,9 @@ public interface TenantAware {
String getCurrentUsername(); String getCurrentUsername();
/** /**
* Gives the possibility to run a certain code under a specific given * Gives the possibility to run a certain code under a specific given {@code tenant}. Only the given {@link TenantRunner} is executed
* {@code tenant}. Only the given {@link TenantRunner} is executed under the * under the specific tenant e.g. under control of an {@link ThreadLocal}. After the {@link TenantRunner} it must be ensured that the
* specific tenant e.g. under control of an {@link ThreadLocal}. After the * original tenant before this invocation is reset.
* {@link TenantRunner} it must be ensured that the original tenant before
* this invocation is reset.
* *
* @param tenant the tenant which the specific code should run * @param tenant the tenant which the specific code should run
* @param tenantRunner the runner which is implemented to run this specific code * @param tenantRunner the runner which is implemented to run this specific code
@@ -69,4 +66,4 @@ public interface TenantAware {
*/ */
T run(); T run();
} }
} }

View File

@@ -17,10 +17,8 @@ import lombok.ToString;
import org.springframework.security.authentication.AbstractAuthenticationToken; import org.springframework.security.authentication.AbstractAuthenticationToken;
/** /**
* An authentication details object * An authentication details object {@link AbstractAuthenticationToken#getDetails()} which is stored in the
* {@link AbstractAuthenticationToken#getDetails()} which is stored in the * spring security authentication token details to transport the principal and tenant in the security context session.
* spring security authentication token details to transport the principal and
* tenant in the security context session.
*/ */
@Getter @Getter
@ToString @ToString

View File

@@ -12,8 +12,7 @@ package org.eclipse.hawkbit.tenancy;
import java.util.Collection; import java.util.Collection;
/** /**
* The service responsible for making the lookup for user authorities/roles * The service responsible for making the lookup for user authorities/roles based on his tenant and username
* based on his tenant and username
*/ */
@FunctionalInterface @FunctionalInterface
public interface UserAuthoritiesResolver { public interface UserAuthoritiesResolver {
@@ -26,4 +25,4 @@ public interface UserAuthoritiesResolver {
* @return a {@link Collection} of authorities/roles for this user * @return a {@link Collection} of authorities/roles for this user
*/ */
Collection<String> getUserAuthorities(String tenant, String username); Collection<String> getUserAuthorities(String tenant, String username);
} }