/** * Copyright (C) 2010 Talend Inc. - www.talend.com */ package service.advanced; import java.util.ArrayList; import java.util.Collections; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.concurrent.atomic.AtomicLong; import javax.persistence.EntityManager; import javax.persistence.Tuple; import javax.persistence.TypedQuery; import javax.persistence.criteria.CriteriaQuery; import javax.persistence.metamodel.SingularAttribute; import org.apache.cxf.jaxrs.ext.search.SearchCondition; import org.apache.cxf.jaxrs.ext.search.SearchConditionVisitor; import org.apache.cxf.jaxrs.ext.search.SearchContext; import org.apache.cxf.jaxrs.ext.search.jpa.JPACriteriaQueryVisitor; import org.apache.cxf.jaxrs.ext.search.jpa.JPATypedQueryVisitor; import common.advanced.Person; import common.advanced.PersonInfo; import common.advanced.Person_; /** * Storage used by both PersonService and SearchService */ public class PersonInfoStorage { private static AtomicLong ID = new AtomicLong(); private Map<Long, Person> persons = Collections.synchronizedMap(new LinkedHashMap<Long, Person>()); private EntityManager em; private Map<String, String> beanPropertiesMap = Collections.emptyMap(); public PersonInfoStorage() { } public void setEntityManager(EntityManager em) { this.em = em; } public void setBeanProperties(Map<String, String> beanProperties) { this.beanPropertiesMap = beanProperties; } public Person getPerson(Long id) { return persons.get(id); } public Long addPerson(Person person) { long id = ID.incrementAndGet(); person.setId(id); System.out.println("Adding new person : name - " + person.getName() + ", id - " + id); persons.put(id, person); return id; } public List<Person> getAll() { return new ArrayList<Person>(persons.values()); } public List<Person> getTypedQueryPerson(SearchContext context) { // Get search condition encapsulating the query expression SearchCondition<Person> filter = getSearchCondition(context); // Initialise JPA2 visitor which can convert the captured search expression // into JPA2 TypedQuery SearchConditionVisitor<Person, TypedQuery<Person>> jpa = new JPATypedQueryVisitor<Person>(em, Person.class); // Convert filter.accept(jpa); // Get TypedQuery TypedQuery<Person> typedQuery = jpa.getQuery(); // Run the query and return the results return typedQuery.getResultList(); } public List<PersonInfo> getTypedQueryTuple(SearchContext context, String expression) { // Get search condition encapsulating the query expression SearchCondition<Person> filter = getSearchCondition(context, expression); // Initialise JPA2 visitor which can convert the captured search expression // into JPA2 TypedQuery JPACriteriaQueryVisitor<Person, Tuple> jpa = new JPACriteriaQueryVisitor<Person, Tuple>(em, Person.class, Tuple.class); // Convert filter.accept(jpa); // Shape the response data with selections and Tuple List<SingularAttribute<Person, ?>> selections = new ArrayList<SingularAttribute<Person, ?>>(); selections.add(Person_.id); jpa.selectTuple(selections); // Get CriteriaQuery and create TypedQuery CriteriaQuery<Tuple> cquery = jpa.getQuery(); TypedQuery<Tuple> typedQuery = em.createQuery(cquery); // Run the query List<Tuple> tuples = typedQuery.getResultList(); // Return the results List<PersonInfo> infos = new ArrayList<PersonInfo>(tuples.size()); for (Tuple tuple : tuples) { infos.add(new PersonInfo(tuple.get(Person_.id.getName(), Long.class))); } return infos; } private SearchCondition<Person> getSearchCondition(SearchContext context) { return getSearchCondition(context, null); } private SearchCondition<Person> getSearchCondition(SearchContext context, String expression) { return context.getCondition(expression, Person.class, beanPropertiesMap); } public void init() { try { em.getTransaction().begin(); Person mother = new Person("Lorraine", 50); addPerson(mother); em.persist(mother); Person father = new Person("John", 55); addPerson(father); em.persist(father); Person partner = new Person("Catherine", 28); addPerson(partner); em.persist(partner); Person p = new Person("Fred", 30, mother, father, partner); addPerson(p); em.persist(p); father.addChild(p); mother.addChild(p); em.getTransaction().commit(); } catch (Exception ex) { throw new RuntimeException(ex); } } }