Skip to main content


Eclipse Community Forums
Forum Search:

Search      Help    Register    Login    Home
Home » Eclipse Projects » Gemini » [Gemini JPA] Migration from EL OSGI to Gemini JPA
[Gemini JPA] Migration from EL OSGI to Gemini JPA [message #754776] Fri, 04 November 2011 09:58 Go to next message
Filipp A. is currently offline Filipp A.Friend
Messages: 49
Registered: February 2010
Member
Hi All!
After Gemini JPA 1.0 is released, I trying to migrate my RCP apps from Eclipselink OSGI to Gemini JPA, but no luck....
in my RCP app I have AbstractDaoActivator, it's look like :

import java.util.HashMap;
import java.util.Map;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.spi.PersistenceUnitTransactionType;

import org.eclipse.persistence.config.PersistenceUnitProperties;
import org.eclipse.persistence.jpa.osgi.PersistenceProvider;
import org.osgi.framework.BundleActivator;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

abstract public class AbstractDaoActivator implements BundleActivator, IDAO {
	
	private static AbstractDaoActivator plugin;
	/** logger for this class*/
	protected static final Logger logger = LoggerFactory.getLogger(AbstractDaoActivator.class);
	// JPA
	private static EntityManagerFactory entityManagerFactory;
	private static ThreadLocal<EntityManager> threadLocal = new ThreadLocal<EntityManager>();
    	private static Object lock = new Object();  
	private ClassLoader modelClassLoader;
	private String persistenceUnitName;
	
	public AbstractDaoActivator(ClassLoader modelClassLoader, String persistenceUnitName){
		plugin = this;
		this.modelClassLoader = modelClassLoader;
		this.persistenceUnitName = persistenceUnitName;
	}
	
	public static AbstractDaoActivator getDefault(){
		return plugin;
	}
	
	@Override
  	  public void connect(){
    		initEntityManager();
    	}

	public EntityManager getEntityManager(){
		if(threadLocal.get() == null || !threadLocal.get().isOpen()){
//			logger.warn("EntityManager is null or closed.... set the new one...");
		threadLocal.set(entityManagerFactory.createEntityManager());
	    }
	    return threadLocal.get();
	}
		
	@Override
   	public void disconnect(){
    	//JPA
		synchronized (lock) {
			if (entityManagerFactory != null){
				entityManagerFactory.close();
			}
		}
    	}
	
	private void initEntityManager() {
		entityManagerFactory = new PersistenceProvider().createEntityManagerFactory(persistenceUnitName, getEntityManagerProperties());
	}
    
    
	protected Map<String, Object> getEntityManagerProperties(){
		Map<String, Object> properties = new HashMap<String, Object>();
		properties.put("javax.persistence.transactionType", PersistenceUnitTransactionType.RESOURCE_LOCAL.name());
		properties.put("javax.persistence.jdbc.driver", (System.getProperty("javax.persistence.jdbc.driver") == null) ? "com.mysql.jdbc.Driver" : System.getProperty("javax.persistence.jdbc.driver"));
		properties.put("javax.persistence.jdbc.url", (System.getProperty("javax.persistence.jdbc.url") == null) ? "jdbc:mysql://127.0.0.1/test" : System.getProperty("javax.persistence.jdbc.url")); // + ";create=true"
		properties.put("javax.persistence.jdbc.user", (System.getProperty("javax.persistence.jdbc.user") == null) ? "test" : System.getProperty("javax.persistence.jdbc.user"));
		properties.put("javax.persistence.jdbc.password", (System.getProperty("javax.persistence.jdbc.password") == null) ? "test" : System.getProperty("javax.persistence.jdbc.password"));
		if(System.getProperty("wrapper.eclipselink.drop-and-create-tables").equals("yes")) {
			properties.put("eclipselink.ddl-generation", "drop-and-create-tables");
		}
		if(System.getProperty("wrapper.eclipselink.create-tables").equals("yes")) {
			properties.put("eclipselink.ddl-generation", "create-tables");
		}
		properties.put("eclipselink.ddl-generation.output-mode", "database");
	//	properties.put("eclipselink.jdbc.read-connections.min", (System.getProperty("wrapper.eclipselink.read-connections.min") == null) ? "1" : System.getProperty("wrapper.eclipselink.read-connections.min"));
		properties.put("eclipselink.jdbc.write-connections.min", (System.getProperty("wrapper.eclipselink.write-connections.min") == null) ? "20" : System.getProperty("wrapper.eclipselink.write-connections.min"));
	//	properties.put("eclipselink.cache.shared.default", "true");
	//	properties.put("eclipselink.jdbc.batch-writing", "JDBC");
	
		// ClassLoader
		properties.put(PersistenceUnitProperties.CLASSLOADER, this.modelClassLoader);
		
		// Logging
		properties.put("eclipselink.logging.level", (System.getProperty("eclipselink.logging.level") == null) ? "FINEST" : System.getProperty("eclipselink.logging.level")); // OFF FINEST
		properties.put("eclipselink.logging.timestamp", "true");
		properties.put("eclipselink.logging.session", "true");
		properties.put("eclipselink.logging.thread", "true");
		properties.put("eclipselink.logging.exceptions", "true");
		
		// Custom Sequences
		properties.put("eclipselink.session.customizer", "wrapper.eclipselink.UUIDSequence");
	
//		properties.put("eclipselink.weaving.changetracking", "false");
//		properties.put("eclipselink.weaving", "true");
//		properties.put("eclipselink.weaving", "dynamic");

		logger.debug(properties.toString());
		return properties;
	}


it's work fine if I have only one persistence.xml

if I understand it right, I must change org.eclipse.persistence.jpa.osgi.PersistenceProvider to org.eclipse.gemini.jpa.provider. PersistenceProvider and I don't need to set ClassLoader any more. Is it correct ?

But, if I try to start my app only what I get, is :

[EL Warning]: 2011-11-04 10:17:09.362--Thread(Thread[Start Level Event Dispatcher,5,main])--The collection of metamodel types is empty. Model classes may not have been found during entity search for Java SE and some Java EE container managed persistence units.  Please verify that your entity classes are referenced in persistence.xml using either <class> elements or a global <exclude-unlisted-classes>false</exclude-unlisted-classes> element


did i something forget?
any Ideas?

Thanks in advance!!
Re: [Gemini JPA] Migration from EL OSGI to Gemini JPA [message #755003 is a reply to message #754776] Sun, 06 November 2011 15:57 Go to previous message
Filipp A. is currently offline Filipp A.Friend
Messages: 49
Registered: February 2010
Member
Problem solved !
If somebody needs, see below:

import java.util.HashMap;
import java.util.Map;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.spi.PersistenceUnitTransactionType;

import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;
import org.osgi.framework.InvalidSyntaxException;
import org.osgi.framework.ServiceReference;
import org.osgi.service.jpa.EntityManagerFactoryBuilder;
import org.osgi.util.tracker.ServiceTracker;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

abstract public class AbstractDaoActivator implements BundleActivator, IDAO {
	
	private static AbstractDaoActivator plugin;
	protected static BundleContext context;
	/** logger for this class*/
	protected static final Logger logger = LoggerFactory.getLogger(AbstractDaoActivator.class);
	// JPA
	private static EntityManagerFactory entityManagerFactory;
	private static ThreadLocal<EntityManager> threadLocal = new ThreadLocal<EntityManager>();
  	private static Object lock = new Object();  
	private String persistenceUnitName;
	private ServiceTracker<?,?> emfTracker;
	
	public AbstractDaoActivator(String persistenceUnitName){
		plugin = this;
		this.persistenceUnitName = persistenceUnitName;
	}
	
	public static AbstractDaoActivator getDefault(){
		return plugin;
	}
	
	
	@Override
	public void connect(){
		EMFServiceTracker st = new EMFServiceTracker(context);
		emfTracker = new ServiceTracker(context, EntityManagerFactory.class.getName(), st);
		emfTracker.open();
    		initEntityManager();
    	}
    
	public EntityManager getEntityManager(){
		if(threadLocal.get() == null || !threadLocal.get().isOpen()){
//			logger.warn("EntityManager is null or closed.... set the new one...");
	            threadLocal.set(entityManagerFactory.createEntityManager());
	    }
	    return threadLocal.get();

	}

	@Override
	public void disconnect(){
    	//JPA
		synchronized (lock) {
			if (entityManagerFactory != null){
				entityManagerFactory.close();
			}
		}
    	}
	
	private void initEntityManager() {	
		EntityManagerFactoryBuilder emfb = lookupEntityManagerFactoryBuilder(persistenceUnitName);
		if(emfb == null){
			return;
		}
		entityManagerFactory = emfb.createEntityManagerFactory(getEntityManagerProperties());
	}
    
    
	protected Map<String, Object> getEntityManagerProperties(){
                Map<String, Object> properties = new HashMap<String, Object>();
                properties.put("javax.persistence.transactionType", PersistenceUnitTransactionType.RESOURCE_LOCAL.name());
                properties.put("javax.persistence.jdbc.driver", (System.getProperty("javax.persistence.jdbc.driver") == null) ? "com.mysql.jdbc.Driver" : System.getProperty("javax.persistence.jdbc.driver"));
                properties.put("javax.persistence.jdbc.url", (System.getProperty("javax.persistence.jdbc.url") == null) ? "jdbc:mysql://127.0.0.1/test" : System.getProperty("javax.persistence.jdbc.url")); // + ";create=true"
                properties.put("javax.persistence.jdbc.user", (System.getProperty("javax.persistence.jdbc.user") == null) ? "test" : System.getProperty("javax.persistence.jdbc.user"));
                properties.put("javax.persistence.jdbc.password", (System.getProperty("javax.persistence.jdbc.password") == null) ? "test" : System.getProperty("javax.persistence.jdbc.password"));
                if(System.getProperty("wrapper.eclipselink.drop-and-create-tables").equals("yes")) {
                        properties.put("eclipselink.ddl-generation", "drop-and-create-tables");
                }
                if(System.getProperty("wrapper.eclipselink.create-tables").equals("yes")) {
                        properties.put("eclipselink.ddl-generation", "create-tables");
                }
                properties.put("eclipselink.ddl-generation.output-mode", "database");
        //      properties.put("eclipselink.jdbc.read-connections.min", (System.getProperty("wrapper.eclipselink.read-connections.min") == null) ? "1" : System.getProperty("wrapper.eclipselink.read-connections.min"));
                properties.put("eclipselink.jdbc.write-connections.min", (System.getProperty("wrapper.eclipselink.write-connections.min") == null) ? "20" : System.getProperty("wrapper.eclipselink.write-connections.min"));
        //      properties.put("eclipselink.cache.shared.default", "true");
        //      properties.put("eclipselink.jdbc.batch-writing", "JDBC");
        
                // Logging
                properties.put("eclipselink.logging.level", (System.getProperty("eclipselink.logging.level") == null) ? "FINEST" : System.getProperty("eclipselink.logging.level")); // OFF FINEST
                properties.put("eclipselink.logging.timestamp", "true");
                properties.put("eclipselink.logging.session", "true");
                properties.put("eclipselink.logging.thread", "true");
                properties.put("eclipselink.logging.exceptions", "true");
                
                // Custom Sequences
                properties.put("eclipselink.session.customizer", "wrapper.eclipselink.UUIDSequence");
        
//              properties.put("eclipselink.weaving.changetracking", "false");
//              properties.put("eclipselink.weaving", "true");
//              properties.put("eclipselink.weaving", "dynamic");

                logger.debug(properties.toString());
                return properties;
        }

		
	public EntityManagerFactoryBuilder lookupEntityManagerFactoryBuilder(String puName) {
		String filter = "(osgi.unit.name="+puName+")";
		ServiceReference[] refs = null;
	        try {
	            refs = context.getServiceReferences(EntityManagerFactoryBuilder.class.getName(), filter);
	        } catch (InvalidSyntaxException isEx) {
	            new RuntimeException("Bad filter", isEx);
	        }
	        return (refs == null) ? null : (EntityManagerFactoryBuilder) context.getService(refs[0]);
	    }
	
	public static EntityManagerFactory lookupEntityManagerFactory(String puName) {
		String filter = "(osgi.unit.name=" + puName + ")";
		ServiceReference[] refs = null;
		try {
			refs = context.getServiceReferences(EntityManagerFactory.class.getName(), filter);
		} catch (InvalidSyntaxException isEx) {
			new RuntimeException("Bad filter", isEx);
		}
		System.out.println("EMF Service refs looked up from registry: " + refs);
		return (refs == null) ? null : (EntityManagerFactory) context.getService(refs[0]);
	}
}


import org.osgi.framework.Bundle;
import org.osgi.framework.BundleContext;
import org.osgi.framework.ServiceReference;
import org.osgi.service.jpa.EntityManagerFactoryBuilder;
import org.osgi.util.tracker.ServiceTrackerCustomizer;

@SuppressWarnings("rawtypes")
public class EMFServiceTracker implements ServiceTrackerCustomizer{
	@SuppressWarnings("unused")
	private final BundleContext context;

	public EMFServiceTracker(BundleContext context) {
		this.context = context;
	}
	@Override
	public Object addingService(ServiceReference reference) {
		Bundle b = reference.getBundle();
		@SuppressWarnings("unchecked")
		Object service = b.getBundleContext().getService(reference);
		String unitName = (String) reference.getProperty(EntityManagerFactoryBuilder.JPA_UNIT_NAME);
		return service;
	}

	@Override
	public void modifiedService(ServiceReference reference, Object service) {}

	@Override
	public void removedService(ServiceReference reference, Object service) {}

}

and don't forget:
add bundle osgi.enterprise
put in manifest dependencies org.osgi.service.jpa, org.osgi.util.tracker
and add to model bundle manifest Meta-Persistence: and JPA-PersistenceUnits:


that's all

and one more thing, I think it's a bug, if you export for example as RAP Project and your model plugin is as jar and not as directory, your probably get java.net.MalformedURLException caused by org.eclipse.persistence.internal.jpa.deployment.PersistenceUnitProcessor.processPersistenceXML

Previous Topic:web-bundle problem with blueprint (context path already exists)
Next Topic:Gemini JPA] predeploy Exception
Goto Forum:
  


Current Time: Fri Apr 26 14:42:41 GMT 2024

Powered by FUDForum. Page generated in 0.04028 seconds
.:: Contact :: Home ::.

Powered by: FUDforum 3.0.2.
Copyright ©2001-2010 FUDforum Bulletin Board Software

Back to the top