/******************************************************************************* * Copyright (c) 2009 Oracle and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Shaun Smith - initial API and implementation * EclipseSource - Additional work *******************************************************************************/ package org.eclipse.examples.toast.backend.data.persistence; import java.util.Collection; import java.util.Map; import javax.persistence.EntityManager; import javax.persistence.EntityManagerFactory; import javax.persistence.NoResultException; import javax.persistence.NonUniqueResultException; import org.eclipse.examples.toast.backend.controlcenter.IData; import org.eclipse.examples.toast.backend.data.IDriver; import org.eclipse.examples.toast.backend.data.IVehicle; import org.eclipse.examples.toast.backend.data.IWaybill; import org.eclipse.examples.toast.backend.data.internal.Vehicle; import org.eclipse.persistence.config.PersistenceUnitProperties; import org.eclipse.persistence.jpa.osgi.PersistenceProvider; public class ToastDataManager implements IData { private static EntityManagerFactory emf; protected String databaseLocation; public ToastDataManager() { } private EntityManagerFactory initEntityManagerFactory(Map<String, Object> properties) { if (emf == null) { ClassLoader classLoader = this.getClass().getClassLoader(); properties.put(PersistenceUnitProperties.CLASSLOADER, classLoader); // properties.put(PersistenceUnitProperties.NON_JTA_DATASOURCE, createDataSource()); addPersistenceUnitProperties(properties); // Properties props = new Properties(); // props.put("user", "app"); // props.put("password", "app"); // try { // Connection connection = new ClientDriver().connect("jdbc:derby://localhost/toast;create=true", props); // System.out.println(connection); // } catch (SQLException e) { // // TODO Auto-generated catch block // e.printStackTrace(); // } emf = new PersistenceProvider().createEntityManagerFactory(getPersistenceUnitName(), properties); } return emf; } // private DataSource createDataSource() { // ClientDataSource dataSource = new ClientDataSource(); // dataSource.setServerName("localhost"); // dataSource.setPortNumber(1527); // dataSource.setDatabaseName("toast"); // dataSource.setUser("app"); // dataSource.setPassword("app"); // return dataSource; // } protected void addPersistenceUnitProperties(Map<String, Object> properties) { } protected String getPersistenceUnitName() { return "toast"; } public void update(IVehicle object) { update((Object) object); } public void update(Object object) { EntityManager em = null; try { em = emf.createEntityManager(); em.getTransaction().begin(); em.merge(object); em.getTransaction().commit(); } finally { em.close(); } } @SuppressWarnings("unchecked") public Collection<IVehicle> getVehicles() { EntityManager em = null; try { em = emf.createEntityManager(); return em.createNamedQuery("Vehicle.findAll").getResultList(); } finally { em.close(); } } @SuppressWarnings("unchecked") public Collection<IWaybill> getWaybills() { EntityManager em = null; try { em = emf.createEntityManager(); return em.createNamedQuery("Waybill.findAll").getResultList(); } finally { em.close(); } } @SuppressWarnings("unchecked") public Collection<IDriver> getDrivers() { EntityManager em = null; try { em = emf.createEntityManager(); return em.createNamedQuery("Driver.findAll").getResultList(); } finally { em.close(); } } public IVehicle getVehicleFor(IWaybill waybill) { EntityManager em = null; try { em = emf.createEntityManager(); return (IVehicle) em.createNamedQuery("Vehicle.findByWaybillId").setParameter("waybillId", waybill.getId()).getSingleResult(); } catch (NoResultException e) { return null; } finally { em.close(); } } public IVehicle getVehicleFor(IDriver driver) { EntityManager em = null; try { em = emf.createEntityManager(); return (IVehicle) em.createNamedQuery("Vehicle.findByDriverId").setParameter("driverId", driver.getId()).getSingleResult(); } catch (NoResultException e) { return null; } finally { em.close(); } } public void persist(IVehicle object) { persist((Object) object); } @SuppressWarnings("unchecked") public void persist(Object object) { EntityManager em = null; try { em = emf.createEntityManager(); em.getTransaction().begin(); em.persist(object); em.getTransaction().commit(); } finally { if (em != null) { em.close(); } } } public void startup(Map properties) { initEntityManagerFactory(properties); } public void shutdown() { emf.close(); } public Collection getVehicleNames() { EntityManager em = null; try { em = emf.createEntityManager(); return em.createQuery("select v.name from Vehicle").getResultList(); } finally { em.close(); } } public IVehicle getVehicle(String name) { EntityManager em = null; try { em = emf.createEntityManager(); return (IVehicle) em.createQuery("select v from Vehicle v where v.name = :name").setParameter("name", name).getSingleResult(); } finally { em.close(); } } public void removeVehicle(String name) { EntityManager em = null; try { em = emf.createEntityManager(); em.getTransaction().begin(); Vehicle vehicle = (Vehicle) em.createQuery("select v from Vehicle v where v.name = :name").setParameter("name", name).getSingleResult(); em.remove(vehicle); em.getTransaction().commit(); } catch (NoResultException e) { // TODO what to do in case Vehicle to remove does not exist? } catch (NonUniqueResultException e) { // TODO what to do in case multiple Vehicles have same name? } finally { em.close(); } } }