All Downloads are FREE. Search and download functionalities are using the official Maven repository.

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