Author: simoneg
Date: Mon Nov 15 18:52:57 2010
New Revision: 1035408

URL: http://svn.apache.org/viewvc?rev=1035408&view=rev
Log:
Hibernate JPA-DB implementation

Added:
    labs/magma/trunk/database-hibernate/pom.xml
    labs/magma/trunk/database-hibernate/src/
    labs/magma/trunk/database-hibernate/src/main/
    labs/magma/trunk/database-hibernate/src/main/java/
    labs/magma/trunk/database-hibernate/src/main/java/org/
    labs/magma/trunk/database-hibernate/src/main/java/org/apache/
    labs/magma/trunk/database-hibernate/src/main/java/org/apache/magma/
    labs/magma/trunk/database-hibernate/src/main/java/org/apache/magma/database/
    
labs/magma/trunk/database-hibernate/src/main/java/org/apache/magma/database/hibernate/
    
labs/magma/trunk/database-hibernate/src/main/java/org/apache/magma/database/hibernate/OverrideAnnotations.aj
    
labs/magma/trunk/database-hibernate/src/main/java/org/apache/magma/database/hibernate/RegisterHibernateClasses.aj
    labs/magma/trunk/database-hibernate/src/main/java/org/apache/openjpa/
    
labs/magma/trunk/database-hibernate/src/main/java/org/apache/openjpa/persistence/
    
labs/magma/trunk/database-hibernate/src/main/java/org/apache/openjpa/persistence/ElementDependent.java
    labs/magma/trunk/database-hibernate/src/main/resources/
    labs/magma/trunk/database-hibernate/src/test/
    labs/magma/trunk/database-hibernate/src/test/java/
    labs/magma/trunk/database-hibernate/src/test/resources/

Added: labs/magma/trunk/database-hibernate/pom.xml
URL: 
http://svn.apache.org/viewvc/labs/magma/trunk/database-hibernate/pom.xml?rev=1035408&view=auto
==============================================================================
--- labs/magma/trunk/database-hibernate/pom.xml (added)
+++ labs/magma/trunk/database-hibernate/pom.xml Mon Nov 15 18:52:57 2010
@@ -0,0 +1,98 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0"; 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"; 
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
http://maven.apache.org/xsd/maven-4.0.0.xsd";>
+  <modelVersion>4.0.0</modelVersion>
+  <parent>
+    <artifactId>magma-parent</artifactId>
+    <groupId>org.apache.magma</groupId>
+    <version>3</version>
+  </parent>
+  <groupId>org.apache.magma</groupId>
+  <artifactId>database-hibernate</artifactId>
+  <version>0.0.3-SNAPSHOT</version>
+  <packaging>magma</packaging>
+  <name>Magma Database Hibernate</name>
+  <dependencies>
+    <dependency>
+      <groupId>org.apache.magma</groupId>
+      <artifactId>database-jpa</artifactId>
+      <version>0.0.3-SNAPSHOT</version>
+               <exclusions>
+                       <exclusion>
+                               <groupId>org.apache.geronimo.specs</groupId>
+                               <artifactId>geronimo-jpa_3.0_spec</artifactId>
+                       </exclusion>
+               </exclusions>
+    </dependency>
+    <dependency>
+       <groupId>org.hibernate</groupId>
+       <artifactId>hibernate-entitymanager</artifactId>
+       <version>3.5.6-Final</version>
+               <exclusions>
+                       <exclusion>
+                               <groupId>org.slf4j</groupId>
+                               <artifactId>slf4j-api</artifactId>
+                       </exclusion>
+               </exclusions>
+    </dependency>
+    <dependency>
+       <groupId>org.hibernate</groupId>
+       <artifactId>hibernate-c3p0</artifactId>
+       <version>3.5.6-Final</version>
+               <exclusions>
+                       <exclusion>
+                               <groupId>org.slf4j</groupId>
+                               <artifactId>slf4j-api</artifactId>
+                       </exclusion>
+               </exclusions>
+    </dependency>
+    <dependency>
+       <groupId>org.hibernate</groupId>
+       <artifactId>hibernate-ehcache</artifactId>
+       <version>3.5.6-Final</version>
+               <exclusions>
+                       <exclusion>
+                               <groupId>org.slf4j</groupId>
+                               <artifactId>slf4j-api</artifactId>
+                       </exclusion>
+                       <exclusion>
+                               <groupId>net.sf.ehcache</groupId>
+                               <artifactId>ehcache</artifactId>
+                       </exclusion>
+               </exclusions>
+    </dependency>
+    <dependency>
+               <groupId>net.sf.ehcache</groupId>
+               <artifactId>ehcache-core</artifactId>
+               <version>2.0.1</version>        
+               <exclusions>
+                       <exclusion>
+                               <groupId>org.slf4j</groupId>
+                               <artifactId>slf4j-api</artifactId>
+                       </exclusion>
+               </exclusions>
+    </dependency>
+    <dependency>
+       <groupId>org.hibernate</groupId>
+       <artifactId>hibernate-jmx</artifactId>
+       <version>3.5.6-Final</version>
+               <exclusions>
+                       <exclusion>
+                               <groupId>org.slf4j</groupId>
+                               <artifactId>slf4j-api</artifactId>
+                       </exclusion>
+               </exclusions>
+    </dependency>
+
+    <dependency>
+      <groupId>org.apache.magma</groupId>
+      <artifactId>foundation-logging</artifactId>
+      <version>0.0.3-SNAPSHOT</version>
+    </dependency>    
+  </dependencies>
+  <repositories>
+       <repository>
+               <id>jboss</id>
+               <name>JBoss</name>
+               
<url>https://repository.jboss.org/nexus/content/repositories/releases/</url>
+       </repository>
+  </repositories>
+</project>
\ No newline at end of file

Added: 
labs/magma/trunk/database-hibernate/src/main/java/org/apache/magma/database/hibernate/OverrideAnnotations.aj
URL: 
http://svn.apache.org/viewvc/labs/magma/trunk/database-hibernate/src/main/java/org/apache/magma/database/hibernate/OverrideAnnotations.aj?rev=1035408&view=auto
==============================================================================
--- 
labs/magma/trunk/database-hibernate/src/main/java/org/apache/magma/database/hibernate/OverrideAnnotations.aj
 (added)
+++ 
labs/magma/trunk/database-hibernate/src/main/java/org/apache/magma/database/hibernate/OverrideAnnotations.aj
 Mon Nov 15 18:52:57 2010
@@ -0,0 +1,11 @@
+package org.apache.magma.database.hibernate;
+
+import org.hibernate.annotations.Cascade;
+import org.hibernate.annotations.CascadeType;
+import org.apache.openjpa.persistence.ElementDependent;
+
+public aspect OverrideAnnotations {
+
+       declare @method : @ElementDependent public * *.get*() : 
@Cascade(CascadeType.DELETE_ORPHAN); 
+       
+}

Added: 
labs/magma/trunk/database-hibernate/src/main/java/org/apache/magma/database/hibernate/RegisterHibernateClasses.aj
URL: 
http://svn.apache.org/viewvc/labs/magma/trunk/database-hibernate/src/main/java/org/apache/magma/database/hibernate/RegisterHibernateClasses.aj?rev=1035408&view=auto
==============================================================================
--- 
labs/magma/trunk/database-hibernate/src/main/java/org/apache/magma/database/hibernate/RegisterHibernateClasses.aj
 (added)
+++ 
labs/magma/trunk/database-hibernate/src/main/java/org/apache/magma/database/hibernate/RegisterHibernateClasses.aj
 Mon Nov 15 18:52:57 2010
@@ -0,0 +1,159 @@
+package org.apache.magma.database.hibernate;
+
+import java.beans.Beans;
+import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.Properties;
+import java.util.Set;
+
+import javax.management.MBeanServer;
+import javax.management.MBeanServerFactory;
+import javax.management.ObjectName;
+import javax.persistence.Entity;
+import javax.persistence.EntityManagerFactory;
+import javax.persistence.Query;
+import javax.persistence.EntityManager;
+
+import net.sf.ehcache.CacheManager;
+import net.sf.ehcache.management.ManagementService;
+
+import org.hibernate.SessionFactory;
+import org.hibernate.ejb.Ejb3Configuration;
+import org.hibernate.ejb.HibernateEntityManagerFactory;
+import org.hibernate.jmx.StatisticsService;
+
+import javax.persistence.Persistence;
+
+import org.apache.commons.beanutils.BeanUtils;
+import org.apache.commons.beanutils.PropertyUtils;
+import org.apache.magma.basics.MagmaException;
+import org.apache.magma.beans.BeanData;
+import org.apache.magma.beans.PropertyInfo;
+import org.apache.magma.database.openjpa.CheckJPAManager;
+import org.apache.magma.logging.MLogger;
+import org.apache.magma.settings.Settings;
+import org.apache.magma.database.openjpa.JPADatabase;
+
+import java.util.Map;
+import java.util.concurrent.atomic.AtomicBoolean;
+
+// TODO remove that "disable hibernate during tests" stuff, and find a better 
way for db tests
+public aspect RegisterHibernateClasses {
+
+       Ejb3Configuration ejc = new Ejb3Configuration();
+       AtomicBoolean initing = new AtomicBoolean(false);
+       EntityManagerFactory factory = null; 
+       
+       before() : staticinitialization(@Entity *) {
+               if (Settings.getEnvironment().equals("test")) return;
+               Class c = 
thisJoinPointStaticPart.getSignature().getDeclaringType();
+               ejc.addAnnotatedClass(c);
+               MLogger log = new MLogger();
+               log.info("Added annotated class {}", c.getName());
+               String associationCache = 
Settings.get("magma.hibernate.cache_associations");
+               if (associationCache != null) {
+                       BeanData bd = BeanData.getFor(c);
+                       Set<String> names = bd.getPropertyNames();
+                       for (String name : names) {
+                               PropertyInfo pi = bd.getProperty(name);
+                               if (pi.isCollection() && !pi.isJpaTransient()) {
+                                       try {
+                                               Method getter = 
c.getMethod("get" + Character.toUpperCase(name.charAt(0)) + name.substring(1));
+                                               if 
(getter.getDeclaringClass().equals(c)) {
+                                                       String pname = 
"hibernate.ejb.collectioncache." + c.getName() + "." + name;
+                                                       if (Settings.get(pname) 
== null) {
+                                                               
ejc.setProperty(pname, associationCache);
+                                                               log.info("Set 
cache {}={}", pname, associationCache);
+                                                       }
+                                               }
+                                       } catch (Exception e) {
+                                               log.info("Cannot cache {}.{} 
cause of exception {} finding getter", new Object[] {c.getName(), name, 
e.getClass()});
+                                       }
+                               }
+                       }
+               }
+               String entitiesCache = 
Settings.get("magma.hibernate.cache_entities");
+               if (entitiesCache != null) {
+                       boolean root = true;
+                       Class acc = c.getSuperclass();
+                       while (!acc.equals(Object.class) && root) {
+                               if (acc.isAnnotationPresent(Entity.class)) root 
= false;
+                               acc = acc.getSuperclass();
+                       }
+                       if (root) {
+                               String pname = "hibernate.ejb.classcache." + 
c.getName();
+                               if (Settings.get(pname) == null) {
+                                       ejc.setProperty(pname, entitiesCache);
+                                       log.info("Set cache {}={}", pname, 
associationCache);
+                               }
+                       }
+               }
+       }
+       
+       after() returning (Query q) : 
+               call(Query+ EntityManager.createQuery(..)) &&
+               within(JPADatabase) {
+               if (Settings.get("magma.hibernate.cache_queries") != null) {
+                       q.setHint("org.hibernate.cacheable", "true");
+               }
+       }
+       
+       EntityManagerFactory around(Map settings) :
+               call(* Persistence.createEntityManagerFactory(..)) &&
+               withincode(public EntityManagerFactory 
CheckJPAManager.createFactory()) &&
+               args(.., settings) {
+               if (Settings.getEnvironment().equals("test")) return 
proceed(settings);
+               if (factory != null) return factory;
+               MLogger log = new MLogger();
+               if (initing.compareAndSet(false, true)) {
+                       log.info("Initing hibernate entity manager");
+                       try {
+                               Properties p = new Properties();
+                               p.putAll(settings);
+                               ejc.addProperties(p);
+                               ejc.buildMappings();
+                               factory = ejc.buildEntityManagerFactory();
+                               log.info("Factory correctly created");
+
+                       MBeanServer mbs = null; 
+
+                               ArrayList<MBeanServer> servers = 
MBeanServerFactory.findMBeanServer(null);
+                               if (servers.size() == 0) {
+                                       mbs = 
MBeanServerFactory.createMBeanServer();
+                               } else {
+                                       mbs = servers.get(0);
+                               }
+                
+                       ObjectName on = new 
ObjectName("Hibernate:type=statistics,application=myapp");
+                
+                       // Enable Hibernate JMX Statistics
+                       StatisticsService statsMBean = new StatisticsService();
+                       SessionFactory sf = 
((HibernateEntityManagerFactory)factory).getSessionFactory();
+                       statsMBean.setSessionFactory(sf);
+                       statsMBean.setStatisticsEnabled(true);
+                       mbs.registerMBean(statsMBean, on);
+                
+                
+                       // Enable Ehcache JMX Statistics
+                       CacheManager cacheMgr = CacheManager.getInstance();
+                       ManagementService.registerMBeans(cacheMgr, mbs, true, 
true, true, true);                                
+                       } catch (Throwable e) {
+                               log.error("Error initing hibernate factory", e);
+                               throw new MagmaException(e, "Error inting 
hibernate");
+                       } finally {
+                               initing.set(false);
+                               log.info("Factory initialization finished");
+                       }
+               } else {
+                       log.info("Waiting for another thread to init hibernate 
entity manager");
+                       while (initing.get()) {
+                               try {
+                                       Thread.sleep(100);
+                               } catch (InterruptedException e) {}
+                       }
+                       log.info("Other thread finished to init hibernate 
entity manager");
+               }
+               return factory;
+       }
+       
+}

Added: 
labs/magma/trunk/database-hibernate/src/main/java/org/apache/openjpa/persistence/ElementDependent.java
URL: 
http://svn.apache.org/viewvc/labs/magma/trunk/database-hibernate/src/main/java/org/apache/openjpa/persistence/ElementDependent.java?rev=1035408&view=auto
==============================================================================
--- 
labs/magma/trunk/database-hibernate/src/main/java/org/apache/openjpa/persistence/ElementDependent.java
 (added)
+++ 
labs/magma/trunk/database-hibernate/src/main/java/org/apache/openjpa/persistence/ElementDependent.java
 Mon Nov 15 18:52:57 2010
@@ -0,0 +1,22 @@
+package org.apache.openjpa.persistence;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+...@target(value={ElementType.METHOD,ElementType.FIELD})
+...@retention(value=RetentionPolicy.RUNTIME)
+
+/**
+ * This is a mock of the OpenJPA propietary ElementDependent annotation. It is 
here to
+ * grant binary compatibility when switching from OpenJPA to Hibernate, cause 
Hibernate uses
+ * Cascade(CascadeType.DELETE_ORPHAN) to express the same thing.
+ * 
+ * TODO : having a magma annotation, like MagPersistent, would be great. 
+ */
+public @interface ElementDependent {
+
+       public boolean value() default true;
+       
+}



---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to