Home » Eclipse Projects » Eclipse 4 » e4 DI, Gemini & Persistence
| | |
Re: e4 DI, Gemini & Persistence [message #799175 is a reply to message #798931] |
Wed, 15 February 2012 15:47 |
Filipp A. Messages: 49 Registered: February 2010 |
Member |
|
|
I playing with DS but not so successfully...
firsts i want to get EntityManagerFactory with annotation
@Inject
@PersistenceUnit(unitName="puTest")
EntityManagerFactory emf;
i have /OSGI-INF/geminiEMF.xml
<?xml version="1.0" encoding="UTF-8"?>
<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" name="geminiEMFsupplier">
<implementation class="org.e4.gemini.di.GeminiEMFObjectSupplier"/>
<service>
<provide interface="javax.persistence.EntityManagerFactory"/>
</service>
<property name="dependency.injection.annotation" type="String" value="javax.persistence.PersistenceUnit"/>
</scr:component>
in /META-INF/MANIFEST.MF i added
Service-Component: OSGI-INF/geminiEMF.xml
GeminiEMFObjectSupplier.java
package org.e4.gemini.di;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.HashMap;
import java.util.Map;
import javax.persistence.EntityManagerFactory;
import javax.persistence.spi.PersistenceUnitTransactionType;
import org.eclipse.e4.core.di.suppliers.ExtendedObjectSupplier;
import org.eclipse.e4.core.di.suppliers.IObjectDescriptor;
import org.eclipse.e4.core.di.suppliers.IRequestor;
import org.eclipse.persistence.config.PersistenceUnitProperties;
import org.osgi.framework.Bundle;
import org.osgi.framework.BundleContext;
import org.osgi.framework.FrameworkUtil;
import org.osgi.framework.InvalidSyntaxException;
import org.osgi.framework.ServiceReference;
import org.osgi.service.jpa.EntityManagerFactoryBuilder;
public class GeminiEMFObjectSupplier extends ExtendedObjectSupplier {
/**
* for future use
* Read config from preferences
* @Inject
* @Preference(value = "jdbc_driver")
*/
private String jdbc_driver = "org.gjt.mm.mysql.Driver";
private String jdbc_url = "jdbc:mysql://127.0.0.1/test";
private String jdbc_user = "test";
private String jdbc_password = "test";
private boolean ddl_drop_and_create_tables = true;
private boolean ddl_create_tables = false;
private int min_conn = 20;
private String logging = "FINEST";
@Override
public Object get(IObjectDescriptor descriptor, IRequestor requestor, boolean track, boolean group) {
Class<?> descriptorsClass = getDesiredClass(descriptor.getDesiredType());
String unitName = getUnitName(descriptor, requestor.getRequestingObjectClass());
EntityManagerFactoryBuilder emfb = lookupEntityManagerFactoryBuilder(unitName);
if(emfb == null){
System.err.println("EntityManagerFactoryBuilder is null...");
return null;
}
EntityManagerFactory emf = emfb.createEntityManagerFactory(getEntityManagerProperties());
//////////////////////////////////////////////
// ???????????????????????????????
//////////////////////////////////////////////
return null;
}
private Class<?> getDesiredClass(Type desiredType) {
if (desiredType instanceof Class<?>)
return (Class<?>) desiredType;
if (desiredType instanceof ParameterizedType) {
Type rawType = ((ParameterizedType) desiredType).getRawType();
if (rawType instanceof Class<?>)
return (Class<?>) rawType;
}
return null;
}
private String getUnitName(IObjectDescriptor descriptor, Class<?> requestingObject) {
if (descriptor == null)
return null;
GeminiPersistenceContext qualifier = descriptor.getQualifier(GeminiPersistenceContext.class);
return qualifier.unitName();
}
public EntityManagerFactoryBuilder lookupEntityManagerFactoryBuilder(String puName) {
//Get Context
Bundle bundle = FrameworkUtil.getBundle(getClass());
BundleContext context = bundle.getBundleContext();
//lookup EMFB
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);
}
System.out.println("EMF Builder Service refs looked up from registry: " + refs);
return (refs == null) ? null : (EntityManagerFactoryBuilder) context.getService(refs[0]);
}
protected Map<String, Object> getEntityManagerProperties(){
Map<String, Object> properties = new HashMap<String, Object>();
properties.put(PersistenceUnitProperties.TRANSACTION_TYPE, PersistenceUnitTransactionType.RESOURCE_LOCAL.name());
properties.put(PersistenceUnitProperties.JDBC_DRIVER, jdbc_driver );
properties.put(PersistenceUnitProperties.JDBC_URL, jdbc_url);
properties.put(PersistenceUnitProperties.JDBC_USER, jdbc_user);
properties.put(PersistenceUnitProperties.JDBC_PASSWORD, jdbc_password);
if(ddl_drop_and_create_tables) {
properties.put(PersistenceUnitProperties.DDL_GENERATION, "drop-and-create-tables");
}
if(ddl_create_tables) {
properties.put(PersistenceUnitProperties.DDL_GENERATION, "create-tables");
}
properties.put(PersistenceUnitProperties.DDL_GENERATION_MODE, "database");
properties.put(PersistenceUnitProperties.CONNECTION_POOL_MIN, min_conn);
properties.put(PersistenceUnitProperties.TEMPORAL_MUTABLE, "true");
// Logging
properties.put(PersistenceUnitProperties.LOGGING_LEVEL, logging);
properties.put(PersistenceUnitProperties.LOGGING_TIMESTAMP, "true");
properties.put(PersistenceUnitProperties.LOGGING_SESSION, "true");
properties.put(PersistenceUnitProperties.LOGGING_THREAD, "true");
properties.put(PersistenceUnitProperties.LOGGING_EXCEPTIONS, "true");
properties.put(PersistenceUnitProperties.WEAVING, "false");
properties.put(PersistenceUnitProperties.WEAVING_INTERNAL, "false");
// properties.put("eclipselink.weaving", "dynamic");
System.out.println(properties.toString());
return properties;
}
}
i am not really understand what must be in public Object get(IObjectDescriptor descriptor, IRequestor requestor, boolean track, boolean group)
can you please explain.
Did i forget anything else?
|
|
|
Re: e4 DI, Gemini &amp; Persistence [message #799312 is a reply to message #799175] |
Wed, 15 February 2012 18:22 |
Thomas Schindl Messages: 6651 Registered: July 2009 |
Senior Member |
|
|
I'd say you simply return emf instead of null in the get() - that's it.
Tom
Am 15.02.12 16:47, schrieb Filipp A.:
> I playing with DS but not so successfully...
> firsts i want to get EntityManagerFactory with annotation
>
> @Inject
> @PersistenceUnit(unitName="puTest")
> EntityManagerFactory emf;
>
> i have /OSGI-INF/geminiEMF.xml
>
> <?xml version="1.0" encoding="UTF-8"?>
> <scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0"
> name="geminiEMFsupplier">
> <implementation class="org.e4.gemini.di.GeminiEMFObjectSupplier"/>
> <service>
> <provide interface="javax.persistence.EntityManagerFactory"/>
> </service>
> <property name="dependency.injection.annotation" type="String"
> value="javax.persistence.PersistenceUnit"/>
> </scr:component>
>
> in /META-INF/MANIFEST.MF i added
>
> Service-Component: OSGI-INF/geminiEMF.xml
>
> GeminiEMFObjectSupplier.java
>
> package org.e4.gemini.di;
>
> import java.lang.reflect.ParameterizedType;
> import java.lang.reflect.Type;
> import java.util.HashMap;
> import java.util.Map;
>
> import javax.persistence.EntityManagerFactory;
> import javax.persistence.spi.PersistenceUnitTransactionType;
>
> import org.eclipse.e4.core.di.suppliers.ExtendedObjectSupplier;
> import org.eclipse.e4.core.di.suppliers.IObjectDescriptor;
> import org.eclipse.e4.core.di.suppliers.IRequestor;
> import org.eclipse.persistence.config.PersistenceUnitProperties;
> import org.osgi.framework.Bundle;
> import org.osgi.framework.BundleContext;
> import org.osgi.framework.FrameworkUtil;
> import org.osgi.framework.InvalidSyntaxException;
> import org.osgi.framework.ServiceReference;
> import org.osgi.service.jpa.EntityManagerFactoryBuilder;
>
> public class GeminiEMFObjectSupplier extends ExtendedObjectSupplier {
>
> /**
> * for future use
> * Read config from preferences
> * @Inject
> * @Preference(value = "jdbc_driver")
> */
> private String jdbc_driver = "org.gjt.mm.mysql.Driver";
> private String jdbc_url = "jdbc:mysql://127.0.0.1/test";
> private String jdbc_user = "test";
> private String jdbc_password = "test";
> private boolean ddl_drop_and_create_tables = true;
> private boolean ddl_create_tables = false;
> private int min_conn = 20;
> private String logging = "FINEST";
>
> @Override
> public Object get(IObjectDescriptor descriptor, IRequestor
> requestor, boolean track, boolean group) {
> Class<?> descriptorsClass =
> getDesiredClass(descriptor.getDesiredType());
> String unitName = getUnitName(descriptor,
> requestor.getRequestingObjectClass());
>
> EntityManagerFactoryBuilder emfb =
> lookupEntityManagerFactoryBuilder(unitName);
> if(emfb == null){
> System.err.println("EntityManagerFactoryBuilder is null...");
> return null;
> }
> EntityManagerFactory emf =
> emfb.createEntityManagerFactory(getEntityManagerProperties());
>
> //////////////////////////////////////////////
> // ???????????????????????????????
> //////////////////////////////////////////////
>
> return null;
> }
>
> private Class<?> getDesiredClass(Type desiredType) {
> if (desiredType instanceof Class<?>)
> return (Class<?>) desiredType;
> if (desiredType instanceof ParameterizedType) {
> Type rawType = ((ParameterizedType) desiredType).getRawType();
> if (rawType instanceof Class<?>)
> return (Class<?>) rawType;
> }
> return null;
> }
>
> private String getUnitName(IObjectDescriptor descriptor, Class<?>
> requestingObject) {
> if (descriptor == null)
> return null;
> GeminiPersistenceContext qualifier =
> descriptor.getQualifier(GeminiPersistenceContext.class);
> return qualifier.unitName();
> }
>
> public EntityManagerFactoryBuilder
> lookupEntityManagerFactoryBuilder(String puName) {
> //Get Context
> Bundle bundle = FrameworkUtil.getBundle(getClass());
> BundleContext context = bundle.getBundleContext();
>
> //lookup EMFB
> 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);
> }
> System.out.println("EMF Builder Service refs looked up from
> registry: " + refs);
> return (refs == null) ? null : (EntityManagerFactoryBuilder)
> context.getService(refs[0]);
> }
>
> protected Map<String, Object> getEntityManagerProperties(){
> Map<String, Object> properties = new HashMap<String, Object>();
> properties.put(PersistenceUnitProperties.TRANSACTION_TYPE,
> PersistenceUnitTransactionType.RESOURCE_LOCAL.name());
> properties.put(PersistenceUnitProperties.JDBC_DRIVER,
> jdbc_driver );
> properties.put(PersistenceUnitProperties.JDBC_URL, jdbc_url);
> properties.put(PersistenceUnitProperties.JDBC_USER, jdbc_user);
> properties.put(PersistenceUnitProperties.JDBC_PASSWORD,
> jdbc_password);
> if(ddl_drop_and_create_tables) {
> properties.put(PersistenceUnitProperties.DDL_GENERATION,
> "drop-and-create-tables");
> }
> if(ddl_create_tables) {
> properties.put(PersistenceUnitProperties.DDL_GENERATION,
> "create-tables");
> }
> properties.put(PersistenceUnitProperties.DDL_GENERATION_MODE,
> "database");
> properties.put(PersistenceUnitProperties.CONNECTION_POOL_MIN,
> min_conn);
>
> properties.put(PersistenceUnitProperties.TEMPORAL_MUTABLE, "true");
>
> // Logging
> properties.put(PersistenceUnitProperties.LOGGING_LEVEL, logging);
> properties.put(PersistenceUnitProperties.LOGGING_TIMESTAMP,
> "true");
> properties.put(PersistenceUnitProperties.LOGGING_SESSION, "true");
> properties.put(PersistenceUnitProperties.LOGGING_THREAD, "true");
> properties.put(PersistenceUnitProperties.LOGGING_EXCEPTIONS,
> "true");
>
> properties.put(PersistenceUnitProperties.WEAVING, "false");
> properties.put(PersistenceUnitProperties.WEAVING_INTERNAL,
> "false");
> // properties.put("eclipselink.weaving", "dynamic");
>
> System.out.println(properties.toString());
> return properties;
> }
> }
>
>
> i am not really understand what must be in public Object
> get(IObjectDescriptor descriptor, IRequestor requestor, boolean track,
> boolean group)
> can you please explain.
> Did i forget anything else?
|
|
| |
Re: e4 DI, Gemini &amp; Persistence [message #799421 is a reply to message #799320] |
Wed, 15 February 2012 21:41 |
Filipp A. Messages: 49 Registered: February 2010 |
Member |
|
|
i have made own implementation of PersistenceUnit -> GeminiPersistenceUnit
package org.e4.gemini.di;
import java.lang.annotation.Target;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import javax.inject.Qualifier;
@Qualifier
@Target({ ElementType.TYPE, ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER })
@Retention(RetentionPolicy.RUNTIME)
public @interface GeminiPersistenceUnit {
String name() default "";
String unitName() default "";
}
and yet i get only one exception
org.eclipse.e4.core.di.InjectionException: Unable to process "OpenHandler.emf": no actual value was found for the argument "EntityManagerFactory[@org.e4.gemini.di.GeminiPersistenceUnit(unitName=puTest, name=test)]".
at org.eclipse.e4.core.internal.di.InjectorImpl.reportUnresolvedArgument(InjectorImpl.java:387)
...
i checked already everything...
my actual code
/OSGI-INF/geminiEMF.xml
<?xml version="1.0" encoding="UTF-8"?>
<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" name="org.e4.gemini.util">
<implementation class="org.e4.gemini.di.GeminiEMFObjectSupplier"/>
<service>
<provide interface="org.e4.gemini.di.GeminiPersistenceUnit"/>
</service>
<property name="dependency.injection.annotation" type="String" value="org.e4.gemini.di.GeminiPersistenceUnit"/>
</scr:component>
META-INF/MANIFEST.MF
Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name:
Gemini DI
Bundle-SymbolicName: org.e4.gemini.util
Bundle-Version: 1.0.0.qualifier
Bundle-RequiredExecutionEnvironment: JavaSE-1.6
Import-Package: org.osgi.framework;version="1.3.0",
javax.annotation;version="1.0.0",
javax.inject;version="1.0.0"
Require-Bundle: javax.persistence;bundle-version="2.0.3";visibility:=reexport,
org.eclipse.persistence.antlr;bundle-version="2.3.2";visibility:=reexport,
org.eclipse.persistence.asm;bundle-version="2.3.2";visibility:=reexport,
org.eclipse.persistence.core;bundle-version="2.3.2";visibility:=reexport,
org.eclipse.persistence.jpa;bundle-version="2.3.2";visibility:=reexport,
javax.inject;bundle-version="1.0.0";visibility:=reexport,
org.eclipse.equinox.ds;bundle-version="1.4.0",
org.eclipse.e4.core.di;bundle-version="1.1.0",
org.eclipse.swt;bundle-version="3.7.0",
org.eclipse.equinox.common;bundle-version="3.6.0",
org.eclipse.e4.core.contexts;bundle-version="0.9.0",
org.eclipse.osgi;bundle-version="3.7.0",
org.eclipse.e4.core.services;bundle-version="0.9.1"
Export-Package: org.e4.gemini.di,
org.e4.gemini.util
Service-Component: OSGI-INF/geminiEMF.xml
Bundle-ActivationPolicy: lazy
GeminiEMFObjectSupplier.java
package org.e4.gemini.di;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.HashMap;
import java.util.Map;
import javax.persistence.EntityManagerFactory;
import javax.persistence.spi.PersistenceUnitTransactionType;
import org.eclipse.e4.core.di.suppliers.ExtendedObjectSupplier;
import org.eclipse.e4.core.di.suppliers.IObjectDescriptor;
import org.eclipse.e4.core.di.suppliers.IRequestor;
import org.eclipse.persistence.config.PersistenceUnitProperties;
import org.osgi.framework.Bundle;
import org.osgi.framework.BundleContext;
import org.osgi.framework.FrameworkUtil;
import org.osgi.framework.InvalidSyntaxException;
import org.osgi.framework.ServiceReference;
import org.osgi.service.jpa.EntityManagerFactoryBuilder;
@SuppressWarnings("restriction")
public class GeminiEMFObjectSupplier extends ExtendedObjectSupplier {
/**
* for future use
* Read config from preferences
* @Inject
* @Preference(value = "jdbc_driver")
*/
private String jdbc_driver = "org.gjt.mm.mysql.Driver";
private String jdbc_url = "jdbc:mysql://127.0.0.1/test";
private String jdbc_user = "test";
private String jdbc_password = "test";
private boolean ddl_drop_and_create_tables = true;
private boolean ddl_create_tables = false;
private int min_conn = 20;
private String logging = "FINEST";
@Override
public Object get(IObjectDescriptor descriptor, IRequestor requestor, boolean track, boolean group) {
// Class<?> descriptorsClass = getDesiredClass(descriptor.getDesiredType());
String unitName = getUnitName(descriptor, requestor.getRequestingObjectClass());
// String unitName = "puTest";
EntityManagerFactoryBuilder emfb = lookupEntityManagerFactoryBuilder(unitName);
if(emfb == null){
System.err.println("EntityManagerFactoryBuilder is null...");
return null;
}
EntityManagerFactory emf = emfb.createEntityManagerFactory(getEntityManagerProperties());
return emf;
}
// private Class<?> getDesiredClass(Type desiredType) {
// if (desiredType instanceof Class<?>)
// return (Class<?>) desiredType;
// if (desiredType instanceof ParameterizedType) {
// Type rawType = ((ParameterizedType) desiredType).getRawType();
// if (rawType instanceof Class<?>)
// return (Class<?>) rawType;
// }
// return null;
// }
private String getUnitName(IObjectDescriptor descriptor, Class<?> requestingObject) {
if (descriptor == null)
return null;
GeminiPersistenceUnit qualifier = descriptor.getQualifier(GeminiPersistenceUnit.class);
return qualifier.unitName();
}
public EntityManagerFactoryBuilder lookupEntityManagerFactoryBuilder(String puName) {
//Get Context
Bundle bundle = FrameworkUtil.getBundle(getClass());
BundleContext context = bundle.getBundleContext();
//lookup EMFB
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);
}
// System.out.println("EMF Builder Service refs looked up from registry: " + refs);
return (refs == null) ? null : (EntityManagerFactoryBuilder) context.getService(refs[0]);
}
protected Map<String, Object> getEntityManagerProperties(){
Map<String, Object> properties = new HashMap<String, Object>();
properties.put(PersistenceUnitProperties.TRANSACTION_TYPE, PersistenceUnitTransactionType.RESOURCE_LOCAL.name());
properties.put(PersistenceUnitProperties.JDBC_DRIVER, jdbc_driver );
properties.put(PersistenceUnitProperties.JDBC_URL, jdbc_url);
properties.put(PersistenceUnitProperties.JDBC_USER, jdbc_user);
properties.put(PersistenceUnitProperties.JDBC_PASSWORD, jdbc_password);
if(ddl_drop_and_create_tables) {
properties.put(PersistenceUnitProperties.DDL_GENERATION, "drop-and-create-tables");
}
if(ddl_create_tables) {
properties.put(PersistenceUnitProperties.DDL_GENERATION, "create-tables");
}
properties.put(PersistenceUnitProperties.DDL_GENERATION_MODE, "database");
properties.put(PersistenceUnitProperties.CONNECTION_POOL_MIN, min_conn);
properties.put(PersistenceUnitProperties.TEMPORAL_MUTABLE, "true");
// Logging
properties.put(PersistenceUnitProperties.LOGGING_LEVEL, logging);
properties.put(PersistenceUnitProperties.LOGGING_TIMESTAMP, "true");
properties.put(PersistenceUnitProperties.LOGGING_SESSION, "true");
properties.put(PersistenceUnitProperties.LOGGING_THREAD, "true");
properties.put(PersistenceUnitProperties.LOGGING_EXCEPTIONS, "true");
properties.put(PersistenceUnitProperties.WEAVING, "false");
properties.put(PersistenceUnitProperties.WEAVING_INTERNAL, "false");
// properties.put("eclipselink.weaving", "dynamic");
// System.out.println(properties.toString());
return properties;
}
}
|
|
| |
Goto Forum:
Current Time: Thu May 16 16:12:32 GMT 2024
Powered by FUDForum. Page generated in 0.03187 seconds
|