package fr.lteconsulting.hexa.demo.client.persistence;
import java.util.HashMap;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.Query;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Root;
import com.google.gwt.core.shared.GWT;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.storage.client.Storage;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.RootPanel;
import fr.lteconsulting.hexa.client.tools.Action;
import fr.lteconsulting.hexa.persistence.client.legacy.persistence.Article;
import fr.lteconsulting.hexa.persistence.client.legacy.persistence.Category;
import fr.lteconsulting.hexa.persistence.client.legacy.persistence.PersistenceConfigurationFactory;
public class EMTest
{
private EntityManager em;
private void withinTransaction( Action a )
{
try
{
em.getTransaction().begin();
a.exec();
em.getTransaction().commit();
}
catch( Exception e )
{
em.getTransaction().rollback();
log( "An exception occurred during a JPA tx : " + e.getMessage() );
}
}
public void run()
{
// create persistence configuration
PersistenceConfigurationFactory configFactory = (PersistenceConfigurationFactory) GWT.create( MyPersistenceConfigurationFactory.class );
// initialize persistence parameters
HashMap<String, Object> parameters = new HashMap<String, Object>();
parameters.put( "entitiesConfiguration", configFactory.getPersistenceConfiguration() );
// create an entitymanager factory
EntityManagerFactory emf = Persistence.createEntityManagerFactory( "db1", parameters );
// create an entitymanager
em = emf.createEntityManager();
withinTransaction( testCreateArticles );
// withinTransaction( test1 );
// withinTransaction( test2 );
// withinTransaction( test3 );
// withinTransaction( test4 );
// withinTransaction( test5 );
// withinTransaction( test6 );
withinTransaction( test7 );
Button resetButton = new Button( "Clear Local Storage" );
RootPanel.get().add( resetButton );
resetButton.addClickHandler( new ClickHandler()
{
@Override
public void onClick( ClickEvent event )
{
Storage.getLocalStorageIfSupported().clear();
}
} );
}
private final Action test7 = new Action()
{
@Override
public void exec()
{
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Article> cq = cb.createQuery( Article.class );
Root<Article> e = cq.from(Article.class);
cq.multiselect( e.get( "name" ), e.<Integer>get( "price" ) );
//cq.multiselect( e.get( "name" ), cb.sum( e.<Integer>get( "price" ) ) );
//cq.where( cb.greaterThan( e.<Integer>get( "id" ), 5 ) );
//cq.groupBy( e.get( "name" ) );
Query query = em.createQuery(cq);
@SuppressWarnings( "unchecked" )
List<Object[]> a = query.getResultList();
log( "Query result count : " + a.size() );
for( Object[] row : a )
log( "name " + ((String)row[0]) + " price " + (row[1]) );
}
};
private final Action test1 = new Action()
{
@Override
public void exec()
{
CriteriaBuilder cb = em.getCriteriaBuilder();
em.find( Article.class, 1 );
CriteriaQuery<Article> cq = cb.createQuery( Article.class );
Root<Article> e = cq.from(Article.class);
cq.where( cb.equal( e.<Integer>get( "id" ), 5 ) );
Query query = em.createQuery(cq);
Article a = (Article) query.getSingleResult();
log( "Query result :" );
if( a == null )
{
log( "Article not found" );
}
else
{
log( "article: " + a );
a.getCategory().getCodeEAN();
log( " category : " + a.getCategory() );
}
}
};
@SuppressWarnings( "unused" )
private final Action test2 = new Action()
{
@Override
public void exec()
{
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Category> cq = cb.createQuery( Category.class );
Root<Category> e = cq.from(Category.class);
cq.where( cb.notEqual( e.<Integer>get( "id" ), 5 ) );
Query queryC = em.createQuery( cq );
List<Category> resultc = queryC.getResultList();
log( "Query results :" );
for( Category a : resultc )
{
log( "Category: " + a );
for( Article aaa : a.getArticles() )
log( " has " + aaa );
}
}
};
@SuppressWarnings( "unused" )
private final Action test3 = new Action()
{
@Override
public void exec()
{
Category c = em.find( Category.class, 1 );
if( c == null )
log( "NOT FOUND !" );
else
log( "FOUND ! " + c.toString() );
for( int i=0; i<3; i++ )
{
c = new Category();
c.setCodeEAN( "toto" );
c.setMarque( "ma marque" );
em.persist( c );
log( "inserted with id " + c.getId() );
}
c = em.find( Category.class, 1 );
if( c == null )
log( "NOT FOUND !" );
else
{
log( "FOUND ! " + c.toString() );
em.remove( c );
}
}
};
@SuppressWarnings( "unused" )
private final Action test4 = new Action()
{
@Override
public void exec()
{
Category c = new Category();
c.setCodeEAN( "TOTO" );
c.setMarque( "Marque jaune" );
Article a = new Article();
a.setName( "un article" );
a.setCategory( c );
em.persist( a );
em.persist( c );
log( "article:" + a.getId() + " category:" + c.getId() );
}
};
private final Action testCreateArticles = new Action()
{
@Override
public void exec()
{
Category c = new Category();
c.setCodeEAN( "TOTO" );
c.setMarque( "Marque jaune" );
em.persist( c );
for( int i=0; i<10; i++ )
{
Article a = new Article();
a.setName( "un article" );
a.setCategory( c );
a.setPrice( (int)(100 * Math.random()) );
em.persist( a );
}
log( "Persisted 10 articles" );
}
};
@SuppressWarnings( "unused" )
private final Action test5 = new Action()
{
@Override
public void exec()
{
Category c2 = em.find( Category.class, 44 );
Article a = em.find( Article.class, 4 );
if( a == null )
{
log( "not found article" );
}
else
{
log( "article 4 found : " + a );
a.getCategory().getCodeEAN();
log( "normally proxy is loaded : " + a );
}
a.setCategory( c2 );
}
};
@SuppressWarnings( "unused" )
private final Action test6 = new Action()
{
@Override
public void exec()
{
Category c = em.find( Category.class, 16 );
if( c != null )
{
log( "found category, here are the articles :" );
List<Article> articles = c.getArticles();
for( Article article : articles )
log( "article : " + article );
}
}
};
private void log( String text )
{
RootPanel.get().add( new Label( text ) );
}
}