FELIX-4060 : Keep service tracker open, otherwise the http service unregisters resources immediately
git-svn-id: https://svn.apache.org/repos/asf/felix/trunk@1661132 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/http/itest/src/test/java/org/apache/felix/http/itest/BaseIntegrationTest.java b/http/itest/src/test/java/org/apache/felix/http/itest/BaseIntegrationTest.java
index cb7d720..e2998a2 100644
--- a/http/itest/src/test/java/org/apache/felix/http/itest/BaseIntegrationTest.java
+++ b/http/itest/src/test/java/org/apache/felix/http/itest/BaseIntegrationTest.java
@@ -40,7 +40,9 @@
import java.net.URL;
import java.util.Collection;
import java.util.Dictionary;
+import java.util.HashMap;
import java.util.Hashtable;
+import java.util.Map;
import java.util.Scanner;
import java.util.concurrent.CountDownLatch;
@@ -96,6 +98,7 @@
m_destroyLatch = destroyLatch;
}
+ @Override
public void destroy()
{
if (m_destroyLatch != null)
@@ -104,11 +107,13 @@
}
}
+ @Override
public final void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException
{
filter((HttpServletRequest) req, (HttpServletResponse) resp, chain);
}
+ @Override
public void init(FilterConfig config) throws ServletException
{
if (m_initLatch != null)
@@ -119,7 +124,7 @@
protected void filter(HttpServletRequest req, HttpServletResponse resp, FilterChain chain) throws IOException, ServletException
{
- ((HttpServletResponse) resp).setStatus(HttpServletResponse.SC_OK);
+ resp.setStatus(HttpServletResponse.SC_OK);
}
}
@@ -332,6 +337,8 @@
junitBundles(), frameworkStartLevel(START_LEVEL_TEST_BUNDLE), felix());
}
+ private final Map<String, ServiceTracker<?, ?>> trackers = new HashMap<String, ServiceTracker<?, ?>>();
+
@Before
public void setUp() throws Exception
{
@@ -341,6 +348,14 @@
@After
public void tearDown() throws Exception
{
+ synchronized ( trackers )
+ {
+ for(final Map.Entry<String, ServiceTracker<?, ?>> entry : trackers.entrySet())
+ {
+ entry.getValue().close();
+ }
+ trackers.clear();
+ }
Bundle bundle = getHttpJettyBundle();
// Restart the HTTP-service to clean all registrations...
if (bundle.getState() == Bundle.ACTIVE)
@@ -358,18 +373,18 @@
*/
protected <T> T awaitService(String serviceName) throws Exception
{
- ServiceTracker tracker = new ServiceTracker(m_context, serviceName, null);
- tracker.open();
- T result;
- try
+ ServiceTracker<?, ?> tracker = null;
+ synchronized ( this.trackers )
{
- result = (T) tracker.waitForService(DEFAULT_TIMEOUT);
+ tracker = trackers.get(serviceName);
+ if ( tracker == null )
+ {
+ tracker = new ServiceTracker(m_context, serviceName, null);
+ trackers.put(serviceName, tracker);
+ tracker.open();
+ }
}
- finally
- {
- tracker.close();
- }
- return result;
+ return (T) tracker.waitForService(DEFAULT_TIMEOUT);
}
protected void configureHttpService(Dictionary<?, ?> props) throws Exception
@@ -435,20 +450,20 @@
* @param serviceName
* @return
*/
- protected <T> T getService(String serviceName)
+ protected <T> T getService(final String serviceName)
{
- ServiceTracker tracker = new ServiceTracker(m_context, serviceName, null);
- tracker.open();
- T result;
- try
+ ServiceTracker<?, ?> tracker = null;
+ synchronized ( this.trackers )
{
- result = (T) tracker.getService();
+ tracker = trackers.get(serviceName);
+ if ( tracker == null )
+ {
+ tracker = new ServiceTracker(m_context, serviceName, null);
+ trackers.put(serviceName, tracker);
+ tracker.open();
+ }
}
- finally
- {
- tracker.close();
- }
- return result;
+ return (T) tracker.getService();
}
protected void register(String pattern, Filter filter) throws ServletException, NamespaceException