
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