/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package jpa20remove;

import entity.Polygon;
import entity.Punkt;
import java.util.Collection;
import java.util.Iterator;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.Query;

/**
 *
 * @author x
 */
public class Main {

  private EntityManagerFactory emf =
          Persistence.createEntityManagerFactory("JPA20RemovePU");
  private EntityManager em = emf.createEntityManager();

  public void objekteErzeugen0() {
    Polygon xA = new Polygon();
    Polygon yA = new Polygon();
    Polygon w = new Polygon();
    for (int i = 0; i < 5; i++) {
      xA.punkteHinzu(new Punkt(i, 0));
      yA.punkteHinzu(new Punkt(0, i));
      w.punkteHinzu(new Punkt(i, i));
    }
    em.getTransaction().begin();
    em.persist(xA);
    em.persist(yA);
    em.persist(w);
    em.getTransaction().commit();
  }

  public void objekteErzeugen() {
    Punkt[] pkt = {new Punkt(0, 0), new Punkt(5, 3), new Punkt(3, 3)};
    Polygon p1 = new Polygon();
    p1.punkteHinzu(pkt[0], pkt[1], pkt[2]);
    em.getTransaction().begin();
    em.persist(p1);
    em.getTransaction().commit();
  }

  public void objekteErzeugen2() {
    Punkt[] pkt = {new Punkt(0, 0), new Punkt(5, 3), new Punkt(3, 3)};
    Polygon p1 = new Polygon();
    p1.punkteHinzu(pkt[0], pkt[1], pkt[2]);
    Polygon p2 = new Polygon();
    p2.punkteHinzu(pkt[0], pkt[1], pkt[2]);
    em.getTransaction().begin();
    em.persist(p1);
    em.persist(p2);
    em.getTransaction().commit();
  }

  public void objekteBearbeiten() {
    Polygon pl = em.createQuery("SELECT p FROM Polygon p", Polygon.class).getResultList().get(0);
    pl.getPunkte().remove(1);
    try {
      em.getTransaction().begin();
      em.persist(pl);
      em.getTransaction().commit();
    } catch (Exception e) {
      System.out.println(e.getLocalizedMessage());
    }
  }

  public void zeigePolygoneUndPunkte() {
    for (Polygon po : em.createQuery("SELECT p FROM Polygon p", Polygon.class).getResultList()) {
      System.out.println(po);
    }
    System.out.println("----");
    for (Punkt pu : em.createQuery("SELECT p FROM Punkt p", Punkt.class).getResultList()) {
      System.out.println(pu);
    }
  }

  public void schliessen() {
    if (em != null && em.isOpen()) {
      em.close();
    }
    if (emf != null && emf.isOpen()) {
      emf.close();
    }
  }

  public void anfragen(String ql) {
    try {
      Query query = em.createQuery(ql);
      Collection erg = query.getResultList();
      for (Iterator it = erg.iterator(); it.hasNext();) {
        System.out.println(it.next());
      }
    } catch (Exception e) {
      System.out.println("Anfrage gescheitert: "
                         + e.getMessage());
    }
  }


  public static void main(String[] args) {
    Main m = new Main();
    m.objekteErzeugen2();
    m.objekteBearbeiten();
    m.zeigePolygoneUndPunkte();
    m.anfragen("SELECT p FROM Punkt p WHERE p IN (SELECT OBJECT(pk) FROM Polygon pl JOIN pl.punkte pk)");
    m.schliessen();
  }

  public void persist(Object object) {
    em.getTransaction().begin();
    try {
      em.persist(object);
      em.getTransaction().commit();
    } catch (Exception e) {
      e.printStackTrace();
      em.getTransaction().rollback();
    } finally {
      em.close();
    }
  }
}
