Skip to content

Commit

Permalink
Fix AmqpMessageDispatcherServiceTest.testSendCancelRequest - set acti…
Browse files Browse the repository at this point in the history
…on tenant

Signed-off-by: Avgustin Marinov <Avgustin.Marinov@bosch.com>
  • Loading branch information
avgustinmm committed Nov 22, 2024
1 parent 9df68e2 commit 2da6282
Show file tree
Hide file tree
Showing 12 changed files with 42 additions and 61 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -72,8 +72,7 @@ EventPublisherHolder eventBusHolder() {
}

/**
* @return default {@link ApplicationEventFilter} that does not filter any
* events
* @return default {@link ApplicationEventFilter} that does not filter any events
*/
@Bean
@ConditionalOnMissingBean
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,7 @@ protected static boolean isMessageBodyEmpty(final Message message) {
return ObjectUtils.isEmpty(message.getBody());
}

protected static final void logAndThrowMessageError(final Message message, final String error) {
protected static void logAndThrowMessageError(final Message message, final String error) {
log.debug("Warning! \"{}\" reported by message: {}", error, message);
throw new AmqpRejectAndDontRequeueException(error);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -90,4 +90,4 @@ private static boolean isMessageException(final Throwable cause) {
cause instanceof MessageConversionException ||
cause instanceof MessageHandlingException;
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -27,8 +27,7 @@ public Class<MessageConversionException> getExceptionClass() {
@Override
public String getErrorMessage(Throwable throwable) {
final String errorMessage = super.getErrorMessage(throwable);
//since the detailed error message lies in the first parent of current throwable we retrieve it
// and append it to the errorMessage
// since the detailed error message lies in the first parent of current throwable we retrieve it and append it to the errorMessage
final Optional<String> detailedErrorMessage = getFirstAncestralErrorMessage(throwable.getCause());
return detailedErrorMessage.isPresent() ? (detailedErrorMessage.get() + errorMessage) : errorMessage;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -224,6 +224,7 @@ void sendUpdateAttributesRequest() {
void testSendCancelRequest() {
final Action action = mock(Action.class);
when(action.getId()).thenReturn(1L);
when(action.getTenant()).thenReturn(TENANT);
when(action.getTarget()).thenReturn(testTarget);
final CancelTargetAssignmentEvent cancelTargetAssignmentDistributionSetEvent = new CancelTargetAssignmentEvent(
action, serviceMatcher.getBusId());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,5 @@ public CancelTargetAssignmentEvent(final Action a, final String applicationId) {

public CancelTargetAssignmentEvent(final String tenant, final List<Action> a, final String applicationId) {
super(applicationId, tenant, a, applicationId);

}
}
Original file line number Diff line number Diff line change
Expand Up @@ -57,8 +57,7 @@ public Optional<E> getEntity() {
private E reloadEntityFromRepository() {
try {
final Class<E> clazz = (Class<E>) Class.forName(getEntityClass());
return EventEntityManagerHolder.getInstance().getEventEntityManager().findEntity(
getTenant(), getEntityId(), clazz);
return EventEntityManagerHolder.getInstance().getEventEntityManager().findEntity(getTenant(), getEntityId(), clazz);
} catch (final ClassNotFoundException e) {
log.error("Cannot reload entity because class is not found", e);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,24 +22,19 @@
import org.springframework.util.MimeType;

/**
* A customize message converter for the spring cloud events. The converter is
* registered for the application/binary+protostuff type.
*
* The clazz-type-information is encoded into the message payload infront with a
* length of {@link #EVENT_TYPE_LENGTH}. This is necessary due in case of
* rabbitMQ batching the message headers will be merged together and custom
* message header information will get lost. So in this implementation the
* information about the event-type is encoded in the payload of the message
* directly using the encoded values of {@link EventType}.
* A customize message converter for the spring cloud events. The converter is registered for the application/binary+protostuff type.
* <p/>
* The clazz-type-information is encoded into the message payload infront with a length of {@link #EVENT_TYPE_LENGTH}. This is necessary
* due in case of rabbitMQ batching the message headers will be merged together and custom message header information will get lost.
* So in this implementation the information about the event-type is encoded in the payload of the message directly using the encoded
* values of {@link EventType}.
*/
@Slf4j
public class BusProtoStuffMessageConverter extends AbstractMessageConverter {

public static final MimeType APPLICATION_BINARY_PROTOSTUFF = new MimeType("application", "binary+protostuff");

/**
* The length of the class type length of the payload.
*/
/** The length of the class type length of the payload. */
private static final byte EVENT_TYPE_LENGTH = 2;

public BusProtoStuffMessageConverter() {
Expand All @@ -52,8 +47,7 @@ protected boolean supports(final Class<?> aClass) {
}

@Override
public Object convertFromInternal(final Message<?> message, final Class<?> targetClass,
final Object conversionHint) {
public Object convertFromInternal(final Message<?> message, final Class<?> targetClass, final Object conversionHint) {
final Object objectPayload = message.getPayload();
if (objectPayload instanceof byte[] payload) {
final byte[] clazzHeader = extractClazzHeader(payload);
Expand All @@ -66,13 +60,9 @@ public Object convertFromInternal(final Message<?> message, final Class<?> targe
}

@Override
protected Object convertToInternal(final Object payload, final MessageHeaders headers,
final Object conversionHint) {

protected Object convertToInternal(final Object payload, final MessageHeaders headers, final Object conversionHint) {
final byte[] clazzHeader = writeClassHeader(payload.getClass());

final byte[] writeContent = writeContent(payload);

return mergeClassHeaderAndContent(clazzHeader, writeContent);
}

Expand Down Expand Up @@ -132,4 +122,4 @@ private static byte[] writeClassHeader(final Class<?> clazz) {
final LinkedBuffer buffer = LinkedBuffer.allocate();
return ProtobufIOUtil.toByteArray(clazzEventType, schema, buffer);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -86,10 +86,8 @@ public class EventType {

private int value;

/**
* The associated event-type-value must remain the same as initially
* declared. Otherwise, messages cannot correctly de-serialized.
*/
// The associated event-type-value must remain the same as initially
// declared. Otherwise, messages cannot correctly de-serialized.
static {
// target
TYPES.put(1, TargetCreatedEvent.class);
Expand Down Expand Up @@ -190,10 +188,12 @@ public EventType(final int value) {
* does not have a {@link EventType}.
*/
public static EventType from(final Class<?> clazz) {
final Optional<Integer> foundEventType = TYPES.entrySet().stream()
.filter(entry -> entry.getValue().equals(clazz)).map(Entry::getKey).findAny();

return foundEventType.map(EventType::new).orElse(null);
return TYPES.entrySet().stream()
.filter(entry -> entry.getValue().equals(clazz))
.map(Entry::getKey)
.findAny()
.map(EventType::new)
.orElse(null);
}

public Class<?> getTargetClass() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,7 @@
import org.springframework.transaction.annotation.Transactional;

/**
* A TenantAwareEvent entity manager, which loads an entity by id and type for
* remote events.
* A TenantAwareEvent entity manager, which loads an entity by id and type for remote events.
*/
@Transactional(readOnly = true)
public class JpaEventEntityManager implements EventEntityManager {
Expand All @@ -38,8 +37,7 @@ public JpaEventEntityManager(final TenantAware tenantAware, final EntityManager
}

@Override
public <E extends TenantAwareBaseEntity> E findEntity(final String tenant, final Long id,
final Class<E> entityType) {
public <E extends TenantAwareBaseEntity> E findEntity(final String tenant, final Long id, final Class<E> entityType) {
return tenantAware.runAsTenant(tenant, () -> entityManager.find(entityType, id));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -165,9 +165,8 @@ private static SecurityContext buildUserSecurityContext(
}

/**
* An {@link Authentication} implementation to delegate to an existing
* {@link Authentication} object except setting the details specifically for
* a specific tenant and user.
* An {@link Authentication} implementation to delegate to an existing {@link Authentication} object except setting the details
* specifically for a specific tenant and user.
*/
private static final class AuthenticationDelegate implements Authentication {

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -65,14 +65,14 @@ public SystemSecurityContext(final TenantAware tenantAware, final RoleHierarchy
/**
* Runs a given {@link Callable} within a system security context, which is
* permitted to call secured system code. Often the system needs to call
* secured methods by it's own without relying on the current security
* secured methods by its own without relying on the current security
* context e.g. if the current security context does not contain the
* necessary permission it's necessary to execute code as system code to
* execute necessary methods and functionality.
*
* <br/>
* The security context will be switched to the system code and back after
* the callable is called.
*
* <br/>
* The system code is executed for a current tenant by using the
* {@link TenantAware#getCurrentTenant()}.
*
Expand All @@ -88,7 +88,7 @@ public <T> T runAsSystem(final Callable<T> callable) {
/**
* Runs a given {@link Callable} within a system security context, which is
* permitted to call secured system code. Often the system needs to call
* secured methods by it's own without relying on the current security
* secured methods by its own without relying on the current security
* context e.g. if the current security context does not contain the
* necessary permission it's necessary to execute code as system code to
* execute necessary methods and functionality.
Expand Down Expand Up @@ -120,12 +120,10 @@ public <T> T runAsSystemAsTenant(final Callable<T> callable, final String tenant
}

/**
* Runs a given {@link Callable} within a system security context, which has
* the provided {@link GrantedAuthority}s to successfully run the
* {@link Callable}.
*
* The security context will be switched to the a new
* {@link SecurityContext} and back after the callable is called.
* Runs a given {@link Callable} within a system security context, which has the provided {@link GrantedAuthority}s to successfully
* run the {@link Callable}.
* <br/>
* The security context will be switched to a new {@link SecurityContext} and back after the callable is called.
*
* @param tenant under which the {@link Callable#call()} must be executed.
* @param callable to call within the security context
Expand Down Expand Up @@ -193,18 +191,17 @@ private void setCustomSecurityContext(final String tenantId, final Object princi
}

/**
* An implementation of the Spring's {@link Authentication} object which is
* used within a system security code block and wraps the original
* authentication object. The wrapped object contains the necessary
* {@link SpringEvalExpressions#SYSTEM_ROLE} which is allowed to execute all
* secured methods.
* An implementation of the Spring's {@link Authentication} object which is used within a system security code block and
* wraps the original authentication object. The wrapped object contains the necessary {@link SpringEvalExpressions#SYSTEM_ROLE}
* which is allowed to execute all secured methods.
*/
public static final class SystemCodeAuthentication implements Authentication {

@Serial
private static final long serialVersionUID = 1L;
private static final List<SimpleGrantedAuthority> AUTHORITIES = Collections
.singletonList(new SimpleGrantedAuthority(SpringEvalExpressions.SYSTEM_ROLE));

private static final List<SimpleGrantedAuthority> AUTHORITIES =
Collections.singletonList(new SimpleGrantedAuthority(SpringEvalExpressions.SYSTEM_ROLE));
private final Authentication oldAuthentication;

private SystemCodeAuthentication(final Authentication oldAuthentication) {
Expand Down

0 comments on commit 2da6282

Please sign in to comment.