From 1d437df805b36ba45df225b25efbf61ea5d88c87 Mon Sep 17 00:00:00 2001 From: Julien Viet Date: Thu, 4 Apr 2013 18:37:06 +0200 Subject: [PATCH] GTNPC-82 : Potential concurency issues in FederatingPortletInvokerService and ContainerPortletInvoker --- .../impl/FederatingPortletInvokerService.java | 4 +++- .../container/ContainerPortletInvoker.java | 20 +++++++++---------- 2 files changed, 13 insertions(+), 11 deletions(-) diff --git a/federation/src/main/java/org/gatein/pc/federation/impl/FederatingPortletInvokerService.java b/federation/src/main/java/org/gatein/pc/federation/impl/FederatingPortletInvokerService.java index 37490e16..b86e3e5b 100755 --- a/federation/src/main/java/org/gatein/pc/federation/impl/FederatingPortletInvokerService.java +++ b/federation/src/main/java/org/gatein/pc/federation/impl/FederatingPortletInvokerService.java @@ -132,7 +132,9 @@ private FederatedPortletInvoker getOrResolveFederatedInvoker(String federatedId, { synchronized (this) { - invokerCache.put(federatedId, federatedPortletInvoker); // put newly resolved invoker in cache + Map copy = new HashMap(invokerCache); + copy.put(federatedId, federatedPortletInvoker); // put newly resolved invoker in cache + invokerCache = copy; } } } diff --git a/portlet/src/main/java/org/gatein/pc/portlet/container/ContainerPortletInvoker.java b/portlet/src/main/java/org/gatein/pc/portlet/container/ContainerPortletInvoker.java index 759f401a..28992a0a 100755 --- a/portlet/src/main/java/org/gatein/pc/portlet/container/ContainerPortletInvoker.java +++ b/portlet/src/main/java/org/gatein/pc/portlet/container/ContainerPortletInvoker.java @@ -60,11 +60,11 @@ public class ContainerPortletInvoker extends PortletInvokerInterceptor public static final String PORTLET_CONTAINER = "PORTLET_CONTAINER"; /** . */ - private Map portlets = new HashMap(); + private volatile Map portlets = new HashMap(); - public void addPortletContainer(PortletContainer portletContainer) + public synchronized void addPortletContainer(PortletContainer portletContainer) { - Map portlets = new HashMap(this.portlets); + Map portlets = new HashMap(this.portlets); PortletImpl portlet = new PortletImpl(portletContainer); portlets.put(portlet.getContext().getId(), portlet); @@ -72,9 +72,9 @@ public void addPortletContainer(PortletContainer portletContainer) this.portlets = portlets; } - public void removePortletContainer(PortletContainer portletContainer) + public synchronized void removePortletContainer(PortletContainer portletContainer) { - Map portlets = new HashMap(this.portlets); + Map portlets = new HashMap(this.portlets); PortletImpl portlet = new PortletImpl(portletContainer); portlets.remove(portlet.getContext().getId()); @@ -107,7 +107,7 @@ public Portlet getPortlet(PortletContext portletContext) throws IllegalArgumentE throw new IllegalArgumentException("No null portlet id accepted"); } String portletId = portletContext.getId(); - PortletImpl portlet = (PortletImpl)portlets.get(portletId); + PortletImpl portlet = portlets.get(portletId); if (portlet == null) { throw new NoSuchPortletException(portletId); @@ -153,13 +153,13 @@ else if (e instanceof RuntimeException) public PropertyMap getProperties(PortletContext portletContext, Set keys) throws IllegalArgumentException, PortletInvokerException, UnsupportedOperationException { - PortletImpl portlet = (PortletImpl)portlets.get(portletContext.getId()); + PortletImpl portlet = portlets.get(portletContext.getId()); if (portlet == null) { throw new NoSuchPortletException(portletContext.getId()); } ContainerPortletInfo info = (ContainerPortletInfo)portlet.getInfo(); - ContainerPreferencesInfo prefs = (ContainerPreferencesInfo)info.getPreferences(); + ContainerPreferencesInfo prefs = info.getPreferences(); PropertyMap result = new SimplePropertyMap(); for (String key : keys) { @@ -174,13 +174,13 @@ public PropertyMap getProperties(PortletContext portletContext, Set keys public PropertyMap getProperties(PortletContext portletContext) throws IllegalArgumentException, PortletInvokerException, UnsupportedOperationException { - PortletImpl portlet = (PortletImpl)portlets.get(portletContext.getId()); + PortletImpl portlet = portlets.get(portletContext.getId()); if (portlet == null) { throw new NoSuchPortletException(portletContext.getId()); } ContainerPortletInfo info = (ContainerPortletInfo)portlet.getInfo(); - ContainerPreferencesInfo prefs = (ContainerPreferencesInfo)info.getPreferences(); + ContainerPreferencesInfo prefs = info.getPreferences(); PropertyMap result = new SimplePropertyMap(); for (String key : prefs.getKeys()) {