[ARIES-1448] Fix Issues reported by Sonar
git-svn-id: https://svn.apache.org/repos/asf/aries/trunk/jpa@1713916 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/examples/tasklist-blueprint/src/main/java/org/apache/aries/jpa/example/tasklist/blueprint/impl/TaskServiceImpl.java b/examples/tasklist-blueprint/src/main/java/org/apache/aries/jpa/example/tasklist/blueprint/impl/TaskServiceImpl.java
index fdcc6dc..fadf293 100644
--- a/examples/tasklist-blueprint/src/main/java/org/apache/aries/jpa/example/tasklist/blueprint/impl/TaskServiceImpl.java
+++ b/examples/tasklist-blueprint/src/main/java/org/apache/aries/jpa/example/tasklist/blueprint/impl/TaskServiceImpl.java
@@ -36,26 +36,31 @@
EntityManager em;
@Transactional(TxType.SUPPORTS)
+ @Override
public Task getTask(Integer id) {
return em.find(Task.class, id);
}
+ @Override
public void addTask(Task task) {
em.persist(task);
em.flush();
}
@Transactional(TxType.SUPPORTS)
+ @Override
public Collection<Task> getTasks() {
CriteriaQuery<Task> query = em.getCriteriaBuilder().createQuery(Task.class);
return em.createQuery(query.select(query.from(Task.class))).getResultList();
}
+ @Override
public void updateTask(Task task) {
em.persist(task);
}
+ @Override
public void deleteTask(Integer id) {
em.remove(getTask(id));
}
diff --git a/examples/tasklist-blueprint/src/main/java/org/apache/aries/jpa/example/tasklist/blueprint/impl/TasklistServlet.java b/examples/tasklist-blueprint/src/main/java/org/apache/aries/jpa/example/tasklist/blueprint/impl/TasklistServlet.java
index 38e68d5..0cfeeb4 100644
--- a/examples/tasklist-blueprint/src/main/java/org/apache/aries/jpa/example/tasklist/blueprint/impl/TasklistServlet.java
+++ b/examples/tasklist-blueprint/src/main/java/org/apache/aries/jpa/example/tasklist/blueprint/impl/TasklistServlet.java
@@ -33,9 +33,7 @@
import org.osgi.service.component.annotations.Reference;
public class TasklistServlet extends HttpServlet {
-
- TaskService taskService;
-
+ private transient TaskService taskService; // NOSONAR
private static final long serialVersionUID = 34992072289535683L;
@Override
@@ -44,7 +42,7 @@
String add = req.getParameter("add");
String taskId = req.getParameter("taskId");
String title = req.getParameter("title");
- PrintWriter writer = resp.getWriter();
+ PrintWriter writer = resp.getWriter(); // NOSONAR
if (add != null) {
addTask(taskId, title);
} else if (taskId != null && taskId.length() > 0) {
diff --git a/examples/tasklist-ds/src/main/java/org/apache/aries/jpa/example/tasklist/ds/impl/TaskServiceImpl.java b/examples/tasklist-ds/src/main/java/org/apache/aries/jpa/example/tasklist/ds/impl/TaskServiceImpl.java
index ab32a3f..8bef894 100644
--- a/examples/tasklist-ds/src/main/java/org/apache/aries/jpa/example/tasklist/ds/impl/TaskServiceImpl.java
+++ b/examples/tasklist-ds/src/main/java/org/apache/aries/jpa/example/tasklist/ds/impl/TaskServiceImpl.java
@@ -36,16 +36,20 @@
private JpaTemplate jpa;
+ @Override
public Task getTask(final Integer id) {
return jpa.txExpr(TransactionType.Required, new EmFunction<Task>() {
+ @Override
public Task apply(EntityManager em) {
return em.find(Task.class, id);
}
});
}
+ @Override
public void addTask(final Task task) {
jpa.tx(new EmConsumer() {
+ @Override
public void accept(EntityManager em) {
em.persist(task);
em.flush();
@@ -53,24 +57,30 @@
});
}
+ @Override
public Collection<Task> getTasks() {
return jpa.txExpr(new EmFunction<Collection<Task>>() {
+ @Override
public Collection<Task> apply(EntityManager em) {
return em.createQuery("select t from Task t", Task.class).getResultList();
}
});
}
+ @Override
public void updateTask(final Task task) {
jpa.tx(new EmConsumer() {
+ @Override
public void accept(EntityManager em) {
em.persist(task);
}
});
}
+ @Override
public void deleteTask(final Integer id) {
jpa.tx(new EmConsumer() {
+ @Override
public void accept(EntityManager em) {
em.remove(getTask(id));
}
diff --git a/examples/tasklist-ds/src/main/java/org/apache/aries/jpa/example/tasklist/ds/impl/TasklistServlet.java b/examples/tasklist-ds/src/main/java/org/apache/aries/jpa/example/tasklist/ds/impl/TasklistServlet.java
index bb4fbb5..4ff3ef7 100644
--- a/examples/tasklist-ds/src/main/java/org/apache/aries/jpa/example/tasklist/ds/impl/TasklistServlet.java
+++ b/examples/tasklist-ds/src/main/java/org/apache/aries/jpa/example/tasklist/ds/impl/TasklistServlet.java
@@ -39,10 +39,8 @@
property = { "alias:String=/tasklist" }
)
public class TasklistServlet extends HttpServlet {
-
- TaskService taskService;
-
private static final long serialVersionUID = 34992072289535683L;
+ private transient TaskService taskService; // NOSONAR
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException,
@@ -50,7 +48,7 @@
String add = req.getParameter("add");
String taskId = req.getParameter("taskId");
String title = req.getParameter("title");
- PrintWriter writer = resp.getWriter();
+ PrintWriter writer = resp.getWriter(); // NOSONAR
if (add != null) {
addTask(taskId, title);
} else if (taskId != null && taskId.length() > 0) {
diff --git a/examples/tasklist-model/src/main/java/org/apache/aries/jpa/example/tasklist/model/Task.java b/examples/tasklist-model/src/main/java/org/apache/aries/jpa/example/tasklist/model/Task.java
index 03e118d..7448a0c 100644
--- a/examples/tasklist-model/src/main/java/org/apache/aries/jpa/example/tasklist/model/Task.java
+++ b/examples/tasklist-model/src/main/java/org/apache/aries/jpa/example/tasklist/model/Task.java
@@ -34,10 +34,9 @@
Date dueDate;
boolean finished;
-
public Task() {
+ // Allow JPA to create the instance
}
-
public Task(Integer id, String title, String description) {
super();
diff --git a/examples/tasklist-model/src/main/java/org/apache/aries/jpa/example/tasklist/model/TaskService.java b/examples/tasklist-model/src/main/java/org/apache/aries/jpa/example/tasklist/model/TaskService.java
index 4f01965..2490f04 100644
--- a/examples/tasklist-model/src/main/java/org/apache/aries/jpa/example/tasklist/model/TaskService.java
+++ b/examples/tasklist-model/src/main/java/org/apache/aries/jpa/example/tasklist/model/TaskService.java
@@ -21,9 +21,9 @@
import java.util.Collection;
public interface TaskService {
- Task getTask(Integer id);
- void addTask(Task task);
- void updateTask(Task task);
- void deleteTask(Integer id);
- Collection<Task> getTasks();
+ Task getTask(Integer id);
+ void addTask(Task task);
+ void updateTask(Task task);
+ void deleteTask(Integer id);
+ Collection<Task> getTasks();
}
diff --git a/itests/jpa-container-blueprint-testbundle/src/main/java/org/apache/aries/jpa/container/itest/bundle/blueprint/impl/CarLifeCycle.java b/itests/jpa-container-blueprint-testbundle/src/main/java/org/apache/aries/jpa/container/itest/bundle/blueprint/impl/CarLifeCycle.java
index bd432ff..d35704c 100644
--- a/itests/jpa-container-blueprint-testbundle/src/main/java/org/apache/aries/jpa/container/itest/bundle/blueprint/impl/CarLifeCycle.java
+++ b/itests/jpa-container-blueprint-testbundle/src/main/java/org/apache/aries/jpa/container/itest/bundle/blueprint/impl/CarLifeCycle.java
@@ -55,7 +55,7 @@
carService.deleteCar(id);
Car car2 = carService.getCar(id);
if (car2 != null) {
- throw new RuntimeException("Car with id " + id + " should be deleted");
+ throw new RuntimeException("Car with id " + id + " should be deleted"); // NOSONAR
}
}
diff --git a/itests/jpa-container-blueprint-testbundle/src/main/java/org/apache/aries/jpa/container/itest/bundle/blueprint/impl/CarServiceEmJtaAnn.java b/itests/jpa-container-blueprint-testbundle/src/main/java/org/apache/aries/jpa/container/itest/bundle/blueprint/impl/CarServiceEmJtaAnn.java
index 2d52267..ec67c41 100644
--- a/itests/jpa-container-blueprint-testbundle/src/main/java/org/apache/aries/jpa/container/itest/bundle/blueprint/impl/CarServiceEmJtaAnn.java
+++ b/itests/jpa-container-blueprint-testbundle/src/main/java/org/apache/aries/jpa/container/itest/bundle/blueprint/impl/CarServiceEmJtaAnn.java
@@ -44,6 +44,7 @@
}
@Transactional(Transactional.TxType.SUPPORTS)
+ @Override
public Collection<Car> getCars() {
return em.createQuery("select c from Car c", Car.class).getResultList();
}
diff --git a/itests/jpa-container-blueprint-testbundle/src/main/java/org/apache/aries/jpa/container/itest/bundle/blueprint/impl/CarServiceImpl.java b/itests/jpa-container-blueprint-testbundle/src/main/java/org/apache/aries/jpa/container/itest/bundle/blueprint/impl/CarServiceImpl.java
index 1a47961..68b65d8 100644
--- a/itests/jpa-container-blueprint-testbundle/src/main/java/org/apache/aries/jpa/container/itest/bundle/blueprint/impl/CarServiceImpl.java
+++ b/itests/jpa-container-blueprint-testbundle/src/main/java/org/apache/aries/jpa/container/itest/bundle/blueprint/impl/CarServiceImpl.java
@@ -36,6 +36,7 @@
em.persist(car);
}
+ @Override
public Collection<Car> getCars() {
return em.createQuery("select c from Car c", Car.class).getResultList();
}
diff --git a/itests/jpa-container-blueprint-testbundle/src/main/java/org/apache/aries/jpa/container/itest/bundle/blueprint/impl/CarServiceWithEmfImpl.java b/itests/jpa-container-blueprint-testbundle/src/main/java/org/apache/aries/jpa/container/itest/bundle/blueprint/impl/CarServiceWithEmfImpl.java
index 0acfa67..d7968b7 100644
--- a/itests/jpa-container-blueprint-testbundle/src/main/java/org/apache/aries/jpa/container/itest/bundle/blueprint/impl/CarServiceWithEmfImpl.java
+++ b/itests/jpa-container-blueprint-testbundle/src/main/java/org/apache/aries/jpa/container/itest/bundle/blueprint/impl/CarServiceWithEmfImpl.java
@@ -50,10 +50,10 @@
em.close();
}
+ @Override
public Collection<Car> getCars() {
- EntityManager em = null;
+ EntityManager em = emf.createEntityManager();
try {
- em = emf.createEntityManager();
return em.createQuery("select c from Car c", Car.class).getResultList();
} finally {
em.close();
diff --git a/itests/jpa-container-blueprint-testbundle/src/main/java/org/apache/aries/jpa/container/itest/bundle/blueprint/impl/CarServiceWithMethodImpl.java b/itests/jpa-container-blueprint-testbundle/src/main/java/org/apache/aries/jpa/container/itest/bundle/blueprint/impl/CarServiceWithMethodImpl.java
index 9352183..9c77c79 100644
--- a/itests/jpa-container-blueprint-testbundle/src/main/java/org/apache/aries/jpa/container/itest/bundle/blueprint/impl/CarServiceWithMethodImpl.java
+++ b/itests/jpa-container-blueprint-testbundle/src/main/java/org/apache/aries/jpa/container/itest/bundle/blueprint/impl/CarServiceWithMethodImpl.java
@@ -41,6 +41,7 @@
em.flush();
}
+ @Override
public Collection<Car> getCars() {
return em.createQuery("select c from Car c", Car.class).getResultList();
}
diff --git a/itests/jpa-container-blueprint-testbundle/src/main/java/org/apache/aries/jpa/container/itest/bundle/blueprint/impl/CarServiceWithMultiAnnotationImpl.java b/itests/jpa-container-blueprint-testbundle/src/main/java/org/apache/aries/jpa/container/itest/bundle/blueprint/impl/CarServiceWithMultiAnnotationImpl.java
index 8bd1c8f..deae394 100644
--- a/itests/jpa-container-blueprint-testbundle/src/main/java/org/apache/aries/jpa/container/itest/bundle/blueprint/impl/CarServiceWithMultiAnnotationImpl.java
+++ b/itests/jpa-container-blueprint-testbundle/src/main/java/org/apache/aries/jpa/container/itest/bundle/blueprint/impl/CarServiceWithMultiAnnotationImpl.java
@@ -53,6 +53,7 @@
localEm.close();
}
+ @Override
public Collection<Car> getCars() {
return em.createQuery("select c from Car c", Car.class).getResultList();
}
diff --git a/itests/jpa-container-blueprint-testbundle/src/main/java/org/apache/aries/jpa/container/itest/bundle/blueprint/impl/CarServiceWithSupplierImpl.java b/itests/jpa-container-blueprint-testbundle/src/main/java/org/apache/aries/jpa/container/itest/bundle/blueprint/impl/CarServiceWithSupplierImpl.java
index 43eb4c3..f44f51f 100644
--- a/itests/jpa-container-blueprint-testbundle/src/main/java/org/apache/aries/jpa/container/itest/bundle/blueprint/impl/CarServiceWithSupplierImpl.java
+++ b/itests/jpa-container-blueprint-testbundle/src/main/java/org/apache/aries/jpa/container/itest/bundle/blueprint/impl/CarServiceWithSupplierImpl.java
@@ -44,6 +44,7 @@
em.get().flush();
}
+ @Override
public Collection<Car> getCars() {
return em.get().createQuery("select c from Car c", Car.class).getResultList();
}
diff --git a/jpa-api/src/main/java/org/apache/aries/jpa/template/EmConsumer.java b/jpa-api/src/main/java/org/apache/aries/jpa/template/EmConsumer.java
index e426767..9697788 100644
--- a/jpa-api/src/main/java/org/apache/aries/jpa/template/EmConsumer.java
+++ b/jpa-api/src/main/java/org/apache/aries/jpa/template/EmConsumer.java
@@ -21,5 +21,5 @@
import javax.persistence.EntityManager;
public interface EmConsumer {
- void accept(EntityManager em);
+ void accept(EntityManager em);
}
diff --git a/jpa-api/src/main/java/org/apache/aries/jpa/template/EmFunction.java b/jpa-api/src/main/java/org/apache/aries/jpa/template/EmFunction.java
index 2af4678..ef68853 100644
--- a/jpa-api/src/main/java/org/apache/aries/jpa/template/EmFunction.java
+++ b/jpa-api/src/main/java/org/apache/aries/jpa/template/EmFunction.java
@@ -21,5 +21,5 @@
import javax.persistence.EntityManager;
public interface EmFunction<R> {
- R apply(EntityManager em);
+ R apply(EntityManager em);
}
diff --git a/jpa-api/src/main/java/org/apache/aries/jpa/template/JpaTemplate.java b/jpa-api/src/main/java/org/apache/aries/jpa/template/JpaTemplate.java
index ad70003..eb07652 100644
--- a/jpa-api/src/main/java/org/apache/aries/jpa/template/JpaTemplate.java
+++ b/jpa-api/src/main/java/org/apache/aries/jpa/template/JpaTemplate.java
@@ -20,9 +20,9 @@
public interface JpaTemplate {
- <R> R txExpr(TransactionType type, EmFunction<R> code);
- void tx(TransactionType type, EmConsumer code);
-
- <R> R txExpr(EmFunction<R> code);
- void tx(EmConsumer code);
+ <R> R txExpr(TransactionType type, EmFunction<R> code);
+ void tx(TransactionType type, EmConsumer code);
+
+ <R> R txExpr(EmFunction<R> code);
+ void tx(EmConsumer code);
}
diff --git a/jpa-api/src/main/java/org/apache/aries/jpa/template/TransactionType.java b/jpa-api/src/main/java/org/apache/aries/jpa/template/TransactionType.java
index 1a6eee5..1d6e1f3 100644
--- a/jpa-api/src/main/java/org/apache/aries/jpa/template/TransactionType.java
+++ b/jpa-api/src/main/java/org/apache/aries/jpa/template/TransactionType.java
@@ -19,5 +19,5 @@
package org.apache.aries.jpa.template;
public enum TransactionType {
- Mandatory, Never, NotSupported, Required, RequiresNew, Supports
+ Mandatory, Never, NotSupported, Required, RequiresNew, Supports // NOSONAR
}
diff --git a/jpa-blueprint/src/main/java/org/apache/aries/jpa/blueprint/impl/Activator.java b/jpa-blueprint/src/main/java/org/apache/aries/jpa/blueprint/impl/Activator.java
index 8c71c85..fe369d5 100644
--- a/jpa-blueprint/src/main/java/org/apache/aries/jpa/blueprint/impl/Activator.java
+++ b/jpa-blueprint/src/main/java/org/apache/aries/jpa/blueprint/impl/Activator.java
@@ -34,14 +34,15 @@
context.registerService(NamespaceHandler.class, handler, createProps(JpaNsHandler.NAMESPACE_JPA_20));
}
- private Dictionary<String, String> createProps(String namespace) {
- Dictionary<String, String> props = new Hashtable<String, String>();
+ private static Dictionary<String, String> createProps(String namespace) {
+ Dictionary<String, String> props = new Hashtable<String, String>(); // NOSONAR
props.put("osgi.service.blueprint.namespace", namespace);
return props;
}
@Override
public void stop(BundleContext context) throws Exception {
+ // Unregistering happens automatically
}
}
diff --git a/jpa-blueprint/src/main/java/org/apache/aries/jpa/blueprint/impl/AnnotationScanner.java b/jpa-blueprint/src/main/java/org/apache/aries/jpa/blueprint/impl/AnnotationScanner.java
index 18d4a9c..b285cff 100644
--- a/jpa-blueprint/src/main/java/org/apache/aries/jpa/blueprint/impl/AnnotationScanner.java
+++ b/jpa-blueprint/src/main/java/org/apache/aries/jpa/blueprint/impl/AnnotationScanner.java
@@ -29,31 +29,28 @@
public List<AccessibleObject> getJpaAnnotatedMembers(Class<?> c, Class<? extends Annotation> annotation) {
final List<AccessibleObject> jpaAnnotated = new ArrayList<AccessibleObject>();
-
- Class<?> cl = c;
- if (c != Object.class) {
- while (cl != Object.class) {
- for (Field field : cl.getDeclaredFields()) {
- if (field.isAnnotationPresent(annotation)) {
- field.setAccessible(true);
- jpaAnnotated.add(field);
- }
- }
-
- for (Method method : cl.getDeclaredMethods()) {
- if ((method.isAnnotationPresent(annotation)) && method.getName().startsWith("set") && method.getParameterTypes().length == 1) {
- jpaAnnotated.add(method);
- }
- }
-
- cl = cl.getSuperclass();
- }
+ for (Class<?> cl = c; cl != Object.class; cl = cl.getSuperclass()) {
+ parseClass(annotation, jpaAnnotated, cl);
}
-
return jpaAnnotated;
}
- public String getName(AccessibleObject member) {
+ private static void parseClass(Class<? extends Annotation> annotation, final List<AccessibleObject> jpaAnnotated, Class<?> cl) {
+ for (Field field : cl.getDeclaredFields()) {
+ if (field.isAnnotationPresent(annotation)) {
+ field.setAccessible(true);
+ jpaAnnotated.add(field);
+ }
+ }
+
+ for (Method method : cl.getDeclaredMethods()) {
+ if ((method.isAnnotationPresent(annotation)) && method.getName().startsWith("set") && method.getParameterTypes().length == 1) {
+ jpaAnnotated.add(method);
+ }
+ }
+ }
+
+ public static String getName(AccessibleObject member) {
if (member instanceof Field) {
return ((Field)member).getName();
} else if (member instanceof Method) {
@@ -67,7 +64,7 @@
throw new IllegalArgumentException();
}
- public Class<?> getType(AccessibleObject member) {
+ public static Class<?> getType(AccessibleObject member) {
if (member instanceof Field) {
return ((Field)member).getType();
} else if (member instanceof Method) {
diff --git a/jpa-blueprint/src/main/java/org/apache/aries/jpa/blueprint/impl/JpaComponentProcessor.java b/jpa-blueprint/src/main/java/org/apache/aries/jpa/blueprint/impl/JpaComponentProcessor.java
index 9f215ce..bdd5e7e 100644
--- a/jpa-blueprint/src/main/java/org/apache/aries/jpa/blueprint/impl/JpaComponentProcessor.java
+++ b/jpa-blueprint/src/main/java/org/apache/aries/jpa/blueprint/impl/JpaComponentProcessor.java
@@ -85,15 +85,15 @@
try {
compClass = bundle.loadClass(compDef.getClassName());
} catch (final ClassNotFoundException e) {
- throw new IllegalArgumentException("Bean class not found " + compDef.getClassName());
+ throw new IllegalArgumentException("Bean class not found " + compDef.getClassName(), e);
}
compDef.setFieldInjection(true);
List<AccessibleObject> pcMembers = annotationScanner.getJpaAnnotatedMembers(compClass, PersistenceContext.class);
for (AccessibleObject member : pcMembers) {
PersistenceContext pcAnn = member.getAnnotation(PersistenceContext.class);
- String propName = annotationScanner.getName(member);
- Class<?> iface = annotationScanner.getType(member);
+ String propName = AnnotationScanner.getName(member);
+ Class<?> iface = AnnotationScanner.getType(member);
LOGGER.debug("Injecting {} into prop {} of bean {} with class {}", iface.getSimpleName(), propName, compName, compClass);
MutableRefMetadata ref = getServiceRef(cdr, pcAnn.unitName(), iface);
compDef.addProperty(propName, ref);
@@ -106,8 +106,8 @@
List<AccessibleObject> puMembers = annotationScanner.getJpaAnnotatedMembers(compClass, PersistenceUnit.class);
for (AccessibleObject member : puMembers) {
PersistenceUnit puAnn = member.getAnnotation(PersistenceUnit.class);
- String propName = annotationScanner.getName(member);
- Class<?> iface = annotationScanner.getType(member);
+ String propName = AnnotationScanner.getName(member);
+ Class<?> iface = AnnotationScanner.getType(member);
LOGGER.debug("Injecting {} into prop {} of bean {} with class {}", iface.getSimpleName(), propName, compName, compClass);
MutableRefMetadata ref = getServiceRef(cdr, puAnn.unitName(), iface);
compDef.addProperty(propName, ref);
@@ -125,27 +125,27 @@
return ref;
}
- @SuppressWarnings("unchecked")
- ComponentMetadata createServiceRef(String id, Class<?> iface) {
+ private ComponentMetadata createServiceRef(String id, Class<?> iface) {
final MutableReferenceMetadata refMeta = pc.createMetadata(MutableReferenceMetadata.class);
refMeta.setActivation(getDefaultActivation(pc));
refMeta.setAvailability(ReferenceMetadata.AVAILABILITY_MANDATORY);
refMeta.setRuntimeInterface(iface);
refMeta.setTimeout(Integer.parseInt(pc.getDefaultTimeout()));
- refMeta.setDependsOn((List<String>)Collections.EMPTY_LIST);
+ List<String> emptyList = Collections.emptyList();
+ refMeta.setDependsOn(emptyList);
refMeta.setId(id);
return refMeta;
}
- @SuppressWarnings("unchecked")
- ComponentMetadata createJPAServiceRef(String unitName, Class<?> iface) {
+ private ComponentMetadata createJPAServiceRef(String unitName, Class<?> iface) {
final MutableReferenceMetadata refMeta = pc.createMetadata(MutableReferenceMetadata.class);
refMeta.setActivation(getDefaultActivation(pc));
refMeta.setAvailability(ReferenceMetadata.AVAILABILITY_MANDATORY);
refMeta.setRuntimeInterface(iface);
refMeta.setFilter(String.format("(%s=%s)", JPA_UNIT_NAME, unitName));
refMeta.setTimeout(Integer.parseInt(pc.getDefaultTimeout()));
- refMeta.setDependsOn((List<String>)Collections.EMPTY_LIST);
+ List<String> emptyList = Collections.emptyList();
+ refMeta.setDependsOn(emptyList);
refMeta.setId(getId(unitName, iface));
return refMeta;
}
@@ -154,13 +154,13 @@
return unitName + "-" + iface.getSimpleName();
}
- private int getDefaultActivation(ParserContext ctx) {
+ private static int getDefaultActivation(ParserContext ctx) {
return "ACTIVATION_EAGER".equalsIgnoreCase(ctx.getDefaultActivation())
? ReferenceMetadata.ACTIVATION_EAGER : ReferenceMetadata.ACTIVATION_LAZY;
}
@SuppressWarnings("unchecked")
- private <T>T getComponent(ComponentDefinitionRegistry cdr, String id) {
+ private static <T>T getComponent(ComponentDefinitionRegistry cdr, String id) {
return (T)((PassThroughMetadata) cdr.getComponentDefinition(id)).getObject();
}
diff --git a/jpa-blueprint/src/main/java/org/apache/aries/jpa/blueprint/impl/JpaInterceptor.java b/jpa-blueprint/src/main/java/org/apache/aries/jpa/blueprint/impl/JpaInterceptor.java
index c5c0f62..6a11125 100644
--- a/jpa-blueprint/src/main/java/org/apache/aries/jpa/blueprint/impl/JpaInterceptor.java
+++ b/jpa-blueprint/src/main/java/org/apache/aries/jpa/blueprint/impl/JpaInterceptor.java
@@ -32,7 +32,7 @@
import org.slf4j.LoggerFactory;
public class JpaInterceptor implements Interceptor {
- private static Logger LOG = LoggerFactory.getLogger(JpaInterceptor.class);
+ private static final Logger LOG = LoggerFactory.getLogger(JpaInterceptor.class);
EntityManager em;
private Boolean cachedIsResourceLocal;
private Coordinator coordinator;
@@ -46,10 +46,12 @@
this.emId = emId;
}
+ @Override
public int getRank() {
return 0;
}
+ @Override
public Object preCall(ComponentMetadata cm, Method m, Object... parameters) throws Throwable {
if (coordinator == null) {
initServices();
@@ -64,7 +66,7 @@
return coordination;
} catch (Exception e) {
LOG.warn("Exception from EmSupplier.preCall", e);
- throw new RuntimeException(e);
+ throw new RuntimeException(e); // NOSONAR
}
}
@@ -73,6 +75,7 @@
em = (EntityManager)container.getComponentInstance(emId);
}
+ @Override
public void postCallWithException(ComponentMetadata cm, Method m, Throwable ex, Object preCallToken) {
LOG.debug("PostCallWithException for bean {}, method {}", cm.getId(), m.getName(), ex);
if (preCallToken != null) {
@@ -80,6 +83,7 @@
}
}
+ @Override
public void postCallWithReturn(ComponentMetadata cm, Method m, Object returnType, Object preCallToken)
throws Exception {
LOG.debug("PostCallWithReturn for bean {}, method {}", cm.getId(), m.getName());
@@ -88,8 +92,6 @@
}
}
-
-
private boolean isResourceLocal(EntityManager em) {
if (cachedIsResourceLocal == null) {
cachedIsResourceLocal = isResourceLocalInternal(em);
@@ -104,10 +106,6 @@
private boolean isResourceLocalInternal(EntityManager em) {
PersistenceUnitTransactionType transactionType = (PersistenceUnitTransactionType)em.getProperties()
.get(PersistenceUnitTransactionType.class.getName());
- if (transactionType == PersistenceUnitTransactionType.RESOURCE_LOCAL) {
- return true;
- } else {
- return false;
- }
+ return transactionType == PersistenceUnitTransactionType.RESOURCE_LOCAL;
}
}
diff --git a/jpa-blueprint/src/main/java/org/apache/aries/jpa/blueprint/impl/JpaNsHandler.java b/jpa-blueprint/src/main/java/org/apache/aries/jpa/blueprint/impl/JpaNsHandler.java
index 25f00c2..0c01af8 100644
--- a/jpa-blueprint/src/main/java/org/apache/aries/jpa/blueprint/impl/JpaNsHandler.java
+++ b/jpa-blueprint/src/main/java/org/apache/aries/jpa/blueprint/impl/JpaNsHandler.java
@@ -19,6 +19,7 @@
package org.apache.aries.jpa.blueprint.impl;
import java.net.URL;
+import java.util.Collections;
import java.util.Set;
import org.apache.aries.blueprint.ComponentDefinitionRegistry;
@@ -36,18 +37,17 @@
public static final String NAMESPACE_JPA_20 = "http://aries.apache.org/xmlns/jpa/v2.0.0";
public static final String NAMESPACE_JPAN_10 = "http://aries.apache.org/xmlns/jpan/v1.0.0";
- private void parseElement(Element elt, ComponentMetadata cm, ParserContext pc) {
+ private void parseElement(Element elt, ParserContext pc) {
ComponentDefinitionRegistry cdr = pc.getComponentDefinitionRegistry();
- if ("enable".equals(elt.getLocalName())) {
- if (!cdr.containsComponentDefinition(JpaComponentProcessor.class.getSimpleName())) {
- MutableBeanMetadata meta = pc.createMetadata(MutableBeanMetadata.class);
- meta.setId(JpaComponentProcessor.class.getSimpleName());
- meta.setRuntimeClass(JpaComponentProcessor.class);
- meta.setProcessor(true);
- meta.addProperty("pc", passThrough(pc, pc));
- cdr.registerComponentDefinition(meta);
- }
+ if ("enable".equals(elt.getLocalName()) &&
+ !cdr.containsComponentDefinition(JpaComponentProcessor.class.getSimpleName())) {
+ MutableBeanMetadata meta = pc.createMetadata(MutableBeanMetadata.class);
+ meta.setId(JpaComponentProcessor.class.getSimpleName());
+ meta.setRuntimeClass(JpaComponentProcessor.class);
+ meta.setProcessor(true);
+ meta.addProperty("pc", passThrough(pc, pc));
+ cdr.registerComponentDefinition(meta);
}
}
@@ -57,19 +57,21 @@
return meta;
}
+ @Override
public ComponentMetadata decorate(Node node, ComponentMetadata cm, ParserContext pc) {
if (node instanceof Element) {
- Element elt = (Element)node;
- parseElement(elt, cm, pc);
+ parseElement((Element)node, pc);
}
return cm;
}
+ @Override
public Metadata parse(Element elt, ParserContext pc) {
- parseElement(elt, pc.getEnclosingComponent(), pc);
+ parseElement(elt, pc);
return null;
}
+ @Override
public URL getSchemaLocation(String namespace) {
if (NAMESPACE_JPAN_10.equals(namespace)) {
// deprecated (remove in jpa 3)
@@ -81,9 +83,10 @@
}
}
+ @Override
@SuppressWarnings("rawtypes")
public Set<Class> getManagedClasses() {
- return null;
+ return Collections.emptySet();
}
}
diff --git a/jpa-blueprint/src/main/java/org/apache/aries/jpa/blueprint/impl/ResourceLocalTransactionParticipant.java b/jpa-blueprint/src/main/java/org/apache/aries/jpa/blueprint/impl/ResourceLocalTransactionParticipant.java
index e5c2a37..33c726e 100644
--- a/jpa-blueprint/src/main/java/org/apache/aries/jpa/blueprint/impl/ResourceLocalTransactionParticipant.java
+++ b/jpa-blueprint/src/main/java/org/apache/aries/jpa/blueprint/impl/ResourceLocalTransactionParticipant.java
@@ -22,8 +22,11 @@
import org.osgi.service.coordinator.Coordination;
import org.osgi.service.coordinator.Participant;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
final class ResourceLocalTransactionParticipant implements Participant {
+ private static final Logger LOG = LoggerFactory.getLogger(ResourceLocalTransactionParticipant.class);
private final EntityManager em;
ResourceLocalTransactionParticipant(EntityManager em) {
@@ -41,8 +44,8 @@
if (em.getTransaction().getRollbackOnly()) {
try {
em.getTransaction().rollback();
- } catch (Exception e1) {
- // Ignore
+ } catch (Exception e) {
+ LOG.debug("Exception on transaction rollback", e);
}
} else {
em.getTransaction().commit();
diff --git a/jpa-container-eclipselink-adapter/src/main/java/org/apache/aries/jpa/eclipselink/adapter/Activator.java b/jpa-container-eclipselink-adapter/src/main/java/org/apache/aries/jpa/eclipselink/adapter/Activator.java
index 6c99963..bc1431d 100644
--- a/jpa-container-eclipselink-adapter/src/main/java/org/apache/aries/jpa/eclipselink/adapter/Activator.java
+++ b/jpa-container-eclipselink-adapter/src/main/java/org/apache/aries/jpa/eclipselink/adapter/Activator.java
@@ -18,20 +18,7 @@
*/
package org.apache.aries.jpa.eclipselink.adapter;
-import org.osgi.framework.Bundle;
-import org.osgi.framework.BundleActivator;
-import org.osgi.framework.BundleContext;
-import org.osgi.framework.BundleEvent;
-import org.osgi.framework.BundleListener;
-import org.osgi.framework.Constants;
-import org.osgi.framework.ServiceFactory;
-import org.osgi.framework.ServiceRegistration;
-import org.osgi.framework.wiring.BundleRevision;
-import org.osgi.framework.wiring.BundleWire;
-import org.osgi.framework.wiring.BundleWiring;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
+import java.lang.reflect.Constructor;
import java.util.Dictionary;
import java.util.HashSet;
import java.util.Hashtable;
@@ -43,6 +30,19 @@
import javax.persistence.EntityManagerFactory;
import javax.persistence.spi.PersistenceProvider;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleActivator;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.BundleEvent;
+import org.osgi.framework.BundleListener;
+import org.osgi.framework.Constants;
+import org.osgi.framework.ServiceRegistration;
+import org.osgi.framework.wiring.BundleRevision;
+import org.osgi.framework.wiring.BundleWire;
+import org.osgi.framework.wiring.BundleWiring;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
/**
* Eclipselink adapter main class.
*
@@ -56,17 +56,15 @@
public class Activator implements BundleActivator, BundleListener {
public static final String ECLIPSELINK_JPA_PROVIDER_BUNDLE_SYMBOLIC_NAME = "org.eclipse.persistence.jpa";
public static final String ECLIPSELINK_JPA_PROVIDER_CLASS_NAME = "org.eclipse.persistence.jpa.PersistenceProvider";
+ private static final Logger LOG = LoggerFactory.getLogger(Activator.class);
private final ConcurrentMap<Bundle, ServiceRegistration<?>> registeredProviders = new ConcurrentHashMap<Bundle, ServiceRegistration<?>>();
- private static final Logger logger = LoggerFactory.getLogger(Activator.class);
-
private BundleContext context;
+ @Override
public void start(BundleContext ctx) {
- logger.debug("Starting EclipseLink adapter");
-
+ LOG.debug("Starting EclipseLink adapter");
context = ctx;
-
ctx.addBundleListener(this);
for (Bundle b : ctx.getBundles()) {
@@ -75,18 +73,20 @@
}
}
+ @Override
public void stop(BundleContext ctx) {
- logger.debug("Stopping EclipseLink adapter");
+ LOG.debug("Stopping EclipseLink adapter");
for (ServiceRegistration<?> reg : registeredProviders.values()) {
reg.unregister();
}
}
+ @Override
public void bundleChanged(BundleEvent event) {
if ((event.getType() & (BundleEvent.RESOLVED)) != 0) {
handlePotentialEclipseLink(event.getBundle());
- } else if (event.getType() == BundleEvent.UNRESOLVED | event.getType() == BundleEvent.UNINSTALLED) {
+ } else if (event.getType() == BundleEvent.UNRESOLVED || event.getType() == BundleEvent.UNINSTALLED) {
ServiceRegistration<?> reg = registeredProviders.remove(event.getBundle());
if (reg != null) {
reg.unregister();
@@ -95,35 +95,41 @@
}
private void handlePotentialEclipseLink(Bundle b) {
- if (b.getSymbolicName().equals(ECLIPSELINK_JPA_PROVIDER_BUNDLE_SYMBOLIC_NAME)) {
- logger.debug("Found EclipseLink bundle {}", b);
-
- // make sure we can actually find the JPA provider we expect to find
- try {
- b.loadClass(ECLIPSELINK_JPA_PROVIDER_CLASS_NAME);
- } catch (ClassNotFoundException cnfe) {
- logger.debug("Did not find provider class, exiting");
- // not one we can handle
- return;
- }
-
- if (!!!registeredProviders.containsKey(b)) {
- logger.debug("Adding new EclipseLink provider for bundle {}", b);
-
- ServiceFactory<PersistenceProvider> factory = new EclipseLinkProviderService(b);
-
- Dictionary<String, Object> props = new Hashtable<String, Object>();
- props.put("org.apache.aries.jpa.container.weaving.packages", getJPAPackages(b));
- props.put("javax.persistence.provider", ECLIPSELINK_JPA_PROVIDER_CLASS_NAME);
-
- ServiceRegistration<?> reg = context.registerService(
- PersistenceProvider.class.getName(), factory, props);
-
- ServiceRegistration<?> old = registeredProviders.putIfAbsent(b, reg);
- if (old != null) {
- reg.unregister();
- }
- }
+ if (!ECLIPSELINK_JPA_PROVIDER_BUNDLE_SYMBOLIC_NAME.equals(b.getSymbolicName())) {
+ return;
+ }
+ if (registeredProviders.containsKey(b)) {
+ return;
+ }
+
+ PersistenceProvider provider = createEclipselinkProvider(b);
+ if (provider == null) {
+ return;
+ }
+
+ LOG.debug("Adding new EclipseLink provider for bundle {}", b);
+ PersistenceProvider proxiedProvider = new EclipseLinkPersistenceProvider(provider, b);
+
+ Dictionary<String, Object> props = new Hashtable<String, Object>(); // NOSONAR
+ props.put("org.apache.aries.jpa.container.weaving.packages", getJPAPackages(b));
+ props.put("javax.persistence.provider", ECLIPSELINK_JPA_PROVIDER_CLASS_NAME);
+ ServiceRegistration<?> reg = context.registerService(PersistenceProvider.class, proxiedProvider, props);
+
+ ServiceRegistration<?> old = registeredProviders.putIfAbsent(b, reg);
+ if (old != null) {
+ reg.unregister();
+ }
+ }
+
+ @SuppressWarnings("unchecked")
+ private static PersistenceProvider createEclipselinkProvider(Bundle b) {
+ try {
+ Class<? extends PersistenceProvider> providerClass = (Class<? extends PersistenceProvider>)b.loadClass(Activator.ECLIPSELINK_JPA_PROVIDER_CLASS_NAME);
+ Constructor<? extends PersistenceProvider> con = providerClass.getConstructor();
+ return con.newInstance();
+ } catch (Exception e) {
+ LOG.debug("Unable to load EclipseLink provider class. Ignoring bundle " + b.getSymbolicName(), e);
+ return null;
}
}
@@ -139,36 +145,29 @@
*/
private String[] getJPAPackages(Bundle jpaBundle) {
Set<String> result = new HashSet<String>();
-
+
for (Bundle b : context.getBundles()) {
BundleWiring bw = b.adapt(BundleWiring.class);
- if(bw != null) {
- List<BundleWire> wires = bw.getProvidedWires(BundleRevision.PACKAGE_NAMESPACE);
-
- for (BundleWire w : wires) {
- String pkgName = (String) w.getCapability().getAttributes().get(BundleRevision.PACKAGE_NAMESPACE);
-
- boolean add = false;
- if (b.equals(jpaBundle)) {
- add = true;
- } else if (pkgName.startsWith("org.eclipse.persistence")) {
- add = true;
- }
-
- if (add) {
- String suffix = ";" + Constants.BUNDLE_SYMBOLICNAME_ATTRIBUTE + "=" + b.getSymbolicName() + ";" + Constants.BUNDLE_VERSION_ATTRIBUTE + "=" + b.getVersion();
- result.add(pkgName + suffix);
- }
- }
+ if (bw == null) {
+ continue;
+ }
+ boolean isJpaBundle = b.equals(jpaBundle);
+ List<BundleWire> wires = bw.getProvidedWires(BundleRevision.PACKAGE_NAMESPACE);
+ for (BundleWire w : wires) {
+ String pkgName = (String)w.getCapability().getAttributes().get(BundleRevision.PACKAGE_NAMESPACE);
+ boolean add = isJpaBundle || pkgName.startsWith("org.eclipse.persistence");
+ if (add) {
+ result.add(getPkg(b, pkgName));
+ }
}
}
- result.add("org.apache.aries.jpa.eclipselink.adapter.platform;" +
- Constants.BUNDLE_SYMBOLICNAME_ATTRIBUTE + "=" + context.getBundle().getSymbolicName() + ";" +
- Constants.BUNDLE_VERSION_ATTRIBUTE + "=" + context.getBundle().getVersion());
-
- logger.debug("Found JPA packages {}", result);
-
+ result.add(getPkg(context.getBundle(), "org.apache.aries.jpa.eclipselink.adapter.platform"));
+ LOG.debug("Found JPA packages {}", result);
return result.toArray(new String[0]);
}
+
+ private static String getPkg(Bundle b, String pkgName) {
+ return String.format("%s;%s=%s; %s=%s", pkgName, Constants.BUNDLE_SYMBOLICNAME_ATTRIBUTE, b.getSymbolicName(), Constants.BUNDLE_VERSION_ATTRIBUTE, b.getVersion());
+ }
}
diff --git a/jpa-container-eclipselink-adapter/src/main/java/org/apache/aries/jpa/eclipselink/adapter/EclipseLinkPersistenceProvider.java b/jpa-container-eclipselink-adapter/src/main/java/org/apache/aries/jpa/eclipselink/adapter/EclipseLinkPersistenceProvider.java
new file mode 100644
index 0000000..7d0adb1
--- /dev/null
+++ b/jpa-container-eclipselink-adapter/src/main/java/org/apache/aries/jpa/eclipselink/adapter/EclipseLinkPersistenceProvider.java
@@ -0,0 +1,64 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIESOR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.aries.jpa.eclipselink.adapter;
+
+import java.util.Map;
+
+import javax.persistence.EntityManagerFactory;
+import javax.persistence.spi.PersistenceProvider;
+import javax.persistence.spi.PersistenceUnitInfo;
+import javax.persistence.spi.ProviderUtil;
+
+import org.osgi.framework.Bundle;
+
+@SuppressWarnings("rawtypes")
+final class EclipseLinkPersistenceProvider implements PersistenceProvider {
+ private final PersistenceProvider delegate;
+ private final Bundle eclipeLinkBundle;
+
+ EclipseLinkPersistenceProvider(PersistenceProvider delegate, Bundle eclipeLinkBundle) {
+ this.delegate = delegate;
+ this.eclipeLinkBundle = eclipeLinkBundle;
+ }
+
+ @Override
+ public ProviderUtil getProviderUtil() {
+ return delegate.getProviderUtil();
+ }
+
+ @Override
+ public EntityManagerFactory createEntityManagerFactory(String arg0, Map arg1) {
+ return delegate.createEntityManagerFactory(arg0, arg1);
+ }
+
+ @Override
+ public EntityManagerFactory createContainerEntityManagerFactory(PersistenceUnitInfo punit, Map props) {
+ return delegate.createContainerEntityManagerFactory(new PersistenceUnitProxyWithTargetServer(punit, eclipeLinkBundle), props);
+ }
+
+ @Override
+ public void generateSchema(PersistenceUnitInfo punit, Map arg1) {
+ delegate.generateSchema(new PersistenceUnitProxyWithTargetServer(punit, eclipeLinkBundle), arg1);
+ }
+
+ @Override
+ public boolean generateSchema(String arg0, Map arg1) {
+ return delegate.generateSchema(arg0, arg1);
+ }
+}
diff --git a/jpa-container-eclipselink-adapter/src/main/java/org/apache/aries/jpa/eclipselink/adapter/EclipseLinkProviderService.java b/jpa-container-eclipselink-adapter/src/main/java/org/apache/aries/jpa/eclipselink/adapter/EclipseLinkProviderService.java
deleted file mode 100644
index 31e0ef0..0000000
--- a/jpa-container-eclipselink-adapter/src/main/java/org/apache/aries/jpa/eclipselink/adapter/EclipseLinkProviderService.java
+++ /dev/null
@@ -1,92 +0,0 @@
-/*
-// * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIESOR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.aries.jpa.eclipselink.adapter;
-
-import org.apache.aries.jpa.eclipselink.adapter.platform.OSGiTSServer;
-import org.osgi.framework.Bundle;
-import org.osgi.framework.ServiceFactory;
-import org.osgi.framework.ServiceRegistration;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.lang.reflect.Constructor;
-import java.util.Map;
-
-import javax.persistence.EntityManagerFactory;
-import javax.persistence.spi.PersistenceProvider;
-import javax.persistence.spi.PersistenceUnitInfo;
-import javax.persistence.spi.ProviderUtil;
-
-/**
- * Service factory for generating the Eclipselink OSGi compatible provider. It proxies the provider so that
- * we can go in at entity manager creation time and set the eclipselink target-server to be {@link OSGiTSServer}.
- */
-@SuppressWarnings({"rawtypes", "unchecked"})
-public class EclipseLinkProviderService implements ServiceFactory<PersistenceProvider> {
- private static final Logger logger = LoggerFactory.getLogger(Activator.class);
-
- private final Bundle eclipseLinkJpaBundle;
-
- public EclipseLinkProviderService(Bundle b) {
- eclipseLinkJpaBundle = b;
- }
-
- @Override
- public PersistenceProvider getService(Bundle bundle, ServiceRegistration registration) {
- logger.debug("Requested EclipseLink Provider service");
-
- try {
- Class<? extends PersistenceProvider> providerClass = (Class<? extends PersistenceProvider>) eclipseLinkJpaBundle.loadClass(Activator.ECLIPSELINK_JPA_PROVIDER_CLASS_NAME);
- Constructor<? extends PersistenceProvider> con = providerClass.getConstructor();
- final PersistenceProvider provider = con.newInstance();
-
- return new PersistenceProvider() {
- public ProviderUtil getProviderUtil() {
- return provider.getProviderUtil();
- }
-
- public EntityManagerFactory createEntityManagerFactory(String arg0, Map arg1) {
- return provider.createEntityManagerFactory(arg0, arg1);
- }
-
- public EntityManagerFactory createContainerEntityManagerFactory(PersistenceUnitInfo punit, Map props) {
- return provider.createContainerEntityManagerFactory(new PersistenceUnitProxyWithTargetServer(punit,
- eclipseLinkJpaBundle), props);
- }
-
- @Override
- public void generateSchema(PersistenceUnitInfo punit, Map arg1) {
- provider.generateSchema(new PersistenceUnitProxyWithTargetServer(punit,
- eclipseLinkJpaBundle), arg1);
- }
-
- @Override
- public boolean generateSchema(String arg0, Map arg1) {
- return provider.generateSchema(arg0, arg1);
- }
- };
-
- } catch (Exception e) {
- logger.error("An exception was caught trying to instantiate the EclipseLink JPA provider.", e);
- return null;
- }
- }
-
- public void ungetService(Bundle bundle, ServiceRegistration registration, PersistenceProvider service) {}
-}
\ No newline at end of file
diff --git a/jpa-container-eclipselink-adapter/src/main/java/org/apache/aries/jpa/eclipselink/adapter/PersistenceUnitProxyWithTargetServer.java b/jpa-container-eclipselink-adapter/src/main/java/org/apache/aries/jpa/eclipselink/adapter/PersistenceUnitProxyWithTargetServer.java
index 635332a..06d5e06 100644
--- a/jpa-container-eclipselink-adapter/src/main/java/org/apache/aries/jpa/eclipselink/adapter/PersistenceUnitProxyWithTargetServer.java
+++ b/jpa-container-eclipselink-adapter/src/main/java/org/apache/aries/jpa/eclipselink/adapter/PersistenceUnitProxyWithTargetServer.java
@@ -1,5 +1,5 @@
/*
-// * Licensed to the Apache Software Foundation (ASF) under one
+ * Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
@@ -47,58 +47,72 @@
FrameworkUtil.getBundle(getClass()));
}
+ @Override
public void addTransformer(ClassTransformer arg0) {
delegate.addTransformer(arg0);
}
+ @Override
public boolean excludeUnlistedClasses() {
return delegate.excludeUnlistedClasses();
}
+ @Override
public ClassLoader getClassLoader() {
return unionClassLoader;
}
+ @Override
public List<URL> getJarFileUrls() {
return delegate.getJarFileUrls();
}
+ @Override
public DataSource getJtaDataSource() {
return delegate.getJtaDataSource();
}
+ @Override
public List<String> getManagedClassNames() {
return delegate.getManagedClassNames();
}
+ @Override
public List<String> getMappingFileNames() {
return delegate.getMappingFileNames();
}
+ @Override
public ClassLoader getNewTempClassLoader() {
return delegate.getNewTempClassLoader();
}
+ @Override
public DataSource getNonJtaDataSource() {
return delegate.getNonJtaDataSource();
}
+ @Override
public String getPersistenceProviderClassName() {
return delegate.getPersistenceProviderClassName();
}
+ @Override
public String getPersistenceUnitName() {
return delegate.getPersistenceUnitName();
}
+ @Override
public URL getPersistenceUnitRootUrl() {
return delegate.getPersistenceUnitRootUrl();
}
+ @Override
public String getPersistenceXMLSchemaVersion() {
return delegate.getPersistenceXMLSchemaVersion();
}
+ @Override
public Properties getProperties() {
Properties props = delegate.getProperties();
@@ -106,7 +120,7 @@
props = new Properties();
}
- if (!!!props.containsKey("eclipselink.target-server")) {
+ if (!props.containsKey("eclipselink.target-server")) {
props.put("eclipselink.target-server",
"org.apache.aries.jpa.eclipselink.adapter.platform.OSGiTSServer");
}
@@ -114,14 +128,17 @@
return props;
}
+ @Override
public SharedCacheMode getSharedCacheMode() {
return delegate.getSharedCacheMode();
}
+ @Override
public PersistenceUnitTransactionType getTransactionType() {
return delegate.getTransactionType();
}
+ @Override
public ValidationMode getValidationMode() {
return delegate.getValidationMode();
}
diff --git a/jpa-container-eclipselink-adapter/src/main/java/org/apache/aries/jpa/eclipselink/adapter/UnionClassLoader.java b/jpa-container-eclipselink-adapter/src/main/java/org/apache/aries/jpa/eclipselink/adapter/UnionClassLoader.java
index a4b7103..9cdcfb9 100644
--- a/jpa-container-eclipselink-adapter/src/main/java/org/apache/aries/jpa/eclipselink/adapter/UnionClassLoader.java
+++ b/jpa-container-eclipselink-adapter/src/main/java/org/apache/aries/jpa/eclipselink/adapter/UnionClassLoader.java
@@ -26,68 +26,71 @@
import org.osgi.framework.Bundle;
import org.osgi.framework.BundleReference;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
-public final class UnionClassLoader extends ClassLoader implements BundleReference{
-
- private static final String ORG_OSGI_FRAMEWORK = "org.osgi.framework.";
- private static final int DOT_INDEX = ORG_OSGI_FRAMEWORK.lastIndexOf('.');
- private final Bundle eclipseLinkBundle;
- private final Bundle adaptorBundle;
-
- public UnionClassLoader(ClassLoader parentLoader, Bundle b, Bundle adaptor) {
- super(parentLoader);
- this.eclipseLinkBundle = b;
- this.adaptorBundle = adaptor;
- }
+public final class UnionClassLoader extends ClassLoader implements BundleReference {
+ private static final String ORG_OSGI_FRAMEWORK = "org.osgi.framework.";
+ private static final int DOT_INDEX = ORG_OSGI_FRAMEWORK.lastIndexOf('.');
+ private static final Logger LOG = LoggerFactory.getLogger(UnionClassLoader.class);
+ private final Bundle eclipseLinkBundle;
+ private final Bundle adaptorBundle;
- protected Class<?> findClass(String name) throws ClassNotFoundException {
-
- if("org.apache.aries.jpa.eclipselink.adapter.platform.OSGiTSServer".equals(name) ||
- "org.apache.aries.jpa.eclipselink.adapter.platform.OSGiTSWrapper".equals(name)) {
-
- ByteArrayOutputStream baos = new ByteArrayOutputStream();
- InputStream is = getClass().getClassLoader().getResourceAsStream(
- name.replace('.', '/') + ".class");
-
- if(is == null)
- throw new ClassNotFoundException(name);
-
-
- try {
- copy(is, baos);
- } catch (IOException ioe) {
- throw new ClassNotFoundException(name, ioe);
- }
- return defineClass(name, baos.toByteArray(), 0, baos.size());
- } else if (name.startsWith(ORG_OSGI_FRAMEWORK) &&
- name.lastIndexOf('.') == DOT_INDEX) {
- return adaptorBundle.loadClass(name);
+ public UnionClassLoader(ClassLoader parentLoader, Bundle b, Bundle adaptor) {
+ super(parentLoader);
+ this.eclipseLinkBundle = b;
+ this.adaptorBundle = adaptor;
}
- return eclipseLinkBundle.loadClass(name);
- }
- public Bundle getBundle() {
- return adaptorBundle;
- }
-
- private static void copy(InputStream in, OutputStream out)
- throws IOException {
- try {
- int len;
- byte[] b = new byte[1024];
- while ((len = in.read(b)) != -1)
- out.write(b, 0, len);
- } finally {
- close(in);
- }
- }
+ @Override
+ protected Class<?> findClass(String name) throws ClassNotFoundException {
+ if ("org.apache.aries.jpa.eclipselink.adapter.platform.OSGiTSServer".equals(name)
+ || "org.apache.aries.jpa.eclipselink.adapter.platform.OSGiTSWrapper".equals(name)) {
+ return loadTempClass(name);
+ } else if (name.startsWith(ORG_OSGI_FRAMEWORK) && name.lastIndexOf('.') == DOT_INDEX) {
+ return adaptorBundle.loadClass(name);
+ }
+ return eclipseLinkBundle.loadClass(name);
+ }
- private static void close(Closeable c) {
- try {
- if (c != null)
- c.close();
- } catch (IOException e) {
- c = null;
- }
- }
-}
\ No newline at end of file
+ private Class<?> loadTempClass(String name) throws ClassNotFoundException, ClassFormatError {
+ InputStream is = getClass().getClassLoader().getResourceAsStream(name.replace('.', '/') + ".class");
+ if (is == null) {
+ throw new ClassNotFoundException(name);
+ }
+ ByteArrayOutputStream baos = new ByteArrayOutputStream();
+ try {
+ copy(is, baos);
+ } catch (IOException ioe) {
+ throw new ClassNotFoundException(name, ioe);
+ }
+ return defineClass(name, baos.toByteArray(), 0, baos.size());
+ }
+
+ @Override
+ public Bundle getBundle() {
+ return adaptorBundle;
+ }
+
+ private static void copy(InputStream in, OutputStream out) throws IOException {
+ try {
+ int len;
+ byte[] b = new byte[1024];
+ while ((len = in.read(b)) != -1) {
+ out.write(b, 0, len);
+ }
+ } finally {
+ close(in);
+ }
+ }
+
+ private static void close(Closeable c) {
+ try {
+ if (c != null) {
+ c.close();
+ }
+ } catch (IOException e) {
+ LOG.debug("Exception closing", e);
+ }
+ }
+}
diff --git a/jpa-container-eclipselink-adapter/src/main/java/org/apache/aries/jpa/eclipselink/adapter/platform/OSGiTSWrapper.java b/jpa-container-eclipselink-adapter/src/main/java/org/apache/aries/jpa/eclipselink/adapter/platform/OSGiTSWrapper.java
index a3ef4f0..db73e78 100644
--- a/jpa-container-eclipselink-adapter/src/main/java/org/apache/aries/jpa/eclipselink/adapter/platform/OSGiTSWrapper.java
+++ b/jpa-container-eclipselink-adapter/src/main/java/org/apache/aries/jpa/eclipselink/adapter/platform/OSGiTSWrapper.java
@@ -36,8 +36,7 @@
ServiceReference ref = ctx.getServiceReference(TransactionManager.class.getName());
if (ref != null) {
- TransactionManager manager = (TransactionManager) ctx.getService(ref);
- return manager;
+ return (TransactionManager) ctx.getService(ref);
}
}
diff --git a/jpa-container/src/main/java/org/apache/aries/jpa/container/impl/Activator.java b/jpa-container/src/main/java/org/apache/aries/jpa/container/impl/Activator.java
index 1dabec1..67c7c56 100644
--- a/jpa-container/src/main/java/org/apache/aries/jpa/container/impl/Activator.java
+++ b/jpa-container/src/main/java/org/apache/aries/jpa/container/impl/Activator.java
@@ -49,7 +49,7 @@
* weaving hooks that are not yet visible to the bundle class loader.
*/
private void registerWeavingHook(BundleContext context, TransformerRegistry tr) {
- Dictionary<String, Object> props = new Hashtable<String, Object>(1);
+ Dictionary<String, Object> props = new Hashtable<String, Object>(1); // NOSONAR
props.put(Constants.SERVICE_RANKING, Integer.MAX_VALUE);
context.registerService(WeavingHook.class.getName(), tr, props);
}
diff --git a/jpa-container/src/main/java/org/apache/aries/jpa/container/impl/DSFTracker.java b/jpa-container/src/main/java/org/apache/aries/jpa/container/impl/DSFTracker.java
index b5c86e6..4f714a0 100644
--- a/jpa-container/src/main/java/org/apache/aries/jpa/container/impl/DSFTracker.java
+++ b/jpa-container/src/main/java/org/apache/aries/jpa/container/impl/DSFTracker.java
@@ -40,7 +40,7 @@
private static final String JDBC_DRIVER = "javax.persistence.jdbc.driver";
private static final String JDBC_URL = "javax.persistence.jdbc.url";
private static final String JDBC_USER = "javax.persistence.jdbc.user";
- private static final String JDBC_PASSWORD = "javax.persistence.jdbc.password";
+ private static final String JDBC_PASSWORD = "javax.persistence.jdbc.password"; // NOSONAR
private static final Logger LOGGER = LoggerFactory.getLogger(DSFTracker.class);
@@ -101,11 +101,10 @@
put(props, DataSourceFactory.JDBC_URL, punit, JDBC_URL);
put(props, DataSourceFactory.JDBC_USER, punit, JDBC_USER);
put(props, DataSourceFactory.JDBC_PASSWORD, punit, JDBC_PASSWORD);
- DataSource ds = dsf.createDataSource(props);
- return ds;
+ return dsf.createDataSource(props);
} catch (SQLException e) {
- throw new RuntimeException("Error creating DataSource for persistence unit " + punit + "."
- + e.getMessage(), e);
+ String msg = "Error creating DataSource for persistence unit " + punit + "." + e.getMessage();
+ throw new RuntimeException(msg, e); // NOSONAR
}
}
diff --git a/jpa-container/src/main/java/org/apache/aries/jpa/container/impl/ManagedEMF.java b/jpa-container/src/main/java/org/apache/aries/jpa/container/impl/ManagedEMF.java
index b8b73ac..04b8851 100644
--- a/jpa-container/src/main/java/org/apache/aries/jpa/container/impl/ManagedEMF.java
+++ b/jpa-container/src/main/java/org/apache/aries/jpa/container/impl/ManagedEMF.java
@@ -49,9 +49,8 @@
* the JPA_CONFIGURATION_PREFIX.<persistence unit name>.
*/
public class ManagedEMF implements Closeable, ManagedService {
- private static final Logger LOGGER = LoggerFactory.getLogger(ManagedEMF.class);
-
- private static String JPA_CONFIGURATION_PREFIX = "org.apache.aries.jpa.";
+ private static final Logger LOGGER = LoggerFactory.getLogger(ManagedEMF.class);
+ private static final String JPA_CONFIGURATION_PREFIX = "org.apache.aries.jpa.";
private EntityManagerFactory emf;
private ServiceRegistration<EntityManagerFactory> reg;
@@ -67,12 +66,11 @@
this.persistenceUnit = persistenceUnit;
this.bundle = bundle;
registerManagedService(containerContext, persistenceUnit);
- //createAndPublishEMF(null);
closed = false;
}
private void registerManagedService(BundleContext containerContext, PersistenceUnitInfo persistenceUnit) {
- Dictionary<String, Object> configuration = new Hashtable<String, Object>();
+ Dictionary<String, Object> configuration = new Hashtable<String, Object>(); // NOSONAR
configuration.put(Constants.SERVICE_PID,
JPA_CONFIGURATION_PREFIX + persistenceUnit.getPersistenceUnitName());
configReg = containerContext.registerService(ManagedService.class.getName(), this, configuration);
@@ -81,10 +79,9 @@
public void closeEMF() {
if (reg != null) {
try {
-
reg.unregister();
} catch (Exception e) {
- // Ignore. May happen if persistence unit bundle is unloaded/updated
+ LOGGER.debug("Exception on unregister", e);
}
}
if (emf != null && emf.isOpen()) {
@@ -98,6 +95,7 @@
emf = null;
}
+ @Override
public void close() {
closed = true;
closeEMF();
@@ -135,7 +133,7 @@
}
public static Dictionary<String, String> createProperties(PersistenceUnitInfo persistenceUnit, Bundle puBundle) {
- Dictionary<String, String> props = new Hashtable<String, String>();
+ Dictionary<String, String> props = new Hashtable<String, String>(); // NOSONAR
props.put(JPA_UNIT_NAME, persistenceUnit.getPersistenceUnitName());
if (persistenceUnit.getPersistenceProviderClassName() != null) {
props.put(JPA_UNIT_PROVIDER, persistenceUnit.getPersistenceProviderClassName());
@@ -145,7 +143,7 @@
}
private Map<String, Object> asMap(Dictionary<String, ?> dict) {
- Map<String, Object> map = new HashMap<String, Object>();
+ Map<String, Object> map = new HashMap<String, Object>(); // NOSONAR
map.put(PersistenceUnitTransactionType.class.getName(), persistenceUnit.getTransactionType());
for (Enumeration<String> e = dict.keys(); e.hasMoreElements();) {
String key = e.nextElement();
diff --git a/jpa-container/src/main/java/org/apache/aries/jpa/container/impl/PersistenceBundleTracker.java b/jpa-container/src/main/java/org/apache/aries/jpa/container/impl/PersistenceBundleTracker.java
index 8cd45f0..b777741 100644
--- a/jpa-container/src/main/java/org/apache/aries/jpa/container/impl/PersistenceBundleTracker.java
+++ b/jpa-container/src/main/java/org/apache/aries/jpa/container/impl/PersistenceBundleTracker.java
@@ -39,29 +39,42 @@
*/
public class PersistenceBundleTracker implements BundleTrackerCustomizer<Bundle> {
private static final Logger LOGGER = LoggerFactory.getLogger(PersistenceBundleTracker.class);
- Map<Bundle, Collection<PersistenceProviderTracker>> trackers;
- private BundleContext context;
+ private final Map<Bundle, Collection<PersistenceProviderTracker>> trackers;
+ private final BundleContext context;
+ private Map<Integer, String> typeMap;
public PersistenceBundleTracker(BundleContext context) {
this.context = context;
trackers = new HashMap<Bundle, Collection<PersistenceProviderTracker>>();
+ this.typeMap = new HashMap<Integer, String>();
+ this.typeMap.put(BundleEvent.INSTALLED, "INSTALLED");
+ this.typeMap.put(BundleEvent.LAZY_ACTIVATION, "LAZY_ACTIVATION");
+ this.typeMap.put(BundleEvent.RESOLVED, "RESOLVED");
+ this.typeMap.put(BundleEvent.STARTED, "STARTED");
+ this.typeMap.put(BundleEvent.STARTING, "Starting");
+ this.typeMap.put(BundleEvent.STOPPED, "STOPPED");
+ this.typeMap.put(BundleEvent.UNINSTALLED, "UNINSTALLED");
+ this.typeMap.put(256, "UNRESOLVED");
+ this.typeMap.put(BundleEvent.UPDATED, "UPDATED");
}
+ @Override
public synchronized Bundle addingBundle(Bundle bundle, BundleEvent event) {
if (event != null && event.getType() == BundleEvent.STOPPED) {
// Avoid starting persistence units in state STOPPED.
// TODO No idea why we are called at all in this state
return bundle;
}
- if (getTrackers(bundle).size() == 0) {
+ if (getTrackers(bundle).isEmpty()) {
findPersistenceUnits(bundle, event);
}
return bundle;
}
+ @Override
public synchronized void removedBundle(Bundle bundle, BundleEvent event, Bundle object) {
Collection<PersistenceProviderTracker> providerTrackers = trackers.remove(bundle);
- if (providerTrackers == null || providerTrackers.size() == 0) {
+ if (providerTrackers == null || providerTrackers.isEmpty()) {
return;
}
LOGGER.info("removing persistence units for " + bundle.getSymbolicName() + " " + getType(event));
@@ -76,12 +89,12 @@
punit.addAnnotated();
trackProvider(bundle, punit);
}
- if (getTrackers(bundle).size() > 0) {
+ if (!getTrackers(bundle).isEmpty()) {
LOGGER.info("Persistence units added for bundle " + bundle.getSymbolicName() + " event " + getEventType(event));
}
}
- private Integer getEventType(BundleEvent event) {
+ private static Integer getEventType(BundleEvent event) {
return (event != null) ? event.getType() : null;
}
@@ -96,36 +109,16 @@
@Override
public void modifiedBundle(Bundle bundle, BundleEvent event, Bundle object) {
+ // Only interested in added or removed
}
- private static String getType(BundleEvent event) {
+ private String getType(BundleEvent event) {
if (event == null) {
return "null";
}
int type = event.getType();
- switch (type) {
- case BundleEvent.INSTALLED:
- return "INSTALLED";
- case BundleEvent.LAZY_ACTIVATION:
- return "LAZY_ACTIVATION";
- case BundleEvent.RESOLVED:
- return "RESOLVED";
- case BundleEvent.STARTED:
- return "STARTED";
- case BundleEvent.STARTING:
- return "Starting";
- case BundleEvent.STOPPED:
- return "STOPPED";
- case BundleEvent.UNINSTALLED:
- case 256: // Not sure why but this event is sent when a bundle is uninstalled
- return "UNINSTALLED";
- case BundleEvent.UNRESOLVED:
- return "UNRESOLVED";
- case BundleEvent.UPDATED:
- return "UPDATED";
- default:
- return "unknown event type: " + type;
- }
+ String typeSt = typeMap.get(type);
+ return (typeSt != null) ? typeSt : "unknown event type: " + type;
}
private Collection<PersistenceProviderTracker> getTrackers(Bundle bundle) {
diff --git a/jpa-container/src/main/java/org/apache/aries/jpa/container/impl/PersistenceProviderTracker.java b/jpa-container/src/main/java/org/apache/aries/jpa/container/impl/PersistenceProviderTracker.java
index 673d96a..2b39780 100644
--- a/jpa-container/src/main/java/org/apache/aries/jpa/container/impl/PersistenceProviderTracker.java
+++ b/jpa-container/src/main/java/org/apache/aries/jpa/container/impl/PersistenceProviderTracker.java
@@ -54,7 +54,7 @@
}
private static Filter createFilter(BundleContext context, PersistenceUnit punit) {
- String filter = null;
+ String filter;
if (punit.getPersistenceProviderClassName() != null) {
filter = String.format("(&(objectClass=%s)(%s=%s))",
PersistenceProvider.class.getName(),
@@ -84,7 +84,7 @@
createAndCloseDummyEMF(provider);
- stored.dsTracker = createDataSourceTracker(stored, provider, providerName);
+ stored.dsTracker = createDataSourceTracker(provider);
EntityManagerFactoryBuilder emfBuilder = new AriesEntityManagerFactoryBuilder(provider, punit);
Dictionary<String, ?> props = ManagedEMF.createProperties(punit, punit.getBundle());
stored.reg = context.registerService(EntityManagerFactoryBuilder.class, emfBuilder , props);
@@ -111,7 +111,7 @@
punit.setNonJtaDataSource(null);
}
- private ServiceTracker<?, ?> createDataSourceTracker(StoredPerProvider stored, PersistenceProvider provider, String providerName) {
+ private ServiceTracker<?, ?> createDataSourceTracker(PersistenceProvider provider) {
if (usesDataSource()) {
if (!usesDataSourceService()) {
LOGGER.warn("Persistence unit " + punit.getPersistenceUnitName() + " refers to a non OSGi service DataSource");
diff --git a/jpa-container/src/main/java/org/apache/aries/jpa/container/parser/impl/JPAAnnotationScanner.java b/jpa-container/src/main/java/org/apache/aries/jpa/container/parser/impl/JPAAnnotationScanner.java
index 0d7f51d..776ecf2 100644
--- a/jpa-container/src/main/java/org/apache/aries/jpa/container/parser/impl/JPAAnnotationScanner.java
+++ b/jpa-container/src/main/java/org/apache/aries/jpa/container/parser/impl/JPAAnnotationScanner.java
@@ -27,8 +27,15 @@
import org.osgi.framework.Bundle;
import org.osgi.framework.wiring.BundleWiring;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
class JPAAnnotationScanner {
+ private static final Logger LOG = LoggerFactory.getLogger(JPAAnnotationScanner.class);
+
+ private JPAAnnotationScanner() {
+ }
+
public static Collection<String> findJPAAnnotatedClasses(Bundle b) {
BundleWiring bw = b.adapt(BundleWiring.class);
Collection<String> resources = bw.listResources("/", "*.class",
@@ -47,12 +54,16 @@
classes.add(s);
}
- } catch (ClassNotFoundException cnfe) {
-
- } catch (NoClassDefFoundError ncdfe) {
-
+ } catch (ClassNotFoundException e) {
+ logEx(e);
+ } catch (NoClassDefFoundError e) {
+ logEx(e);
}
}
return classes;
}
+
+ private static void logEx(Throwable e) {
+ LOG.debug("Exception while scanning for JPA annotations", e);
+ }
}
diff --git a/jpa-container/src/main/java/org/apache/aries/jpa/container/parser/impl/JPAHandler.java b/jpa-container/src/main/java/org/apache/aries/jpa/container/parser/impl/JPAHandler.java
index 1e70eed..4ccd164 100644
--- a/jpa-container/src/main/java/org/apache/aries/jpa/container/parser/impl/JPAHandler.java
+++ b/jpa-container/src/main/java/org/apache/aries/jpa/container/parser/impl/JPAHandler.java
@@ -18,8 +18,9 @@
*/
package org.apache.aries.jpa.container.parser.impl;
+import java.util.ArrayDeque;
import java.util.Collection;
-import java.util.Stack;
+import java.util.Deque;
import javax.persistence.SharedCacheMode;
import javax.persistence.ValidationMode;
@@ -36,7 +37,7 @@
*/
public class JPAHandler extends DefaultHandler {
/** The Persistence Units that we have parsed */
- private final Stack<PersistenceUnit> persistenceUnits = new Stack<PersistenceUnit>();
+ private final Deque<PersistenceUnit> persistenceUnits = new ArrayDeque<PersistenceUnit>();
/** The name of the current element */
private String elementName;
/** The version of the persistence.xml file */
@@ -106,7 +107,7 @@
pu.setExcludeUnlisted(Boolean.parseBoolean(s));
else if ("shared-cache-mode".equals(elementName))
pu.setSharedCacheMode(SharedCacheMode.valueOf(s));
- else if ("validation-mode".equals(elementName))
+ else if ("validation-mode".equals(elementName))
pu.setValidationMode(ValidationMode.valueOf(s));
}
diff --git a/jpa-container/src/main/java/org/apache/aries/jpa/container/parser/impl/PersistenceUnit.java b/jpa-container/src/main/java/org/apache/aries/jpa/container/parser/impl/PersistenceUnit.java
index 03e5ee9..f5f767a 100644
--- a/jpa-container/src/main/java/org/apache/aries/jpa/container/parser/impl/PersistenceUnit.java
+++ b/jpa-container/src/main/java/org/apache/aries/jpa/container/parser/impl/PersistenceUnit.java
@@ -95,10 +95,9 @@
return this.classLoader;
}
- @SuppressWarnings("unchecked")
@Override
public List<URL> getJarFileUrls() {
- return Collections.EMPTY_LIST;
+ return Collections.emptyList();
}
@Override
@@ -112,15 +111,12 @@
@Override
public List<String> getManagedClassNames() {
- ArrayList<String> names = new ArrayList<String>();
- names.addAll(classNames);
- return names;
+ return new ArrayList<String>(classNames);
}
- @SuppressWarnings("unchecked")
@Override
public List<String> getMappingFileNames() {
- return Collections.EMPTY_LIST;
+ return Collections.emptyList();
}
public String getName() {
diff --git a/jpa-container/src/main/java/org/apache/aries/jpa/container/parser/impl/PersistenceUnitParser.java b/jpa-container/src/main/java/org/apache/aries/jpa/container/parser/impl/PersistenceUnitParser.java
index c0ad662..6c5cf73 100644
--- a/jpa-container/src/main/java/org/apache/aries/jpa/container/parser/impl/PersistenceUnitParser.java
+++ b/jpa-container/src/main/java/org/apache/aries/jpa/container/parser/impl/PersistenceUnitParser.java
@@ -42,8 +42,11 @@
*/
public class PersistenceUnitParser {
private static final String DEFAULT_PERSISTENCE_LOCATION = "META-INF/persistence.xml";
- private static final Logger _logger = LoggerFactory.getLogger("org.apache.aries.jpa.container");
+ private static final Logger LOG = LoggerFactory.getLogger("org.apache.aries.jpa.container");
public static final String PERSISTENCE_UNIT_HEADER = "Meta-Persistence";
+
+ private PersistenceUnitParser() {
+ }
/**
* This method locates persistence descriptor files based on a combination of the default location
@@ -82,10 +85,10 @@
try {
InputStream is = locateFile(bundle, location);
if (is != null) {
- parse(bundle, location, is, punits);
+ parse(bundle, is, punits);
}
} catch (Exception e) {
- _logger.error("exception.while.locating.descriptor", e);
+ LOG.error("exception.while.locating.descriptor", e);
return Collections.emptySet();
}
}
@@ -93,7 +96,7 @@
return punits;
}
- private static void parse(Bundle bundle, String location, InputStream is, Collection<PersistenceUnit> punits) {
+ private static void parse(Bundle bundle, InputStream is, Collection<PersistenceUnit> punits) {
SAXParserFactory parserFactory = SAXParserFactory.newInstance();
try {
SAXParser parser = parserFactory.newSAXParser();
@@ -101,7 +104,7 @@
parser.parse(is, handler);
punits.addAll(handler.getPersistenceUnits());
} catch (Exception e) {
- throw new RuntimeException("persistence.description.parse.error", e);
+ throw new RuntimeException("Error parsing persistence unit in bundle " + bundle.getSymbolicName(), e); // NOSONAR
} finally {
safeClose(is);
}
@@ -112,7 +115,7 @@
try {
is.close();
} catch (IOException e) {
- // No logging necessary, just consume
+ LOG.debug("Exception while closing", e);
}
}
}
@@ -127,41 +130,38 @@
*/
private static InputStream locateFile(Bundle bundle, String location) throws IOException {
// There is nothing for an empty location
- InputStream is = null;
if ("".equals(location)) {
return null;
}
// If there is a '!' then we have to look in a jar
int bangIndex = location.indexOf('!');
- // No '!', getEntry will do
if (bangIndex == -1) {
URL url = bundle.getEntry(location);
- if (url != null)
- is = url.openStream();
-
- } else {
- // There was a '!', find the jar
- URL url = bundle.getEntry(location.substring(0, bangIndex));
-
if (url != null) {
- // Remember to trim off the "!/"
+ return url.openStream();
+ }
+ } else {
+ URL url = bundle.getEntry(location.substring(0, bangIndex));
+ if (url != null) {
String toLocate = location.substring(bangIndex + 2);
-
- @SuppressWarnings("resource")
- JarInputStream jis = new JarInputStream(url.openStream());
- JarEntry entry = jis.getNextJarEntry();
-
- while (entry != null) {
- if (entry.getName().equals(toLocate)) {
- is = jis;
- break;
- }
- entry = jis.getNextJarEntry();
- }
+ return locateInJar(url, toLocate);
}
}
- return is;
+ return null;
+ }
+
+ private static InputStream locateInJar(URL url, String toLocate) throws IOException {
+ JarInputStream jis = new JarInputStream(url.openStream());
+ JarEntry entry = jis.getNextJarEntry();
+
+ while (entry != null) {
+ if (entry.getName().equals(toLocate)) {
+ return jis;
+ }
+ entry = jis.getNextJarEntry();
+ }
+ return null;
}
}
diff --git a/jpa-container/src/main/java/org/apache/aries/jpa/container/parser/impl/TempBundleDelegatingClassLoader.java b/jpa-container/src/main/java/org/apache/aries/jpa/container/parser/impl/TempBundleDelegatingClassLoader.java
index 4c0a293..0a0c5ec 100644
--- a/jpa-container/src/main/java/org/apache/aries/jpa/container/parser/impl/TempBundleDelegatingClassLoader.java
+++ b/jpa-container/src/main/java/org/apache/aries/jpa/container/parser/impl/TempBundleDelegatingClassLoader.java
@@ -21,7 +21,6 @@
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
-import java.lang.reflect.UndeclaredThrowableException;
import java.net.URL;
import java.security.AccessController;
import java.security.PrivilegedAction;
@@ -35,165 +34,139 @@
import org.osgi.framework.wiring.BundleRevision;
import org.osgi.framework.wiring.BundleWire;
import org.osgi.framework.wiring.BundleWiring;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
/**
* This is a simple temporary ClassLoader that delegates to the Bundle,
* but does not call loadClass. It is used by the PersistenceUnitInfo
*/
public class TempBundleDelegatingClassLoader extends ClassLoader {
+ private static final Logger LOG = LoggerFactory.getLogger(TempBundleDelegatingClassLoader.class);
+ private final Bundle bundle;
- private static final boolean CONTEXT_TRACKING_ENABLED;
-
- static {
- boolean enabled = true;
- try {
- Class.forName("org.osgi.framework.wiring.BundleWiring");
- } catch (ClassNotFoundException cnfe) {
- enabled = false;
- }
- CONTEXT_TRACKING_ENABLED = enabled;
- }
-
- private final Bundle bundle;
-
- private final ThreadLocal<Deque<Bundle>> currentLoadingBundle = new ThreadLocal<Deque<Bundle>>(){
- @Override
- protected Deque<Bundle> initialValue() {
- return new LinkedList<Bundle>();
- }
- };
-
- public TempBundleDelegatingClassLoader(Bundle b, ClassLoader parent) {
- super(parent);
- bundle = b;
- }
-
- @Override
- protected Class<?> findClass(String className) throws ClassNotFoundException {
- String classResName = className.replace('.', '/').concat(".class");
-
- //Don't use loadClass, just load the bytes and call defineClass
- Bundle currentContext = currentLoadingBundle.get().peek();
- InputStream is;
- if(currentContext == null) {
- is = getResourceAsStream(classResName);
- } else {
- is = getResourceInBundleAsStream(classResName, currentContext);
- }
-
- if(is == null)
- throw new ClassNotFoundException(className);
-
- ByteArrayOutputStream baos = new ByteArrayOutputStream();
-
- byte[] buff = new byte[4096];
- try {
- try {
- int read = is.read(buff);
- while(read >0) {
- baos.write(buff, 0, read);
- read = is.read(buff);
+ private final ThreadLocal<Deque<Bundle>> currentLoadingBundle = new ThreadLocal<Deque<Bundle>>() {
+ @Override
+ protected Deque<Bundle> initialValue() {
+ return new LinkedList<Bundle>();
}
- }finally {
- is.close();
- }
- } catch (IOException ioe) {
- throw new ClassNotFoundException(className, ioe);
- }
-
- buff = baos.toByteArray();
+ };
- if(CONTEXT_TRACKING_ENABLED) {
- updateContext(currentContext, className);
+ public TempBundleDelegatingClassLoader(Bundle b, ClassLoader parent) {
+ super(parent);
+ bundle = b;
}
- try {
- return defineClass(className, buff, 0, buff.length);
- } finally {
- if(CONTEXT_TRACKING_ENABLED) {
- currentLoadingBundle.get().pop();
+
+ @Override
+ protected Class<?> findClass(String className) throws ClassNotFoundException {
+ String classResName = className.replace('.', '/').concat(".class");
+
+ // Don't use loadClass, just load the bytes and call defineClass
+ Bundle currentContext = currentLoadingBundle.get().peek();
+ InputStream is;
+ if (currentContext == null) {
+ is = getResourceAsStream(classResName);
+ } else {
+ is = getResourceInBundleAsStream(classResName, currentContext);
+ }
+
+ if (is == null) {
+ throw new ClassNotFoundException(className);
+ }
+
+ ByteArrayOutputStream baos = new ByteArrayOutputStream();
+
+ byte[] buff = new byte[4096];
+ try {
+ try {
+ int read = is.read(buff);
+ while (read > 0) {
+ baos.write(buff, 0, read);
+ read = is.read(buff);
+ }
+ } finally {
+ is.close();
+ }
+ } catch (IOException ioe) {
+ throw new ClassNotFoundException(className, ioe);
+ }
+
+ buff = baos.toByteArray();
+
+ updateContext(currentContext, className);
+ try {
+ return defineClass(className, buff, 0, buff.length);
+ } finally {
+ currentLoadingBundle.get().pop();
}
}
- }
- private void updateContext(Bundle currentContext, String className) {
- if(currentContext == null) {
- currentContext = bundle;
- }
-
- int idx = className.lastIndexOf('.');
- String packageName = (idx == -1) ? "" : className.substring(0, idx);
-
- Bundle contextToSet = currentContext;
-
- BundleWiring wiring = currentContext.adapt(BundleWiring.class);
- for(BundleWire wire : wiring.getRequiredWires(BundleRevision.PACKAGE_NAMESPACE)) {
- if(wire.getCapability().getAttributes().get(BundleRevision.PACKAGE_NAMESPACE).equals(packageName)) {
- contextToSet = wire.getProviderWiring().getBundle();
- break;
- }
- }
- currentLoadingBundle.get().push(contextToSet);
- }
-
-@Override
- protected URL findResource(final String resName)
- {
- return findResourceInBundle(resName, bundle);
- }
-
- protected URL findResourceInBundle(final String resName, final Bundle inBundle)
- {
- //Bundle.getResource requires privileges that the client may not have but we need
- //use a doPriv so that only this bundle needs the privileges
- return AccessController.doPrivileged(new PrivilegedAction<URL>() {
-
- public URL run()
- {
- return inBundle.getResource(resName);
- }
- });
- }
-
- private InputStream getResourceInBundleAsStream(final String resName, final Bundle inBundle) {
- URL url = findResourceInBundle(resName, inBundle);
- try {
- return (url == null) ? null : url.openStream();
- } catch (IOException e) {
- return null;
- }
- }
-
- @Override
- protected Enumeration<URL> findResources(final String resName) throws IOException
- {
- return findResourcesInBundle(resName, bundle);
- }
-
- protected Enumeration<URL> findResourcesInBundle(final String resName, final Bundle inBundle) throws IOException
- {
- Enumeration<URL> resources = null;
- try {
- //Bundle.getResources requires privileges that the client may not have but we need
- //use a doPriv so that only this bundle needs the privileges
- resources = AccessController.doPrivileged(new PrivilegedExceptionAction<Enumeration<URL>>() {
-
- public Enumeration<URL> run() throws IOException
- {
- return inBundle.getResources(resName);
+ private void updateContext(Bundle currentContext, String className) {
+ Bundle contextToSet = (currentContext == null) ? bundle : currentContext;
+ int idx = className.lastIndexOf('.');
+ String packageName = (idx == -1) ? "" : className.substring(0, idx);
+ BundleWiring wiring = contextToSet.adapt(BundleWiring.class);
+ for (BundleWire wire : wiring.getRequiredWires(BundleRevision.PACKAGE_NAMESPACE)) {
+ if (wire.getCapability().getAttributes().get(BundleRevision.PACKAGE_NAMESPACE).equals(packageName)) {
+ contextToSet = wire.getProviderWiring().getBundle();
+ break;
+ }
}
- });
- } catch(PrivilegedActionException pae) {
- //thrownException can never be a RuntimeException, as that would escape
- //the doPriv normally
- Exception thrownException = pae.getException();
- if (thrownException instanceof IOException) {
- throw (IOException)thrownException;
- } else {
- // This code should never get called, but we don't
- // want to gobble the exception if we see it.
- throw new UndeclaredThrowableException(thrownException);
- }
+ currentLoadingBundle.get().push(contextToSet);
}
- return resources;
- }
+
+ @Override
+ protected URL findResource(final String resName) {
+ return findResourceInBundle(resName, bundle);
+ }
+
+ private URL findResourceInBundle(final String resName, final Bundle inBundle) {
+ // Bundle.getResource requires privileges that the client may not have but we need.
+ // use a doPriv so that only this bundle needs the privileges
+ return AccessController.doPrivileged(new PrivilegedAction<URL>() {
+ @Override
+ public URL run() {
+ return inBundle.getResource(resName);
+ }
+ });
+ }
+
+ private InputStream getResourceInBundleAsStream(final String resName, final Bundle inBundle) {
+ URL url = findResourceInBundle(resName, inBundle);
+ try {
+ return (url == null) ? null : url.openStream();
+ } catch (IOException e) {
+ LOG.debug("Exception on openStream", e);
+ return null;
+ }
+ }
+
+ @Override
+ protected Enumeration<URL> findResources(final String resName) throws IOException {
+ return findResourcesInBundle(resName, bundle);
+ }
+
+ private Enumeration<URL> findResourcesInBundle(final String resName, final Bundle inBundle) throws IOException {
+ Enumeration<URL> resources = null;
+ try {
+ // Bundle.getResources requires privileges that the client may not
+ // have but we need
+ // use a doPriv so that only this bundle needs the privileges
+ resources = AccessController.doPrivileged(new PrivilegedExceptionAction<Enumeration<URL>>() {
+ @Override
+ public Enumeration<URL> run() throws IOException {
+ return inBundle.getResources(resName);
+ }
+ });
+ } catch (PrivilegedActionException pae) {
+ // thrownException can never be a RuntimeException, as that would escape the doPriv normally
+ Exception thrownException = pae.getException();
+ if (thrownException instanceof IOException) {
+ throw (IOException)thrownException;
+ } else {
+ LOG.warn("Exception during findResourcesInBundle", pae);
+ }
+ }
+ return resources;
+ }
}
diff --git a/jpa-container/src/main/java/org/apache/aries/jpa/container/weaving/impl/DummyDataSource.java b/jpa-container/src/main/java/org/apache/aries/jpa/container/weaving/impl/DummyDataSource.java
index 72c84e6..6e5fa43 100644
--- a/jpa-container/src/main/java/org/apache/aries/jpa/container/weaving/impl/DummyDataSource.java
+++ b/jpa-container/src/main/java/org/apache/aries/jpa/container/weaving/impl/DummyDataSource.java
@@ -39,31 +39,36 @@
* Simply tries to avoid that calling code runs into NPE
*/
private final class DummyHandler implements InvocationHandler {
+ @Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
ClassLoader classLoader = this.getClass().getClassLoader();
- if (method.getReturnType() == DatabaseMetaData.class) {
- Class<?>[] ifAr = new Class[] {
- DatabaseMetaData.class
- };
- return Proxy.newProxyInstance(classLoader, ifAr, this);
- }
- if (method.getReturnType() == int.class) {
+ Class<?> type = method.getReturnType();
+ if (type == int.class) {
return new Integer(0);
}
- if (method.getReturnType() == boolean.class) {
+ if (type == boolean.class) {
return new Boolean(false);
}
- if (method.getReturnType() == String.class) {
+ if (type == String.class) {
return "";
}
- if (method.getReturnType() == ResultSet.class) {
- Class<?>[] ifAr = new Class[] {
- ResultSet.class
- };
- return Proxy.newProxyInstance(classLoader, ifAr, this);
+ return proxyClasses(classLoader, type);
+ }
+
+ private Object proxyClasses(ClassLoader classLoader, Class<?> type) {
+ if (type == DatabaseMetaData.class) {
+ return createProxy(classLoader, DatabaseMetaData.class);
+ }
+ if (type == ResultSet.class) {
+ return createProxy(classLoader, ResultSet.class);
}
return null;
}
+
+ private Object createProxy(ClassLoader classLoader, Class<?> iface) {
+ Class<?>[] ifAr = new Class[] { iface };
+ return Proxy.newProxyInstance(classLoader, ifAr, this);
+ }
}
@Override
@@ -78,12 +83,15 @@
@Override
public void setLoginTimeout(int seconds) throws SQLException {
+ // Ignore
}
@Override
public void setLogWriter(PrintWriter out) throws SQLException {
+ // Ignore
}
+ @Override
public java.util.logging.Logger getParentLogger() throws SQLFeatureNotSupportedException {
return null;
}
diff --git a/jpa-container/src/main/java/org/apache/aries/jpa/container/weaving/impl/JPAWeavingHook.java b/jpa-container/src/main/java/org/apache/aries/jpa/container/weaving/impl/JPAWeavingHook.java
index 6d65722..64daebb 100644
--- a/jpa-container/src/main/java/org/apache/aries/jpa/container/weaving/impl/JPAWeavingHook.java
+++ b/jpa-container/src/main/java/org/apache/aries/jpa/container/weaving/impl/JPAWeavingHook.java
@@ -55,6 +55,7 @@
JPAWeavingHook() {
}
+ @Override
public void weave(WovenClass wovenClass) {
BundleWiring wiring = wovenClass.getBundleWiring();
Bundle bundle = wiring.getBundle();
@@ -64,10 +65,10 @@
if (transformClass(wovenClass, cl, transformer)) {
LOGGER.info("Weaving " + wovenClass.getClassName() + " using " + transformer.getClass().getName());
break;
- };
+ }
}
Class<?> dClass = wovenClass.getDefinedClass();
- if (transformersToTry.size() == 0 && dClass != null && dClass.getAnnotation(Entity.class) != null) {
+ if (transformersToTry.isEmpty() && dClass != null && dClass.getAnnotation(Entity.class) != null) {
LOGGER.warn("Loading " + wovenClass.getClassName() + " before transformer is present");
}
}
@@ -75,10 +76,10 @@
@SuppressWarnings("unchecked")
private synchronized Collection<ClassTransformer> getTransformers(Bundle bundle) {
LinkedHashSet<ClassTransformer> transformers = registeredTransformers.get(bundle);
- return transformers != null ? new ArrayList<ClassTransformer>(transformers) : Collections.EMPTY_LIST;
+ return (Collection<ClassTransformer>)(transformers != null ? new ArrayList<ClassTransformer>(transformers) : Collections.emptyList());
}
- private boolean transformClass(WovenClass wovenClass, ClassLoader cl, ClassTransformer transformer)
+ private static boolean transformClass(WovenClass wovenClass, ClassLoader cl, ClassTransformer transformer)
throws ThreadDeath, OutOfMemoryError {
try {
byte[] result = transformer
@@ -93,21 +94,16 @@
wovenClass.getDynamicImports().add("org.apache.openjpa.*");
return true;
}
- } catch (Throwable t) {
- if (t instanceof ThreadDeath)
- throw (ThreadDeath)t;
- else if (t instanceof OutOfMemoryError)
- throw (OutOfMemoryError)t;
- else {
- Bundle b = wovenClass.getBundleWiring().getBundle();
- String msg = String.format("Weaving failure", wovenClass.getClassName(),
- b.getSymbolicName(), b.getVersion(), transformer);
- throw new WeavingException(msg, t);
- }
+ } catch (Exception t) {
+ Bundle b = wovenClass.getBundleWiring().getBundle();
+ String msg = String.format("Weaving failure on class %s in bundle %s/%s using transformer %s", wovenClass.getClassName(),
+ b.getSymbolicName(), b.getVersion(), transformer);
+ throw new WeavingException(msg, t);
}
return false;
}
+ @Override
public synchronized void addTransformer(Bundle pBundle, ClassTransformer transformer) {
LOGGER.info("Adding transformer " + transformer.getClass().getName());
LinkedHashSet<ClassTransformer> transformers = registeredTransformers.get(pBundle);
@@ -118,6 +114,7 @@
transformers.add(transformer);
}
+ @Override
public synchronized void removeTransformer(Bundle pBundle, ClassTransformer transformer) {
LinkedHashSet<ClassTransformer> set = registeredTransformers.get(pBundle);
if (set == null || !set.remove(transformer)) {
diff --git a/jpa-container/src/main/java/org/apache/aries/jpa/container/weaving/impl/TransformerRegistrySingleton.java b/jpa-container/src/main/java/org/apache/aries/jpa/container/weaving/impl/TransformerRegistrySingleton.java
index 8e49b8a..9998653 100644
--- a/jpa-container/src/main/java/org/apache/aries/jpa/container/weaving/impl/TransformerRegistrySingleton.java
+++ b/jpa-container/src/main/java/org/apache/aries/jpa/container/weaving/impl/TransformerRegistrySingleton.java
@@ -23,12 +23,15 @@
* This class is used to get hold of the active {@link TransformerRegistry} for this bundle.
*/
public class TransformerRegistrySingleton {
- private static TransformerRegistry _instance;
+ private static TransformerRegistry instance;
+
+ private TransformerRegistrySingleton() {
+ }
public static TransformerRegistry get() {
- if (_instance == null) {
- _instance = new JPAWeavingHook();
+ if (instance == null) {
+ instance = new JPAWeavingHook();
}
- return _instance;
+ return instance;
}
}
diff --git a/jpa-container/src/main/java/org/apache/aries/jpa/container/weaving/impl/WrappingTransformer.java b/jpa-container/src/main/java/org/apache/aries/jpa/container/weaving/impl/WrappingTransformer.java
index 76e83bd..4bd49a6 100644
--- a/jpa-container/src/main/java/org/apache/aries/jpa/container/weaving/impl/WrappingTransformer.java
+++ b/jpa-container/src/main/java/org/apache/aries/jpa/container/weaving/impl/WrappingTransformer.java
@@ -35,6 +35,10 @@
class WrappingTransformer implements ClassTransformer {
private final ClassTransformer delegate;
private final Collection<String> packageImportsToAdd = new HashSet<String>();
+
+ public WrappingTransformer(ClassTransformer transformer) {
+ delegate = transformer;
+ }
public WrappingTransformer(ClassTransformer delegate, ServiceReference<?> persistenceProvider) {
validate(delegate, persistenceProvider);
@@ -57,7 +61,7 @@
}
}
- private void validate(ClassTransformer delegate, ServiceReference<?> persistenceProvider) {
+ private static void validate(ClassTransformer delegate, ServiceReference<?> persistenceProvider) {
if (delegate == null) {
throw new NullPointerException("Transformer delegate may not be null");
}
@@ -66,10 +70,8 @@
}
}
- public WrappingTransformer(ClassTransformer transformer) {
- delegate = transformer;
- }
+ @Override
public byte[] transform(ClassLoader loader, String className, Class<?> classBeingRedefined, ProtectionDomain protectionDomain, byte[] classfileBuffer)
throws IllegalClassFormatException {
return delegate.transform(loader, className, classBeingRedefined, protectionDomain, classfileBuffer);
@@ -79,10 +81,12 @@
return packageImportsToAdd;
}
+ @Override
public int hashCode() {
return delegate.hashCode();
}
+ @Override
public boolean equals(Object o) {
if (o instanceof WrappingTransformer) {
return delegate == ((WrappingTransformer)o).delegate;
@@ -90,6 +94,7 @@
return false;
}
+ @Override
public String toString() {
return "Transformer: " + delegate.toString() + " Packages to add: " + packageImportsToAdd;
}
diff --git a/jpa-support/src/main/java/org/apache/aries/jpa/support/impl/AbstractJpaTemplate.java b/jpa-support/src/main/java/org/apache/aries/jpa/support/impl/AbstractJpaTemplate.java
index d0b2289..d97fac6 100644
--- a/jpa-support/src/main/java/org/apache/aries/jpa/support/impl/AbstractJpaTemplate.java
+++ b/jpa-support/src/main/java/org/apache/aries/jpa/support/impl/AbstractJpaTemplate.java
@@ -30,6 +30,7 @@
@Override
public void tx(final TransactionType type, final EmConsumer code) {
txExpr(type, new EmFunction<Object>() {
+ @Override
public Object apply(EntityManager em) {
code.accept(em);
return null;
@@ -47,7 +48,6 @@
tx(TransactionType.Required, code);
}
-
protected RuntimeException wrapThrowable(Throwable ex, String message) {
if (ex instanceof RuntimeException) {
return (RuntimeException) ex;
diff --git a/jpa-support/src/main/java/org/apache/aries/jpa/support/impl/EMSupplierImpl.java b/jpa-support/src/main/java/org/apache/aries/jpa/support/impl/EMSupplierImpl.java
index de60683..14577e6 100644
--- a/jpa-support/src/main/java/org/apache/aries/jpa/support/impl/EMSupplierImpl.java
+++ b/jpa-support/src/main/java/org/apache/aries/jpa/support/impl/EMSupplierImpl.java
@@ -44,10 +44,8 @@
* sure all EMs are closed.
*/
public class EMSupplierImpl implements EmSupplier {
-
-
private static final long DEFAULT_SHUTDOWN_WAIT_SECS = 10;
- private static Logger LOG = LoggerFactory.getLogger(EMSupplierImpl.class);
+ private static final Logger LOG = LoggerFactory.getLogger(EMSupplierImpl.class);
private EntityManagerFactory emf;
private AtomicBoolean shutdown;
private long shutdownWaitTime = DEFAULT_SHUTDOWN_WAIT_SECS;
@@ -141,10 +139,12 @@
@Override
public void preCall() {
+ // Just for backward compatibility
}
@Override
public void postCall() {
+ // Just for backward compatibility
}
/**
@@ -161,12 +161,13 @@
try {
emsToShutDown.await(shutdownWaitTime, shutdownWaitTimeUnit);
} catch (InterruptedException e) {
+ LOG.debug("Close was interrupted", e);
}
return shutdownRemaining();
}
private synchronized boolean shutdownRemaining() {
- boolean clean = (emSet.size() == 0);
+ boolean clean = emSet.isEmpty();
if (!clean) {
LOG.warn("{} EntityManagers still open after timeout. Shutting them down now", emSet.size());
}
@@ -177,7 +178,7 @@
return clean;
}
- private void closeEm(EntityManager em) {
+ private static void closeEm(EntityManager em) {
try {
if (em.isOpen()) {
em.close();
diff --git a/jpa-support/src/main/java/org/apache/aries/jpa/support/impl/ResourceLocalJpaTemplate.java b/jpa-support/src/main/java/org/apache/aries/jpa/support/impl/ResourceLocalJpaTemplate.java
index 2f68ee3..22cbc91 100644
--- a/jpa-support/src/main/java/org/apache/aries/jpa/support/impl/ResourceLocalJpaTemplate.java
+++ b/jpa-support/src/main/java/org/apache/aries/jpa/support/impl/ResourceLocalJpaTemplate.java
@@ -45,9 +45,8 @@
if (type != TransactionType.Required) {
throw new IllegalStateException("Only transation propagation type REQUIRED is supported");
}
- Coordination coord = null;
+ Coordination coord = coordinator.begin(this.getClass().getName(), 0);
try {
- coord = coordinator.begin(this.getClass().getName(), 0);
em = emSupplier.get();
weControlTx = !em.getTransaction().isActive();
if (weControlTx) {
@@ -60,7 +59,7 @@
return result;
} catch (Exception e) {
if (weControlTx) {
- safeRollback(em, e);
+ safeRollback(em);
}
throw wrapThrowable(e, "Exception occured in transactional code");
} finally {
@@ -68,12 +67,12 @@
}
}
- private void safeRollback(EntityManager em, Exception e) {
+ private static void safeRollback(EntityManager em) {
if (em != null) {
try {
em.getTransaction().rollback();
- } catch (Exception e1) {
- LOGGER.warn("Exception during transaction rollback", e1);
+ } catch (Exception e) {
+ LOGGER.warn("Exception during transaction rollback", e);
}
}
}
diff --git a/jpa-support/src/main/java/org/apache/aries/jpa/support/impl/XAJpaTemplate.java b/jpa-support/src/main/java/org/apache/aries/jpa/support/impl/XAJpaTemplate.java
index 9a62cea..f8f984e 100644
--- a/jpa-support/src/main/java/org/apache/aries/jpa/support/impl/XAJpaTemplate.java
+++ b/jpa-support/src/main/java/org/apache/aries/jpa/support/impl/XAJpaTemplate.java
@@ -59,42 +59,50 @@
em.joinTransaction();
}
R result = (R)code.apply(em);
+ safeFinish(tranToken, ta, coord);
return result;
- } catch (Throwable ex) {
- safeRollback(tranToken, ex);
- if (ex instanceof Error) {
- throw (Error)ex;
- }
+ } catch (Exception ex) {
+ safeRollback(tranToken, ta, coord, ex);
throw wrapThrowable(ex, "Exception occured in transactional code");
- } finally {
- try {
- ta.finish(tm, tranToken);
- } catch (Exception e) {
- // We are throwing an exception, so we don't error it out
- LOGGER.debug("Exception during finish of transaction", e);
- throw wrapThrowable(e, "Exception during finish of transaction");
- } finally {
- if (coord != null)
- coord.end();
- }
+ } catch (Error ex) { // NOSONAR
+ safeRollback(tranToken, ta, coord, ex);
+ throw ex;
}
}
- private void safeRollback(TransactionToken token, Throwable ex) {
+ private static void close(Coordination coord) {
+ if (coord != null) {
+ coord.end();
+ }
+ }
+
+ private void safeFinish(TransactionToken tranToken, TransactionAttribute ta, Coordination coord) {
+ try {
+ ta.finish(tm, tranToken);
+ } catch (Exception e) {
+ // We are throwing an exception, so we don't error it out
+ LOGGER.debug("Exception during finish of transaction", e);
+ throw wrapThrowable(e, "Exception during finish of transaction");
+ }
+ close(coord);
+ }
+
+ private void safeRollback(TransactionToken token, TransactionAttribute ta, Coordination coord, Throwable ex) {
try {
Transaction tran = token.getActiveTransaction();
- if (tran != null) {
- if (ex instanceof RuntimeException || ex instanceof Error) {
- tran.setRollbackOnly();
- } else {
- // declared exception, we don't set rollback
- }
+ if (tran != null && shouldRollback(ex)) {
+ tran.setRollbackOnly();
}
} catch (Exception e) {
// we do not throw the exception since there already is one, but we
// need to log it
LOGGER.warn("Exception during transaction rollback", e);
}
+ safeFinish(token, ta, coord);
+ }
+
+ private static boolean shouldRollback(Throwable ex) {
+ return ex instanceof RuntimeException || ex instanceof Error;
}
}
diff --git a/jpa-support/src/main/java/org/apache/aries/jpa/support/osgi/impl/EMFTracker.java b/jpa-support/src/main/java/org/apache/aries/jpa/support/osgi/impl/EMFTracker.java
index 4a78ae5..6e8826e 100644
--- a/jpa-support/src/main/java/org/apache/aries/jpa/support/osgi/impl/EMFTracker.java
+++ b/jpa-support/src/main/java/org/apache/aries/jpa/support/osgi/impl/EMFTracker.java
@@ -47,7 +47,7 @@
*/
@SuppressWarnings("rawtypes")
public class EMFTracker extends ServiceTracker {
- private static Logger LOG = LoggerFactory.getLogger(EMFTracker.class);
+ private static final Logger LOG = LoggerFactory.getLogger(EMFTracker.class);
private Coordinator coordinator;
@@ -103,14 +103,14 @@
return PersistenceUnitTransactionType.JTA;
}
- private Dictionary<String, String> getEmSupplierProps(String unitName) {
- Dictionary<String, String> props = new Hashtable<String, String>();
+ private static Dictionary<String, String> getEmSupplierProps(String unitName) {
+ Dictionary<String, String> props = new Hashtable<String, String>(); // NOSONAR
props.put(JPA_UNIT_NAME, unitName);
return props;
}
- private Dictionary<String, String> rlTxManProps(String unitName) {
- Dictionary<String, String> props = new Hashtable<String, String>();
+ private static Dictionary<String, String> rlTxManProps(String unitName) {
+ Dictionary<String, String> props = new Hashtable<String, String>(); // NOSONAR
props.put(JPA_UNIT_NAME, unitName);
props.put(TMTracker.TRANSACTION_TYPE, "RESOURCE_LOCAL");
return props;
diff --git a/jpa-support/src/main/java/org/apache/aries/jpa/support/osgi/impl/EmProxy.java b/jpa-support/src/main/java/org/apache/aries/jpa/support/osgi/impl/EmProxy.java
index fba66e1..5d66782 100644
--- a/jpa-support/src/main/java/org/apache/aries/jpa/support/osgi/impl/EmProxy.java
+++ b/jpa-support/src/main/java/org/apache/aries/jpa/support/osgi/impl/EmProxy.java
@@ -41,9 +41,8 @@
}
try {
return method.invoke(em, args);
- } catch (InvocationTargetException ex) {
- InvocationTargetException iex = (InvocationTargetException)ex;
- throw iex.getTargetException();
+ } catch (InvocationTargetException ex) { // NOSONAR
+ throw ex.getTargetException();
}
}
diff --git a/jpa-support/src/main/java/org/apache/aries/jpa/support/osgi/impl/TMTracker.java b/jpa-support/src/main/java/org/apache/aries/jpa/support/osgi/impl/TMTracker.java
index d585ec6..f718d69 100644
--- a/jpa-support/src/main/java/org/apache/aries/jpa/support/osgi/impl/TMTracker.java
+++ b/jpa-support/src/main/java/org/apache/aries/jpa/support/osgi/impl/TMTracker.java
@@ -32,6 +32,8 @@
import org.osgi.service.coordinator.Coordinator;
import org.osgi.service.jpa.EntityManagerFactoryBuilder;
import org.osgi.util.tracker.ServiceTracker;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
/**
* Is created for an EntityManagerFactory with JTA transactions and creates
@@ -39,6 +41,7 @@
*/
@SuppressWarnings("rawtypes")
public class TMTracker extends ServiceTracker<TransactionManager, ServiceRegistration> {
+ private static final Logger LOG = LoggerFactory.getLogger(TMTracker.class);
static final String TRANSACTION_TYPE = "transaction.type";
private final EmSupplier emSupplier;
@@ -60,8 +63,8 @@
return context.registerService(JpaTemplate.class, txManager, xaTxManProps(unitName));
}
- private Dictionary<String, String> xaTxManProps(String unitName) {
- Dictionary<String, String> txmanProperties = new Hashtable<String, String>();
+ private static Dictionary<String, String> xaTxManProps(String unitName) {
+ Dictionary<String, String> txmanProperties = new Hashtable<String, String>(); // NOSONAR
txmanProperties.put(EntityManagerFactoryBuilder.JPA_UNIT_NAME, unitName);
txmanProperties.put(TRANSACTION_TYPE, "JTA");
return txmanProperties;
@@ -73,7 +76,7 @@
reg.unregister();
context.ungetService(reference);
} catch (Exception e) {
- // Ignore. May happen if persistence unit bundle is unloaded / updated
+ LOG.debug("Exception during unregister", e);
}
}
diff --git a/jpa-support/src/main/java/org/apache/aries/jpa/support/xa/impl/TransactionAttribute.java b/jpa-support/src/main/java/org/apache/aries/jpa/support/xa/impl/TransactionAttribute.java
index d9bfe0c..493b4fd 100644
--- a/jpa-support/src/main/java/org/apache/aries/jpa/support/xa/impl/TransactionAttribute.java
+++ b/jpa-support/src/main/java/org/apache/aries/jpa/support/xa/impl/TransactionAttribute.java
@@ -36,6 +36,7 @@
public enum TransactionAttribute {
MANDATORY
{
+ @Override
public TransactionToken begin(TransactionManager man) throws SystemException
{
if (man.getStatus() == Status.STATUS_NO_TRANSACTION) {
@@ -47,6 +48,7 @@
},
NEVER
{
+ @Override
public TransactionToken begin(TransactionManager man) throws SystemException
{
if (man.getStatus() == Status.STATUS_ACTIVE) {
@@ -58,6 +60,7 @@
},
NOTSUPPORTED
{
+ @Override
public TransactionToken begin(TransactionManager man) throws SystemException
{
if (man.getStatus() == Status.STATUS_ACTIVE) {
@@ -67,8 +70,9 @@
return new TransactionToken(null, null, NOTSUPPORTED);
}
+ @Override
public void finish(TransactionManager man, TransactionToken tranToken) throws SystemException,
- InvalidTransactionException, IllegalStateException
+ InvalidTransactionException
{
Transaction tran = tranToken.getSuspendedTransaction();
if (tran != null) {
@@ -78,6 +82,7 @@
},
REQUIRED
{
+ @Override
public TransactionToken begin(TransactionManager man) throws SystemException, NotSupportedException
{
if (man.getStatus() == Status.STATUS_NO_TRANSACTION) {
@@ -88,8 +93,9 @@
return new TransactionToken(man.getTransaction(), null, REQUIRED);
}
+ @Override
public void finish(TransactionManager man, TransactionToken tranToken) throws SystemException,
- InvalidTransactionException, IllegalStateException, SecurityException, RollbackException,
+ InvalidTransactionException, RollbackException,
HeuristicMixedException, HeuristicRollbackException
{
if (tranToken.isCompletionAllowed()) {
@@ -103,8 +109,9 @@
},
REQUIRESNEW
{
+ @Override
public TransactionToken begin(TransactionManager man) throws SystemException, NotSupportedException,
- InvalidTransactionException, IllegalStateException
+ InvalidTransactionException
{
TransactionToken tranToken;
if (man.getStatus() == Status.STATUS_ACTIVE) {
@@ -129,8 +136,9 @@
return tranToken;
}
+ @Override
public void finish(TransactionManager man, TransactionToken tranToken) throws SystemException,
- InvalidTransactionException, IllegalStateException, SecurityException, RollbackException,
+ InvalidTransactionException, RollbackException,
HeuristicMixedException, HeuristicRollbackException
{
if (tranToken.isCompletionAllowed()) {
@@ -149,8 +157,9 @@
},
SUPPORTS
{
+ @Override
public TransactionToken begin(TransactionManager man) throws SystemException, NotSupportedException,
- InvalidTransactionException, IllegalStateException
+ InvalidTransactionException
{
if (man.getStatus() == Status.STATUS_ACTIVE) {
return new TransactionToken(man.getTransaction(), null, SUPPORTS);
@@ -170,16 +179,15 @@
return valueOf(type.name().toUpperCase());
}
- public TransactionToken begin(TransactionManager man) throws SystemException, NotSupportedException,
- InvalidTransactionException, IllegalStateException
+ public TransactionToken begin(TransactionManager man) throws SystemException, NotSupportedException, InvalidTransactionException // NOSONAR
{
return null;
}
- public void finish(TransactionManager man, TransactionToken tranToken) throws SystemException,
- InvalidTransactionException, IllegalStateException, SecurityException, RollbackException,
+ public void finish(TransactionManager man, TransactionToken tranToken) throws SystemException, // NOSONAR
+ InvalidTransactionException, RollbackException,
HeuristicMixedException, HeuristicRollbackException
{
-
+ throw new UnsupportedOperationException();
}
}