
com.github.nill14.utils.init.impl.ProviderInstancePojoFactory Maven / Gradle / Ivy
The newest version!
package com.github.nill14.utils.init.impl;
import javax.inject.Provider;
import com.github.nill14.utils.init.api.IBeanDescriptor;
import com.github.nill14.utils.init.api.IPojoFactory;
import com.github.nill14.utils.init.api.IPropertyResolver;
import com.github.nill14.utils.init.inject.PojoInjectionDescriptor;
import com.github.nill14.utils.init.inject.ReflectionUtils;
import com.google.common.reflect.TypeToken;
public final class ProviderInstancePojoFactory implements IPojoFactory {
public static ProviderInstancePojoFactory of(TypeToken typeToken, Provider provider) {
return new ProviderInstancePojoFactory(typeToken, provider);
}
private static final long serialVersionUID = 1L;
private final TypeToken typeToken;
private final Provider provider;
/** Cache the beanDescriptor */
private IBeanDescriptor beanDescriptor;
/**
*
* WARNING: do not use closure as provider: () -> (Type) instance
* The {@link #getType()} will return always Object!!!
*
* @param provider
*/
public ProviderInstancePojoFactory(Provider provider) {
this.typeToken = ReflectionUtils.getProviderReturnTypeToken(provider);
if (Object.class.equals(typeToken.getRawType())) {
throw new IllegalArgumentException(
"This constructor cannot be used with a Provider of Object type. "
+ "This limitation provides some type safety. "
+ "Note that expression () -> new Integer(5) has as a return type Object" );
}
this.provider = provider;
}
public ProviderInstancePojoFactory(TypeToken typeToken, Provider provider) {
this.typeToken = typeToken;
this.provider = provider;
}
protected ProviderInstancePojoFactory(IBeanDescriptor beanDescriptor, Provider provider) {
this.typeToken = beanDescriptor.getToken();
this.beanDescriptor = beanDescriptor;
this.provider = provider;
}
@Override
public T newInstance(IPropertyResolver resolver, CallerContext context) {
T instance = provider.get();
if (instance != null) {
resolver.initializeBean(getDescriptor(), instance, context);
}
return instance;
}
@Override
public TypeToken getType() {
return typeToken;
}
@Override
public IBeanDescriptor getDescriptor() {
//avoiding synchronization on purpose
IBeanDescriptor h = beanDescriptor;
if (h == null) {
h = new PojoInjectionDescriptor<>(typeToken);
beanDescriptor = h;
}
return h;
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy