Browse Source

switch to GSON

Nick Kasvosve 10 years ago
parent
commit
04e7c1ea99

+ 5 - 0
frameworks/Java/beyondj/beyondj-data/pom.xml

@@ -118,6 +118,11 @@
             <artifactId>c3p0</artifactId>
             <version>${c3p0.version}</version>
         </dependency>
+        <dependency>
+            <groupId>com.google.code.gson</groupId>
+            <artifactId>gson</artifactId>
+            <version>2.3.1</version>
+        </dependency>
     </dependencies>
 
     <build>

+ 3 - 0
frameworks/Java/beyondj/beyondj-data/src/main/java/com/techempower/beyondj/domain/Fortune.java

@@ -1,5 +1,6 @@
 package com.techempower.beyondj.domain;
 
+import com.google.gson.annotations.Expose;
 import org.springframework.data.domain.Persistable;
 
 import javax.persistence.Column;
@@ -12,9 +13,11 @@ public final class Fortune implements Comparable<Fortune>, Persistable<Integer>
 
     @Id
     @GeneratedValue
+    @Expose
     private volatile Integer id;
 
     @Column
+    @Expose
     public volatile String message;
 
     Fortune() {

+ 3 - 0
frameworks/Java/beyondj/beyondj-data/src/main/java/com/techempower/beyondj/domain/World.java

@@ -1,5 +1,6 @@
 package com.techempower.beyondj.domain;
 
+import com.google.gson.annotations.Expose;
 import org.springframework.data.domain.Persistable;
 
 import javax.persistence.Column;
@@ -12,9 +13,11 @@ public final class World implements Persistable<Integer> {
 
     @Id
     @GeneratedValue
+    @Expose
     private volatile Integer id;
 
     @Column
+    @Expose
     private volatile Integer randomNumber;
 
     World() {

+ 0 - 32
frameworks/Java/beyondj/beyondj-data/src/main/java/com/techempower/beyondj/repository/FortuneRepositoryImpl.java

@@ -1,32 +0,0 @@
-package com.techempower.beyondj.repository;
-
-import com.techempower.beyondj.domain.Fortune;
-import org.hibernate.criterion.Projections;
-import org.hibernate.criterion.Restrictions;
-
-import java.util.List;
-
-public class FortuneRepositoryImpl extends Repository implements FortuneRepository {
-
-    @Override
-    public Fortune findOne(Integer id) {
-        return (Fortune) createCriteria(Fortune.class)
-                .add(Restrictions.eq(ID, id)).uniqueResult();
-    }
-
-    @Override
-    public long count() {
-        return (Integer) getSession().createCriteria(Fortune.class)
-                .setProjection(Projections.rowCount()).uniqueResult();
-    }
-    @Override
-    public List<Fortune> findAll() {
-        return (List<Fortune>) createQuery(
-                "from Fortune").list();
-    }
-
-    @Override
-    public void save(Fortune obj) {
-         getSession().persist(obj);
-    }
-}

+ 0 - 174
frameworks/Java/beyondj/beyondj-data/src/main/java/com/techempower/beyondj/repository/Repository.java

@@ -1,174 +0,0 @@
-package com.techempower.beyondj.repository;
-
-import org.hibernate.*;
-import org.springframework.dao.DataAccessException;
-import org.springframework.transaction.annotation.Transactional;
-import org.springframework.transaction.support.TransactionTemplate;
-
-import java.io.Serializable;
-
-@Transactional
-public class Repository {
-
-	private SessionFactory sessionFactory;
-	private TransactionTemplate transactionTemplate;
-
-	public boolean contains(Object obj) {
-		return getSession().contains(obj);
-	}
-
-	@SuppressWarnings("rawtypes")
-	public Criteria createCriteria(Class obj) {
-		return getSession().createCriteria(obj);
-	}
-
-	public Criteria createCriteria(String obj) {
-		return getSession().createCriteria(obj);
-	}
-
-	public void attach(Object object) throws DataAccessException {
-		try {
-			getSession().lock(object, LockMode.NONE);
-		} catch (HibernateException ex) {
-		}
-	}
-
-	public TransactionTemplate getTransactionTemplate() {
-		return transactionTemplate;
-	}
-
-	public void setTransactionTemplate(TransactionTemplate transactionTemplate) {
-		this.transactionTemplate = transactionTemplate;
-	}
-
-	@SuppressWarnings("rawtypes")
-	public Criteria createCriteria(Class obj, String arg1) {
-		return getSession().createCriteria(obj, arg1);
-	}
-
-	public Criteria createCriteria(String obj, String arg1) {
-		return getSession().createCriteria(obj, arg1);
-	}
-
-	public Query createFilter(Object obj, String arg1) {
-		return getSession().createFilter(obj, arg1);
-	}
-
-	public Query createQuery(String obj) {
-		return getSession().createQuery(obj);
-	}
-
-	public SQLQuery createSQLQuery(String obj) {
-		return getSession().createSQLQuery(obj);
-	}
-
-
-	@SuppressWarnings("rawtypes")
-	public Object get(Class obj, Serializable arg1) {
-		return (Object) getSession().get(obj, arg1);
-	}
-
-	public Object get(String obj, Serializable arg1) {
-		return (Object) getSession().get(obj, arg1);
-	}
-
-	@SuppressWarnings({ "rawtypes" })
-	public Object get(Class obj, Serializable arg1, LockMode arg2) {
-		return (Object) getSession().get(obj, arg1, arg2);
-	}
-
-	public Object get(String obj, Serializable arg1, LockMode arg2) {
-		return (Object) getSession().get(obj, arg1, arg2);
-	}
-
-	public CacheMode getCacheMode() {
-		return getSession().getCacheMode();
-	}
-
-	public String getEntityName(Object obj) {
-		return getSession().getEntityName(obj);
-	}
-
-	public FlushMode getFlushMode() {
-		return getSession().getFlushMode();
-	}
-
-	public Serializable getIdentifier(Object obj) {
-		return getSession().getIdentifier(obj);
-	}
-
-	public Query getNamedQuery(String obj) {
-		return getSession().getNamedQuery(obj);
-	}
-
-	@SuppressWarnings("rawtypes")
-	public Object load(Class obj, Serializable arg1) {
-		return (Object) getSession().load(obj, arg1);
-	}
-
-	public Object load(String obj, Serializable arg1) {
-		return (Object) getSession().load(obj, arg1);
-	}
-
-	public Object load(Object obj, Serializable arg1) {
-		getSession().load(obj, arg1);
-		return obj;
-	}
-
-	@SuppressWarnings("rawtypes")
-	public Object load(Class obj, Serializable arg1, LockMode arg2) {
-		return (Object) getSession().load(obj, arg1, arg2);
-	}
-
-	public Object load(String obj, Serializable arg1, LockMode arg2) {
-		return (Object) getSession().load(obj, arg1, arg2);
-	}
-
-	public Object merge(Object obj) {
-		getSession().merge(obj);
-		return obj;
-	}
-
-	public Object merge(String obj, Object arg1) {
-		getSession().merge(obj, arg1);
-		return arg1;
-	}
-
-	public Object persist(Object obj) {
-		getSession().persist(obj);
-		return obj;
-	}
-
-	public Object persist(String obj, Object arg1) {
-		getSession().persist(obj, arg1);
-		return arg1;
-	}
-
-	public Object refresh(Object obj) {
-		getSession().refresh(obj);
-		return obj;
-	}
-
-	public Object refresh(Object obj, LockMode arg1) {
-		getSession().refresh(obj, arg1);
-		return obj;
-	}
-
-	protected Session getSession() {
-		return sessionFactory.getCurrentSession();
-	}
-
-	protected Session getCurrentSession() {
-		return sessionFactory.getCurrentSession();
-	}
-
-	public SessionFactory getSessionFactory() {
-		return sessionFactory;
-	}
-
-	public void setSessionFactory(SessionFactory sessionFactory) {
-		this.sessionFactory = sessionFactory;
-	}
-
-	protected static final String ID = "id";
-}

+ 2 - 0
frameworks/Java/beyondj/beyondj-data/src/main/java/com/techempower/beyondj/repository/WorldRepository.java

@@ -1,6 +1,7 @@
 package com.techempower.beyondj.repository;
 
 import com.techempower.beyondj.domain.World;
+import org.springframework.transaction.annotation.Transactional;
 
 import java.util.List;
 
@@ -10,6 +11,7 @@ public interface WorldRepository {
 
     long count();
 
+    @Transactional
     void save(World var1);
 
     List<World> findAll();

+ 18 - 8
frameworks/Java/beyondj/beyondj-data/src/main/java/com/techempower/beyondj/repository/WorldRepositoryImpl.java

@@ -3,29 +3,39 @@ package com.techempower.beyondj.repository;
 import com.techempower.beyondj.domain.World;
 import org.hibernate.criterion.Projections;
 import org.hibernate.criterion.Restrictions;
+import org.springframework.transaction.annotation.Transactional;
 
+import javax.persistence.EntityManager;
+import javax.persistence.PersistenceContext;
+import javax.persistence.criteria.CriteriaBuilder;
+import javax.persistence.criteria.CriteriaQuery;
 import java.util.List;
 
-public class WorldRepositoryImpl extends Repository implements WorldRepository {
+public class WorldRepositoryImpl implements WorldRepository {
+
+    @PersistenceContext
+    private EntityManager entityManager;
+
     @Override
     public World findOne(Integer id) {
-        return (World) createCriteria(World.class)
-                .add(Restrictions.eq(ID, id)).uniqueResult();
+        return entityManager.find(World.class, id);
     }
 
     @Override
     public long count() {
-        return (Integer) getSession().createCriteria(World.class)
-                .setProjection(Projections.rowCount()).uniqueResult();
+        CriteriaBuilder qb = entityManager.getCriteriaBuilder();
+        CriteriaQuery<Long> cq = qb.createQuery(Long.class);
+        cq.select(qb.count(cq.from(World.class)));
+        return entityManager.createQuery(cq).getSingleResult();
     }
 
     public List<World> findAll() {
-        return (List<World>) createQuery(
-                "from World").list();
+        return entityManager.createQuery("Select t from " + World.class.getSimpleName() + " t").getResultList();
     }
 
     @Override
+    @Transactional
     public void save(World obj) {
-        getSession().persist(obj);
+        entityManager.merge(obj);
     }
 }

+ 13 - 4
frameworks/Java/beyondj/beyondj-service/src/main/java/com/techempower/beyondj/action/HelloActionBean.java

@@ -1,9 +1,11 @@
 package com.techempower.beyondj.action;
 
+import com.google.gson.Gson;
+import com.google.gson.GsonBuilder;
+import com.techempower.beyondj.Message;
 import net.sourceforge.stripes.action.*;
-import org.stripesrest.JsonBuilder;
 import org.stripesrest.JsonResolution;
-import com.techempower.beyondj.Message;
+
 import javax.servlet.http.HttpServletResponse;
 import java.util.HashMap;
 import java.util.Map;
@@ -18,8 +20,15 @@ public class HelloActionBean extends BaseActionBean {
     public Resolution json() {
         Message message = new Message(HELLO_WORLD);
 
-        JsonBuilder builder = new JsonBuilder(message);
-        String rawJsonText = builder.build();
+        Gson gson = new GsonBuilder()
+                .enableComplexMapKeySerialization()
+                .serializeNulls()
+                .setPrettyPrinting()
+                .setVersion(1.0)
+                .excludeFieldsWithoutExposeAnnotation()
+                .create();
+
+        String rawJsonText = gson.toJson(message);
         Map<String,String> headers = new HashMap<>();
         headers.put(CONTENT_LENGTH,String.valueOf(rawJsonText.getBytes().length));
         setResponseHeaders(headers);

+ 41 - 10
frameworks/Java/beyondj/beyondj-service/src/main/java/com/techempower/beyondj/action/WorldDatabaseActionBean.java

@@ -1,8 +1,11 @@
 package com.techempower.beyondj.action;
 
+import com.google.gson.Gson;
+import com.google.gson.GsonBuilder;
 import com.techempower.beyondj.Common;
 import com.techempower.beyondj.domain.World;
 import com.techempower.beyondj.repository.WorldRepository;
+import com.techempower.beyondj.repository.WorldRepositoryImpl;
 import net.sourceforge.stripes.action.DefaultHandler;
 import net.sourceforge.stripes.action.HandlesEvent;
 import net.sourceforge.stripes.action.Resolution;
@@ -11,7 +14,6 @@ import net.sourceforge.stripes.integration.spring.SpringBean;
 import net.sourceforge.stripes.validation.Validate;
 import org.springframework.transaction.annotation.Propagation;
 import org.springframework.transaction.annotation.Transactional;
-import org.stripesrest.JsonBuilder;
 import org.stripesrest.JsonResolution;
 
 import java.util.*;
@@ -31,8 +33,16 @@ public class WorldDatabaseActionBean extends BaseActionBean {
     public Resolution queryOne() {
         final Random random = ThreadLocalRandom.current();
         World world = worldRepository.findOne(random.nextInt(DB_ROWS) + 1);
-        JsonBuilder builder = new JsonBuilder(world);
-        String rawJsonText = builder.build();
+        Gson gson = new GsonBuilder()
+                .enableComplexMapKeySerialization()
+                .serializeNulls()
+                .setPrettyPrinting()
+                .setVersion(1.0)
+                .excludeFieldsWithoutExposeAnnotation()
+                .create();
+
+        String rawJsonText = gson.toJson(world);
+
         Map<String,String> headers = new HashMap<>();
         headers.put(CONTENT_LENGTH, String.valueOf(rawJsonText.getBytes().length));
          setResponseHeaders(headers);
@@ -40,7 +50,7 @@ public class WorldDatabaseActionBean extends BaseActionBean {
     }
 
     @HandlesEvent(QUERIES)
-    @Transactional(readOnly = true)
+    @Transactional
     public Resolution queries() throws Exception{
         int value = boundQueryCount();
         List<Future<World>> wfs = new ArrayList<>(value);
@@ -56,8 +66,16 @@ public class WorldDatabaseActionBean extends BaseActionBean {
                             }));
         }
         List<World> worlds = waitFor(wfs);
-        JsonBuilder builder = new JsonBuilder(worlds);
-        String rawJsonText = builder.build();
+
+        Gson gson = new GsonBuilder()
+                .enableComplexMapKeySerialization()
+                .serializeNulls()
+                .setPrettyPrinting()
+                .setVersion(1.0)
+                .excludeFieldsWithoutExposeAnnotation()
+                .create();
+
+        String rawJsonText = gson.toJson(worlds);
         Map<String,String> headers = new HashMap<>();
         headers.put(CONTENT_LENGTH, String.valueOf(rawJsonText.getBytes().length));
          setResponseHeaders(headers);
@@ -89,14 +107,22 @@ public class WorldDatabaseActionBean extends BaseActionBean {
                             Random random = ThreadLocalRandom.current();
                             World world = (World) worldRepository.findOne(random.nextInt(DB_ROWS) + 1);
                             world.setRandomNumber(random.nextInt(DB_ROWS) + 1);
-                            worldRepository.save(world);
+                            worldRepositoryImpl.save(world);
                             return world;
                         }
                     }));
         }
         List<World> worlds = waitFor(wfs);
-        JsonBuilder builder = new JsonBuilder(worlds);
-        String rawJsonText = builder.build();
+
+        Gson gson = new GsonBuilder()
+                .enableComplexMapKeySerialization()
+                .serializeNulls()
+                .setPrettyPrinting()
+                .setVersion(1.0)
+                .excludeFieldsWithoutExposeAnnotation()
+                .create();
+
+        String rawJsonText = gson.toJson(worlds);
         Map<String,String> headers = new HashMap<>();
         headers.put(CONTENT_LENGTH, String.valueOf(rawJsonText.getBytes().length));
          setResponseHeaders(headers);
@@ -138,8 +164,13 @@ public class WorldDatabaseActionBean extends BaseActionBean {
 
     @SpringBean
     private WorldRepository worldRepository;
-    private static final String QUERIES = "queries";
+
+    @SpringBean
+    private WorldRepositoryImpl worldRepositoryImpl;
+
     private static final String DB = "db";
+    public static final String NEW = "new";
+    private static final String QUERIES = "queries";
     private static final String UPDATES = "updates";
     public static final String CONTENT_LENGTH = "Content-Length";
 }

+ 1 - 7
frameworks/Java/beyondj/beyondj-service/src/main/resources/beyondj-service-jpa-spring-config.xml

@@ -82,13 +82,7 @@
         <property name="password" value="${system.jdbc.password}"/>
     </bean>
 
-    <bean  id="fortuneRepository" class="com.techempower.beyondj.repository.FortuneRepositoryImpl">
-        <property name="sessionFactory" ref="sessionFactory"/>
-    </bean>
-
-    <bean  id="worldRepositoryImpl" class="com.techempower.beyondj.repository.WorldRepositoryImpl">
-        <property name="sessionFactory" ref="sessionFactory"/>
-    </bean>
+    <bean  id="worldRepositoryImpl" class="com.techempower.beyondj.repository.WorldRepositoryImpl"/>
 
 </beans>