[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();
     }
 }