// Path: src/main/java/net/ftlines/blog/cdidemo/model/Employee.java
// @Entity
// public class Employee implements Serializable {
// 
//   @GeneratedValue
//   @Id
//   private Long id;
//   @Basic(optional = false)
//   private String firstName;
//   @Basic(optional = false)
//   private String lastName;
//   @Basic(optional = false)
//   private String email;
//   @Temporal(TemporalType.DATE)
//   @Basic(optional = false)
//   private Date hireDate;
// 
//   public Long getId() {
//     return id;
//   }
// 
//   public String getFirstName() {
//     return firstName;
//   }
// 
//   public void setFirstName(String firstName) {
//     this.firstName = firstName;
//   }
// 
//   public String getLastName() {
//     return lastName;
//   }
// 
//   public void setLastName(String lastName) {
//     this.lastName = lastName;
//   }
// 
//   public String getEmail() {
//     return email;
//   }
// 
//   public void setEmail(String email) {
//     this.email = email;
//   }
// 
//   public Date getHireDate() {
//     return hireDate;
//   }
// 
//   public void setHireDate(Date hireDate) {
//     this.hireDate = hireDate;
//   }
// 
//   public String getFullName() {
//     return firstName + " " + lastName;
//   }
// }
// 
// Path: src/main/java/net/ftlines/blog/cdidemo/model/EmployeesRepository.java
// @ApplicationScoped
// public class EmployeesRepository {
// 
//   @Inject
//   private EntityManager em;
// 
//   public List<Employee> search(String keywords) {
//     String hql = "FROM Employee WHERE 1=1 ";
//     List<Object> params = new ArrayList<Object>();
// 
//     for (String keyword : keywords.split(" ")) {
//       final String like = "%" + keyword + "%";
//       hql += " AND ( firstName LIKE (?) OR lastName LIKE (?) OR email LIKE (?) )";
//       params.add(like);
//       params.add(like);
//       params.add(like);
//     }
// 
//     Query query = em.createQuery(hql);
//     for (int i = 0; i < params.size(); i++) {
//       query.setParameter(i + 1, params.get(i));
//     }
//     query.setMaxResults(20);
//     return query.getResultList();
//   }
// 
//   public List<Employee> list(EmployeeCriteria criteria, int first, int max) {
//     return query("FROM Employee e", criteria, "ORDER BY lastName, firstName").setFirstResult(first).setMaxResults(max)
//         .getResultList();
//   }
// 
//   public int count(EmployeeCriteria criteria) {
//     return ((Long) query("SELECT COUNT(*) FROM Employee e", criteria, "").getSingleResult()).intValue();
//   }
// 
//   private Query query(String base, EmployeeCriteria criteria, String suffix) {
//     List<Object> params = new ArrayList<Object>();
//     String hql = base + " WHERE 1=1";
//     if (criteria.getHireDateMin() != null) {
//       hql += " AND e.hireDate>=?";
//       params.add(criteria.getHireDateMin());
//     }
//     if (criteria.getHireDateMax() != null) {
//       hql += " AND e.hireDate<=?";
//       params.add(criteria.getHireDateMax());
//     }
//     if (criteria.getTeam() != null) {
//       hql += " AND EXISTS (FROM Team t JOIN t.members AS m WHERE m.employee=e AND t=?)";
//       params.add(criteria.getTeam());
//     }
// 
//     Query query = em.createQuery(hql + suffix);
//     for (int i = 0; i < params.size(); i++) {
//       query.setParameter(i + 1, params.get(i));
//     }
//     return query;
//   }
// }
// 
// Path: src/main/java/net/ftlines/blog/cdidemo/util/IteratorAdapter.java
// public abstract class IteratorAdapter<O, N> implements Iterator<N> {
//   private final Iterator<? extends O> delegate;
// 
//   public IteratorAdapter(Iterator<? extends O> delegate) {
//     this.delegate = delegate;
//   }
// 
//   public boolean hasNext() {
//     return delegate.hasNext();
//   }
// 
//   public N next() {
//     return next(delegate.next());
//   }
// 
//   protected abstract N next(O next);
// 
//   public void remove() {
//     delegate.remove();
//   }
// 
// }


import java.util.Iterator;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.inject.Inject;
import javax.persistence.EntityManager;
import net.ftlines.blog.cdidemo.model.Employee;
import net.ftlines.blog.cdidemo.model.EmployeesRepository;
import net.ftlines.blog.cdidemo.util.IteratorAdapter;
import org.apache.wicket.extensions.ajax.markup.html.autocomplete.AutoCompleteTextField;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.Model;

package net.ftlines.blog.cdidemo.web.app;





public class EmployeePicker extends AutoCompleteTextField<String> {
  @Inject
  EmployeesRepository employees;

  @Inject
  EntityManager em;

  private final IModel<Employee> employee;


// Path: src/main/java/net/ftlines/blog/cdidemo/model/Employee.java
// @Entity
// public class Employee implements Serializable {
// 
//   @GeneratedValue
//   @Id
//   private Long id;
//   @Basic(optional = false)
//   private String firstName;
//   @Basic(optional = false)
//   private String lastName;
//   @Basic(optional = false)
//   private String email;
//   @Temporal(TemporalType.DATE)
//   @Basic(optional = false)
//   private Date hireDate;
// 
//   public Long getId() {
//     return id;
//   }
// 
//   public String getFirstName() {
//     return firstName;
//   }
// 
//   public void setFirstName(String firstName) {
//     this.firstName = firstName;
//   }
// 
//   public String getLastName() {
//     return lastName;
//   }
// 
//   public void setLastName(String lastName) {
//     this.lastName = lastName;
//   }
// 
//   public String getEmail() {
//     return email;
//   }
// 
//   public void setEmail(String email) {
//     this.email = email;
//   }
// 
//   public Date getHireDate() {
//     return hireDate;
//   }
// 
//   public void setHireDate(Date hireDate) {
//     this.hireDate = hireDate;
//   }
// 
//   public String getFullName() {
//     return firstName + " " + lastName;
//   }
// }
// 
// Path: src/main/java/net/ftlines/blog/cdidemo/model/EmployeesRepository.java
// @ApplicationScoped
// public class EmployeesRepository {
// 
//   @Inject
//   private EntityManager em;
// 
//   public List<Employee> search(String keywords) {
//     String hql = "FROM Employee WHERE 1=1 ";
//     List<Object> params = new ArrayList<Object>();
// 
//     for (String keyword : keywords.split(" ")) {
//       final String like = "%" + keyword + "%";
//       hql += " AND ( firstName LIKE (?) OR lastName LIKE (?) OR email LIKE (?) )";
//       params.add(like);
//       params.add(like);
//       params.add(like);
//     }
// 
//     Query query = em.createQuery(hql);
//     for (int i = 0; i < params.size(); i++) {
//       query.setParameter(i + 1, params.get(i));
//     }
//     query.setMaxResults(20);
//     return query.getResultList();
//   }
// 
//   public List<Employee> list(EmployeeCriteria criteria, int first, int max) {
//     return query("FROM Employee e", criteria, "ORDER BY lastName, firstName").setFirstResult(first).setMaxResults(max)
//         .getResultList();
//   }
// 
//   public int count(EmployeeCriteria criteria) {
//     return ((Long) query("SELECT COUNT(*) FROM Employee e", criteria, "").getSingleResult()).intValue();
//   }
// 
//   private Query query(String base, EmployeeCriteria criteria, String suffix) {
//     List<Object> params = new ArrayList<Object>();
//     String hql = base + " WHERE 1=1";
//     if (criteria.getHireDateMin() != null) {
//       hql += " AND e.hireDate>=?";
//       params.add(criteria.getHireDateMin());
//     }
//     if (criteria.getHireDateMax() != null) {
//       hql += " AND e.hireDate<=?";
//       params.add(criteria.getHireDateMax());
//     }
//     if (criteria.getTeam() != null) {
//       hql += " AND EXISTS (FROM Team t JOIN t.members AS m WHERE m.employee=e AND t=?)";
//       params.add(criteria.getTeam());
//     }
// 
//     Query query = em.createQuery(hql + suffix);
//     for (int i = 0; i < params.size(); i++) {
//       query.setParameter(i + 1, params.get(i));
//     }
//     return query;
//   }
// }
// 
// Path: src/main/java/net/ftlines/blog/cdidemo/util/IteratorAdapter.java
// public abstract class IteratorAdapter<O, N> implements Iterator<N> {
//   private final Iterator<? extends O> delegate;
// 
//   public IteratorAdapter(Iterator<? extends O> delegate) {
//     this.delegate = delegate;
//   }
// 
//   public boolean hasNext() {
//     return delegate.hasNext();
//   }
// 
//   public N next() {
//     return next(delegate.next());
//   }
// 
//   protected abstract N next(O next);
// 
//   public void remove() {
//     delegate.remove();
//   }
// 
// }


// Path: src/main/java/net/ftlines/blog/cdidemo/web/app/EmployeePicker.java
import java.util.Iterator;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.inject.Inject;
import javax.persistence.EntityManager;
import net.ftlines.blog.cdidemo.model.Employee;
import net.ftlines.blog.cdidemo.model.EmployeesRepository;
import net.ftlines.blog.cdidemo.util.IteratorAdapter;
import org.apache.wicket.extensions.ajax.markup.html.autocomplete.AutoCompleteTextField;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.Model;

package net.ftlines.blog.cdidemo.web.app;





public class EmployeePicker extends AutoCompleteTextField<String> {
  @Inject
  EmployeesRepository employees;

  @Inject
  EntityManager em;

  private final IModel<Employee> employee;


  public EmployeePicker(String id, IModel<Employee> model) {
