Skip to content

Commit

Permalink
WELD-1782 Don't wrap resource producer field if the actual type is
Browse files Browse the repository at this point in the history
assignable to Serializable
  • Loading branch information
mkouba authored and jharting committed Nov 14, 2014
1 parent c211318 commit 03973ab
Show file tree
Hide file tree
Showing 3 changed files with 88 additions and 49 deletions.
82 changes: 42 additions & 40 deletions impl/src/main/java/org/jboss/weld/bean/AbstractProducerBean.java
Expand Up @@ -16,43 +16,6 @@
*/
package org.jboss.weld.bean;

import com.google.common.cache.CacheBuilder;
import com.google.common.cache.CacheLoader;
import com.google.common.cache.LoadingCache;
import org.jboss.weld.Container;
import org.jboss.weld.bootstrap.BeanDeployerEnvironment;
import org.jboss.weld.bootstrap.api.ServiceRegistry;
import org.jboss.weld.exceptions.DefinitionException;
import org.jboss.weld.exceptions.IllegalProductException;
import org.jboss.weld.exceptions.WeldException;
import org.jboss.weld.injection.CurrentInjectionPoint;
import org.jboss.weld.introspector.WeldMember;
import org.jboss.weld.manager.BeanManagerImpl;
import org.jboss.weld.metadata.cache.MetaAnnotationStore;
import org.jboss.weld.util.Beans;
import org.jboss.weld.util.reflection.Reflections;
import org.slf4j.cal10n.LocLogger;

import javax.enterprise.context.Dependent;
import javax.enterprise.context.NormalScope;
import javax.enterprise.context.spi.CreationalContext;
import javax.enterprise.inject.Produces;
import javax.enterprise.inject.spi.InjectionPoint;
import javax.enterprise.inject.spi.Producer;
import javax.inject.Inject;
import javax.inject.Scope;
import java.io.Serializable;
import java.lang.annotation.Annotation;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Member;
import java.lang.reflect.Method;
import java.lang.reflect.Type;
import java.lang.reflect.TypeVariable;
import java.lang.reflect.WildcardType;
import java.util.HashSet;
import java.util.Set;

import static org.jboss.weld.logging.Category.BEAN;
import static org.jboss.weld.logging.LoggerFactory.loggerFactory;
import static org.jboss.weld.logging.messages.BeanMessage.NON_SERIALIZABLE_CONSTRUCTOR_PARAM_INJECTION_ERROR;
Expand All @@ -71,6 +34,45 @@
import static org.jboss.weld.util.cache.LoadingCacheUtils.getCacheValue;
import static org.jboss.weld.util.reflection.Reflections.cast;

import java.io.Serializable;
import java.lang.annotation.Annotation;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Member;
import java.lang.reflect.Method;
import java.lang.reflect.Type;
import java.lang.reflect.TypeVariable;
import java.lang.reflect.WildcardType;
import java.util.HashSet;
import java.util.Set;

import javax.enterprise.context.Dependent;
import javax.enterprise.context.NormalScope;
import javax.enterprise.context.spi.CreationalContext;
import javax.enterprise.inject.Produces;
import javax.enterprise.inject.spi.InjectionPoint;
import javax.enterprise.inject.spi.Producer;
import javax.inject.Inject;
import javax.inject.Scope;

import org.jboss.weld.Container;
import org.jboss.weld.bootstrap.BeanDeployerEnvironment;
import org.jboss.weld.bootstrap.api.ServiceRegistry;
import org.jboss.weld.exceptions.DefinitionException;
import org.jboss.weld.exceptions.IllegalProductException;
import org.jboss.weld.exceptions.WeldException;
import org.jboss.weld.injection.CurrentInjectionPoint;
import org.jboss.weld.introspector.WeldMember;
import org.jboss.weld.manager.BeanManagerImpl;
import org.jboss.weld.metadata.cache.MetaAnnotationStore;
import org.jboss.weld.util.Beans;
import org.jboss.weld.util.reflection.Reflections;
import org.slf4j.cal10n.LocLogger;

import com.google.common.cache.CacheBuilder;
import com.google.common.cache.CacheLoader;
import com.google.common.cache.LoadingCache;

/**
* The implicit producer bean
*
Expand Down Expand Up @@ -219,7 +221,7 @@ public Set<InjectionPoint> getInjectionPoints() {
*
* @param instance The instance to validate
*/
protected void checkReturnValue(T instance) {
protected T checkReturnValue(T instance) {
if (instance == null) {
if (!isDependent()) {
throw new IllegalProductException(NULL_NOT_ALLOWED_FROM_PRODUCER, getProducer());
Expand Down Expand Up @@ -251,6 +253,7 @@ protected void checkReturnValue(T instance) {
}
}
}
return instance;
}

@Override
Expand Down Expand Up @@ -305,8 +308,7 @@ public Producer<T> getProducer() {
*/
public T create(final CreationalContext<T> creationalContext) {
T instance = getProducer().produce(creationalContext);
checkReturnValue(instance);
return instance;
return checkReturnValue(instance);
}

protected abstract class AbstractProducer implements Producer<T> {
Expand Down
Expand Up @@ -62,10 +62,11 @@ private static class EEResourceCallable<T> extends AbstractEECallable<T> {
private transient T instance;
private final CreationalContext<T> creationalContext;

private EEResourceCallable(BeanManagerImpl beanManager, ProducerField<?, T> producerField, CreationalContext<T> creationalContext) {
private EEResourceCallable(BeanManagerImpl beanManager, ProducerField<?, T> producerField, CreationalContext<T> creationalContext, T instance) {
super(beanManager);
this.beanId = producerField.getId();
this.creationalContext = creationalContext;
this.instance = instance;
}

public T call() throws Exception {
Expand Down Expand Up @@ -139,11 +140,13 @@ protected void checkEEResource() {

@Override
public T create(CreationalContext<T> creationalContext) {
if (Reflections.isFinal(getWeldAnnotated().getJavaClass()) || Serializable.class.isAssignableFrom(getWeldAnnotated().getJavaClass())) {
return createUnderlying(creationalContext);
final T beanInstance = getProducer().produce(creationalContext);
if (Reflections.isFinal(getWeldAnnotated().getJavaClass()) || Serializable.class.isAssignableFrom(beanInstance.getClass())) {
return checkReturnValue(beanInstance);
} else {
BeanInstance proxyBeanInstance = new EnterpriseTargetBeanInstance(getTypes(), new CallableMethodHandler(new EEResourceCallable<T>(getBeanManager(), this, creationalContext)));
return proxyFactory.create(proxyBeanInstance);
BeanInstance proxyBeanInstance = new EnterpriseTargetBeanInstance(getTypes(), new CallableMethodHandler(new EEResourceCallable<T>(getBeanManager(),
this, creationalContext, beanInstance)));
return checkReturnValue(proxyFactory.create(proxyBeanInstance));
}
}

Expand Down
42 changes: 38 additions & 4 deletions porting-package/src/main/java/org/jboss/weld/tck/BeansImpl.java
Expand Up @@ -21,8 +21,10 @@
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.ObjectStreamClass;

/**
* Implements the Beans SPI for the TCK specifically for the JBoss RI.
Expand All @@ -40,13 +42,45 @@ public boolean isProxy(Object instance) {
public byte[] serialize(Object instance) throws IOException {
ByteArrayOutputStream bytes = new ByteArrayOutputStream();
ObjectOutputStream out = new ObjectOutputStream(bytes);
out.writeObject(instance);
return bytes.toByteArray();
try {
out.writeObject(instance);
return bytes.toByteArray();
} finally {
if (out != null) {
out.close();
}
}
}

public Object deserialize(byte[] bytes) throws IOException, ClassNotFoundException {
ObjectInputStream in = new ObjectInputStream(new ByteArrayInputStream(bytes));
return in.readObject();
TCCLObjectInputStream in = new TCCLObjectInputStream(new ByteArrayInputStream(bytes));
try {
return in.readObject();
} finally {
if (in != null) {
in.close();
}
}
}

private static class TCCLObjectInputStream extends ObjectInputStream {

private final ClassLoader classLoader;

public TCCLObjectInputStream(InputStream in) throws IOException {
super(in);
this.classLoader = Thread.currentThread().getContextClassLoader();
}

@Override
protected Class<?> resolveClass(ObjectStreamClass desc) throws IOException, ClassNotFoundException {
try {
String name = desc.getName();
return Class.forName(name, false, classLoader);
} catch (ClassNotFoundException e) {
return super.resolveClass(desc);
}
}
}

}

0 comments on commit 03973ab

Please sign in to comment.