Skip to content

Commit

Permalink
Adding Servlet Events
Browse files Browse the repository at this point in the history
  • Loading branch information
cuioss committed Jul 20, 2023
1 parent 58e67e6 commit 2b40776
Show file tree
Hide file tree
Showing 8 changed files with 229 additions and 0 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,14 @@ public class PortalConfigurationKeys implements Serializable {
*/
public static final String HTTP_HEADER_BASE = PORTAL_BASE + "httpHeader.";

/**
* Context parameter prefix within configuration-subsystem with the name
* portal.httpHeader.enabled
* <p>
* Defines optional header parameters to be configured.
*/
public static final String HTTP_HEADER_ENABLED = HTTP_HEADER_BASE + ENABLED;

/**
* Context parameter prefix within configuration-subsystem with the name
* 'integration.'.
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
package de.cuioss.portal.core.cdi.servlet.bridge;

import java.io.IOException;

import javax.enterprise.inject.spi.CDI;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

import de.cuioss.portal.core.cdi.servlet.literal.DestroyedLiteral;
import de.cuioss.portal.core.cdi.servlet.literal.Initialized;
import de.cuioss.portal.core.cdi.servlet.literal.InitializedLiteral;
import de.cuioss.tools.logging.CuiLogger;

/**
* Inspired by deltaspike. Fires events for {@link Initialized} and
* {@link Destroyed}.
*/
public class RequestResponseEventFilter implements Filter {

private static final CuiLogger LOGGER = new CuiLogger(RequestResponseEventFilter.class);

@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {

var beanManager = CDI.current().getBeanManager();

LOGGER.trace("Fire @Initialized events");
beanManager.fireEvent(request, InitializedLiteral.INSTANCE);
beanManager.fireEvent(response, InitializedLiteral.INSTANCE);

try {
LOGGER.trace("Execute Chain");
chain.doFilter(request, response);
} finally {
LOGGER.trace("Fire @Destroyed events");
beanManager.fireEvent(request, DestroyedLiteral.INSTANCE);
beanManager.fireEvent(response, DestroyedLiteral.INSTANCE);
}
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package de.cuioss.portal.core.cdi.servlet.literal;

import static java.lang.annotation.ElementType.FIELD;
import static java.lang.annotation.ElementType.METHOD;
import static java.lang.annotation.ElementType.PARAMETER;
import static java.lang.annotation.ElementType.TYPE;
import static java.lang.annotation.RetentionPolicy.RUNTIME;

import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;

import javax.inject.Qualifier;

/**
* Qualifier for events which are fired when servlet objects are deleted.
*
* @author https://github.com/apache/deltaspike/blob/deltaspike-1.9.6/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/api/lifecycle/Destroyed.java
*/
@Qualifier
@Target({ TYPE, METHOD, PARAMETER, FIELD })
@Retention(RUNTIME)
@Documented
public @interface Destroyed {

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package de.cuioss.portal.core.cdi.servlet.literal;

import javax.enterprise.util.AnnotationLiteral;

/**
* Annotation literal for {@link DestroyedLiteral}.
*
* @author https://github.com/apache/deltaspike/blob/deltaspike-1.9.6/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/api/literal/DestroyedLiteral.java
*/
public class DestroyedLiteral extends AnnotationLiteral<Initialized> implements Destroyed {

private static final long serialVersionUID = 5587631398288144209L;
public static final Destroyed INSTANCE = new DestroyedLiteral();

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package de.cuioss.portal.core.cdi.servlet.literal;

import static java.lang.annotation.ElementType.FIELD;
import static java.lang.annotation.ElementType.METHOD;
import static java.lang.annotation.ElementType.PARAMETER;
import static java.lang.annotation.ElementType.TYPE;
import static java.lang.annotation.RetentionPolicy.RUNTIME;

import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;

import javax.inject.Qualifier;

/**
* Qualifier for events which are fired when servlet objects are created.
*
* @author https://github.com/apache/deltaspike/blob/deltaspike-1.9.6/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/api/lifecycle/Initialized.java
*/
@Qualifier
@Target({ TYPE, METHOD, PARAMETER, FIELD })
@Retention(RUNTIME)
@Documented
public @interface Initialized {

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package de.cuioss.portal.core.cdi.servlet.literal;

import javax.enterprise.util.AnnotationLiteral;

/**
* Annotation literal for {@link Initialized}.
*
* @author https://github.com/apache/deltaspike/blob/deltaspike-1.9.6/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/api/literal/InitializedLiteral.java
*/
public class InitializedLiteral extends AnnotationLiteral<Initialized> implements Initialized {

private static final long serialVersionUID = 1268993406072023790L;

public static final Initialized INSTANCE = new InitializedLiteral();

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
<web-fragment xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-fragment_3_1.xsd"
version="3.1">
<name>portal_core</name>

<ordering>
<before>
<others />
</before>
</ordering>

<distributable />
<listener>
<listener-class></listener-class>
</listener>
<filter>
<filter-name>requestResponseEventFilter</filter-name>
<filter-class>de.cuioss.portal.core.cdi.servlet.bridge.RequestResponseEventFilter</filter-class>
</filter>

<filter-mapping>
<filter-name>requestResponseEventFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-fragment>
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
package de.cuioss.portal.core.cdi.servlet.bridge;

import static org.junit.jupiter.api.Assertions.assertTrue;

import java.io.IOException;

import javax.enterprise.event.Observes;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.myfaces.test.mock.MockHttpServletRequest;
import org.apache.myfaces.test.mock.MockHttpServletResponse;
import org.easymock.EasyMock;
import org.jboss.weld.junit5.auto.EnableAutoWeld;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;

import de.cuioss.portal.core.cdi.servlet.literal.Initialized;

@EnableAutoWeld
class RequestResponseEventFilterTest {

private boolean initRequest;
private boolean destroyRequest;

private boolean initResponse;
private boolean destroyResponse;

@BeforeEach
void restEventResults() {
initRequest = false;
destroyRequest = false;
initResponse = false;
destroyResponse = false;
}

@Test
void shouldFilter() throws IOException, ServletException {
var filter = new RequestResponseEventFilter();
FilterChain chain = EasyMock.createNiceMock(FilterChain.class);

filter.doFilter(new MockHttpServletRequest(), new MockHttpServletResponse(), chain);
assertTrue(destroyRequest);
assertTrue(destroyResponse);
assertTrue(initRequest);
assertTrue(initResponse);
}

void initRequest(@Observes @Initialized HttpServletRequest request) {
initRequest = true;
}

void destroyRequest(@Observes @Initialized HttpServletRequest request) {
destroyRequest = true;
}

void initResponse(@Observes @Initialized HttpServletResponse request) {
initResponse = true;
}

void destroyResponse(@Observes @Initialized HttpServletResponse request) {
destroyResponse = true;
}

}

0 comments on commit 2b40776

Please sign in to comment.