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

br.eti.clairton.repository.http.AttributeBuilder Maven / Gradle / Ivy

package br.eti.clairton.repository.http;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

import javax.enterprise.context.Dependent;
import javax.inject.Inject;
import javax.persistence.EntityManager;
import javax.persistence.metamodel.Attribute;
import javax.persistence.metamodel.ManagedType;
import javax.persistence.metamodel.Metamodel;
import javax.persistence.metamodel.PluralAttribute;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;

/**
 * Builder para facilidar o agrupamento de jpa Attribute.
 * 
 * @author Clairton Rodrigo Heinzen [email protected]
 */
@Dependent
public class AttributeBuilder {
	private final List> attributes = new ArrayList>();

	private final EntityManager entityManager;
	
	@Deprecated
	public AttributeBuilder() {
		this((EntityManager) null);
	}

	@Inject
	public AttributeBuilder(final EntityManager entityManager) {
		super();
		this.entityManager = entityManager;
	}

	/**
	 * Construtor com parametros.
	 * 
	 * @param attibute
	 *            jpa Attribute
	 */
	public AttributeBuilder(final Attribute attibute) {
		this.entityManager = null;
		attributes.add(attibute);
	}

	/**
	 * Adiciona um jpa Attribute
	 * 
	 * @param attibute
	 *            jpa Attribute
	 * @return this
	 */
	public AttributeBuilder add(final Attribute attibute) {
		attributes.add(attibute);
		return this;
	}

	/**
	 * Devolve um array.
	 * 
	 * @return array
	 */
	public Attribute[] toArray() {
		final Attribute[] array = new Attribute[attributes.size()];
		return attributes.toArray(array);
	}

	/**
	 * Devolve uma coleção.
	 * 
	 * @return {@link Collection}
	 */
	public Collection> toCollection() {
		return attributes;
	}

	public  Attribute[] with(@NotNull final Class base, @NotNull @Size(min = 1) final String path) {
		final Metamodel metamodel = entityManager.getMetamodel();
		final ManagedType entityType = metamodel.managedType(base);
		if (path.matches(".*\\].*")) {
			// subtitui para o padrão com pontos se for com chaves
			return with(base, path.replaceAll("]", "").replaceAll("\\[", "\\."));
		}
		final String[] fields = path.split("\\.");
		final Attribute attribute = entityType.getAttribute(fields[0]);
		attributes.add(attribute);
		if (fields.length > 1) {
			final Class nextType;
			if(PluralAttribute.class.isAssignableFrom(attribute.getClass())){
				final PluralAttribute pluralAttribute = (PluralAttribute) attribute;
				@SuppressWarnings("unchecked")
				final Class t = (Class) pluralAttribute.getElementType().getJavaType();
				nextType = t;
			}else{
				@SuppressWarnings("unchecked")
				final Class t = (Class) attribute.getJavaType();
				nextType = t;
			}
			return with(nextType, path.replace(fields[0] + ".", ""));
		}
		final Attribute[] a = toArray();
		attributes.clear();
		return a;
	}
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy