You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ambari.apache.org by tb...@apache.org on 2015/06/16 23:37:12 UTC
ambari git commit: AMBARI-11957 - Views : DataStore persistence error
(tbeerbower)
Repository: ambari
Updated Branches:
refs/heads/trunk ac508b8df -> 1cdf8864c
AMBARI-11957 - Views : DataStore persistence error (tbeerbower)
Project: http://git-wip-us.apache.org/repos/asf/ambari/repo
Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/1cdf8864
Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/1cdf8864
Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/1cdf8864
Branch: refs/heads/trunk
Commit: 1cdf8864c1d52d44a910b836e31acf6f6ded161d
Parents: ac508b8
Author: tbeerbower <tb...@hortonworks.com>
Authored: Tue Jun 16 17:36:51 2015 -0400
Committer: tbeerbower <tb...@hortonworks.com>
Committed: Tue Jun 16 17:36:59 2015 -0400
----------------------------------------------------------------------
.../server/view/persistence/DataStoreImpl.java | 30 +++--
.../view/persistence/DataStoreImplTest.java | 121 +++++++++++++++++++
2 files changed, 144 insertions(+), 7 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/ambari/blob/1cdf8864/ambari-server/src/main/java/org/apache/ambari/server/view/persistence/DataStoreImpl.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/view/persistence/DataStoreImpl.java b/ambari-server/src/main/java/org/apache/ambari/server/view/persistence/DataStoreImpl.java
index 8353d63..69328e7 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/view/persistence/DataStoreImpl.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/view/persistence/DataStoreImpl.java
@@ -25,14 +25,17 @@ import org.apache.ambari.view.PersistenceException;
import org.eclipse.persistence.dynamic.DynamicClassLoader;
import org.eclipse.persistence.dynamic.DynamicEntity;
import org.eclipse.persistence.dynamic.DynamicType;
+import org.eclipse.persistence.internal.helper.DatabaseField;
import org.eclipse.persistence.jpa.dynamic.JPADynamicHelper;
import org.eclipse.persistence.jpa.dynamic.JPADynamicTypeBuilder;
+import org.eclipse.persistence.mappings.DirectToFieldMapping;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.inject.Inject;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
+import javax.persistence.EntityTransaction;
import javax.persistence.Query;
import java.beans.IntrospectionException;
import java.beans.Introspector;
@@ -41,6 +44,8 @@ import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.ParameterizedType;
+import java.sql.Clob;
+import java.sql.Types;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
@@ -131,9 +136,7 @@ public class DataStoreImpl implements DataStore {
persistEntity(entity, em, new HashSet<DynamicEntity>());
em.getTransaction().commit();
} catch (Exception e) {
- if (em.getTransaction()!= null) {
- em.getTransaction().rollback();
- }
+ rollbackTransaction(em.getTransaction());
throwPersistenceException("Caught exception trying to store view entity " + entity, e);
}
} finally {
@@ -162,9 +165,7 @@ public class DataStoreImpl implements DataStore {
em.remove(dynamicEntity);
em.getTransaction().commit();
} catch (Exception e) {
- if (em.getTransaction()!= null) {
- em.getTransaction().rollback();
- }
+ rollbackTransaction(em.getTransaction());
throwPersistenceException("Caught exception trying to remove view entity " + entity, e);
}
}
@@ -297,7 +298,15 @@ public class DataStoreImpl implements DataStore {
Class<?> propertyType = descriptor.getPropertyType();
if (isDirectMappingType(propertyType)) {
- typeBuilder.addDirectMapping(attributeName, propertyType, attributeName);
+ DirectToFieldMapping mapping = typeBuilder.addDirectMapping(attributeName, propertyType, attributeName);
+
+ // explicitly set the type of string fields
+ if (String.class.isAssignableFrom(propertyType)) {
+ DatabaseField field = mapping.getField();
+
+ field.setSqlType(Types.CLOB);
+ field.setType(Clob.class);
+ }
}
}
}
@@ -593,6 +602,13 @@ public class DataStoreImpl implements DataStore {
return (Class<?>) parameterizedType.getActualTypeArguments()[0];
}
+ // rollback the given transaction if it is active
+ private static void rollbackTransaction(EntityTransaction transaction) {
+ if (transaction != null && transaction.isActive()) {
+ transaction.rollback();
+ }
+ }
+
// throw a new persistence exception and log the error
private static void throwPersistenceException(String msg, Exception e) throws PersistenceException {
LOG.error(msg, e);
http://git-wip-us.apache.org/repos/asf/ambari/blob/1cdf8864/ambari-server/src/test/java/org/apache/ambari/server/view/persistence/DataStoreImplTest.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/view/persistence/DataStoreImplTest.java b/ambari-server/src/test/java/org/apache/ambari/server/view/persistence/DataStoreImplTest.java
index 2b19b0a..d623a26 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/view/persistence/DataStoreImplTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/view/persistence/DataStoreImplTest.java
@@ -139,6 +139,67 @@ public class DataStoreImplTest {
}
@Test
+ public void testStore_create_longStringValue() throws Exception {
+ DynamicClassLoader classLoader = new DynamicClassLoader(DataStoreImplTest.class.getClassLoader());
+
+ // create mocks
+ EntityManagerFactory entityManagerFactory = createMock(EntityManagerFactory.class);
+ EntityManager entityManager = createMock(EntityManager.class);
+ JPADynamicHelper jpaDynamicHelper = createNiceMock(JPADynamicHelper.class);
+ SchemaManager schemaManager = createNiceMock(SchemaManager.class);
+ EntityTransaction transaction = createMock(EntityTransaction.class);
+
+ // set expectations
+ Capture<DynamicType> typeCapture = new Capture<DynamicType>();
+ Capture<DynamicType> typeCapture2 = new Capture<DynamicType>();
+ jpaDynamicHelper.addTypes(eq(true), eq(true), capture(typeCapture), capture(typeCapture2));
+
+ expect(entityManagerFactory.createEntityManager()).andReturn(entityManager);
+ expect(entityManager.getTransaction()).andReturn(transaction).anyTimes();
+
+ Capture<Class> entityClassCapture = new Capture<Class>();
+ expect(entityManager.find(capture(entityClassCapture), eq("bar"))).andReturn(null);
+
+ Capture<Class> entityClassCapture2 = new Capture<Class>();
+ expect(entityManager.find(capture(entityClassCapture2), eq(99))).andReturn(null);
+
+ Capture<DynamicEntity> entityCapture = new Capture<DynamicEntity>();
+ entityManager.persist(capture(entityCapture));
+
+ Capture<DynamicEntity> entityCapture2 = new Capture<DynamicEntity>();
+ entityManager.persist(capture(entityCapture2));
+
+ entityManager.close();
+
+ transaction.begin();
+ transaction.commit();
+
+ // replay mocks
+ replay(entityManagerFactory, entityManager, jpaDynamicHelper, transaction, schemaManager);
+
+ DataStoreImpl dataStore = getDataStore(entityManagerFactory, jpaDynamicHelper, classLoader, schemaManager);
+
+ StringBuffer sb = new StringBuffer();
+ for (int i = 0; i < 5000; ++i) {
+ sb.append("A");
+ }
+ String longString = sb.toString();
+
+ dataStore.store(new TestEntity(99, longString, new TestSubEntity("bar")));
+
+ Assert.assertEquals(entityClassCapture.getValue(), typeCapture.getValue().getJavaClass());
+ Assert.assertEquals(entityClassCapture2.getValue(), typeCapture2.getValue().getJavaClass());
+
+ Assert.assertEquals("bar", entityCapture.getValue().get("DS_name"));
+
+ Assert.assertEquals(99, entityCapture2.getValue().get("DS_id"));
+ Assert.assertEquals(longString, entityCapture2.getValue().get("DS_name"));
+
+ // verify mocks
+ verify(entityManagerFactory, entityManager, jpaDynamicHelper, transaction, schemaManager);
+ }
+
+ @Test
public void testStore_update() throws Exception {
DynamicClassLoader classLoader = new DynamicClassLoader(DataStoreImplTest.class.getClassLoader());
@@ -193,6 +254,66 @@ public class DataStoreImplTest {
}
@Test
+ public void testStore_update_longStringValue() throws Exception {
+ DynamicClassLoader classLoader = new DynamicClassLoader(DataStoreImplTest.class.getClassLoader());
+
+ // create mocks
+ EntityManagerFactory entityManagerFactory = createMock(EntityManagerFactory.class);
+ EntityManager entityManager = createMock(EntityManager.class);
+ JPADynamicHelper jpaDynamicHelper = createNiceMock(JPADynamicHelper.class);
+ SchemaManager schemaManager = createNiceMock(SchemaManager.class);
+ EntityTransaction transaction = createMock(EntityTransaction.class);
+ DynamicEntity dynamicEntity = createMock(DynamicEntity.class);
+
+ // set expectations
+ Capture<DynamicType> typeCapture = new Capture<DynamicType>();
+ Capture<DynamicType> typeCapture2 = new Capture<DynamicType>();
+ jpaDynamicHelper.addTypes(eq(true), eq(true), capture(typeCapture), capture(typeCapture2));
+
+ expect(entityManagerFactory.createEntityManager()).andReturn(entityManager);
+ expect(entityManager.getTransaction()).andReturn(transaction).anyTimes();
+
+ Capture<Class> entityClassCapture = new Capture<Class>();
+ expect(entityManager.find(capture(entityClassCapture), eq("bar"))).andReturn(null);
+
+ Capture<Class> entityClassCapture2 = new Capture<Class>();
+ expect(entityManager.find(capture(entityClassCapture2), eq(99))).andReturn(dynamicEntity);
+
+ Capture<DynamicEntity> entityCapture = new Capture<DynamicEntity>();
+ entityManager.persist(capture(entityCapture));
+
+ entityManager.close();
+
+ StringBuffer sb = new StringBuffer();
+ for (int i = 0; i < 5000; ++i) {
+ sb.append("A");
+ }
+ String longString = sb.toString();
+
+ expect(dynamicEntity.set("DS_id", 99)).andReturn(dynamicEntity);
+ expect(dynamicEntity.set("DS_name", longString)).andReturn(dynamicEntity);
+
+ Capture<DynamicEntity> subEntityCapture = new Capture<DynamicEntity>();
+ expect(dynamicEntity.set(eq("DS_subEntity"), capture(subEntityCapture))).andReturn(dynamicEntity);
+
+ transaction.begin();
+ transaction.commit();
+
+ // replay mocks
+ replay(entityManagerFactory, entityManager, jpaDynamicHelper, transaction, schemaManager, dynamicEntity);
+
+ DataStoreImpl dataStore = getDataStore(entityManagerFactory, jpaDynamicHelper, classLoader, schemaManager);
+
+ dataStore.store(new TestEntity(99, longString, new TestSubEntity("bar")));
+
+ Assert.assertEquals(entityClassCapture.getValue(), typeCapture.getValue().getJavaClass());
+ Assert.assertEquals(entityClassCapture2.getValue(), typeCapture2.getValue().getJavaClass());
+
+ // verify mocks
+ verify(entityManagerFactory, entityManager, jpaDynamicHelper, transaction, schemaManager, dynamicEntity);
+ }
+
+ @Test
public void testRemove() throws Exception {
DynamicClassLoader classLoader = new DynamicClassLoader(DataStoreImplTest.class.getClassLoader());