Skip to content

Commit

Permalink
PAYARA-3754 @clustered Annotation Doesn't Use Bean Name (#3901)
Browse files Browse the repository at this point in the history
* Added check for bean class name.
  • Loading branch information
MattGill98 authored Apr 24, 2019
1 parent 9596903 commit 7b6ec8f
Show file tree
Hide file tree
Showing 3 changed files with 147 additions and 7 deletions.
6 changes: 6 additions & 0 deletions appserver/payara-appserver-modules/payara-micro-cdi/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -97,5 +97,11 @@
<groupId>org.glassfish.soteria</groupId>
<artifactId>javax.security.enterprise</artifactId>
</dependency>
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
<version>${mockito.version}</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright (c) [2016-2018] Payara Foundation and/or its affiliates. All rights reserved.
* Copyright (c) [2016-2019] Payara Foundation and/or its affiliates. All rights reserved.
*
* The contents of this file are subject to the terms of either the GNU
* General Public License Version 2 only ("GPL") or the Common Development
Expand Down Expand Up @@ -39,21 +39,25 @@
*/
package fish.payara.micro.cdi.extension.cluster;

import com.google.common.base.Optional;
import com.sun.enterprise.deployment.Application;
import com.sun.enterprise.deployment.util.DOLUtils;
import fish.payara.cluster.Clustered;
import fish.payara.micro.cdi.extension.cluster.annotations.ClusterScoped;
import java.lang.annotation.Annotation;

import javax.enterprise.context.ApplicationScoped;
import javax.enterprise.context.spi.Context;
import javax.enterprise.context.spi.Contextual;
import javax.enterprise.context.spi.CreationalContext;
import javax.enterprise.inject.spi.Bean;
import javax.enterprise.inject.spi.BeanManager;

import com.google.common.base.Optional;
import com.sun.enterprise.deployment.Application;
import com.sun.enterprise.deployment.util.DOLUtils;

import org.glassfish.internal.deployment.Deployment;
import org.glassfish.soteria.cdi.CdiUtils;

import fish.payara.cluster.Clustered;
import fish.payara.micro.cdi.extension.cluster.annotations.ClusterScoped;

/**
* @Clustered singleton CDI context implementation
*
Expand Down Expand Up @@ -118,8 +122,21 @@ private<TT> TT getFromApplicationScoped(Contextual<TT> contextual, Optional<Crea
}
}

/**
* Get the most appropriate name for a bean. First checks the `@Clustered`
* annotation key name property, then the bean EL name, then the bean class
* name.
*
* @param bean the bean to reference.
* @param annotation the Clustered annotation to reference.
* @throws IllegalArgumentException if no name can be found for the bean.
*/
static <TT> String getBeanName(Bean<TT> bean, Clustered annotation) {
return annotation.keyName().isEmpty()? bean.getName() : annotation.keyName();
try {
return firstNonNull(annotation.keyName(), bean.getName(), bean.getBeanClass().getName());
} catch (Throwable t) {
throw new IllegalArgumentException("Could not find the name for bean: " + bean.toString(), t);
}
}

static <TT> Clustered getAnnotation(BeanManager beanManager, Bean<TT> bean) {
Expand All @@ -129,4 +146,13 @@ static <TT> Clustered getAnnotation(BeanManager beanManager, Bean<TT> bean) {
static <TT> Clustered getAnnotation(BeanManager beanManager, Class<?> clazz) {
return CdiUtils.getAnnotation(beanManager, clazz, Clustered.class).get();
}

private static String firstNonNull(String... items) {
for (String i : items) {
if (i != null && !i.trim().isEmpty()) {
return i;
}
}
throw new IllegalArgumentException("All elements were null.");
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,108 @@
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright (c) [2019] Payara Foundation and/or its affiliates. All rights reserved.
*
* The contents of this file are subject to the terms of either the GNU
* General Public License Version 2 only ("GPL") or the Common Development
* and Distribution License("CDDL") (collectively, the "License"). You
* may not use this file except in compliance with the License. You can
* obtain a copy of the License at
* https://github.com/payara/Payara/blob/master/LICENSE.txt
* See the License for the specific
* language governing permissions and limitations under the License.
*
* When distributing the software, include this License Header Notice in each
* file and include the License file at glassfish/legal/LICENSE.txt.
*
* GPL Classpath Exception:
* The Payara Foundation designates this particular file as subject to the "Classpath"
* exception as provided by the Payara Foundation in the GPL Version 2 section of the License
* file that accompanied this code.
*
* Modifications:
* If applicable, add the following below the License Header, with the fields
* enclosed by brackets [] replaced by your own identifying information:
* "Portions Copyright [year] [name of copyright owner]"
*
* Contributor(s):
* If you wish your version of this file to be governed by only the CDDL or
* only the GPL Version 2, indicate your decision by adding "[Contributor]
* elects to include this software in this distribution under the [CDDL or GPL
* Version 2] license." If you don't indicate a single choice of license, a
* recipient has the option to distribute your version of this file under
* either the CDDL, the GPL Version 2 or to extend the choice of license to
* its licensees as provided above. However, if you add GPL Version 2 code
* and therefore, elected the GPL Version 2 license, then the option applies
* only if the new code is made subject to such option by the copyright
* holder.
*/
package fish.payara.micro.cdi.extension.cluster;

import static org.junit.Assert.assertEquals;
import static org.mockito.Mockito.when;

import javax.enterprise.inject.spi.Bean;

import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner;

import fish.payara.cluster.Clustered;

/**
* @author Matt Gill
*/
@RunWith(MockitoJUnitRunner.class)
public class ClusterScopeContextTest {

private static final String ANNOTATION_BEAN_NAME = "Annotation";
private static final String CDI_BEAN_NAME = "CDI";
private static final Class BEAN_CLASS = Object.class;

@Mock
private Bean<?> bean;

@Mock
private Clustered annotation;

@Before
public void initialiseMocks() {
when(annotation.keyName()).thenReturn(ANNOTATION_BEAN_NAME);
when(bean.getName()).thenReturn(CDI_BEAN_NAME);
when(bean.getBeanClass()).thenReturn(BEAN_CLASS);
}

@Test
public void when_key_name_not_empty_expect_correct_getBeanName() {
assertEquals(ANNOTATION_BEAN_NAME, ClusterScopeContext.getBeanName(bean, annotation));
}

@Test
public void when_key_name_null_expect_correct_getBeanName() {
when(annotation.keyName()).thenReturn(null);
assertEquals(CDI_BEAN_NAME, ClusterScopeContext.getBeanName(bean, annotation));
}

@Test
public void when_key_name_empty_expect_correct_getBeanName() {
when(annotation.keyName()).thenReturn("");
assertEquals(CDI_BEAN_NAME, ClusterScopeContext.getBeanName(bean, annotation));
}

@Test
public void when_key_name_blank_expect_correct_getBeanName() {
when(annotation.keyName()).thenReturn(" ");
assertEquals(CDI_BEAN_NAME, ClusterScopeContext.getBeanName(bean, annotation));
}

@Test
public void when_key_name_and_bean_name_null_expect_correct_getBeanName() {
when(annotation.keyName()).thenReturn(null);
when(bean.getName()).thenReturn(null);
assertEquals("java.lang.Object", ClusterScopeContext.getBeanName(bean, annotation));
}

}

0 comments on commit 7b6ec8f

Please sign in to comment.